エフセキュアブログ

by:ヤルコ・ツルクレイネン

Petya:ディスク暗号化ランサムウェア

 4月3日更新。暗号化スキームについてより詳しく追記した。


 Petyaは邪悪なひねりが加えられている新しいランサムウェアだ。ディスク上のファイルを暗号化する代わりに、ディスク全体をロックしてほとんど使い物にならない状態にする。具体的には、ファイルシステムのMFT(master file table)を暗号化する。つまりOSからファイルの位置が特定できなくなることを意味する。Petyaは、ブートキットと同様に自身をディスクのMBR(master boot record)にインストールする。ただし、秘密裏に活動するのではなく、赤い画面上にシステムを復旧する方法についての説明を表示する。

 MFTを狙うと素早く攻撃できる。データファイルを暗号化するより極めて短時間で済むのだ。それでも全体的な結果としては暗号化と同じ、すなわちデータにアクセスできなくなる。

Petya, Press Any Key!

 Petyaは2段階で実行する。第1段階はメインのドロッパーで、以下を実行する。

  • \\.\PhysicalDriveを直接操作してMBRに感染させる
  • 一連の暗号キーを生成する。これには16バイトのランダムなディスク暗号用のキーと楕円暗号(EC、Elliptic Curve)のキーペアが含まれる。この時点で、特別な「復号コード」も用意される
  • あとでMBRに感染したコードで使うため、ディスクの暗号キーと復号コードをディスクに保存する。その他の生成された暗号データはすべて破棄される
  • なんの警告もなしにマシンをシャットダウンし、MBRのコードでブートする

 Petyaは非対称キーによる暗号化と搬送のために、楕円曲線暗号スキームを用いている。192ビットの公開鍵とsecp192k1曲線パラメータは、ドロッパーのバイナリにハードコーディングされて配信される。Petyaはサーバの公開鍵を取得し、ECDH(Elliptic Curve Diffie-Hellman)アルゴリズムを用いて共有の秘密鍵を構築する。この共有秘密鍵を用いて16バイトのディスク暗号キーをAES暗号化する。共有秘密鍵はこのマルウェアとサーバしか使用できない。バイナリをASCIIにエンコーディングするBase58により、このマルウェアの楕円曲線の公開鍵といっしょにディスク暗号キーをパッケージする。ここで得られるパッケージが、後に赤いスクリーン上で提示される「復号コード」である。

Petya physdrive
PetyaドロッパーによるPhysicaldriveの操作

Petya server pubkey
ドロッパー内部にあるPetyaサーバの楕円曲線暗号の公開鍵

Petya ecc params
ドロッパー内部にあるPetyaのsecp192k1の曲線パラメータ

Petya encode pubkey
ASCIIエンコーディングのPetyaドロッパーの楕円曲線暗号の公開鍵

Petya gen salsa20 key
Petyaドロッパーのsalsa20バイト列の生成

 感染後、マシンはMBRのコードでブートする。これは以下のようになる。

  • まずディスクが感染しているかを確認する
  • 感染していなければ偽のCHKDSK画面を表示し、暗号キーに共有秘密キーを用いてMFTを暗号化する
  • ディスクの暗号化にsalsa20を用いる。暗号化後は当該キーを破棄する
  • 赤い「スカルスクリーン」、続いてTorの隠しサービスのURLがある画面と「復号コード」を表示する。「復号コード」とは、サーバでしか開けない暗号化されたメッセージである
Petya debug environment
Petyaが環境を取り戻すところ

petya_disk_encryption
salsa20でディスクを暗号化する際の、偽の「CHKDSK」に関するMBRのコード

Petya salsa20 expand32
MBRに置かれるsalsa20のコード

 楕円曲線アルゴリズムを用いて暗号キーを復号できるのは、もはやサーバしかない。これはマルウェアによってキーが破棄されたためだ。また、たとえ破棄されていなかったとしても、マシンがロックされて使えないままだ。リカバリディスクでMBRを復旧したとしても役には立たないだろう。なぜならMFTがいまだ暗号化されているからだ。理論上は共有秘密鍵を復旧して、リカバリディスクでディスク暗号化キーを復号して戻すことは可能だ。しかしそのためには、元々の楕円曲線暗号のキーペアを入手しなければならないのだが、必要な楕円曲線のデータはすべてドロッパーが破棄してしまっている。これはまるで家に入るための鍵が2つあって、意図的に片方を無くしたようなものだ。

 サーバ側では、復号コードのデコードが逆の順番で行われることが想定される。

  • Base58で符号化されたバイナリデータをデコードする
  • マルウェアの公開鍵と暗号化されたデータを展開する
  • 公開鍵を用いて、共有秘密鍵を構築する
  • この共有秘密鍵を用いると、サーバはAESを使ってディスク暗号化キーを復号できる
  • ここで攻撃者は、ロックされたマシンを解放できる暗号化キーを元に戻すことができる

 一例として、当社のラボのマシン上の復号コードの1つは次のように見える(ハイフンと先頭の2文字は削除。サーバはこれをデコードに使用しない)。

Q5rL1YMqnJPCsCgji4KcDv5XnQrtqttBQ7tfbAq7QStmTXNQ6Voepeaiem8uzaQxYq3LwpvMCXBvMx2Mmqkdt8Fi

 このコードを標準のBase58アルゴリズムを用いてデコードすると、以下のデータが生成される(説明のために、マルウェアが生成する公開鍵を緑で、ディスクを暗号化するキーを赤で示す)。

Petya decryption code opened

 サーバのヘルプ無しでマシンを復旧する唯一の方法は、デバッガを使って感染プロセスの途中でsalsa20のキーを捕捉することだ。これは通常のコンピュータユーザにとっては、あまり魅力的な対抗手段ではない:)

トリビア:

SofacyがCarberpとMetasploitのコードを再利用する

1. まえがき

 Sofacy Group(Pawn StormまたはAPT28の別名でも知られる)は、彼らの仕掛けるAPTキャンペーンにおいてゼロデイエクスプロイトをデプロイすることでよく知られている。一例を挙げると、Sofacy Groupが最近利用した2件のゼロデイは、Microsoft OfficeのCVE-2015-2424とJavaのCVE-2015-2590という脆弱性の悪用だった。

 この悪用が成功するとSofacyのダウンローダコンポーネントがインストールされるが、我々が今まで目にしてきたダウンローダとは異なっている。このダウンローダは悪名高きCarberpのソースコードをベースにしている。当該コードは2013年の夏に漏えいし、パブリックドメインとなったものだ。

1.1 Firefoxのブートストラップ型アドオン

 我々は今年の春、ゼロデイエクスプロイトとは別に、Firefoxのブートストラップ型アドオンなど別の手段でデプロイされた、Carberpベースのダウンローダにも遭遇した。だがブートストラップ型のアドオンとは何だろうか?Mozillaによれば、ブラウザを再起動することなくインストールおよび使用が可能なアドオンの一種とのことだ。

 このSofacyのアドオンのインストールは、主にソーシャルエンジニアリングに頼っている。ユーザが悪意のあるWebサイトや侵害されたWebサイトを訪れると、このアドオンをインストールするように促されるのだ。

HTML5 Rendering Enhancements 1.0.
図1:Sofacyのアドオン「HTML5 Rendering Enhancements」

 メインのコードは、アドオンのパッケージ内にあるbootstrap.jsに格納されている。アドオンが有効になった時点で、前述のJavaScriptはSofacyのCarberpベースのダウンローダを次のURLからダウンロードする。

hxxp://dailyforeignnews.com/2015/04/Qih/north-korea-declares-no-sail-zone-missile-launch-seen-as-possible-reports/579382/hazard.edn

 ペイロードはvmware_manager.exeとしてローカルに保存される。

 このブートストラップ型アドオンの技術は、完全に新規のものというわけではない。2007年にはドキュメント化されており、主に潜在的に迷惑なアプリケーションで使われている。しかしながら、Sofacyがこの手法を使っているのを目にするのは、初めてのことだ。Sofacyのbootstrap.jsファイル内のコードの大半は、Metasploitから直接コピーされたもので、{d0df471a-9896-4e6d-83e2-13a04ed6df33}というGUIDや「HTML5 Rendering Enhancements」というアドオン名が含まれている。その一方で、ペイロードをダウンロードする部分はMozillaのコード片の1つからコピーしていた。

2. ドロッパーとDLLに関する技術情報

 このエクスプロイトを使用した文書ファイルやアドオンは、PE実行ファイルを運んでくる。この実行ファイルは、自身に組み込まれているDLLをシステムにインストールするものだ。実行ファイルの大きさは100KB内外で、ファイル圧縮はされていない。一方、インストールするDLLは標準的なWindows APIを用いて圧縮されており、ディスクにドロップする前にRtlDecompressBufferで展開する。我々が見てきた全サンプルが有する重要かつ共通の特徴は、「jhuhugit.temp」という名前の一時ファイルだ。このファイル名は、実行ファイル内にあるほぼ唯一の平文の文字列だ。他の文字列は、固定の11バイトのキーを使ったXORアルゴリズムにより難読化が図られている。一部のサンプルに現れる興味を引く別の文字列は、「bRS8yYQ0APq9xfzC」という暗号キーだ。GitHubにあるCarberpのソースツリーで見つかった固定の「メインパスワード」の1つと一致するものだった。

 このDLLは、OSの実行ファイルであるrundll32.exeを使い、「init」という名前でエクスポートされているものが実行される。DLL自体には多くの機能はない。単純にループし続けて、30分ごとに決まったC2サーバ群のうちの1台に問い合わせを行う。我々は生きているペイロードをこれらのサーバからいまだ取得できていないが、コードに基づくと、DLLは最初に自身が実行されたときとまったく同じ方法でペイロードの実行のみを行う。C2サーバのアドレスや他の設定データは、同じ11バイトのXORキーアルゴリズムを用いて難読化されている。これまでのところ手が込んでいるようなことは何もないが、同じCarberpのパスワードが、しかも我々が見てきたすべてのDLLで使われている。我々はこの関連性を発見しようとするほど、好奇心をそそられた。

 DLLのリバースエンジニアリングを注意深く行うことで、このファミリーはCarberpのソースコードをベースとしていることが明確になった。コードのレポジトリはGitHubで見つかるものとまったく同じではないが、後述する主張をするのに十分なほど似通っている。今回Sofacyが使ったCarberpのソースをベースにした機能には、API解決アルゴリズムとコードインジェクションメカニズムが含まれる。またランダムなURLを生成するために用いたアルゴリズムも、大まかにはCarberpに基づいている。

3. Carberpのソースコードとの比較

3.1. API解決アルゴリズム

 公開されているCarberpのソースコードでは、実行時にAPIが解決される。これには以下のようなコードの構造を用いている。

#define pLoadLibraryA   pushargEx< DLL_KERNEL32, 0xC8AC8026, 2 >

 例では、pLoadLibraryAという関数が別のpushargEx関数で定義されている。この関数には以下の引数が与えられている。

  • モジュールの識別子として、この例ではDLL_KERNEL32
  • 関数名のハッシュ値としてC8AC8026。これは実行時に計算される
  • 関数のキャッシュのインデックスとして「2」

 このpushargEx関数は複数の定義により、見込まれる引数の数のすべてに対応する。引数が5個の場合の定義を以下に例示する。

inline LPVOID pushargEx(A a1, B a2, C a3, D a4, E a5)
{
    typedef LPVOID (WINAPI *newfunc)(A, B, C, D, E);
    newfunc func = (newfunc)GetProcAddressEx2( NULL, h, hash, CacheIndex );
    return func(a1, a2, a3, a4, a5);
}

 PushargExGetProcAddressEx2に行きつく。この関数は名前のハッシュ値に基づきAPIの関数アドレスを割り出すものだ。その後、当該アドレスの関数が実行される。このような構造にした目的は、通常コード内にある標準的なWin32のAPI関数を、「p」という文字を関数名の先頭に追加して使えるようにすることだ。その結果得られるコンパイル後のコードは、あまり読みやすいものではない。したがってリバースエンジニアリングの過程に時間がかかるようになる。また、このような完全な位置独立コードによる恩恵もある。コードインジェクションには都合が良いのだ。

 CarberpのソースツリーにはAPIのハッシュ値と、対応するキャッシュのインデックスのリストが含まれる。以下のような素敵なリストだ。

Carberp API list.
図2:CarberpのAPIリスト

 ここでSofacyのバイナリコードに戻ろう。逆コンパイルしたコード片の実例から、Sofacyが同じハッシュアルゴリズムとインデックスの採番方式を採用していることは明白だ。

Sofacy GetModuleHandleA
図3:SofacyのGetModuleHandleA

 GetModuleHandleAは、Sofacyが動的に解決する数多くの関数の1つに過ぎない。ただしそれらの関数はすべて、Carberpのソースコードと完全に一致する。ハッシュ値や引数、インデックス値までもだ(図2のインデックス番号の#43を見てほしい)。

 API解決部分までさらに観察していくと、GetProcAddressExおよびGetProcAddressEx2と名付けられた関数に著しい類似性が見られた。CarberpのソースとSofacyのバイナリを逆コンパイルしたコードのGetProcAddressEx2のスクリーンショットを、以下に並べて示す。

GetProcAddressEx2 from Carberp and Sofacy.
図4:CarberpおよびSofacyのGetProcAddressEx2

 CarberpのソースとSofacyのバイナリを逆コンパイルしたコードのGetProcAddressExの類似性の比較は以下のようになる。

GetProcAddressEx from Carberp and Sofacy
図5:CarberpおよびSofacyのGetProcAddressEx

 上記の逆コンパイルしたコード片においては、意図的にすべての関数と変数の名前がCarberpのソースに従うようにした。これは単に説明のためだ。

3.2. コードインジェクション

 Sofacyは、ネットワーク周りのコードすべてにおいてコードインジェクションを用いている。自身の関数をブラウザのプロセス群にインジェクションするのだ。プロセス群を探すために、Carberpのプロセス名ハッシュアルゴリズムを用いている。このような仕組みにした目的は、十中八九パーソナルファイアウォールやその他のビヘイビア検知システムを迂回するためだ。

 コードインジェクションはInjectIntoProcessという名前の関数から開始する。この関数はプロセスをオープンしてInjectCode4 によりコードを注入し、CreateRemoteThreadで実行する。以下にCarberpのコード片を示す。

InjectCode4 from the Carberp source.
図6:CarberpのソースにあるInjectCode4

 SofacyのバイナリにあるInjectIntoProcessInjectCode4が、この機能を結び付けている。

InjectIntoProcess from Sofacy
図7:SofacyにあるInjectIntoProcess

Figure 8: InjectCode4 from Sofacy
図8:SofacyにあるInjectCode4

3.3. ミステリアスなメインパスワード

 Carberpのソースには、MainPassword、あるいはRC2_Password、DebugPasswordと呼ばれるパスワードが存在する。このパスワードの取り得る値の1つが「bRS8yYQ0APq9xfzC」というもので、Sofacyでも使用されている。Carberpにおけるこのパスワードの目的は、たとえばHTTPトラフィックの暗号化だ。一方Sofacyでは、まったく異なる方法で使用されている。SofacyではAPI解決のためのアルゴリズムに手が加えられており、そこでこのパスワードを用いている。Carberpでは、API解決部分において平文でDDL名のリストを持っている。GetProcAddressEx2が参照するインデックスパラメータのことだ。Sofacyではこのリストは、Carberpの「メインパスワード」を用いて単純なXORベースのアルゴリズムで難読化がなされている。

4. 結論

 本ブログ記事で示された分析に基づけば、新たなSofacyのダウンローダはCarberpのソースコードをベースにしている。しかしながら非常に大きな違いもある。たとえばAPIの解決や、Carberpのメインパスワードの使用といったものだ。その関連について我々が下せる結論とは?Sofacyの一味は、Carberpのソースコードのプライベートなソースツリーを保有していることを意味すると、我々は考えている。APIの解決部分でDDL名を保護するためにパスワードを使用していることは、GitHubで一般公開されているソースよりも新しいことを示唆するものだ。これはSofacy一味は単にソースツリーをコピーして開発を継続していることを意味するのだろうか?あるいは、舞台裏で誰か別の人物がさらに開発を重ねているのだろうか?これについては、我々はまだ把握していない。しかしSofacyとのつながりや、さらに加えて(Carberpをベースにしている)AnunakやCarbanakによる最近のインシデントにより、Carberpがいまだに健在であることが示唆される。

5. ハッシュ値

bootstrap.js:

e7d13aed50bedb5e67d92753f6e0eda8a3c9b4f0

ドロッパー:

b8aabe12502f7d55ae332905acee80a10e3bc399
015425010bd4cf9d511f7fcd0fc17fc17c23eec1
51b0e3cd6360d50424bf776b3cd673dd45fd0f97
4fae67d3988da117608a7548d9029caddbfb3ebf
b7788af2ef073d7b3fb84086496896e7404e625e
63d1d33e7418daf200dc4660fc9a59492ddd50d9
b4a515ef9de037f18d96b9b0e48271180f5725b7
f3d50c1f7d5f322c1a1f9a72ff122cac990881ee

DLL:

5c3e709517f41febf03109fa9d597f2ccc495956 (逆コンパイルされたコードの例)
ed9f3e5e889d281437b945993c6c2a80c60fdedc
21835aafe6d46840bb697e8b0d4aac06dec44f5b
d85e44d386315b0258847495be1711450ac02d9f
ac61a299f81d1cff4ea857afd1b323724aac3f04
7319a2751bd13b2364031f1e69035acfc4fd4d18
b8b3f53ca2cd64bd101cb59c6553f6289a72d9bb
f7608ef62a45822e9300d390064e667028b75dea
9fc43e32c887b7697bf6d6933e9859d29581ead0
3b52046dd7e1d5684eabbd9038b651726714ab69
d3aa282b390a5cb29d15a97e0a046305038dbefe


バックナンバー
セキュリティ関連リンク
セキュリティ機関

政府関連

セキュリティ関連団体

研究機関・大学
詳細カテゴリ
メディア関係者の皆様へ
エフセキュアブログメンバー
エフセキュアブログメンバー
ミッコ・ヒッポネン
エフセキュア CRO(セキュリティ研究所主席研究員)(ヘルシンキ)
(Twitterアカウント)
(研究所Twitter)
ショーン・サリバン
エフセキュア セキュリティ・アドバイザー(ヘルシンキ)
(Twitterアカウント)
高間 剛典
メタ・アソシエイツ代表
(公式ブログ)
(Twitterアカウント)
星澤 裕二
株式会社セキュアブレイン 最高技術責任者
(公式ブログ)
(人物紹介)
岩井 博樹
デロイト トーマツ リスクサービス株式会社 (〜2013年3月 株式会社ラック) 情報セキュリティ大学院大学 客員研究員
(Twitterアカウント)

(人物紹介)
福森 大喜
株式会社サイバーディフェンス研究所 上級分析官
CDI-CIRTメンバー
(人物紹介)
鵜飼 裕司
株式会社FFRI 代表取締役社長
(人物紹介)
福本 佳成
楽天株式会社 システムセキュリティ室 室長
Rakuten-CERT representative
(人物紹介)
神田 貴雅
エフセキュア株式会社 プロダクトグループ 部長
富安 洋介
エフセキュア株式会社 プロダクトグループ
コーポレートセールスチーム
エフセキュア株式会社
(エフセキュアブログ公式Twitterアカウント)

海外記事翻訳
株式会社イメージズ・アンド・ワーズ
エフセキュアメールマガジン

ブログに載らないメルマガ限定情報や、技術者インタビュー、製品情報、技術解説を掲載して毎月一回配信します。アドレスのみの登録で購読無料。

エフセキュアブログQRコード
QRコード