ポリモルフィックコード
ポリモルフィックコード(英: Polymorphic code)とは、本来のアルゴリズムを保ったまま変化していくコード(プログラム)である。この技法はコンピュータウイルス、シェルコード、ワームが自身の存在を隠すために使われる。
アンチウイルスソフトウェアや侵入検知システムの多くは、ファイルやコンピュータネットワーク上のパケットを調べ、悪意あるコードがないか調べる。これにおける検出方法はもっぱらパターンマッチであるため、ポリモルフィック手法によりコードを絶えず変化させることで、検出を難しくすることができる。
ポリモルフィックコードを実現する手段としてよく使われるのは暗号である。しかし、コード全体を暗号化してしまうと実行不可能となるので、それはできない。したがって、一部のコードは暗号化せずに残しておく。アンチウイルスソフトウェアは、その暗号化されない一部分をターゲットとして探索する。
悪意あるプログラマは、暗号化できない復号エンジン部をウイルスやワームが伝播するたびに書き換えることでセキュリティソフトウェアから逃れようとする。また、アンチウイルスソフトウェア側もマルウェアを確実に検出するため、復号エンジン部の突然変異によっても変化しないパターンを見つけ出そうとする。
世界初のポリモルフィックコード方式のウイルスを作ったのは Mark Washburn である。そのウイルス 1260 は1990年に書かれた。もっとよく知られているポリモルフィックコード方式のウイルスとしては、1992年にブルガリアのクラッカー Dark Avenger(en:Dark Avenger)が作った、ミューテーションエンジン(Dark Avenger Mutation Engineを略してDAME、あるいはMtEと略される)がある。MtEの著しい特徴は、それ自身は厳密にはウイルスではなく、他のウイルスにとりつき、そのウイルスのコードを暗号化する「エンジン」である点である。
例
編集以下の擬似コードは、コードの一部が暗号化されているとして、それを復号して実行するコードである。
Start: GOTO Decryption_Code Encrypted: ... 暗号化されたコード列 ... Decryption_Code: A = Encrypted Loop: B = *A B = B XOR CryptoKey *A = B A = A + 1 GOTO Loop IF NOT A = Decryption_Code GOTO Encrypted CryptoKey: 何らかの乱数
以下は同じコードを不必要な C という変数を導入して擬装した例である。
Start: GOTO Decryption_Code Encrypted: ... 暗号化されたコード列 ... Decryption_Code: C = C + 1 A = Encrypted Loop: B = *A C = 3214 * A B = B XOR CryptoKey *A = B C = 1 C = A + B A = A + 1 GOTO Loop IF NOT A = Decryption_Code C = C^2 GOTO Encrypted CryptoKey: 何らかの乱数
"Encrypted" 以下の暗号化されたコードを復号して実行したとき、Decryption_Code と CryptoKey の間にあるコードを調べ、変数 C をいじっている部分を削除する。次に暗号化されるとき、C をいじる不要なコードを新たに生成する。一般に、最初は暗号キーとしてゼロを使う。そうすると復号時に何も変化しないため、暗号化されていない通常のコードのままでよい。それを1回実行したときに新たな暗号キーを生成するなどして暗号化する。
他にも、NOP(何もしない)命令を適当に挿入するなどのポリモルフィックな技法がある。
関連項目
編集参考文献
編集- Diomidis Spinellis. Reliable identification of bounded-length viruses is NP-complete. IEEE Transactions on Information Theory, 49(1):280–284, January 2003. doi:10.1109/TIT.2002.806137