Pegasus間諜套件內部原理及流程剖析
事件介紹
這篇報道是關于最近發生的在全球范圍內活躍的APT間諜軟件的深度研究,Lookup團隊已經捕獲了樣本,并且在一臺全新的iOS設備上進行了深度研究。NSO集團提供的間諜軟件套裝名為Pegasus(可戲稱為天馬流星拳),Pegasus是一套高度定制化和自動化的間諜軟件,其內置三叉戟(3個iOS的0day漏洞組合),可以有效刺破iOS的安全機制,抵達內核,完全控制手機,然后竊取其中數據。運用動態庫hooking的方式來破壞內核層與應用層的安全機制,包括且不限于語音、電話、GMAIL、FACEBOOK、WHATSAPP、FACETIME、VIBER、WECHAT、TELEGRAM等等,不管是蘋果的內置應用還是第三方應用,完全不能幸免(因為拿到了root權限,監控軟件的進程已經是上帝模式)。Pegasus所使用的三叉戟漏洞,已經被蘋果在最新的iOS 9.3.5中修補完成,下文中將對其進行詳細的介紹。
根據最新的報道,NSO集團從2010年開始就已經出售武器化的監控軟件套裝給企業和組織,到眼前被發現為止已經存在了很長一段時間來了,其宣稱組合使用了高維度的系統組合漏洞來完成滲透和攻擊,可以輕易地進入iOS、安卓和黑莓系統,竊取其內部信息。
這款間諜軟件高度隱蔽并且模塊化,易于定制。它使用了高強度的加密來保護自身不被傳統殺毒軟件發現,并且保證被發現之后進行“自爆”,提高取證難度。我們的報告指出三叉戟漏洞包含以下三種漏洞的組合:
- CVE-2016-4657:Safari的Webkit內核上的內存泄露漏洞,用戶點擊之后攻擊者可以占領這臺機器。
- CVE-2016-4655:內核信息泄露漏洞繞過KASLR,攻擊者可以計算出內核的基質,鎖定內核的位置。
- CVE-2016-4656:iOS內核內存漏洞導致越獄,不管是32位還是64位均可以越獄其內核,并安裝監控軟件。
根據代碼顯示,這款間諜軟件套裝至少存在了超過兩年的時間,代碼里顯示部分配置適配于iOS 7,這個版本蘋果在2013年就發布了。
Pegasus利用了我們的生活已經離不開移動手機這一特點,手機是一款一直聯網的終極信息管理終端。手機用戶覺得他們的手機非常安全,毫無破綻,他們使用手機來發送/接受位置、打電話發送語音、進行社交和工作,但是他們不知道其實手機已經被Pegasus完全監控了,他們的一舉一動均在NSO集團的掌握之中。Pegasus的一份授權賣25000美元,他們賣掉了300份授權,得到了超過800萬美元的收入。
這份報告深入研究了Pegasus從開始到結束的技術細節,包括三叉戟漏洞的利用細節,以及監控組件的技術實現,讓大家看一看一款監控軟件究竟可以干哪些事情,并且做到什么地步。
三叉戟漏洞是最新的漏洞,一直到iOS 9.3.4版本依然有效,直到我們跟蘋果合作,推出了9.3.5之后,才偃旗息鼓。請升級到最新的9.3.5,以確保自己的手機安全。
0×01.背景
隨著移動設備進一步的滲透進我們的日常生活當中,惡意軟件作者就瞄上了這塊巨大的市場,持續的開發木馬間諜軟件運行于受害者的設備上,受害者卻渾然不知。這些暗黑的項目中,有些是為了謀財,例如廣告木馬、銀行卡木馬、或者短信欺詐,有些則是為了竊取組織或者個人情報,例如高度定制的系統級別木馬,在受害者毫不知情的情況下,偷偷把信息傳回控制服務器。
間諜軟件通常可以做到收集受害者的短信、聯系人、通話記錄、通話錄音,或者遠程開啟攝像頭和麥克風,對目標進行監聽和監視。包括錄下聲音和視頻,傳回控制服務器。
有些間諜軟件甚至可以做到傳播病毒和木馬,以受害人手機為基礎和跳板,進一步攻擊最終目標。這項技術非常復雜和冒險,攻擊者往往得掌握著目標系統的0day漏洞才能成功。所以不管是私人安全公司還是企業系統均推出漏洞回饋計劃,有償征集系統漏洞。
兩家私人安全公司Gamma集團和Hacking Team公司,自從被爆出開發了移動平臺監控軟件并出售給政府機構之后,都上了各大媒體頭條。這些監控軟件造價不菲,功能豐富,往往只有大金主才能使用,里面內置的0day漏洞更是確保其行動萬無一失。
以色列NSO集團平時行事低調,不顯山不露水,這次行動已經進行了五年之久,也沒人發現。這家由Niv Carmi,Shalev Hulio,和Omri Lavie在2010年建立的NSO集團宣稱,已經把自己開發的監控軟件賣給了各國的政府集團。他們宣傳自己的監控軟件是無法被檢測的,其中以為創始人還說:“我們是名副其實的魅影”。私人公司費城兄弟在2014年以1.1億美元收購了NSO集團。在此之外,NSO集團還組建了移動軟件安全公司Kaymera,既射門,又守門,風光無限,一時無兩。
0×02.時間線
- 2016.08.12 Citizen Lab報告監控軟件給Lookout團隊
- 2016.08.15 兩家團隊合作分析這款間諜軟件所使用的技術之后,提交給了蘋果
- 2016.08.25 蘋果釋放9.3.5更新,封堵漏洞
Pegasus間諜套裝
攻擊的方式很簡單,有效載荷的傳播也是靜默方式。攻擊者給受害者發送一個URL,可以是短信、郵箱、社交軟件或者任何其他方式,受害者僅需點擊一下鏈接,服務器就開始向受害者的手機傳輸攻擊載荷,遠程越獄受害者的手機,然后安裝監控軟件。一切都是在受害者不知情的狀況下發生的,受害者唯一可以察覺的就是按下這個鏈接之后,瀏覽器自動退出了。
監控軟件包含木馬代碼和程序,用來監控、收集數據并且上傳到服務器,受害者的一舉一動盡在攻擊者的掌握之中。監控軟件可以完全控制以下軟件:GMAIL,FACETIME,FACEBOOK,LINE,MAIL.RU,CALENDAR,WECHAT,SURESPOT,TANGO,VIBER,SKYPE,TELEGRAM,KAKAOTALK。
為了達到完全靜默監控,監控軟件不會下載這些軟件的木馬版本,重新安裝到受害者手機上。而是采用預裝的版本,包括系統軟件和用戶安裝的軟件。
一般情況下,iOS的系統是為軟件做好分離設計的,軟件之間是無法通信甚至無法知道對方存在的。但是越獄后的系統確是可以通過hooking的方式來監控其他軟件的。三叉戟軟件套裝通過加載其動態鏈接庫到目標進程的方式,可以應用于hook那些安裝有Cydia Mobile Substrate框架的軟件。這個框架在越獄社區非常有名,三叉戟套裝也使用了這個框架。
用戶感染了Pegasus之后,手機處于完全的監控狀態之中,包括電話錄音,通話記錄,短信,麥克風/攝像頭實時通信(幾乎變成對講機)。在這個階段獲取到信息之后,監控者可以將這些信息用于下個階段的入侵,例如拿到你的銀行卡賬戶和密碼,拿到郵箱賬戶密碼,以及社保等等。
受害者點擊鏈接之后,攻擊者展開攻擊。攻擊分為三個階段,每個階段都包含了攻擊模塊代碼和隱蔽軟件。攻擊是線性的,每個階段都依賴于上個階段的代碼、隱蔽軟件的成功,每個階段都使用了關鍵的三叉戟漏洞,以確保進攻成功進行。
階段一:傳遞Safari內核的Webkit漏洞,這個階段是誘使受害者點擊一個網站地址,誘發漏洞,執行代碼,位32位機器和64位機器分別下載用于下個階段的代碼;
階段二:這個階段是執行上個階段下載來的代碼,代碼是一段加密后的亂碼。每個下載都是用單獨的密碼單獨加密的,傳統的云端特征碼檢測技術在此失效(大多數殺軟均采用特征碼技術),這些代碼中含有內核基質定位代碼和UAF漏洞利用代碼,并且包含了代碼解密程序。在此階段內核基質被定位并被越獄。
階段三:這個階段設備開始安裝上個階段下載解密好的監控程序Pegasus,并且動態庫hooking到想要監控的程序,程序也會檢測設備是不是已經通過其他方法越獄過,如果是,則移除任何第三方控制方式(例如SSH),使其成為Pegasus專屬監控設備。程序也會監控三個階段的執行是否成功,如果失敗(或者特定狀態下),則清除自身不留痕跡,春夢了無痕。
階段三使用的程序部署在一個tarball里面(test222.tar),每段代碼都有其自己的目的,稍后詳述。
- # ca.crt - root keystore中的TLS certificate
- # ccom.apple.itunessotred.2.csstore - standalone模式的JavaScript代碼,會在重啟時執行。用于在重啟時執行未簽名的代碼以及靜默維持jailbreak。
- # converter - 根據pid來入侵dylib。這只不過是把Cydia開源軟件庫中的cynject程序重命名而已。
- # libaudio.dylib - 通話錄音的基礎庫
- # libimo.dylib - imo.im的嗅探庫
- # libvbcalls.dylib - Viber的嗅探庫
- # libwacalls.dylib - Whatsapp的嗅探庫
- # lw-install - 安裝換新所有嗅探庫
- # systemd - 發送報告及文件到服務器
- # watchdog
- # worked - SIP模塊
我們檢測到的攻擊最高可以用于iOS 9.3.4版本,攻擊者維護著一份龐大的代碼庫用于攻擊iOS從7到9.3.3,我們檢測的代碼中沒有9.3.4的配置信息,但是對于9.3.4版本依然有效(我們知道9.3.4的發布,僅僅是為了封堵盤古團隊手上的漏洞,盤古團隊手上的漏洞可以越獄到9.3.3)。所以我們推薦大家升級到9.3.5。
另外一個特性就是,標準的越獄檢測程序無法檢測到設備已經越獄,因為攻擊者的目標是盡可能的隱蔽。所以受害者的設備哪怕在專業程序的檢測下,依然是“未越獄”的狀態。
0×03.專業開發團隊
Pegasus有著模塊化的設計,簡單高效。比如它維護者一份magic table,用來分辨不同設備,不同iOS版本號下的內核內存基址,iOS 9.2.1在iPhone 6上的內核內存基址如下圖所示:
這樣就算出了每個程序在內存中的地址(基于內核地址的偏移量),這個信息在破解時幫了大忙。
另外,模塊化的代碼命名方式對于我們的剖析內部構造也是非常有力,例如libwacalls就是Whatsapp的嗅探庫,libvbcalls就是Viber的嗅探庫,代碼及其高效簡潔,這跟其他木馬作者不同,其他作者總是盡全力隱藏其目的,而Pegasus是木馬界的一股清流。
還有,程序健壯,高可用也是充分保證的,哪怕在最初階段我們也發現了他們的debugging代碼和QA標準,這些都是企業級別測試組織流程。
0×04.革命性的軟件
這款木馬已經運作了數年,這足以讓我們產生給它頒發一座軟件健壯大獎的沖動,并且它還支持所有ihone型號上運行的所有iOS版本,從iPhone 4s到iPhone 6s Plus。
這是一段證明其適用于iOS7 (發布于2013年)的代碼片斷。
剖析“三叉戟”漏洞
這套間諜軟件內置了三個iOS系統內核漏洞,這里稱之為“三叉戟”漏洞。這套漏洞組合在iOS 9.3.3上被發現,在9.3.4版本上也運行良好,于9.3.5版本被蘋果封堵。
0×05.CVE-2016-4657:Safari的Webkit內核上的內存泄露
在Safari的Webkit內核上存在的內存崩潰漏洞,使攻擊者可以執行任意代碼。Pegasus利用這個漏洞在Safari的進程中獲取初始化代碼執行權限。這個漏洞比較復雜,我們將繼續分析,持續報道。
0×06.CVE-2016-4655:內核信息泄露漏洞繞過KASLR
在Pegasus可以執行jailbreak之前,它必須先知道內核位于內存的哪里。蘋果的內核基址隨機化技術使得內核在內存中出現的方式完全隨機,找不到內核在哪里,攻破內核更是無從談起了。Pegasus利用了iOS內核讀取棧數據時缺乏邊界檢查,導致Pegasus能夠獲取棧上額外的數據,而函數的返回地址一般會被保存在棧上,刺探到了內核的基址。
0×07.CVE-2016-4656:iOS內核內存漏洞導致越獄
這個漏洞則是一個典型的UAF漏洞,通過精心構造數據可以在Free之后先分配對象來重新占用之后再觸發Use,也可以進一步轉換成double free,獲取內核態的執行權限從而執行越獄代碼。
0×08.越獄維持技術
一旦內核被攻破了,Pegasus開始準備安裝越獄環境。
- # 關閉內核保護措施,例如代碼簽名
- # 重新掛載系統分區
- # 清除Safari的緩沖區(清除攻擊痕跡)
- # 寫入越獄文件(包含主要加載器 /sbin/mount_nfs)
在上一節的階段二中,Pegasus會移除/etc/nfs.conf導致文件系統加載/sbin/mount_nfs(這就是階段三的越獄加載器),/sbin/mount_nfs是以root的權限運行的,所以越獄軟件接管了系統的完整權限。階段三結束后,Pegasus需要在重啟后也繼續維持越獄狀態,所以使用一段jsc二進制代碼替換了系統中的rtbuddyd,并且鏈接到CVE-2016-4657,達到越獄持久化。
木馬分析
Pegasus是我們檢測過的最隱蔽和最高效的間諜軟件套件。它使用神話般的方式來安裝和隱藏自己,一旦它躋身系統之中,它有一連串方式來隱藏通訊和達到反查殺的功能,并且hook到root和mobile進程中來收集系統和用戶信息。
0×09.安裝和持久化
軟件在階段三運行lw-install時安裝到受害者手機上。Lw-installl負責了持久化的的大部分設計功能,包括重啟后持續接管,以及另外一些小手段防止手機變磚。
Lw-install做的第一件事情,就是檢查iOS的版本號,根據手機運行的是iOS 9還是之前的版本執行不同的代碼。
如果用戶手機安裝的是iOS 9,lw-install會運行.plist上的/sbin/launchctl load 拖到/Library/LaunchDeamons(這個目錄通常是空的,或者用于存放越獄后開機啟動plist服務列表,例如SSHD),這樣可以保證重啟后立即運行。
如果運行的不是iOS 9,lw-install會先刪除一些數據,然后運行代碼,log文件在這里/private/var/wireless/Library/com.apple.wifid.r.log。
0×0901.持久化技術:JSC提權
Pegasus用jsc開發工具來實現越獄持久化,這個組件是包含在iOS環境之中的,其功能是使用戶可以在Webkit瀏覽器之外運行JavaScript代碼。在這個組件里的內存崩潰漏洞使得Pegasus執行代碼得到了持久化的能力。
持久化過程中,rtbuddyd這個守護進程被一段簽名過并有著運行權限的jsc代碼替換。系統重啟時,在early-boot階段假的rtbuddyd會運行,鏈接到com.apple.itunesstored.2.cstore文件,這個文件的結構與CVE-2016-4657類似,再次載入攻擊腳本攻破內核,進行越獄。過程如下:
- # 運行jsc代碼 –early boot
- # 運行攻擊代碼找到內核基址
- # 攻擊內核越獄
- # 釋放Pegasus監控套件,systemd、watchdogd。
上一次分析中我們就提到,Pegasus的自我保護和反偵察功能是優先于監控功能的。也就是說,寧可不再監控,也要保護自己不被發現,因為一旦被發現、分析(這就是我們現在在做的事情),馬上就會變成眾矢之的,尸骨無存了。
所以,Pegasus有一大堆功能來保持其隱蔽性和靜默性,它持續地監控手機狀態并且阻止任何其他的方法來越獄/連接手機,并且當紙包不住火時,它有完整的自毀功能,從手機里完整的移除自己。
0×0902.禁用更新
階段三禁用了軟件更新,使手機無法收到任何軟件更新提示信息。
0×0903.檢測越獄狀態
階段三會檢測手機是否已經越獄;
Pegasus每次啟動時也會檢測一次是否越獄。
0×0904.監控設備
為了可以持續監測和通訊,Pegasus禁用了系統的“深度睡眠”功能。(so那些受害人需要頻繁充電?)
軟件也在監測電池狀態。同時監測網絡狀態,查看是否是運營商網絡或者wifi網絡,可能是用于選擇何時合適將所有數據上傳服務器。
0×0905.靜默上傳至C&C服務器
Pegasus擁有多種靜默通信方式,systemd貌似使用的是短信方式。
盡管看上去像一條來自谷歌的密碼重置短信,這個短信實際上是發給Pegasus的更新C&C服務器的指令命令行。Pegasus可以接受5種像這樣的命令短信,指令ID是驗證碼中的最后一位,在這個例子中就是9。
這個功能可以在http或者https不可用的時候,C2(C&C中繼服務器)服務器框架也下線的時候,這個功能就是Pegasus最后的救命稻草,指導它去發現新的C2服務器,這項前無古人的設計,確保了哪怕服務端已經完全down掉,發個短信也能迅速換新Pegasus。
短信的姿勢可以是這些:
0×0906.自毀
Pegasus有高度敏感的反偵察系統,保證其不被發現,當其貌似即將暴露的時候,它就會開始自毀進程,并且移除李鬼版本的rtbuddyd和com.apple.itunesstored.2.csstore 。
0×10.收集數據
收集數據作為Pegasus監控軟件的默認功能,是我們見過的間諜軟件中最高效完備,兼容性最高的。它收集所有有價值的信息,例如密碼、聯系人、日歷以及其他高價值信息的敲門磚,包括Sms,calendar,address book,gmail,viber,Facebook,Whatsapp,line,kakao,WeChat,surespot,IMO.im,mail.ru,tango,VK,odnoklashniki。
0×1001.日歷
作為高價值信息,Pegasus當然想要受害者的日歷。Systemd進程會抓取VCAL文件并通過短信發送出去。
0×1002.聯系人
Pegasus會抓取受害者的所有聯系人信息。
0×1003.GPS信息
Pegasus會抓取設備的GPS信息并發送出。
0×1004.捕獲用戶密碼
0×1005.捕獲Wifi和路由器密碼
Pegasus為了偷到用戶的所有密碼,會分析抓取所有的wifi的SSID ,wep/wpa密碼。已經蘋果的路由器airport,time capsule等等。
0×11.攔截電話與短信
Pegasus在后臺安裝好語音(libaudio.dylib)與短信(libimo.dylib)竊聽庫,這些庫非常健壯,但是還有一些特制的庫用于攔截關鍵協議。Libaudio.dylib庫注冊了許多觀察接口,這些觀察接口由Pegasus旗下眾多模塊發送ID進行觸發,在下面的例子中libwacalls和libvbcalls觸發了觀察接口,請見下圖。
0×1101.進程注入:converter
Pegasus使用converter來實時動態注入通訊軟件進程空間(例如Whatsapp),converter來源于cynject(這是Cydia的開源項目)。這個庫使用一個pid作為參數,然后使用Mach內核API注入一個dylib到目標進程,converter的使用方式如下:
另外,converter還有一個失敗模式,監聽鍵盤上的一個鍵,用來上傳一個自定義的dylib。
0×1102.Skype
Pegasus會抓取所有的Skype通話記錄,包含錄音。
0×1103.Telegram
0×1104.Whatsapp
Pegasus使用動態鏈接庫libwacalls.dylib來hook Whatsapp的關鍵進程并且監聽各種通信手段,通過我們捕獲的樣本,可以看出Pegasus已經對Whatsapp擁有了完整的攔截權限。Whatsapp在通話接通、打斷或者結束的時候libwacalls會發出系統級通知,其他軟件會接收到信號在他們知道ID的情況下,Pegasus的通知信號是獨特的并且并不復雜,他們是由56個字符組成的字符串,看上去是由sha224產生的。Pegasus的其他模塊會監聽這些ID并且開始工作。在Whatsapp的情況下我們發現這些信號由libwacalls發出,最終由libaudio.dylib捕獲并且開始錄音,錄制受害者的通話內容。
Libaudio.dylib把來自于Whatsapp的通話錄音保存在以下文件夾:
- # micFileName - /private/var/tmp/cr/x.<call_id>.caf
- # spkFileName - /private/var/tmp/cr/t.<call_id>.caf
- # sentryFileName - /private/var/tmp/cr/z.<call_id>.caf
Libwacalls.dylib首先通過試圖嘗試連接/usr/lib/libdata.dylib的文件的存在來確認Cydia Mobile substrate是否安裝在系統里,否則繼續執行解密字符串來定位需要hook的類和方法。Libwacalls.dylib負責hook CallManager類下的以下方法:
- # setCallConnected
- # setCallInterrupted
- # setCallInterruptedByPeer
- # endCall
還有CallLogger類里的addCallEvent方法。
所有的hook都依賴于系統通知機制IPC。
0×1105.Viber
我們捕獲的樣本中,Viber的hook動態庫libvbcalls會抓取所有的Viber通信記錄。Libvbcalls的hook方式與libwacalls類似,當電話接通和結束的時候,libvbcalls也會發送ID。
CallEnded用來hook通話的結束時間并且發送系統級的ID。
下列ID是libvbcalls發送的。
- # onCallStarted : eb899b6873eb166859e610915dd002ea21b6057bd31fc6c1b38f27e2
- # onCallEnded : b79cd49420fbeba629a0290bc890c66924dd8452d0c2fd5ba9b327d0
Libaudio.dylib收到ID后開始錄音,并且把通話保存到下列文件夾:
- # micFileName - /private/var/tmp/cr/x.<call_id>.caf
- # spkFileName - /private/var/tmp/cr/t.<call_id>.caf
- # sentryFileName - /private/var/tmp/cr/z.<call_id>.caf
0×12.實時監控
為了能夠監控手機的所有輸入和輸出,Pegasus可以實時錄制音頻和視頻。就好像Omri Lavie在Financial Times所說的“你們的手機現在就跟對講機沒啥區別”,請見下文函數:
結論
我們依賴手機來存儲數碼資產,手機一直帶在身邊已經成為了我們的語音、視頻、文字一體化通訊系統。里面的很多秘密,成為罪犯的攻擊目標。NSO集團作為網絡武器商,擁有數百名員工,并且每年收入數百萬美元。NSO只是一個例子,但是我們知道他并不是唯一的一個,就像我們知道的Hacking Team,Finisher,還有其他的互聯網組織。這個軟件只是iOS版本,據報道還有Android和Blackberry版本。
這份文件告訴我們,維持手機系統版本up to date的重要性,還有就是即使是最新版的軟件,也要保持警惕。
0×13.附錄A:TLS證書信息
0×14.附錄B:越獄檢測IOCs信息