Web和移動安全之???基本概念和方法
基本概念和方法
本節介紹影響安全性的現代Web和移動平臺的基本概念和方法。本節中提供的信息旨在作為更好地了解以下各節中安全挑戰的基礎。與其他軟件產品和計算機系統類似,移動操作系統和應用程序以及Web瀏覽器以及Web服務器可能包含可利用的錯誤。通用軟件漏洞在軟件安全CyBOK知識領域[6]中討論。
應用化
在過去的十年中,移動設備的興起和無處不在的互聯網接入改變了軟件的生產、分發和消費方式,改變了人類與計算機設備以及設備上安裝的軟件的交互方式。雖然在前移動時代,常規互聯網瀏覽器一直是訪問網絡內容的主要方式,但應用程序的概念顯著改變了用戶訪問的方式。在線內容[11]。Appization描述了從基于Web的平臺轉向通過具有高度專業化,微小功能集的移動應用程序使用Web瀏覽器在線訪問大多數數字工具和媒體的現象。隨著移動設備逐漸成為全球Web訪問的主要界面[19],應用程序的數量在過去十年中大幅增加。“萬物皆有應用”成為應用軟件生態系統的口頭禪,它為各種用例和應用領域產生了大量應用程序。許多應用看起來像本機本地桌面或移動應用程序。但是,它們通常是與后端服務通信的(移動)Web應用程序,然后將計算和存儲任務外包給客戶端。向應用程序的轉變對Web和移動安全產生了重大影響,在客戶端帶來了更多的安全挑戰。應用的興起也影響了開發者的格局。在前應用時代,軟件開發主要由經驗豐富的開發人員主導。由于更廣泛的工具和框架支持,應用生態系統的市場準入門檻較低。這吸引了更多缺乏經驗的開發人員,并對一般的Web和移動安全產生負面影響(參見人為因素CyBOK知識領域[20])。
公民開發者的崛起應用化趨勢吸引了許多稱為公民開發者的非專業軟件開發者。他們中的許多人沒有接受過軟件工程教育,但利用多個簡單的API和工具來為不同的平臺形式構建應用程序。Oltrogge等人[21]發現,采用易于使用的在線應用程序生成器(OAG)來開發,分發和維護應用程序會對應用程序安全性產生負面影響。生成的應用往往容易受到重新配置和代碼注入攻擊,并依賴于不安全的基礎結構。
網絡化
現代網絡和移動平臺產生了另一種現象。許多應用程序不是用編譯編程語言(如Java或Kotlin和C/C++)編寫的本機應用程序(例如對于Android應用程序)或Objective-C和Swift(例如對于iOS應用程序)。相反,它們基于Web技術,包括服務器端Python,Ruby,Java或JavaScript腳本以及客戶端JavaScript。除了針對常規Web瀏覽器的傳統Web應用程序外,移動Web應用程序更頻繁地使用這些Web技術構建。特別是,移動Web應用程序大量使用JavaScript語言。
本節簡要介紹了在KA后面解釋漏洞和緩解措施所需的最基本技術。我們包括統一資源定位器(URL),超文本傳輸協議(HTTP),Hyptertext標記語言(HTML),級聯樣式表(CSS)和JavaScript編程語言。有關更多詳細信息,我們建議您閱讀[22]。
統一資源定位器
統一資源定位器(URL)[12]是Web的核心概念。URL是格式正確且完全限定的文本字符串,用于尋址和標識服務器上的資源。現代瀏覽器中的地址欄用戶界面(UI)使用URL來說明呈現的文檔的遠程地址。完全限定的絕對URL字符串由多個段組成,包含訪問特定資源所需的所有信息。絕對URL的語法是:scheme://credentials@host:port/resourcepath?query_parameters#fragments。每個段都有特定的含義(參見表1)。
超文本傳輸協議
超文本傳輸協議(HTTP)是在Web上的服務器和客戶端之間交換文檔的最廣泛使用的機制。雖然HTTP主要用于傳輸HTML文檔,但它可用于任何數據。雖然HTTP/2.0[23]是最新的協議修訂版,但最廣泛支持的協議版本是HTTP/1.1[10]。HTTP是一種使用TCP/IP的基于文本的協議。HTTP客戶端通過向HTTP服務器發送HTTP請求來啟動會話。服務器返回一個HTTP響應,其中包含請求的file。
客戶端請求的第一行包括HTTP版本信息(例如HTTP/1.1)。其余請求標頭由零個或多個名稱:值對組成。這些對由新行分隔。常見的請求標頭是User-Agent(包括瀏覽器信息)、主機(URL主機名)、接受(包含所有受支持的文檔類型)、內容長度(長度)整個請求和Cookie–請參閱第2.8節。請求標頭以單個空行終止。HTTP客戶端可以將任何其他內容傳遞給服務器。盡管內容可以是任何類型的,但客戶端通常會將HTML內容發送到服務器,例如以提交表單數據。HTTP服務器使用響應標頭響應請求,后跟請求的內容。響應標頭包含支持的協議版本、數字狀態代碼和可選的、人類可讀的狀態消息。狀態通知用于指示請求成功(例如狀態200)、錯誤條件(例如狀態404或500)或其他異常事件。響應標頭也可能包含Cookie標頭–參見第2.8節。其他響應標頭行是可選的。標頭以單個空行結尾,后跟所請求資源的實際內容。與請求內容類似,內容可以是任何類型的,但通常是HTML文檔。
雖然cookie不是原始HTTP RFC的一部分[10],但它們是最重要的協議擴展之一。Cookie允許遠程服務器在客戶端存儲中存儲多個名稱=值對。服務器可以通過發送Set-Cookie:name=value響應標頭來設置cookie,并通過讀取客戶端的Cookie:name=value請求標頭來使用它們。Cookie是維護客戶端和服務器之間的會話以及驗證用戶身份的常用機制。
HTTP是基于請求-響應的,并且巧妙地適應了單向數據傳輸用例。無論如何,為了更好的延遲和更有效地利用帶寬,需要雙向網絡連接。雙向連接不僅允許客戶端從服務器拉取數據,還可以讓服務器隨時向客戶端推送數據。因此,Web Socket協議[24]提供了一種基于HTTP的機制。Web Socket連接從包含Upgrade:Web Socket標頭的常規HTTP請求開始。Web Socket握手完成后,雙方都可以隨時發送數據,而無需運行新的握手。
超文本標記語言
Hypter text標記語言(HTML)[13]是在Web上生成和使用文檔的最廣泛使用的方法。最新版本是HTML5。HTML語法相當簡單:標簽、name=value標簽參數和文本節點的分層樹結構構成了一個HTML文檔。域對象模型(DOM)定義HTML文檔的邏輯結構,并規定如何訪問和操作它。但是,競爭的Web瀏覽器供應商引入了各種自定義功能,并根據自己的意愿修改了HTML語言。許多不同和不同的瀏覽器實現導致互聯網上只有一小部分網站遵守HTML標準的語法。因此,HTML解析模式和錯誤恢復的實現在不同的瀏覽器之間差異很大。
HTML語法對參數值中或文本節點內可能包含的內容有一些約束。某些字符(例如,尖括號、單引號和雙引號以及與號)構成了HTML標記的塊。每當它們用于不同的目的時,例如文本子字符串的一部分,都需要對它們進行轉義。為了避免不良副作用,HTML提供了實體編碼方案。但是,在顯示用戶控制的信息時,如果未能將編碼正確應用于保留字符,可能會導致嚴重的Web安全漏洞,例如跨站點腳本(cf.第4節)。
級聯樣式表
級聯樣式表(CSS)[25]是一種一致且靈活的機制,用于操作HTML文檔的外觀。CSS的主要目標是提供一種簡單明了的基于文本的描述語言,以取代許多導致許多不一致的特定于供應商的HTML標記參數。但是,與不同的HTML解析實現類似,不同的瀏覽器也實現不同的CSS解析行為。CSS允許縮放、定位或修飾HTML標記,而不受原始HTML標記約束的限制。與HTML標簽值類似,CSS內部的值可以由用戶控制或由外部提供,這使得CSS對于Web安全至關重要。
JavaScript
JavaScript[14]是一種簡單而強大的面向對象編程語言。它既在Web瀏覽器中運行客戶端,也作為Web應用程序的一部分在服務器端運行。該語言旨在在運行時進行解釋,并具有受C啟發的語法。JavaScript支持無類對象模型,提供自動垃圾回收以及弱和動態類型。客戶端JavaScript不支持開箱即用的I/O機制。相反,一些有限的預制接口由瀏覽器內的本機代碼提供。服務器端JavaScript(例如,Node.js[26])支持各種I/O機制,例如網絡和虛擬訪問。下面的討論將集中在Web瀏覽器中的客戶端JavaScript。瀏覽器中的每個HTML文檔都有其JavaScript執行上下文。文檔上下文中的所有腳本共享相同的沙箱(參見第2.4節)。通過特定于瀏覽器的API支持腳本之間的上下文間通信。但是,執行上下文通常彼此嚴格隔離。上下文中的所有JavaScript塊都以明確定義的順序單獨執行。腳本處理包括三個階段:
分析會驗證腳本語法,并出于性能原因將其轉換為中間二進制表示形式。在解析完成之前,代碼無效。忽略具有語法錯誤的塊,并解析下一個塊。
函數解析注冊解析器在塊中找到的所有命名的全局函數。可以從以下代碼訪問所有已注冊的函數。
執行運行功能塊之外的所有代碼語句。但是,異常仍可能導致執行失敗。
雖然JavaScript是一種非常強大和優雅的腳本語言,但它帶來了新的挑戰和安全問題,例如跨站點腳本漏洞(參見第4.1節)。
網站組裝
Web Assembly(Wasm)[27]是一種高效且快速的二進制指令格式,大多數現代瀏覽器供應商都支持這種格式。它是一種基于堆棧的虛擬機語言,主要旨在以本機速度在客戶端計算機上執行。用Web Assembly編寫的代碼是內存安全的,并受益于與網站關聯的常規代碼提供的所有安全功能。Web Assembly代碼是沙盒化的,強制執行同源策略(參見第2.4節),并且僅限于相應網站權限提供的資源。此外,Web Assembly代碼可以訪問在同一源容器中運行的JavaScript代碼,并將其功能提供給來自同一源的JavaScript代碼。
網頁視圖
Web Views是Web ization和移動應用程序的進一步趨勢,它們允許將Web內容輕松集成到移動應用程序中[28]。開發人員可以將應用程序與HTML和JavaScript集成,并從可移植性優勢中受益。Web View在常規移動應用程序的上下文中運行,并允許與托管的Web內容進行豐富的雙向交互。移動應用程序可以從Web內容中調用JavaScript,并監視和攔截Web內容中的事件。同時,特定的JavaScript API允許WebView應用程序與WebView上下文之外的內容和傳感器進行交互。Web內容與本機應用程序內容的交互引發了新的安全問題,并導致應用程序到Web和Web到應用程序的攻擊[29,30,31]。App-to-Web攻擊,允許惡意應用程序將JavaScript注入托管的Web View,目的是泄露敏感信息或誘騙Web View導航到并向用戶展示不受信任和潛在的惡意網站。Web到應用攻擊將不受信任的Web內容注入應用,并利用應用的JavaScript橋接到底層主機應用。Web到應用程序攻擊的目標是將權限提升到其托管應用程序進程的級別。應用化和網絡化現象都導致了一種新的軟件分發方式。代替分散的下載源,出現了下一節中說明的集中式應用程序商店。