サポート情報 | フォーカスシステムズ サイバーフォレンジックセンター

お問い合わせはこちら
東京証券取引所 プライバシーマーク ISMS JUSE

サポート情報

ホーム > サポート情報一覧 > CryptoWallによる暗号化処理(前編)

CryptoWallによる暗号化処理(前編)

目次へ

 ドライブ文字ごとに起動される、暗号化のためのスレッドの処理の流れを順に追ってみましょう。

 ファイルを暗号化するには、まずファイルを捜索しなければいけません。ディスク上にあるファイルはファイルシステム上にありますから、OSを経由して取得するのが合理的です。そのため、CryptoWallもWindows APIを用いてファイルを探しています。

 まず、検索するためのパス名を編集します。最初はドライブ直下となるため、ドライブ名の末尾にワイルドカードを設定した文字列をパラメータとして、ファイル情報を検索します(【図142】参照)。なお、暗号化処理の追跡のため、ターゲットになる画像ファイルを用意しておきます。

IDA_Cryptowall_FileSearch1

【図142-1】ファイル検索のためのパラメータ

 

IDA_Cryptowall_FileSearch2

IDA_Cryptowall_FileSearch3

【図142-2】ファイル検索のための検索処理と結果

 

IDA_Cryptowall_FileSearch4

【図142-3】追跡のためのターゲットとするファイル(.jpg)

 

 まず、検索したいディレクトリ(初回はルート)でFindFirstFile APIを実行し、そのディレクトリに存在するファイルやフォルダを検索します。検索した結果、それがファイルであれば拡張子のチェックに移り、フォルダならそのフォルダ内に移動して更に検索します。フォルダがある場合は、最下層まで再帰的に検索処理をしていくようです(【図143】参照)。また、検索しているフォルダ内に複数のファイルやフォルダある場合、FindNextFile APIを使用してフォルダ内のファイル情報を収集しています。

IDA_Cryptowall_FileSearch5

【図143-1】フォルダの中をさらに検索するためのパスの生成

 

IDA_Cryptowall_FileSearch6

IDA_Cryptowall_FileSearch7

【図143-2】フォルダの複数のファイルやフォルダを検索する処理と結果

 

 FindFirstFile/ FindNextFile APIで得られた対象がファイルだった場合、ファイルの拡張子のチェックを行います。

 まず、ファイルの文字列から拡張子を抽出します。今回のターゲットでは、「jpg」が抽出されます(【図144】参照)。

 この文字列をチェックするのですが、CryptoWallではチェック対象の拡張子の文字列を通常の文字列としては保持していません。そのため、この文字列に対し、簡単な「ハッシュ化」のような処理を行います。処理の流れと変換に用いているテーブルの一部を【図145】に示します。

 処理としては、文字を小文字に揃え、演算結果バッファに格納されているデータとxorをとった結果をインデックス値とし、マップを参照してそのデータを演算結果バッファの値とxorを取る処理を行っています。演算結果バッファの値も、ビットシフトが関与しておりやや複雑になっています。

 「jpg」の場合、変換結果は「0x46E81AE9」となります(【図146】参照)。

IDA_Cryptowall_FileExt1

【図144】暗号化対象かチェックするために拡張子を抽出

 

IDA_Cryptowall_FileExt2

【図145-1】拡張子の文字列を変換するためのロジック

 

IDA_Cryptowall_FileExt3

【図145-2】拡張子の文字列を変換するための変換値マップ

 

IDA_Cryptowall_FileExt4

【図146】拡張子の文字列の変換結果

 

 この拡張子の変換値を用いてチェックを行っています。チェックは2回に分けて行われており、結果の判定から、1回目は暗号化対象外、2回目は暗号化対象の拡張子をチェックしているとみられます(【図147】参照)。チェック対象のリストの数は、暗号化対象外の1回目が16、暗号化対象の2回目が361となっています。

 「jpg」のケースでは、2回目のチェックにヒットし、暗号化処理のルーチンへ分岐していきます。

IDA_Cryptowall_FileExt5

【図147-1】拡張子変換値のチェック処理(1回目)

 

IDA_Cryptowall_FileExt6

【図147-2】拡張子変換値のチェック処理(2回目)

 

IDA_Cryptowall_FileExt7

【図147-3】拡張子変換値のチェック対象リスト

 

 検証のため、同じフォルダ内に複数の拡張子のファイルを用意し、CryptoWallを実行した結果を【図148】に示します。暗号化対象のファイル拡張子が361種類もあるので、どのファイルまでが対象かを追跡するのは、かなり骨が折れる作業だと思われます。

IDA_Cryptowall_FileExt8

【図148-1】暗号化前のフォルダ状況

 

IDA_Cryptowall_FileExt9

【図148-2】暗号化後のフォルダ状況(拡張子によっては暗号化されていない)

 

 拡張子がヒットして暗号化処理の分岐へ進むと、暗号化対象ファイルのフルパス名を取得します。

 続いて、ファイルの属性情報を取得した上で、任意の属性(FILE_ATTRIBUTE_ARCHIVE)に設定します。これは、暗号化されたファイルに属性情報を設定するための読み取りと、暗号化処理等でのファイルアクセスのための属性設定だと考えられます。

 属性の設定が終わると、暗号化対象ファイルを読み取りのためにオープンします。このとき16バイトだけの読み込みを行い、さらにスレッド起動時に引数で受け取った公開鍵のハッシュ値(【図141】)と比較しています。これは、暗号化処理結果の部分で詳しく触れますが、「対象ファイルが暗号化済みかどうか」のチェックです(【図149】参照)。

 今回の検証では、実際の画像ファイルを用意しましたが、CryptoWallによるファイルのヘッダチェックはこれ以外行われていませんでした。これは、ファイルの内容によらず、拡張子だけで暗号化対象かどうかを判定していることを示します。仮に、ドキュメントや画像ファイルであっても、拡張子を少し異なるものにしておけば暗号化の対象外になる、ということです。

IDA_Cryptowall_FileOpen1

【図149-1】暗号化対象ファイルのオープン

 

IDA_Cryptowall_FileOpen2

【図149-2】暗号化対象ファイルから16バイトのみ読み込み

 

IDA_Cryptowall_FileOpen3

【図149-3】暗号化対象ファイルの先頭16バイトと公開鍵のハッシュ値の比較

 

 対象ファイルが暗号化されていないと判断すると、読み込みに使ったファイルポインタを先頭にシークしなおし、出力先となるランダムなファイル名を生成します。ランダムな文字列の生成処理は、通信の際に作成したランダムな文字列の生成と同じロジックを使用しているため、英小文字で文字列を作成した後、一部を数字に置き換えます。ランダムな文字列は、ファイル名部分と拡張子部分の2つを生成します。

 ランダムな文字列が生成できたのち、暗号化対象ファイルのフォルダのパスに結合して、暗号化後のファイル名を生成します(【図150】参照)。

IDA_Cryptowall_FileOpen4

IDA_Cryptowall_FileOpen5

【図150-1】ファイル名、拡張子部分のランダムな文字列の生成結果

 

IDA_Cryptowall_FileOpen6

【図150-2】暗号化後のファイル名を生成

 

 暗号化後のフルパス名ができたら、同名ファイルの存在をチェックした上で、書き込み用ファイルを生成します(【図151】参照)。このファイルに、暗号化された結果を格納していきます。

 この段階で、暗号化対象の捜索、判定が行われ、暗号化対象ファイルの読み込みのためのオープンと暗号化後ファイルの書き込みのためのオープンが完了しました。引き続き暗号化処理に進みます。

IDA_Cryptowall_FileOpen7

【図151】暗号化後のファイルを生成

 

< CryptoWallの暗号化処理の準備 目 次CryptoWallによる暗号化処理(後編) >