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