今度はbyte code

ほぼこもセキュリティニュース By Terilogy Worx

いろいろなマルウェアがあります。
いろいろなマルウェアはいろいろなコンピュータ言語で開発されます。
現代的なコンピュータ言語は開発の容易性が高く、通常の開発者に人気ですが、悪意あるプログラムを作成する開発者にも利用されます。
そんな現代的なコンピュータ言語のひとつにPythonがあります。

Pythonはコーディングが平易で、PyPIというオープンソースリポジトリを活用することで少ないコーディングで期待するプログラムを作成することができます。
このため、マルウェアの作成者がこれを選択することもあります。

ところで、Pythonで作成されたアプリケーションのファイル状態にはどういったものがあるでしょうか。

  • Pythonのソースコード
    これはファイルの拡張子が「.py」となっているものです。
    Pythonの実行環境があればこれを動作させることができます。
    そしてPythonはスクリプト言語ですので、なんらかの難読化の手が講じられていない場合にはこのソースコードは処理内容を確認することが比較的容易です。
    PyPIなどのリポジトリに悪意あるコードが混ぜ込まれる際にこの状態が選択されることが多いと思われます。

     

  • 実行形式ファイル
    通常、Pythonで作成されたアプリケーションを実行する際にはPythonの実行環境が必要です。
    しかしwindows環境であれば「.exe」拡張子などの実行形式ファイルの状態にすることで、PythonのプログラムはPythonの実行環境を必要とすることなく単独で動作することができるようになります。
    作成された悪意あるコードを含むアプリケーションがマルウェアとして配布される場合にこの形式が選択されるケースが出てきています。

     

  • Pythonのbyte code
    これはファイルの拡張子が「.pyc」となっているものです。
    Pythonの実行環境があればこれを動作させることができます。
    pycファイルは、Pythonで記述されたソースコードから生成されたコンパイル済み出力ファイルです。
    Pythonの実行環境を使用してpyファイルを実行すると、実行用のバイトコードに変換されます。このときコンパイルされたバイトコードが.pycファイルとして保存され、必要に応じて後でキャッシュから再利用されるように動作します。
    このpycはpyファイルの内容がコンパイルされたものですので、このpycを動作させる際に元のpyファイルは必要ありません。
    このpycファイルが悪意あるプログラムの配布の形式として利用されるケースが観測されてきています。

マルウェアかもしれないと想定して調査する必要のあるファイル形式がどんどん増加していきます。
pycファイルはコンパイル済みファイルですのでそのまま内容を解釈することはできませんが、pycファイルをpyファイルに逆コンパイルすることもできますので、内容を知ることは可能です。
しかし人手を介することなく自動的に内容を解釈して悪意の有無を判定して防御したいと考える場合、この話はまたしても防御側の負担が増える話に思えてきます。

参考記事(外部リンク):When byte code bites: Who checks the contents of compiled
Python files?

www.reversinglabs.com/blog/when-python-bytecode-bites-back-who-checks-the-contents-of-compiled-python-files