作者:heeeeen
公眾號:OPPO安全應急響應中心
0x00 介紹
所謂攻擊面,既是系統處理正常輸入的各種入口的總和,也是未授權攻擊者進入系統的入口。在漏洞挖掘中,攻擊面是最為核心的一個概念,超越各種流派、各種專業方向而存在,無論Web還是二進制,也無論Windows還是Android,總是在研究如何訪問攻擊面,分析與攻擊面有關的數據處理代碼,或者Fuzz攻擊面。漏洞挖掘工作總是圍繞著攻擊面在進行。
就Android系統和App而言,通常所知的本地攻擊面無外乎暴露組件、binder服務、驅動和套接字,遠程攻擊面無外乎各種通信協議、文件格式和網頁鏈接。然而,實際漏洞案例總是鮮活的,總有一些鮮為人知的攻擊面,出現的漏洞頗為有趣,甚至很有實際利用價值,所以這里準備寫一個系列,記錄發現的一些有趣漏洞。先來談談與用戶發生交互的對話框。
0x01 人機交互對話框
在AOSP的漏洞評級標準中,中危漏洞和高危漏洞的評級都有這么一條:
-
High:Local bypass of user interaction requirements for any developer or security settings modifications
-
Moderate: Local bypass of user interaction requirements (access to functionality that would normally require either user initiation or user permission)
系統中需要用戶交互進行確認的地方,一旦可以繞過修改安全設置或者產生安全影響,即認為出現了漏洞,這里與用戶交互的對話框就是一種特殊的攻擊面。
0x02 用戶確認繞過
在與用戶交互的對話框中,撥打電話對話框通常比較特殊,開發人員容易忽視其被外部直接調用繞過用戶交互后的安全影響。Android歷史上就曾出現這種漏洞,如CVE-2013-6272。
然而在一些流行的社交網絡軟件中,其VoIP撥號功能也容易出現此類漏洞,惡意程序可以繞過用戶交互直接撥號到另一個用戶,這樣另一個用戶就可以監聽受害用戶手機的麥克風,使受害用戶的隱私泄露。
俄羅斯知名的社交軟件VK.COM曾出現這樣一個漏洞: Bypass User Interaction to initiate a VoIP call to Another User
主要原因在于com.vkontakte.android.LinkRedirActivity可以傳入一個Provider,而這個Provider中可以指定其他用戶的id
ContentValues cr_vals = new ContentValues();
cr_vals.put("data1", 458454771); //target user_id
cr_vals.put("name", "unused");
當啟動該Activity的時候就會直接向指定id的用戶撥號。問題在于,作為撥號過程,這里需要設計一個對話框讓用戶確認。剛開始VK.COM并不認為這是一個漏洞,后來使用HackerOne的仲裁機制,邀請其他Android領域的知名安全專家一起參加討論才說服廠商,修復最終添加了一個確認對話框,用戶確認后才允許撥號。
同樣,Line也出現過類似的漏洞,繞過用戶交互向另一用戶撥打Audio Phone,Line將這個漏洞歸為Authentication Bypass,同樣在修復中加入了一個用戶確認對話框。
0x03 用戶確認欺騙
除了對話框繞過以外,攻擊者還可以在對話框中顯示欺騙的內容,達到clickjacking的效果。
CVE-2017-13242: 藍牙配對對話框欺騙
這個漏洞發生在我們經常使用的藍牙配對對話框中,如下圖是正常的藍牙配對對話框:

這里的Angler是對端的藍牙配對設備。但是這個設備名是攻擊者可控的,能否在這個攻擊面上造成安全影響呢?
我們將對端的藍牙配對設備名變長,并插入一個換行符,改為“Pair with Angler \n to pair but NOT to access your contacts and call history”,那么藍牙配對對話框顯示為:

雖然有一些奇怪,但用戶一定會在是否共享通訊錄和通話記錄這個問題上比較糾結,“是的,我允許配對,但我不想共享通訊錄和通話記錄!”于是,誤導配對用戶勾選下面的復選框,反而達到與用戶期望相反的目的,正中攻擊者的下懷。
這個漏洞于2018年2月修復,可惜Google的修復并不完全,只是在Settings App中的Strings.xml作了限制,不允許對端配對的藍牙設備名傳入,將配對對話框中的提示內容變成了一個固定的字符串。但是,這個修復并不完全,沒有考慮到其他藍牙連接的入口。
CVE-2018-9432: 藍牙通訊錄和短信訪問協議對話框欺騙
Android藍牙協議還支持PBAP和MAP Server,分別用于其他設備通過藍牙訪問手機的通訊錄和短信,通常我們開車時通過藍牙撥打電話、訪問手機通訊錄就使用了PBAP協議。通過PBAP協議和MAP協議,可以無需配對,直接在手機上彈出對話框,讓用戶確認是否訪問通訊錄和短信。PBAP協議確認對話框如下圖所示:

但同樣,臨近攻擊者可以將配對設備heen-ras重新命名,并插入許多的換行符
pi@heen-ras:~ $ sudo hciconfig hci0 name "heen-ras 想要訪問你的通信錄和電話簿, 要拒絕它嗎?
>
…(skip)
>
> "
然后再次通過PBAP協議訪問手機通信錄,使用"nOBEX"這個腳本
pi@heen-ras:~/bluetooth-fuzz/nOBEX $ python3 examples/pbapclient.py <victim_bluetooth_address>
此時通訊錄確認對話框如下:

對比上下兩圖,確認對話框中的重要信息被隱藏了,并顯示出相反的結果。在內部實際環境進行模擬檢測,發現普通用戶對此毫無招架,一般都會選擇“是”,結果通訊錄被全部竊取。這個漏洞最終于2018年7月修復,使用的方法是在BluetoothDevice類中過濾配對藍牙設備名中的\r\n字符。
值得一提的是,同樣是插入攻擊設備藍牙適配器的換行符,還可以遠程注入藍牙配置文件,攻擊者可以設置藍牙設備名繞過配對與Android設備建立藍牙連接,這個嚴重級別的漏洞也在去年所修復,與上述兩個漏洞異曲同工。同樣是攻擊面思維,漏洞作者將可控的藍牙設備名傳入藍牙配置文件帶來安全影響,而我們這里則是將藍牙設備名傳入配對對話框欺騙普通用戶。
小結
從攻的角度來看,對話框是一種特殊的攻擊面;從防的角度來看,對話框也是一種重要的安全機制,開發者需在對安全或隱私有影響的操作前設置用戶交互對話框,在用戶同意后才可進行敏感操作,并仔細檢查對話框中傳入的內容,防止對用戶進行點擊欺騙。
參考文獻
-
https://source.android.com/security/overview/updates-resources
-
https://curesec.com/blog/article/blog/CVE-2013-6272-comandroidphone-35.html
-
https://android.googlesource.com/platform/frameworks/base/+/a6fe2cd18c77c68219fe7159c051bc4e0003fc40
-
http://sploit3r.xyz/cve-2017-13284-injection-in-configuration-file
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1174/
暫無評論