Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WannaCryの暗号化・復号のプロセス、身代金の支払い、復号ツール #ssmjp /ssmjp1710-1

WannaCryの暗号化・復号のプロセス、身代金の支払い、復号ツール #ssmjp /ssmjp1710-1

Takuji Kitagawa

November 13, 2017
Tweet

More Decks by Takuji Kitagawa

Other Decks in Technology

Transcript

  1. • 3つの固定のビットコインアドレス 115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw 13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94 • $300 を要求、3日経つと $600 に倍増

    • 「7日間で支払いを行わないと、ファイルを永久に回復す ることはできません」と脅す • 338件、14万ドル(約1500万円)の支払い (2017年7月時点) WannaCryの身代金の支払い
  2. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 sample.docx WannaCry 暗号化のプロセス
  3. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 sample.docx WannaCry 暗号化のプロセス
  4. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 WannaCry 暗号化のプロセス
  5. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 WannaCry 暗号化のプロセス
  6. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス
  7. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 犯人の公開鍵ペア 犯人

    RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス
  8. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された ファイル

    暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス
  9. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス
  10. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス
  11. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaCry 暗号化のプロセス ファイル毎に繰り返し
  12. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY WannaCry 復号のプロセス
  13. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor)
  14. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor)
  15. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 00000000.dky 被害者 RSA-2048 秘密鍵 受信(tor)
  16. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 AES-128 共通鍵 復号 WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 00000000.dky 被害者 RSA-2048 秘密鍵 受信(tor)
  17. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 AES-128 共通鍵 復号 元の ファイル sample.docx 復号 WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 00000000.dky 被害者 RSA-2048 秘密鍵 受信(tor)
  18. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 AES-128 共通鍵 復号 元の ファイル sample.docx 復号 WannaCry 復号のプロセス 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 00000000.dky 被害者 RSA-2048 秘密鍵 受信(tor) ファイル毎に繰り返し
  19. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 C&Cサーバ(.onion)

    00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID
  20. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 C&Cサーバ(.onion)

    00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス
  21. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス
  22. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス
  23. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス
  24. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス
  25. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky
  26. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky
  27. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵
  28. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵
  29. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵
  30. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 AES-128 共通鍵 復号 元の ファイル sample.docx 復号 WannaCry ファイルの復号処理 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 00000000.dky 被害者 RSA-2048 秘密鍵 受信(tor) ファイル毎に繰り返し
  31. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス 本来想定された動作 VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵
  32. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号
  33. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 c.wnry Bitcoinアドレスは空白 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号
  34. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 c.wnry Bitcoinアドレスは空白 @[email protected] ハードコードされた Bitcoinアドレスを表示 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号
  35. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 c.wnry Bitcoinアドレスは空白 @[email protected] ハードコードされた Bitcoinアドレスを表示 共通のBitcoin アドレス 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号
  36. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 c.wnry Bitcoinアドレスは空白 @[email protected] ハードコードされた Bitcoinアドレスを表示 共通のBitcoin アドレス 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作
  37. ユーザ識別子を送信 VictimID • 8-byteのID(CryptGenRandomで生成した乱数) • ComputerName • UserName 被害者毎のBitcoinアドレスを生成 Bitcoinアドレスを

    c.wnryに保存 1. Bitcoinの入金をチェック 2. 入金が確認できたら、犯人の秘 密鍵で00000000.ekyを復号 c.wnry C&Cより受信したBitcoin アドレス C&Cサーバ(.onion) @[email protected] c.wnryより読み込んだ Bitcoinアドレスを表示 Bitcoinの支払い Check Paymentボタン 00000000.eky 犯人の公開鍵で暗号化され た被害者の秘密鍵 入金 生成 入金チェック 受信した被害者の秘密鍵を 00000000.dkyとして保存 00000000.dky 被害者の秘密鍵 Decryptボタン 復号処理 被害者毎に異る Bitcoinアドレス VictimID Bitcoinアドレス VictimID Bitcoinアドレス 00000000.eky 被害者の秘密鍵 バグによりこの処理より前に WanaDecryptorが起動 Check Paymentを行っても秘密鍵の受取りが出来ないため Decyptボタンを押しても復号されない c.wnry Bitcoinアドレスは空白 @[email protected] ハードコードされた Bitcoinアドレスを表示 共通のBitcoin アドレス 1. 共通のBitcoinアドレスのため誰 の入金か識別が出来ない 2. 00000000.ekyの復号は行われ ない (バグによる)実際の動作
  38. この手順で支払者の識別が可能か? • 「Contact US」「Check Payment」ともに、ユーザ識別 情報が送信される • 「Contact US」から、事前にBitcoinアドレスを通知 •

    通知済みのBitcoinアドレスからの入金を確認できれば、 「Contact US」のユーザ識別情報に対し、支払済とマーク • 「Check Payment」のユーザ識別情報が支払済であれば、 00000000.ekyを復号して秘密鍵を被害者に送信
  39. 被害者 「5/XX X時X分にBitcoinアドレスAAAAから0.16BTCを支払った」 「ファイルを戻して欲しい」 犯人 「 AAAAがお前のものであることを証明するために、 非公開のBitcoinアドレスBBBBに0.00001BTCを送金してくれ!」 被害者 「送金した!」

    犯人 「AAAAから非公開のBBBBへの入金を確認した」 「確かにAAAAはお前が所有しており、なりすましではないな」 「よし、復号鍵を送ろう」 既に支払済の者が、 自分の支払いであることを証明する方法(の想定の一例)
  40. シアトルの土地測量会社 共同経営者(34歳) (記事では名前、会社名が記載されており、検索すると実在する会社で経営者として名前が出ている) • 5/12経営する会社のサーバのファイルのほぼ全てが暗号化 • 業務がすべて止まる • IT業者に相談するが、何も出来ないと言われる •

    5/13にBitcoinで身代金を支払う • 「Check Payment」を押しても「支払いが確認できませ ん」と表示される • 「Contact US」で「支払ったからファイルを戻して欲し い」と毎日、計6,7回メッセージを送信
  41. オンラインエンターテイメント会社に在宅勤務(32歳) クラクフ、ポーランド • 5/12に自宅のPCが感染 • 家族の写真、仕事用ファイル、音楽など、デジタルライフ のすべてが失われる • 身代金を支払う意志はあったが、払っても復元できるとは 信じられなかった

    • ネットで、支払って復元できたという情報がないかを探し 続けたが見つからなかった • 金額は問題ではなかったが、支払ってもファイルが戻らな かった場合、犯罪者に寄付をすることになるため支払いを ためらった
  42. • WannaCryが3つの固定のBitcoinアドレスを使用している のは意図されたものではなくバグである • 13時間後にはバグを修正したバージョンが配布されている • 事前にBitcoinアドレスを通知すれば早く復号鍵を受取れる などのメッセージが送信されている • 個別に犯人とコンタクトしてファイルを復号できたケース

    が複数報告されている • 最終的にはBitcoinがすべて引き出されている • これらのことから金銭目的である可能性が高い(それも含 めた偽装工作の可能性もあるが) WannaCryは破壊活動を目的にしたものと言う識者が多いが
  43. • Adrien Guinet氏によりWannaCryに感染したPCよりRSA 秘密鍵を取り出すツールWannaKeyが公開 • Benjamin Delpy氏がWannaKeyの手法を用いてWannaCry で暗号化されたファイルを復元させるツール wanakiwi を

    公開 • Windows Crypto APIがRSA鍵ペアを生成する時に使われ た素数をメモリ上から正しく破棄していないため • 犯人のミスではなくCrypto APIの問題。Windows 10では 完全に破棄されている • 感染後、再起動されていないことが条件 WannaCryの復号ツール
  44. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 WannaKeyによる 秘密鍵の復元
  45. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaKeyによる 秘密鍵の復元
  46. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaKeyによる 秘密鍵の復元 素数
  47. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaKeyによる 秘密鍵の復元 素数 WannaKey
  48. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaKeyによる 秘密鍵の復元 素数 素数 RSA鍵ペア生成時の素数を メモリ上から抜き出す WannaKey
  49. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 元の ファイル 暗号化された AES-128

    共通鍵 暗号化 暗号化された ファイル 暗号化 犯人の公開鍵ペア 犯人 RSA-2048 公開鍵 マルウェアにハードコー ドされた犯人の公開鍵 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵 メモリ上で 被害者の公開鍵ペア生成 暗号化 暗号化された 被害者 RSA-2048 秘密鍵 00000000.eky sample.docx sample.docx.WNCRY 被害者 RSA-2048 公開鍵 00000000.pky 公開鍵をファイルに保存 AES-128 共通鍵 ファイル毎に異る 共通鍵生成 メモリ上の 鍵ペア破棄 WannaKeyによる 秘密鍵の復元 素数 素数 RSA鍵ペア生成時の素数を メモリ上から抜き出す 鍵ペア生成 WannaKey 被害者 RSA-2048 公開鍵 被害者 RSA-2048 秘密鍵
  50. AES-128 共通鍵 元の ファイル AES-128 共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された

    AES-128 共通鍵 sample.docx sample.docx.WNCRY 被害者 RSA-2048 秘密鍵 復号 復号 WannaKeyで秘密鍵を取り出せれば ファイルを復号出来る ファイル毎に繰り返し
  51. • WannaCryのメモリ内の鍵ペアは初期の段階で破棄される。その後に大 量のファイルの暗号化処理が走るとそれでメモリが上書きされる • 感染後時間が経っていると何も作業していなくてもバックグラウンドで 様々なプロセスが動いており、メモリが上書きされる • 復号ツール(Wanakiwi)のインストール(コピー)でもメモリが上書き される •

    実験環境で、予め復号ツールをインストールし、少数のファイルのみ暗 号化された状態で、感染直後に実行した場合でも、成功率は60%程度 との報告 • 実環境で大量のファイルが暗号化され、感染後から時間が経っている場 合には、ファイル復元の可能性はかなり低い WannaCryの復号ツール
  52. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵 元の ファイル AES-128 共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky 00000000.dky sample.docx sample.docx.WNCRY 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 被害者 RSA-2048 秘密鍵 復号 被害者 RSA-2048 秘密鍵 受信(tor) 復号 復号 WannaCry 復号のプロセス
  53. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵 元の ファイル AES-128 共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky 00000000.dky sample.docx sample.docx.WNCRY 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 被害者 RSA-2048 秘密鍵 復号 被害者 RSA-2048 秘密鍵 受信(tor) 復号 復号 WannaCry 復号のプロセス 犯人の秘密鍵がリリース されたとしても
  54. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵 元の ファイル AES-128 共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky 00000000.dky sample.docx sample.docx.WNCRY 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 被害者 RSA-2048 秘密鍵 復号 被害者 RSA-2048 秘密鍵 受信(tor) 復号 復号 WannaCry 復号のプロセス 犯人の秘密鍵がリリース されたとしても 00000000.ekyがないと ファイルを復号出来ない
  55. 犯人 RSA-2048 公開鍵 犯人 RSA-2048 秘密鍵 犯人の公開鍵で 暗号化された 被害者の秘密鍵 AES-128

    共通鍵 元の ファイル AES-128 共通鍵で 暗号化された ファイル 被害者の公開鍵で 暗号化された AES-128 共通鍵 犯人の公開鍵ペア 00000000.eky 00000000.dky sample.docx sample.docx.WNCRY 犯人の公開鍵で 暗号化された 被害者の秘密鍵 送信(tor) 被害者 RSA-2048 秘密鍵 復号 被害者 RSA-2048 秘密鍵 受信(tor) 復号 復号 WannaCry 復号のプロセス 犯人の秘密鍵がリリース されたとしても 00000000.ekyがないと ファイルを復号出来ない .WNCRYをバックアップするだけ では不十分
  56. Inside the digital heist that terrorized the world—and only made

    $100k https://qz.com/985093/inside-the-digital-heist-that- terrorized-the-world-and-made-less-than-100k/ Is WannaCry Really Ransomware? https://securingtomorrow.mcafee.com/executive- perspectives/wannacry-really-ransomware/ WannaCry|WannaDecrypt0r NSA-Cyberweapon-Powered Ransomware Worm https://gist.github.com/rain- 1/989428fa5504f378b993ee6efbc0b168 参考資料