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