在復活節拜訪岳父期間,leo-stone 發現這個家庭正為 Petya 勒索軟體所苦。有人正在求職,而這台主機的主人真的需要讀取他的履歷,於是輸入了管理員密碼——結果出現的不是檔案,而是 Petya 的紅色骷髏頭,這表示磁碟的主檔案表已被加密。對方提供的出路是付錢買金鑰。作者把替代方案說得很直白:「付贖金算不上什麼挑戰」;真正的挑戰是在不付錢的情況下破解這道鎖。

leo-stone 沒有正面攻擊加密演算法,而是針對 Petya 本身驗證輸入金鑰的方式下手。他重新實作了驗證雜湊,並公布了關鍵要點:Salsa 使用 16 位元字而非 32 位元,執行十輪(Salsa10),而非二十輪(Salsa20)。測試資料就留在受害者的磁碟上——第 54 磁區有一個 8 位元組的 nonce,第 55 磁區則有一個 512 位元組的加密驗證磁區。他的 Go 程式讀取那 512 位元組,將其中相關的字與 0x37 做 XOR 運算以還原雜湊的目標輸出,讀取 nonce,然後對問題啟動遺傳演算法求解器。

求解器在幾秒內就找到了金鑰——在他自己的案例中是 10 到 30 秒——他將其釋出為開源的 hack-petya 儲存庫,並附上簡單的操作說明:從加密磁碟取出 nonce 與驗證磁區,分別存成 nonce.txt 與 src.txt,執行程式,等待,然後使用金鑰,最好是在虛擬機中的磁碟映像上操作。他為程式碼雜亂致歉(「我當時有點趕」),並在遺傳演算法函式庫於 Go 1.6 下因並行讀取 map 而 panic 後對其打了補丁。這次發布於 2016 年 4 月 11 日在 Hacker News 上獲得 451 點與 79 則留言;該儲存庫顯示有 612 個星標與 80 次分支。

重新實作 Petya 的金鑰檢查,然後讓遺傳演算法求解器找出金鑰——無需支付贖金

他攻擊的是金鑰檢查而非加密演算法:驗證磁區就位於受害者自己的磁碟上,使 Petya 的設計變成任何人都能重建的可測試預言機

遺傳演算法求解器讓搜尋變得快速:候選金鑰針對重新實作的雜湊演化,直到正確的金鑰浮現,只需 10 到 30 秒,而非暴力破解的漫長等待

修復方案免費提供,並附有確切的還原步驟,讓其他受害者無需付費、也無需將磁碟送往任何地方即可解密

在 GitHub 與 Hacker News 上發布讓這個工具廣為流傳:發布時獲得 451 點與 79 則留言,而該儲存庫至今仍顯示 612 個星標與 80 次分支

一道必須驗證自身金鑰的鎖,會在受害者這一側留下一個預言機:重建檢查機制並對其搜尋,而非付錢,然後把工具免費送出,讓修復方案得以傳播。

leo-stone 在 10 到 30 秒內還原了自己的金鑰,並公開釋出了這個工具。2016 年 4 月 11 日在 Hacker News 的發布獲得 451 點與 79 則留言,而該儲存庫的存檔顯示有 612 個星標、80 次分支與 34 位關注者。該頁面並未記錄任何關於後續 Petya 變種的說法;它留下的是可重複使用的模式——擷取磁碟上的驗證資料、重建檢查機制,然後讓搜尋找出金鑰。

追溯依據

參考來源

  1. leo-stone/hack-petya — search key to restore petya encrypted mft GitHub · github.com
  2. Hack-petya mission accomplished — Petya ransomware decryptor (Hacker News discussion) Hacker News · news.ycombinator.com ·