イースターの訪問中、leo-stoneは義父の家がPetyaランサムウェアで困っているのを目の当たりにした。誰かが求職中で、そのホストはどうしても履歴書を読む必要があったため管理者パスワードを入力したところ、ファイルの代わりに現れたのはPetyaの赤い骸骨のマークだった。これはディスクのマスターファイルテーブルが暗号化されたことを示す印である。提示された脱出方法は鍵の代金を支払うことだった。作者は代替案を率直に位置づけた。「身代金を支払うのはそれほど難しいことではない」——難しいのは、支払わずに錠を破ることだった。

leo-stoneは暗号そのものに正面から挑むのではなく、Petya自身が入力された鍵を検証する仕組みを狙った。彼は検証ハッシュを再実装し、その要点を公開した。32ビットではなく16ビットワードでSalsaを動かし、20ラウンド(Salsa20)ではなく10ラウンド(Salsa10)を実行する。テストデータは被害者のディスク上に残る——セクター54の8バイトのナンスと、セクター55の512バイトの暗号化された検証セクターである。彼のGoプログラムはその512バイトを読み取り、該当するワードを0x37でXORしてハッシュの目標出力を復元し、ナンスを読み取り、問題に遺伝的ソルバーを投入する。

ソルバーは数秒で鍵を見つけた——彼自身のケースでは10〜30秒——そして彼はそれをオープンソースのhack-petyaリポジトリとして公開し、簡単な手順を添えた。暗号化されたディスクからナンスと検証セクターを取り出し、nonce.txtとsrc.txtとして保存し、プログラムを実行し、待ってから鍵を使う。理想的にはVM内のディスクイメージ上で使う。彼はコードが雑なことを詫び(「ちょっと急いでいたんだ」)、Go 1.6で並行マップ読み取りによりパニックを起こした後、遺伝的ライブラリにパッチを当てた。この公開は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 ·