进一步考察与UI相关的安全漏洞-下
提取私人信息
在介紹這個(gè)漏洞之前,讓我們先了解一下占位符。眾所周知,當(dāng)我們與自動(dòng)填充建議的用戶界面互動(dòng)時(shí),如果將鼠標(biāo)懸停在每個(gè)建議的條目上,都會(huì)發(fā)生一些有趣的事情。一個(gè)占位符值將被放置在我們?cè)噲D填寫的任何輸入中。不過(guò),這個(gè)占位符的值不應(yīng)該允許網(wǎng)頁(yè)隨意訪問(wèn):只有當(dāng)用戶明確選擇了他們認(rèn)為合適的條目后,瀏覽器才能讀取自動(dòng)填充數(shù)據(jù)。除此之外,占位符將被設(shè)置為所有具有匹配名稱的輸入。這意味著信用卡號(hào)碼、地址、用戶名、全名等都可以被提取出來(lái)。
我第一次意識(shí)到這個(gè)微妙的安全問(wèn)題是因?yàn)檫@個(gè)漏洞(作者M(jìn)ark Amery),它使用CSS/字體技巧來(lái)提取占位符數(shù)據(jù)。
現(xiàn)在回到這個(gè)漏洞本身。在試圖找出我之前提到的問(wèn)題(關(guān)于瀏覽器用戶界面的偽造)的解決方案時(shí),我偶然發(fā)現(xiàn)了一個(gè)有趣的行為。在研究問(wèn)題(2)時(shí),我在自動(dòng)填充出現(xiàn)時(shí)切換了輸入的類型,結(jié)果導(dǎo)致自動(dòng)填充的用戶界面一直存在。在這個(gè)例子中,我所做的不是改變輸入類型,而是在第一個(gè)自動(dòng)填充建議的用戶界面出現(xiàn)時(shí),讓另一個(gè)自動(dòng)填充用戶界面出現(xiàn):
1.用戶與一個(gè)輸入元素“A”互動(dòng)
2.自動(dòng)填充建議出現(xiàn)在輸入元素“A”上
3.讓自動(dòng)填充建議出現(xiàn)在輸入元素“B”上
4.從文檔中刪除輸入元素“B”。
這樣一來(lái),最后剩下的只有輸入元素“A”(包括來(lái)自自動(dòng)填充建議的占位符值),而實(shí)際的建議用戶界面并不存在。這對(duì)攻擊者來(lái)說(shuō)是好事,因?yàn)楝F(xiàn)在他們有充分的時(shí)間來(lái)提取數(shù)據(jù),而以前,一旦自動(dòng)填充建議消失,占位符值就會(huì)被刪除。
下面是針對(duì)這一特定行為的小型PoC:
hit down arrow < Br >< br >< form id="qsub" >< input id="qa" name=email placeholder="tester" type=text autocomplete=email >< /form >< form name="addr1.1" id="paymentForm" action="" method="post" >< input type="text" id="nameInput" name="name" autofocus >< /form >< script >nameInput.onkeydown = (e) = > {setTimeout((g) = > {qa.click();qa.focus();document.execCommand("insertText", false, "\u0000");qa.remove();}, 215);}; < /script >我發(fā)現(xiàn)有兩種方法可以提取這些數(shù)據(jù)并將其暴露在網(wǎng)頁(yè)上,具體如下所示。
CVE-2021-21177:拖放占位符的值
一個(gè)有趣的函數(shù)是document.execCommand(‘selectAll’),其作用就是選擇一個(gè)可編輯文檔中的所有文本(我們可以通過(guò)contenteditable=true屬性將所有元素設(shè)置為可編輯)。我注意到,當(dāng)占位符停留在輸入中時(shí),如果執(zhí)行這個(gè)命令,它將被選中。不夠,由于我們無(wú)法自動(dòng)復(fù)制和粘貼所選的值(沒(méi)有剪貼板使用權(quán)限),所以,我使用了另一種方法:拖放!
所以,漏洞利用過(guò)程變?yōu)?#xff1a;
1.讓用戶點(diǎn)擊頁(yè)面
2.觸發(fā)占位符持久性故障
3.誘使用戶拖放頁(yè)面的一部分
前面,我們已經(jīng)介紹了完成任務(wù)(1)的方法,對(duì)于任務(wù)(2),我的方法是放置一個(gè)冒充iframe的圖片,當(dāng)用戶試圖使用不存在的滾動(dòng)條向下滾動(dòng)時(shí),他們會(huì)在不知不覺中拖放他們的自動(dòng)填充占位符值。
【學(xué)習(xí)視頻】
基于拖放方法的原始PoC可以從這里找到。
在這個(gè)漏洞的相關(guān)報(bào)告中,最初的討論似乎是為了防止拖放適用于占位符的值。實(shí)際上,已經(jīng)有一個(gè)CSS可以做到這一點(diǎn)“ -webkit-user-select: none;”。但這還不夠,主要問(wèn)題是自動(dòng)填充數(shù)據(jù)的持久性。
實(shí)際上,拖放已經(jīng)是一種經(jīng)常遇到的用戶互動(dòng)了,所以我想看看是否可以用一個(gè)更好的提取占位數(shù)據(jù)的方法來(lái)代替它。CSS和字體似乎根本不適用于占位符數(shù)據(jù),所以,經(jīng)過(guò)一番折騰,我最終發(fā)現(xiàn)了一個(gè)不同的方法。
CVE-2021-21177:使用window.find()提取占位符的值
這個(gè)函數(shù)一出現(xiàn)在我的腦海中,我就對(duì)它抱有很大的期望,結(jié)果確實(shí)如此。
眾所周知,window.find()是一個(gè)非常有用的API,網(wǎng)頁(yè)通過(guò)它對(duì)自身的內(nèi)容進(jìn)行搜索。假設(shè)我們有一個(gè)只有Hello World文本的文檔,那么window.find(“Hello”)==true,window.find(“World”)==true,當(dāng)然window.find(“doesntexist”)==false。
現(xiàn)在,完整的漏洞利用過(guò)程如下所示:
1.用戶按下向下箭頭
2.觸發(fā)占位符故障
3.使用window.find提取占位符
這意味著,用戶只需要在一個(gè)惡意的頁(yè)面上按下方向鍵,我就能提取很多私人信息,其中最危險(xiǎn)的是信用卡信息。
【學(xué)習(xí)視頻】
原始PoC可以從這里找到。
CVE-2021-21216:隱藏自動(dòng)填充建議的用戶界面
我們知道,有一些UI應(yīng)該始終顯示給用戶。其中,最受歡迎的是當(dāng)我們進(jìn)入全屏?xí)r出現(xiàn)的“You are now in fullscreen”的信息。由于進(jìn)入全屏后,由于瀏覽器的頭部會(huì)消失,因此,攻擊者可以輕易通過(guò)偽造的信息來(lái)代替它來(lái)欺騙用戶的。
我清楚地認(rèn)識(shí)到,自動(dòng)填充建議的用戶界面和全屏用戶界面一樣重要。這是因?yàn)?#xff0c;在它從未顯示出來(lái)的情況下,攻擊者就可以讓用戶按下某些鍵盤按鈕,并神不知鬼不覺地用自動(dòng)填充值來(lái)填充隱藏的輸入元素。關(guān)于這一點(diǎn),我也是從一個(gè)漏洞利用代碼中領(lǐng)悟到的:相應(yīng)的PoC是一個(gè)游戲,以獲得提取數(shù)據(jù)所需的用戶手勢(shì)。
使用一個(gè)類似于之前討論的本地瀏覽器偽造的漏洞,我注意到:可以讓自動(dòng)填充建議的UI“出現(xiàn)”在用戶屏幕之外。因此,換句話說(shuō),攻擊者可以讓用戶看不到自動(dòng)填充的用戶界面,盡管該界面確實(shí)存在。
利用這個(gè)漏洞的方法非常簡(jiǎn)單:
1.誘騙用戶訪問(wèn)惡意頁(yè)面,設(shè)法讓他們點(diǎn)擊向下的箭頭。
2.讓隱藏的自動(dòng)填充出現(xiàn)在屏幕外的某個(gè)地方,并選擇第一個(gè)建議的結(jié)果,隨后用占位符的值填充多個(gè)隱藏的輸入。
3.讓惡意頁(yè)面誘導(dǎo)用戶點(diǎn)擊“Enter”鍵。
這樣的話,就能讓用戶會(huì)在不知不覺中用自動(dòng)填充數(shù)據(jù)填寫一個(gè)隱藏的表單。
【學(xué)習(xí)視頻】
原始PoC可以從這里找到。
自動(dòng)挖掘UI安全漏洞
我開發(fā)了一個(gè)審查UI安全問(wèn)題的工具,當(dāng)然,這只能算是我學(xué)習(xí)Fuzzer工作原理的副產(chǎn)品,因?yàn)槲以诩尤肽壳皥F(tuán)隊(duì)之前,從未真正使用過(guò)Fuzzer。這是一個(gè)非常簡(jiǎn)陋的工具,幾乎都不能算作Fuzzer,之所以這么說(shuō),是因?yàn)镕uzzer通常能夠發(fā)現(xiàn)內(nèi)存問(wèn)題。通常來(lái)說(shuō),瀏覽器的崩潰是出現(xiàn)安全問(wèn)題的明確信號(hào),但檢測(cè)用戶界面問(wèn)題卻沒(méi)有這樣明確的信號(hào)。所以,我為該工具設(shè)置了一個(gè)模式,以觀察的用戶可以手動(dòng)選擇某個(gè)東西看起來(lái)是不是很奇怪。
結(jié)果是,我既能發(fā)現(xiàn)內(nèi)存問(wèn)題的漏洞,也能發(fā)現(xiàn)與UI有關(guān)的設(shè)計(jì)缺陷。在繼續(xù)之前,讓我先介紹一下這個(gè)簡(jiǎn)單的自動(dòng)測(cè)試器是如何工作的。
?使用普通Web內(nèi)容可調(diào)用的UI列表及其相應(yīng)的PoC,我創(chuàng)建了一個(gè)測(cè)試用例,以隨機(jī)的順序隨機(jī)地顯示這些用戶界面。當(dāng)測(cè)試用例運(yùn)行時(shí),我就進(jìn)行某種導(dǎo)航操作:
-在歷史中導(dǎo)航-導(dǎo)航到一個(gè)新標(biāo)簽-打開一個(gè)彈出式窗口-在一個(gè)iframe中運(yùn)行測(cè)試案例 + (可選)呈現(xiàn)兩個(gè)按鈕,看看是否出現(xiàn)某些奇怪的東西-如果出現(xiàn):保存測(cè)試用例,并開始新的迭代-如果沒(méi)有出現(xiàn):直接開始新的迭代這個(gè)實(shí)驗(yàn)確實(shí)找到了一些有趣的結(jié)果,具體如下所示。
smartscreen:FlyoutShower中的堆使用后釋放漏洞(僅限Edge瀏覽器)
這個(gè)內(nèi)部漏洞是我最先發(fā)現(xiàn)的,該漏洞與Smartscreen有關(guān)。Smartscreen是Edge瀏覽器特有的一種功能,相當(dāng)于谷歌的安全瀏覽功能:進(jìn)行相應(yīng)的檢查,以確保下載的文件和訪問(wèn)的網(wǎng)站沒(méi)有被標(biāo)記為惡意的。
然而,它們的區(qū)別在于Edge處理被標(biāo)記為潛在網(wǎng)絡(luò)釣魚網(wǎng)站的網(wǎng)站的具體方式。如果我們使用Edge瀏覽器導(dǎo)航到這種類型的網(wǎng)站,就會(huì)看到:
因此,這自然成為我實(shí)現(xiàn)自動(dòng)化的UI調(diào)用命令之一。不久后,我發(fā)現(xiàn)Edge崩潰了,原來(lái)是瀏覽器進(jìn)程崩了。
< html >< body >< script >const blob = new Blob([`< iframe id="qss"src="https://nav.smartscreen.msft.net/other/areyousure.html"target="_blank" rel="noreferrer noopener" >< /iframe >`,], {type: "text/html"});var test = window.open(window.URL.createObjectURL(blob));var blank = window.open("about:blank");setTimeout(function() {blank.close();test.close();}, 1400);< /script >< /body >< /html >之所以出現(xiàn)這種情況,是因?yàn)镾martScreen UI沒(méi)有安全地處理指向WebContents對(duì)象的指針?biāo)隆T贑hromium和Edge瀏覽器中,WebContents對(duì)象是直接與標(biāo)簽的壽命掛鉤的。由于標(biāo)簽可以自行關(guān)閉,考慮到它們有一個(gè)開啟器,我們可以濫用調(diào)用這個(gè)用戶界面的自行關(guān)閉的標(biāo)簽,并可靠地令其崩潰。
使用這種技術(shù),我們?cè)贓dge和上游瀏覽器中還發(fā)現(xiàn)了其他一些與UI相關(guān)的漏洞,這些漏洞要么還沒(méi)有被完全修復(fù),要么沒(méi)有那么有趣,因此,這里就不介紹了。
CVE-2020-26953:繞過(guò)Firefox中的全屏UI
作為BVR團(tuán)隊(duì)的一員,我們被鼓勵(lì)對(duì)其他瀏覽器中進(jìn)行相關(guān)的安全測(cè)試。雖然Chromium的代碼庫(kù)與Firefox不同,但兩者可能具有相同的設(shè)計(jì)缺陷。這樣做的另一個(gè)好處是:可以了解Firefox是如何處理某種行為的,并從中獲得啟示。
在一個(gè)周末,我決定修改自己的工具,看看對(duì)Firefox的效果如何,結(jié)果發(fā)現(xiàn)一個(gè)UI設(shè)計(jì)缺陷不斷出現(xiàn),但并不穩(wěn)定。這個(gè)漏洞會(huì)導(dǎo)致瀏覽器進(jìn)入全屏?xí)r,通知用戶進(jìn)入全屏的UI完全不可見。
最初報(bào)告的PoC中有一個(gè)謎團(tuán):似乎只有在建立websocket連接并失敗的情況下,它才會(huì)起作用。不僅如此,你還必須不斷地把它改變到另一個(gè)無(wú)效的位置(假設(shè)是為了繞過(guò)任何緩存)。
原始PoC可以從這里找到。
一位Mozilla員工(Gijs)指出,PoC中神秘的websocket部分可以用卸載處理程序中的console.log()調(diào)用代替。這個(gè)變化對(duì)我來(lái)說(shuō)是個(gè)謎,console.log與全屏UI顯示與否有什么關(guān)系?如果您想了解其中的緣由,請(qǐng)參閱Bugzilla的相關(guān)報(bào)告。
按照上述報(bào)告給出的建議,我用卸載處理程序替換了websocket連接,還添加了一個(gè)blob導(dǎo)航,而不是導(dǎo)航到同一個(gè)頁(yè)面,最終得到了一個(gè)更可靠的PoC。
關(guān)于修訂版的PoC,可以從這里找到。
【學(xué)習(xí)視頻】
對(duì)我來(lái)說(shuō),這具有很重要的意義,因?yàn)檫@個(gè)漏洞是以半自動(dòng)的方式發(fā)現(xiàn)的,從而讓我看到了自動(dòng)挖掘邏輯/設(shè)計(jì)漏洞的潛力。
與標(biāo)簽相關(guān)的安全漏洞
標(biāo)簽是用戶界面的一部分,可以說(shuō)是瀏覽器中比較復(fù)雜的用戶界面之一。因此,當(dāng)我注意到標(biāo)簽頁(yè)中的一個(gè)安全漏洞被修復(fù)時(shí),我覺得這個(gè)代碼中一定還有更多的漏洞尚未發(fā)現(xiàn)。例如,通過(guò)標(biāo)簽,我們可以將它們添加到組中,進(jìn)行拖放,將一個(gè)窗口中的標(biāo)簽轉(zhuǎn)換成另一個(gè)窗口中的標(biāo)簽,反之亦然,等等。正如之前提到的,標(biāo)簽是可以自行關(guān)閉(如果它們有一個(gè)開啟器的話)的,這意味著網(wǎng)頁(yè)內(nèi)容可以控制標(biāo)簽的壽命。
我所做的事情,只是創(chuàng)建了一個(gè)腳本來(lái)打開標(biāo)簽,而這些標(biāo)簽會(huì)自行關(guān)閉;然后,在這個(gè)連續(xù)的打開和關(guān)閉標(biāo)簽的過(guò)程中,對(duì)標(biāo)簽的不同功能進(jìn)行了相應(yīng)的處理。
以下安全漏洞已被上報(bào)并隨后得到了修復(fù)。
CVE-2021-21197:TabStrip的堆緩沖區(qū)溢出
這里被利用的主要標(biāo)簽功能是將標(biāo)簽拖放到自己的窗口中的能力。當(dāng)一個(gè)標(biāo)簽在拖動(dòng)另一個(gè)標(biāo)簽到自己的窗口時(shí)關(guān)閉,就會(huì)發(fā)生崩潰。
相關(guān)的PoC可以從這里找到。
CVE-2021-21192:標(biāo)簽組中的堆緩沖區(qū)溢出漏洞
這里再次利用了拖放技術(shù),只不過(guò),這次拖動(dòng)的不是一個(gè)普通的標(biāo)簽,而是在標(biāo)簽關(guān)閉時(shí)將標(biāo)簽組拖出并拖入主窗口。
相關(guān)的PoC可以從這里找到。
CVE-2021-21154:頁(yè)簽列(Tab Strip)中的堆緩沖區(qū)溢出
您猜對(duì)沒(méi)錯(cuò):在一些標(biāo)簽關(guān)閉時(shí)拖動(dòng)一組標(biāo)簽會(huì)導(dǎo)致這種崩潰。在這個(gè)例子中,用到了通過(guò)按住shift鍵+選擇范圍來(lái)選擇標(biāo)簽的主要標(biāo)簽功能。
相關(guān)的PoC可以從這里找到。
CVE-2021-21180:標(biāo)簽搜索功能中UAF漏洞
該漏洞與一個(gè)相對(duì)較新的功能有關(guān),該功能使用戶能夠搜索自己的活動(dòng)標(biāo)簽。我發(fā)現(xiàn),這個(gè)新的標(biāo)簽搜索用戶界面實(shí)際上就是一個(gè)位于chrome://tab-search.top-chrome/的WebUI。
在這個(gè)標(biāo)簽搜索用戶界面中,我們可以關(guān)閉標(biāo)簽,但是,當(dāng)我們?cè)谧约旱拇翱谥写蜷_“chrome://tab-search.top-chrome/”,然后試圖使用標(biāo)簽搜索用戶界面的關(guān)閉機(jī)制來(lái)關(guān)閉自己時(shí),就會(huì)觸發(fā)UAF漏洞。
小結(jié)
我們希望本文能夠幫助讀者了解UI安全的相關(guān)知識(shí),正如您所看到的,這并不是一個(gè)單純的邏輯/設(shè)計(jì)問(wèn)題,因?yàn)橛袝r(shí)還會(huì)摻雜內(nèi)存損壞問(wèn)題。另外,UI安全的審計(jì)工作,是很難實(shí)現(xiàn)自動(dòng)化和模糊處理的,即使是圍繞著標(biāo)簽的內(nèi)存問(wèn)題也需要進(jìn)行拖放操作,但是幾乎沒(méi)有Fuzzer會(huì)模擬這些操作。由此看起來(lái),UI安全是自動(dòng)化漏洞挖掘領(lǐng)域中的一塊處女地,一旦獲得突破,將曝出更多的安全漏洞。
【領(lǐng)取網(wǎng)絡(luò)安全相關(guān)的學(xué)習(xí)資料】
總結(jié)
以上是生活随笔為你收集整理的进一步考察与UI相关的安全漏洞-下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进一步考察与UI相关的安全漏洞-上
- 下一篇: Chrome 0 day漏洞利用链