IoTマルウェアの静的解析におけるランタイムライブラリ関数を特定するスクリプトを公開しました。
1.はじめに
逆アセンブラ・逆コンパイラのIDA ProではIDA F.L.I.R.T.[1]とよばれるシグネチャマッチングの仕組みがあり、実行可能ファイルに静的にリンクされているライブラリを特定します。Windowsの場合、Microsoftがビルドしたランタイムライブラリをリンクする場合が多く、その種類は限られています。一方、ソースコードが公開されているUNIX系OSでは、ディストリビュータが個別にランタイムライブラリをビルドするため、その種類は多く、IDA Proに含まれているシグネチャでランタイムライブラリの関数を特定することは困難です。 実際、この問題を解決するためのランタイムライブラリの関数を特定する研究やツール[2][3][4][5]は発表されています。しかしIDA Proで直接利用できるIDA F.L.I.R.T.のシグネチャやツールではないため、私たちはディストリビュータがビルドしたランタイムライブラリの既存のバイナリイメージからIDA F.L.I.R.T.のシグネチャを生成し、一致するシグネチャを探してランタイムライブラリの関数を特定する「idaflirt-detector」[6]を作成しGitHubに公開しました。
GitHub URL:https://github.com/SecureBrain/idaflirt-detector
尚、本稿はIDA Pro、PythonおよびWindowsマルウェアの静的解析についてある程度の知識があることを前提とします。IoTマルウェアが動作するOSはUNIX系OSであると仮定します。本稿では、IoTマルウェアの静的解析を始めるときの問題の1つである、静的にリンクされているランタイムライブラリの関数の特定について説明します。
2.実行可能ファイル
IoTマルウェアの実行可能ファイルの形式はELF(Executable and Linkable Format)です。ランタイムライブラリの関数特定の観点から、ELFの実行可能ファイルを整理すると、下記のように分けることができます。
・動的リンク
・静的リンク
-stripされていない -stripされている
まず、Windowsの実行可能ファイルと同様に、動的リンクと静的リンクに分かれます。動的リンクでは実行時にライブラリをロードし、名前から関数のアドレスを解決するので、この場合には関数の名前を特定する必要はありません。静的リンクの場合でもstripしなければシンボル情報が削除されずに関数の名前が実行可能ファイルに残るので、この場合も関数の名前を特定する必要はありません。したがって、静的リンクでありかつstripされている実行可能ファイルでは関数の名前を特定する必要があります。(ただし、シンボル情報が偽装されているなどの解析妨害がされている場合は除きます。)
3.使い方
3.1.事前設定
scriptフォルダにあるpkg2sig.pyでパッケージをダウンロードしてIDA F.L.I.R.T.のシグネチャを生成することができますが、既にdeliverableフォルダに生成物があるのでこれを使います。deliverableフォルダのsigフォルダの中をすべて図 1に示すIDA Proがインストールされているフォルダのsigフォルダ(通常は「C:\Program Files\IDA Pro 7.6\sig」)にコピーします。コピーが終われば事前の設定は完了です。
3.2.ランタイムライブラリライブラリ特定
scriptフォルダのchksig.pyでランタイムライブラリライブラリを特定します。実行可能ファイルの名前が「sample」のときには、次のようにコマンドラインから実行します。
・python chksig.py <sampleのパス>
chksig.pyは何度かIDA Proをコマンドラインから実行した後、sample_chksig.json(対象のファイルに「_chksig.json」が付く」)を作成します。
3.3.ランタイムライブラリの特定結果の適用
ランタイムライブラリが静的にリンクされstripされた実行可能ファイルをIDA Proで開くと、図 2のようになります。ランタイムライブラリの関数が特定されておらず、名前も不明の状態です。
IDA Proでscriptフォルダのprepare.pyを実行すると、sample_chksig.jsonに基づいて特定したランタイムライブラリがロードされます。prepare.pyは他にも
・孤立したコードを関数に設定
・関数の名前を正規化
・mainの検出と作成
・タイプライブラリのロード
・関数の型を適用
を行います。prepare.pyの実行後は図 3になります。ライブラリの関数の名前が特定され、ランタイムライブラリの関数のアドレスが水色になっています。
4.詳細
4.1.ディストリビューションとランタイムライブラリ
先行研究[2][3][4]により、IoTマルウェアのビルド環境の多くがFirmware Linuxとその後継のAboriginal Linuxであることが判明しているため、pkg2sig.pyが対応するディストリビューションはFirmware LinuxとAboriginal Linuxだけです。ランタイムライブラリはlibcとlibgccに対応しています。
4.2.chksig.py
はじめてchksig.pyが実行されたときには、chksig.pyはIDA Proを起動し、検体に対してすべてのシグネチャを適用します。このとき、シグネチャの適用前に関数のライブラリフラグをoffにしますが、完全に初期化することができません。したがって同じシグネチャでも、シグネチャを初めて適用したときの結果と、2回目以降(他のシグネチャを適用した後)に適用した場合では結果が変わってしまいます。そこでchksig.pyではすべてのシグネチャを適用した結果は概算値として保存します。その後、概算値が大きい順に1つづつシグネチャを適用し、決定値とします。すべての概算値よりも決定値が大きいならば、そのランタイムライブラリを実行可能ファイルのランタイムライブラリとして特定します。
4.3.関数の名前を正規化
ライブラリの関数は複数の名前を持つことがあります。たとえば、strcmpはstrcoll、__GI_strcmp、__GI_strcollになりえます。同じ関数が異なる名前で検出されてしまうと、解析が困難になります。そこでprepare.pyは最も短く辞書順で先頭になる名前に他の名前を置き換えます。pkg2sig.pyはこの名前の変換のために、IDA F.L.I.R.T.のシグネチャを生成するときにname_alternate.csvを生成します。このファイルは同じ関数が同じ行になっており、各行は名前が短い順→辞書順でソートされています。
4.4.関数の型を適用
prepare.pyはprepare.txtに基づいて関数の型を設定します。現在、prepare.txtには十分な関数の型の定義がないので、必要に応じて追加する必要があります。
5.謝辞
本研究は総務省の「電波資源拡大のための研究開発(JPJ000254)」における委託研究「電波の有効利用のためのIoTマルウェア無害化/無機能化技術等に関する研究開発」によって実施した成果を含みます。
6.参考文献
[1]Hex-Rays,“IDA F.L.I.R.T. technology: in-depth”, https://www.hex-rays.com/products/ida/tech/flirt/in_depth/ (参照 2022-01-24).
[2]赤羽 秀,岡本 剛,“シンボル情報が消去されたIoTマルウェアに静的結合されたライブラリ関数の特定”,コンピュータセキュリティシンポジウム2020,セッション 2C1-3,2020
[3]赤羽 秀,岡本 剛,“ライブラリ関数が静的結合されたIoTマルウェアのビルドに使用されたツールチェインの特定”,技術報告13,神奈川工科大学(2021).
[4]赤羽 秀,川古谷 裕平,岩村 誠,岡本 剛: IoT マルウェアにおける関数の依存関係と結合の順序関係に基づくライブラリ関数名の特定,コンピュータセキュリティシンポジウム2021 論文集,pp. 786-793 (2021).
[5]Akabane, S. Okamoto, T., “stelftools”, https://github.com/shuakabane/stelftools (参照 2022-01-24)
[6]SecureBrain, “idaflirt-detector”, https://github.com/SecureBrain/idaflirt-detector (参照 2022-01-24)