《iOS應用安全攻防實戰》第六章:無法銷燬的檔案
將一個普通的檔案系統想象為一個大的筆記本。當一個檔案被刪除時,許多人以為這一頁是被用“三福”牌記號筆完全塗黑了,就像關於51 區的機密文件那樣。但事實上,在這個操作背後所發生的一切更像是用一支很細的紅色筆在這一頁上面畫了一個巨大的X。檔案被標記為已刪除,但內容實際上還存在於筆記本上。所有想知道其看起來是什麼樣的人還是可以輕鬆地讀出它的內容,而不管有一個紅色的X 將它標記為已刪除。這就是庭審律師(不論是美劇Boston Legal
中的還是真實生活中的律師)如何從嫌疑犯的電腦裡還原出大量已刪除的檔案。蘋果公司也知道這一點,因此,在iOS 4
中開始使用一些特殊的精心設計的檔案系統加密方法來防止已刪除檔案被還原出來。然而,這種技巧並不完美,有時候檔案依然可能被盜。
在前面我們已經看到,iOS 4
和iOS 5
使用了加密的檔案系統,在這個檔案系統中的所有檔案都使用了一個唯一的金鑰進行加密。在檔案系統中,這個金鑰被儲存在名為cprotect
的屬性中,並且它實際上也是被所謂的AES-Wrap
方式加密的,加密它的金鑰或者是存放在NAND
可擦除區域的Dkey
,或者是保護等級金鑰中的一個。當刪除一個檔案時,該檔案的cprotect
屬性會隨之被丟掉。而拿不到這個屬性中的加密金鑰,檔案就無法被揭秘,那麼將其還原出來也就沒有意義。
想象一下,無論你走到哪裡都有一個秘書跟著,我們把這個秘書叫作Iris
。現在想象一下Iris
會幫你記住過去一兩個月所做的每一件事情,記住的方法則是記錄下所有你說過的話,當然,這麼做是你同意的。好,這麼做確實很有幫助,因為你有時候容易忘事,尤其是你喝了太多的咖啡並且經常性地情緒崩潰的情況下。你可以告訴Iris
在哪一天要和哪一個特定的客戶說些什麼,這樣她會在到時候複述給你聽。
但是Iris
(除了在你晨浴時總是帶來尷尬以外)有一個缺點,因為她會記住你所說過的所有內容,所以一不留意就會就記錄下你要交給客戶用來訪問你網站上一些檔案的密碼。你採用了非常嚴格的安全機制來保證你的密碼不會被洩露。但是Iris
始終和你在一起,如果有人能夠拿下她,那就能夠拿到你的客戶的所有檔案。
蘋果公司的HFS
日誌就是iOS
的電子版Iris
。HSF
日誌記錄了所有檔案系統的寫入、更改和刪除操作,這樣檔案系統不會在裝置毀壞或者電源無效後丟失資料。HFS
日誌使用EMF 金鑰加密,前面我們已經瞭解到,該金鑰儲存在NAND
的可擦除儲存區域中。EMF
金鑰並沒有使用需要的密碼來加密,所以任何人知道該怎麼做就都能夠輕易解密HFS
日誌,而不需要使用者的密碼。在第5 章中介紹的Sogeti
暴力破解工具除了可以從裝置中抽取所有其他的加密金鑰外,還具有這個額外的功能。當一個檔案的加密金鑰被寫入磁碟的cprotect
屬性中時,HFS
日誌會自動將它的一份副本記錄到磁碟中。
如果一個檔案已經被刪除,寫入到磁碟的加密金鑰會被抹掉,但是寫入到HFS
日誌中的那份副本並不會。這可能是因為HFS日誌功能早於HFS+加密卷出現,因此,其執行是獨立於加密功能以及檔案系統的其他附加功能的。除非蘋果公司從日誌中定位並且清除一個已刪除檔案的加密金鑰,否則可以竊取到這個金鑰副本並還原出原始檔案。
0x00 刮取HFS 日誌
在第5章中已經介紹了Sogeti
的免費資料保護工具套件,它包含一組用於解密iOS
檔案和鑰匙鏈資料的工具。這個套件中的另一個名為emf_undelete
的工具用於刮取出HFS
日誌中包含了檔案加密金鑰的cprotect
屬性。這個工具會嘗試著使用這些金鑰來解密磁碟中殘留的檔案。就像Iris一樣,HFS日誌只會儲存有限的一段時間裡的資訊,直到這些資訊成為更舊的資料被輪換出去。這段時間的長度取決於裝置的活躍程度,可能短到只有一天,也可能長達數週。裝置使用得越頻繁,HFS
日誌輪換出老舊資料就越快。
為了獲得日誌的內容,我們進入Sogeti
工具集的python_scripts
目錄下,執行其中的emf_undelete.py
指令碼,並輸入用RawTheft
載荷獲取到的原始磁碟映象。此外,還需要用第4 章中的KeyTheft
載荷獲取一份裝置的加密金鑰。
$ python emf_undelete.py rdisk0s1s2.dmg
Keybag: SIGN check OK
Keybag unlocked with passcode key
cprotect version : 2
Found deleted file record 109296 lto2.dat
Found deleted file record 111607 NetworkInterfaces.plist
Found deleted file record 111939 com.apple.AutoWake.plist
Found deleted file record 111571 com.apple.PowerManagement.plist
Found deleted file record 109294 com.apple.network.identification.plist
Found deleted file record 111874 com.apple.wifi.plist
Found deleted file record 111871 preferences.plist
...
當指令碼執行時,會去掃描日誌中已刪除的檔案和加密金鑰,然後,它會執行第二遍掃描,將資料抽取到兩個名為junk
和undelete
的目錄中。其中,undelete
目錄包含指令碼可以驗證已經成功解密的檔案;junk
目錄則包含它無法驗證的那些,但也許仍然是有效的。
這個EMF 反刪除指令碼中預先寫入了一些基本的檔案頭部(稱為magic
值),它使用這些頭部來判斷檔案是否有效。檢查一下hfs/journal.py
檔案的isDecryptedCorrectly
函式,就會看到它們。
magics=["SQLite", "bplist", "<?xml", "\xFF\xD8\xFF", "\xCE\xFA\xED\xFE"]
"""
HAX: should do something better like compute entropy or something
"""
def isDecryptedCorrectly(data):
for m in magics:
if data.startswith(m):
return True
return False
事實上,我們應該對它做些改進以取得更好的效果。上面的實現方法限制了反刪除指令碼可以驗證的檔案型別。要改進這個功能,並減少被移到junk
資料夾的有效檔案數量,可以將這個函式用下列程式碼替換:
def isDecryptedCorrectly(data, filekey):
filename = "/tmp/%s.bin" % (filekey.encode("hex")[:8])
write_file(filename,data)
filetype = commands.getoutput("/usr/bin/file -b %s" % filename)
os.unlink(filename)
print "file type for %s: %s" %(filename, filetype)
if filetype == "data":
return False
return True
上述程式碼會呼叫一個名為file
的外部程式。該程式是一個包含在Mac OS X
系統中的UNIX
工具,用於判斷檔案型別。它可以識別出非常多的有效檔案,判斷一個成功解密後的檔案是否有效、可讀,並且給出更精確的結果。當file 工具無法判斷正在檢視的這個檔案是哪種型別時,會簡單返回一個通用的data
型別。
雖然file
工具更加精確,但是它也無法識別專有版權型別的檔案。如果你的應用軟體在一些特定檔案中使用了自定義的格式,由於反刪除工具無法識別它們,你可能得去junk
資料夾中查詢。
0x01 還原閒置空間
徹底掃描未分配的空間,這是試圖恢復已刪除資料的最後方法。在反刪除工具中預設禁用該功能,因為要刮取未分配的記憶體需要相當長的時間,而且效果通常也並不太好。
可以透過編輯hfs/journal.py
指令碼來啟用這個功能。在該檔案的最底部附近,有一個對carveEMFemptySpace
的呼叫,但是被一條if False
語句禁用了:
if False:
fks = set(reduce(lambda x,y: x+y, filekeys.values()))
print "%d file keys left, try carving empty space (slow) ? CTRL-C to
exit" % len(fks)
raw_input()
carveEMFemptySpace(volume, fks, carveokdir)
將這條語句改為if True
,然後儲存這一修改。這樣,在原來的日誌操作完成後,就會看到開始還原的提示。
0x02 常被還原出來的資料
透過刮取HFS
日誌可以還原出許多不同的檔案來。事實上,任何曾經存在於檔案系統上的東西都可能被還原,尤其是像屬性列表、影像等較小的檔案。由於HFS
日誌的大小有限,因此,小檔案被還原出來的機率更大。
應用軟體螢幕截圖
當一個應用軟體掛起到後臺時,會有一個螢幕截圖被捕獲並寫入磁碟中。這是為了當使用者下次返回到應用軟體時可以產生出視窗縮放回到螢幕的效果,就好像應用軟體立即就從後臺載入起來一樣。事實上,應用軟體需要花一些時間載入回來重新變為活躍狀態,而這個動畫效果則給了軟體一些時間。
每一次應用軟體掛起時,應用軟體的截圖都會重複來一次,晚些時候再將截圖檔案刪除或者覆蓋。當一通電話進來時,或者其他可能導致應用軟體掛起的事件發生時,也會有截圖發生。從HFS 日誌中經常可以找到這些已刪除的應用軟體截圖,從而洩露你的應用
軟體中哪怕是最安全的加密資料的內容(見圖6-1)。
圖6-1.恢復出來的使用者郵件截圖,郵件軟體是取證中非常有用的工具
除了應用軟體截圖洩露,安全的網站也會面臨這一問題。不管是Google(見圖6-2),還是你在企業VPN 內部看到的機密郵件,截圖洩露都會導致保護得最好的資料變得不安全。
圖6-2.從一個Safari瀏覽會話中恢復出來的截圖
已刪除的屬性列表
從日誌中還經常能恢復出舊的屬性列表以及其他配置檔案。如果這些檔案中儲存了網站的機密資料、加密金鑰或者其他敏感資料,然後又被刪除了,這些資料還是有可能被恢復。一些應用軟體會先寫好一個明文的屬性列表,然後使用加密函式來對其中的資料進行加密。即便明文副本已被刪除,依然可以被恢復出來,這樣其中最初的明文內容就洩露了。
在一個這樣的案例裡,一個安全郵件客戶端將它當前正在處理的郵件副本儲存到一個臨時的SQLite
資料庫。這個資料庫檔案用於該應用不同元件之間來回複製資料,而操作完成後,會被刪除。雖然該應用軟體將郵件安全地儲存到它的主資料庫中,任何在其中曾經被選中並且處理過的郵件都在這個臨時資料庫中臨時儲存過。因此,就會輕易洩露給攻擊者。
已刪除的語音郵件和錄音
語音郵件會直接推送到與視覺化語音郵箱相連的iPhone
中,從而可以根據使用者的意願隨機訪問和離線收聽,甚至在使用者收聽資訊之前,這些檔案就已經被推送下來了,因此,在裝置上甚至都能找到未讀的語音郵件。語音郵件檔案使用AMR
編碼格式,這是一種專門為聲音錄音設計的音訊編碼方法。 錄音檔案也使用了相同的音訊格式。已刪除的錄音也可能從裝置上找到。
已刪除的鍵盤快取
在第4 章中已介紹過,鍵盤快取中包含了在應用軟體的任何地方透過鍵盤輸入的資料的快取,除非這個軟體的這個文字框被專門禁用了自動糾錯功能或者被設定為安全密碼框。從HFS
日誌中可以找到已刪除的鍵盤快取檔案副本,其中甚至包含非常早之前透過鍵盤輸入的快取資料副本。
照片和其他個人資訊
類似地,從HFS
日誌中可以還原出已刪除的照片以及已刪除檔案中儲存的其他個人資訊。例如,一個網銀類應用軟體儲存了透過裝置自帶相機拍下的支票照片,當這張支票照片被清除時,事實上,它是被刪除了,而不是被徹底抹掉,這樣攻擊者就可能拿到殘留的資料。
0x03 總結
任何剛剛被刪除的檔案都可能存在於日誌中。千萬不要依賴於裝置會在檔案刪除後安全地抹除它們這一假設,而最好是認為檔案系統在底層壓根就沒有加密保護能力。如果資料中包含了你不希望攻擊者能還原出來的敏感資訊,那就不要將這段資料的明文副本寫入磁碟中。在第11 章中,你會學到一系列的反取證技巧。透過這些技巧,可以使刪除檔案時會安全地清除資料,並且使你的應用軟體在掛起時不會儲存螢幕截圖。
相關文章
- iOS單利的銷燬2018-09-05iOS
- 實戰、實效!360終端安全管理系統攻防演練落地應用方案2021-03-24
- 容器雲安全挑戰和攻防應對2022-10-31
- 淺談設計模式在iOS開發實戰專案中的應用2019-03-01設計模式iOS
- 攻防實戰利器|綠盟智慧安全運營平臺(ISOP)攻防應急演練專版更新2021-04-06
- 電腦檔案被佔用無法刪除?Win10系統檔案被佔用無法刪除的解決方法2019-01-18Win10
- ASR專案實戰-任務佇列在檔案轉寫特性中的應用2023-12-31佇列
- iOS匯入其他APP下載的檔案(用其他應用開啟)2021-07-10iOSAPP
- 檔案無法粉碎解決辦法2018-10-12
- cp: 無法建立普通檔案 : 檔案已存在2020-05-25
- 無法寫入檔案 Filesystem2020-08-05
- go語言實戰教程:Redis實戰專案應用2019-04-18GoRedis
- jvm:jmap無法dump檔案的解決辦法2019-01-24JVM
- Service銷燬流程2018-11-08
- 無線應用安全剖析2020-08-19
- 令人頭大: Mac提示應用程式無法開啟,檔案損壞怎麼辦?2020-09-16Mac
- C#實現JWT無狀態驗證的實戰應用2021-03-01C#JWT
- Eclipse 無法載入類檔案2020-11-04Eclipse
- pandas 無法開啟 .xlsx 檔案2020-12-28
- 第六章 檔案操作2024-04-29
- Mac應用程式無法開啟提示不明開發者或檔案損壞的處理方法2023-04-06Mac
- 實驗7 檔案應用程式設計2024-06-24程式設計
- 建立和銷燬物件2019-01-15物件
- 攻防實戰是什麼?2022-07-01
- iOS – RxSwift 專案實戰記錄2019-03-04iOSSwift
- 無服務計算應用場景探討及 FaaS 應用實戰2020-08-31
- 你還用FTP,怪不得檔案傳輸無響應2020-05-13FTP
- iOS逆向 - 應用簽名原理及重簽名 (重籤微信應用實戰)2019-10-18iOS
- C++檔案操作實戰:建立、寫入、讀取、修改檔案一應俱全2024-03-17C++
- 《iOS 應用逆向與安全》讀後感2018-06-26iOS
- iOS逆向 應用重簽名+微信重簽名實戰2019-11-15iOS
- 攻防演練 | 無懼無檔案釣魚,這裡有一份硬核指南2022-07-08
- 應用koa的上傳檔案,手動實現koa2018-08-03
- 實戰專案 10: 貨物清單應用2018-04-11
- 【Hadoop踩雷】無法上傳檔案?有辦法!2021-09-09Hadoop
- SpEL應用實戰2024-02-21
- 實驗7_檔案應用程式設計2024-06-23程式設計
- 解決廢紙簍檔案無法清除的方法2021-11-01