標籤:

【OSG】實驗code review 解碼蘋果所有的Tokens decrypts/extracts all authorization tokens on macOS/OSX

原文鏈接: MMeTokenDecrypt

作者: manwhoami

翻譯: Chensh  校對: 布兜兒

前言

這個程序用來解密或提取出所有存儲在 macOS/OS X/OSX 上面的授權令牌(Authorization Tokens)。無需用戶身份驗證,是因為利用了一個在 macOS 上授權訪問鑰匙串的流程中的缺陷。

所有的授權令牌都存儲在 /Users/*/Library/Application Support/iCloud/Accounts/DSID 目錄下。 DSID 是每一個 iCloud 賬戶在蘋果系統里的後端存儲格式。

這個 DSID 格式文件使用了128位AES的CBC模式[^注1] 和一個空的初始化向量進行加密。針對這個文件的解密密鑰存儲在用戶的鑰匙串里,一個名為 iCloud 的服務條目下,名字是 iCloud 賬戶相關的郵件地址。

這個解密鑰匙進行了 base64 編碼,並作為 Hmac 演算法[^注2]中的消息體,進行標準的 MD5 哈希加密。這裡的問題是,Hmac 演算法里所需的輸入鑰匙,被藏在了 MacOS 內核深處。這個鑰匙由44個隨機字元組成,它是解密 DSID 文件的關鍵。這個鑰匙包含在本工程的源代碼中,據我所知,到目前為止這個鑰匙還未被公開過。

意義

目前市面上擁有類似功能的工具,只有一款名為 「Elcomsoft Phone Breaker [^注3]」的取證工具。 MMeTokenDecrypt 是開源的,允許任何開發者在工程里使用這個解密 iCloud 授權的文件。

蘋果必須要重新設計鑰匙串信息的獲取方式。因為本程序 fork 了一個蘋果已經簽名的二進位文件作為子進程,當用戶看到鑰匙串訪問請求彈窗時,並不會意識到其背後的危險。更進一步,攻擊者可以向用戶重複彈出鑰匙串彈窗,直至用戶允許了鑰匙串訪問為止,因為蘋果並沒有為拒絕選項設定超時時間。這將會導致iCloud授權令牌被盜竊,而這些令牌可以用來訪問幾乎所有iCloud的服務項目:iOS備份,iCloud聯繫人,iCloud Drive, iCloud 圖片庫, 查找我的好友,查找我的手機(查看我其他的項目)

上報反饋歷程

  • 我2016年10月17日開始聯繫蘋果,非常詳細地闡述了如何破壞用戶鑰匙串授權的方法,並在不同的 macOS 系統版本中進行重現。
  • 直到2016年11月6日,沒有得到蘋果的任何反饋。(委屈失落的作者……)
  • bug報告包含了破壞整個鑰匙串訪問。MMeTokenDecrypt 只是這個 bug 的其中一個實現。查看我的其他項目,OSXChromeDecrypt 是這個 bug 的另外一種實現。
  • 報告中有個值得注意的摘錄如下:

此外,假如我們是遠程攻擊者,當「詢問鑰匙串密碼」的選項沒有被勾選時,那麼本質上,我們就是通過代碼實現強制彈窗提示,迫使用戶單擊「允許」按鈕,這樣我們就可以獲得密碼。但是,如果「通過密碼訪問鑰匙串」的選項被選中,並且用戶點擊了「拒絕」按鈕,那麼強制提示則會變得比較棘手。

  • 我已經把 bug 的報告上傳到本項目中,並將實時同步蘋果的更新。

用法

運行 python 文件:

$ python MMeDecrypt.pynDecrypting token plist -> [/Users/bob/Library/Application Support/iCloud/Accounts/123456789]nnSuccessfully decrypted token plist!nnbobloblaw@gmail.com Bob Loblaw -> [123456789]nncloudKitToken = AQAAAABYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~nnmapsToken = AQAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~nnmmeAuthToken = AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=nnmmeBTMMInfiniteToken = AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~nnmmeFMFAppToken = AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~nnmmeFMIPToken = AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~n

注意

假如你是使用 homebrew 安裝的 python,那麼你運行這個腳本的時候有可能會遇到以下錯誤:

user@system:~/code/MMeTokenDecrypt $ python MMeDecrypt.pynTraceback (most recent call last):n File "MMeDecrypt.py", line 2, in <module>n from Foundation import NSData, NSPropertyListSerializationnImportError: No module named Foundationn

想要解決這個問題,你可以手動指定一個你系統上默認的 python 版本的完整的路徑。

user@system:~/code/MMeTokenDecrypt $ /usr/bin/python MMeDecrypt.pynDecrypting token plist -> [/Users/user/Library/Application Support/iCloud/Accounts/123413453]nnSuccessfully decrypted token plist!nnuser@email.com [First Last -> 123413453]n{n cloudKitToken = "AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~";n mapsToken = "AQAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~";n mmeAuthToken = "AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=";n mmeBTMMInfiniteToken = "AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~";n mmeFMFAppToken = "AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~";n mmeFMIPToken = "AQAAAABXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~";n}n

已在 Mac OS X EI Capitan 上驗證

注釋

注1: AES 的 CBC 加密模式。即為密碼分組鏈接模式(Cipher Block Chaining (CBC)),這種模式是先將明文切分成若干小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。

注2: Hmac 演算法,是密鑰相關的哈希運算消息認證碼,HMAC運算利用哈希演算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。

注3: Elcomsoft Phone Breaker 是 Elcomsoft 公司的一款手機取證工具,具有解密、下載 iCloud 文件和備份,獲取 iCloud 的 Token,解析鑰匙串等功能。

以下內容是我發送給蘋果的Bug報告

  • 日期:2016年10月17日

概要:

致相關人士,

目前將程序插入到 MacOS/OS X (每個版本)中的條目的實現,都缺乏一個關鍵的特性。

這個特性其實早已可以通過鑰匙串訪問程序來實現,但由於某些原因,遲遲沒有開放給 「security」 命令行工具。

鑰匙串訪問 app 中「訪問控制」下的**「詢問鑰匙串密碼」**選項實現了這樣的功能。

但它不允許開發者使用程序來自動勾選這個選項,這種做法阻止了開發者安全地將數據信息存儲到鑰匙串中。

因為應用開發者並不能僅針對他們的應用或者合法的鑰匙串所有者來限制鑰匙串條目的訪問。

例如,假設有人未經允許訪問了我的電腦,然後想要獲取到鑰匙串裡面Chrome安全存儲條目中的鍵值,那麼他所需要做的就是允許一個命令:secutiry find-generic-password -ga Chrome.

而之後那些惡意用戶所需要做的,僅僅是在彈出鑰匙串彈窗點擊**「允許」**按鈕。

但是,如果本機主人以前曾經打開過鑰匙串訪問,在 Chrome 安全存儲條目中的訪問控制面板下,勾選過**「詢問鑰匙串密碼」**的選項,那麼就可以強制惡意用戶必須輸入鑰匙串密碼,否則未授權的訪問將會被終止。

谷歌 Chrome 依舊可以無限制地訪問這個鑰匙串(這也是我們所希望的),因為它在訪問控制面板下被列為了唯一授權應用。

此外,假如我們是遠程攻擊者,當「詢問鑰匙串密碼」的選項沒有被勾選,那麼我們本質上就是通過代碼實現強制彈窗提示,迫使用戶單擊「允許」按鈕,這樣我們就可以獲得密碼。

但是,如果「通過密碼訪問鑰匙串」的選項被選中,並且用戶點擊了「拒絕」按鈕,那麼強制提示則會變得比較棘手。(參見參考文獻)

重現步驟:

  1. 谷歌 Chrome 瀏覽器是一個很好的例子,因為它是一個很常用的應用,而且可以非常直接查看到它通過 MacOS 系統或調用庫創建的鑰匙串條目。
  2. 在我們勾選鑰匙串訪問面板中的「詢問鑰匙串密碼」選項之前。我們先在命令行運行以下命令:secutiry find-generic-password -ga Chrome,然後我們可以觀察到,這些敏感信息非常需要鑰匙串密碼來驗證以保證安全性。(這個安全存儲鍵值可以解密谷歌 Chrome 所有本地存儲的密碼)
  3. 在鑰匙串訪問中,查找到「Chrome Safe Storage」條目,右鍵,顯示簡介,切換到訪問控制面板,勾選「詢問鑰匙串密碼」選項,然後保存更改。(這裡鑰匙串應用有個Bug,就是你需要重複這個操作兩次才能夠真正生效。但這個是無關本次議題的bug了)
  4. 當我們使用命令**「security add-generic-password -T | -A」**來創建一個新的鑰匙串密碼條目後,打開谷歌Chrome瀏覽器,發現它並沒有詢問你確認你的密碼,這是因為它已經是在受信任列表裡面的應用了。
  5. 在命令行下,我們再次運行**secutiry find-generic-password -ga Chrome**這個命令,我們發現這次的彈窗需要你輸入密碼了。

預期結果: 在這些步驟之後,您將了解到為何密碼是必需。

實際結果: 如上所述。

版本: 所有的 MacOS 或 OSX 版本。

注意: 在 MacOS 中已經存在「詢問鑰匙串密碼」的選項功能了。

實現這點只需要很少的資源。

我在此請求蘋果開放程序控制這個功能給開發者(IE將新的條目參數添加到鑰匙串的操作是:『security add-generic-password -T | -A』),以便終止那些未經許可的鑰匙串信息訪問。

因此,希望把勾選「詢問鑰匙串密碼」後的系統調用加入到 「security」 這個命令行工具的調用裡面,提供一個參數允許開發者通過命令行工具去設置選項是否選中,而不是通過用戶交互界面。

作為一個應用開發者,我不能指望我的用戶通過 GUI 操作來保護我的應用裡面的鑰匙串條目。畢竟應用開發者的一個目標就是減少用戶的繁瑣操作。

移步看雪論壇看完整版【OSG】實驗code review 解碼蘋果上所有的Tokens decrypts/extracts all authorization tokens on macOS/OSX


推薦閱讀:

你的 iPad 和 iPod 背面刻著什麼話?
Siri 會不會是一個「革命」?
用了兩年的iPhone6換小米5S合適嗎?

TAG:iOS |