8-3-3. スマホ用ランサムウェア(filelocker)
暗号化処理
では、暗号化処理の関数である"b"の中身を見ていきます。
同じファイルの中に、以下の通り関数bが定義されていました。

暗号化の対象ファイルの指定、暗号化したファイルの名前の指定
それでは要点の解析結果を紹介します。
まず、80行目から82行目です。
private void b(String str) {
FileInputStream fileInputStream = new FileInputStream(str);
FileOutputStream fileOutputStream = new FileOutputStream(str + ".enc")
80行目は関数を宣言しており、コンパイルの過程において”b”に置き換わっていますが、おそらく元々はencyptionといった関数名であったと推察します。
ここで引数に "str"を受け取っています。
これは、前回の8-3-2. スマホ用ランサムウェア(filelocker)で紹介した通り、ディープスキャンによりリストアップした暗号化の対象となるファイル名です。例えば、”記念日.jpg"といった写真データを想定します。
81行目は、この"記念日.jpg"を”str”としてFileInputStreamの引数として受け取ります。FileInputStreamは、受け取ったファイルをバイナリデータとして読み込むための仕組みです。この後にバイナリデータを暗号化するための、いわば下準備です。
続いて、82行目です。FileOutputStreamは最終的に暗号化したバイナリデータの出力先を指定します。FileOutputStream(str + ".enc")ということは、”記念日.jpg"は暗号化される結果、元あった場所に”記念日.jpg.enc"というファイルが置かれることになります。
ランサムウェアの特徴として、端末内のファイルがなくなるわけではなく、元々あったファイルが暗号化された形に置き換えられます。ファイル名は”記念日.jpg.enc"という別物になり、その中身もバイナリデータがグチャグチャに暗号化されるので、もはや表示することは不可能になります。
暗号化方式を設定
83行目は、”PASSWORD”という言葉があります。これはハッカーが事前に決めたパスワードです。このパスワードを素にして、暗号化の方法を決めていきます。
89行目。
SecretKeySpec secretKeySpec = new SecretKeySpec();
SecretKeySpecは共通鍵を作成するクラスです。なので、このランサムウェアは秘密鍵/公開鍵を使うタイプではないようです。
90行目。
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
Cipherクラスは、暗号化の方式を設定します。ここでは、暗号化方式としてAES(共通鍵を生成するアルゴリズムですね。)、モード(CBC)、パティング方式(PKC...)を指定しています。
96行目。
byte[] bArr2 = new byte[64];
これは、”記念日.jpg"ファイルのバイナリデータを流し込んで暗号化するためのメモリ上の領域を確保しています。暗号化作業のための作業台を用意したようなイメージです。
暗号化スタート
下準備が整ったところで暗号化開始です。
98行目の”fileInputStream.read(bArr2)”は、”記念日.jpg"ファイルのバイナリデータをfileInpuStreamで読み込んでいき、read関数によってメモリ領域(作業台)であるbArr2に一時的に格納します。
続いて、103行目に入ります。
byte[] update = cipher.update(bArr2, 0, read);
cipherは上記で用意した暗号化の方式を保持したオブジェクトです。第一引数の"bArr2"には”記念日.jpg"ファイルのバイナリデータが格納されているので、これをcipherがAES方式で暗号化します。そして、暗号化してグチャグチャにしたバイナリデータをバイト配列であるupdateに格納します。
ここが最大の山場です。
暗号化終了
103行目。
fileOutputStream.write(update)
冒頭に記載した通り、fileOutputStreamは最終的に暗号化したバイナリデータの出力先として”記念日.jpg.enc”というファイルを用意していました。
write関数は、引数として受け取った”暗号化してグチャグチャにしたバイナリデータをバイト配列であるupdate”を、fileOutputStreamを通して”記念日.jpg.enc”ファイルに流し込みます。
その結果、”記念日.jpg"が”記念日.jpg.enc"が自動的に変換されます。
これにて一つのファイルに暗号化完了です。
この後、リストアップされたファイルが順次暗号化されていきます。
おわりに
以上が世間を騒がせているランサムウェアにおける暗号化の仕組みでした。
今回紹介したコードは、ランサムウェアアプリのコードの全体の1%程度ですが、コードベースで見ると”暗号化の対象ファイルをディープスキャンしてリストアップ”+”リストアップしたファイルを暗号化処理”という意外にシンプルな構成であることが分かりました。
Discussion