2018年4月18日
株式会社Doctor Web Pacific
アンチウイルスについて知っているなら、おそらくシグネチャについて聞いたことがあると思います。少なくともこのコラムを定期的に読んでいる読者は間違いなく知っているはずです。ではシグネチャとは何か、おさらいしてみましょう。
シグネチャとは、マルウェアを検知するために作成された悪性コードの一部で、これによってアンチウイルスを可能にします。
つまり、理論上、コードフラグメント(ウイルスデータベースを可能な限り容量を小さくする)を手動か自動で選択し、他の悪意のあるプログラムのコードと、最も一般的な正当なコードが一致しないことを確認し、アプリケーションを作成、ウイルスデータベースに追加します。その後、アンチウイルスはアプリケーションコードを調べるだけで感染を検出することができます。
しかし、攻撃者はアンチウイルスがシグネチャを使用していることを知っているため、アンチウイルスを起動させるシグネチャを特定し、悪質なファイルを公開することができます。そして、それぞれのコードを修正し、アンチウイルスの検知から逃れようとします。
では、アンチウイルスがシグネチャによって悪質なファイルを簡単に公開することができるなら、攻撃者はシグネチャが生成されないような方法でマルウェアを設計できるのでしょうか?
多様な形を持つ悪質なプログラムの中には、特定のマルウェアに関連した特定できるコードは含まれていないものがあります。ファイルが感染すると、悪質なコードがファイル全体に変更や配布をし、感染の特徴的な兆候が検出されないようにします。
最初に知られているポリモーフィック型ウイルスは1260と呼ばれ、1990年にマーク・ウォッシュバーンによって書かれました。もう1つ、よりよく知られているポリモーフィック型ウイルスは、1992年にブルガリアのダーク・アベンジャーと名乗るハッカーによって、自己を書き換える機能をもつMtE(突然変異エンジン)が展開されました。
マルウェアをアンチウイルスがシグネチャを使って検出できないようにするには、いくつかの方法があります。
NOPまたはNOOP(No Operation) - 何もしないようにCPUに指示する特定の命令をします。そういったアプリケーションは多く存在します。たとえば、一定の期間、遅延を引き起こすために使用されることがあります。
簡単に言えば、マルウェアを含むプログラムは一連の命令とデータで、アプリケーションのコードは一連の命令です。NOPコマンドは何もしないので、他の命令のストリームのどこにでも挿入することも、コードをランダムに散在させることもできます。遅延がプログラムの活動の間に発生することが問題にならない限り、プログラムの動作には何の影響もありません。
このトリックは本当にシンプルなものですが、アンチウイルスの反応もそうです。分析対象のコードとシグネチャを比較する際、アンチウイルスはNOP命令を無視します。
暗号化は第2の選択肢です。ご存じのように、異なるキーを使用してデータを暗号化すると、2つの異なるコードが完成します。ファイルが感染している場合、悪意のあるコードは新しい鍵を使用して暗号化され、解読コードに追加されます。暗号化されたデータをターゲットファイルに置き、暗号解読者の暗号化コードの先頭を指定し、解読コードを目的のファイルに追加します。
したがって、アンチウイルスは暗号化されたコードを公開することはできず、暗号解除プログラムのみを探すことができます。一方、ファイルが感染すると、デクリプタコードも変更され、キーと分岐命令が追加されます。
残念ながら、ユーザーが別のアンチウイルステストに関する情報を参照すると、その結果にのみ関心を持つだけで、テスト方法は完全に無視されます。
一方、方法論は重要な要素です。たとえば、アンチウイルスが悪意のあるファイルを起動せずにどのように検出するかを確認したいだけなら、単に定期的なテストに使用されるコードの典型的な部分を探すだけで、ポリモーフィックアナライザーを使用しなくてもウイルス対策を講じることができます。
しかし、上記で説明した技術はすべて、アンチウイルスの作業をより困難にするだけです。並べ替えは、悪質なプログラムを特定するために使用できる特定のコードを取り除くために使用されます。
コードは一連の命令です。命令は、互いに続けることができ、また、他のデータの中に散在することができる。JMP(ジャンプ)命令は、フラグメント間を誘導するために使用されます。
この場合、悪意のあるコードは複数のブロックで構成され、新しいファイルが感染し、ジャンプ命令を使用して接続されるたびに再編成されます。簡単そうに聞こるかもしれませんが、そう簡単ではありません。すべてのプログラムコードには関数の呼び出し、分岐などが組み込まれています。したがって、コードの一部が改ざんされた場合は、すべての呼び出しが適切な場所を指すようにコードを調べる必要があります。アンチウイルスがそのシグネチャによってコードを検出するのを防ぐために、コードブロックは非常に小さくなければならず、コードの完全性も維持する必要があります。
アンチウイルスはどのように順列に対処することができるでしょうか? 今すぐ署名を検索するだけでなく、彼らは指示を見て、ジャンプ命令の分岐間を通過します。したがって、アンチウイルスは、エンジン内のファイルを実行することによって命令シーケンスを実行することにより、コードをまとめてシグネチャデータベースと比較することができます。
これ自体はあまり難しいものではありませんが、実際には、ファイルを起動するためにシステムリソースを割り当てる必要があり、システム全体のパフォーマンスに影響する可能性があります。そのため、ウイルス対策スキャンを行うすべてのファイルに対して多型分析を実行することはできません。しかしここで、ヒューリスティックアナライザーが補助します。
以前発見されたマルウェアとどれほど似ているかによって悪質なプログラムを検出することができます。しかし、これはヒューリスティックアナライザーのタスクの1つに過ぎません。
ヒューリスティックアナライザーがマルウェアを公開するのに役立てるコードプロパティーは、ほんのわずかです。
セクション内で書き込み権限があるエントリポイント(rwx)です。制御が実行可能コードを含むセクションに転送され、書き込み許可を持っているとマークされた場合、自己変更コードが使用されている可能性が非常に高いです。この種のセクションはウイルスと保護プログラムの典型です。またエントリポイントにジャンプ命令を配置する実際的な理由はありません。これが起こると、自己修正コードがファイルに存在することを示します。セクションの後半のエントリポイントについては、通常、ウイルスコードはファイルセクションの末尾に追加されます。これは通常のファイルの典型ではなく、疑わしいと考えられます。壊れたヘッダーを持つファイルは感染後も動作中のままですが、ヘッダーにはリンク処理中に発生しなかったエラーが含まれている可能性があります。だからこの種の誤りは疑惑を引き起こします。いくつかの特別なセクションでは珍しいフォーマットです。実行可能ファイルには、 .ctors、 .dtors、 nad .finiなどの特別なセクションが含まれています。それらはファイルを感染させるのに使用できます。これらのセクションでフォーマットの変更が検出された場合、それも疑わしいと考えてください。
...他にも何百もの疑わしいコードのプロパティがあります。
プロパティは多数あり、それぞれのプロパティには異なるリスクがあります。同時に起こることで脅威を示すものもありますが、脅威を公開し、さらに分析が必要かどうかを判断する上で非常に役立ちます。ヒューリスティックな分析の回避は簡単なことではありません(つまり、警告を発することさえ禁止するという意味です)。これは、特定のコンパイラやフレームワーク(コンストラクタやデストラクタの上書きなど)の機能を利用するプラットフォーム依存のソリューションを使用して、ヒューリスティックなデータベースにすばやくアクセスすることによって、またはファイル全体のコードを並べ替える際に巧みに使用される洗練されたものです。
したがって、順列は、アンチウイルスがマルウェアプログラムをシグネチャで検出するのを妨げるものではありませんが、アンチウイルス開発チームに課せられた要件の点では限界があります。
攻撃者は他に何を持っているでしょうか?
ごみの挿入についてはすでにNOP命令の中で述べました。攻撃者は、実際の悪意のあるコードを隠すために、感染ファイルに重複した命令が挿入されていることを確認することもできます。これは簡単に聞こえるかもしれませんが、複数の役に立たないコマンドが追加されたにもかかわらず、コードを操作し続ける必要があるためです。
これに対処するために、多態性解析器はさらに複雑になります。つまり、コードをまとめておくだけでなく、無駄な断片を取り除くこともできます(Windowsコードを調べるルーチンを実行すれば、どれくらい残されますか? この場合、分析エラーは致命的な結果を招く可能性があります。
変成マルウェアは、コードのブロックが単に並べ替えられた順列とは異なり、変成マルウェアコードは実際に変化します。理論的には、この種の悪質なコードの署名を生成することは意味をなさないので、この種のマルウェアは検出できません。
しかし、多くの読者が知っているように、ほぼすべてのプログラムは特定のプログラミング言語で書かれ、その後実行可能なコードにコンパイルされます。コンパイラは、パフォーマンスやサイズの最適化などのオプションを有効にすることで、同じプログラムに対して異なるコードを生成するように設定できます。メタモルフィックエンジンも同様に動作し、起動するたびに、基本コードを使用して新しいコードを生成します。
定数、レジスタなどを変更することで、悪意のあるコードをさらに難読化することができます。数学との類推を描くことによって、この点を説明しましょう。たとえば、 2+4、 3+3および8-2の結果として6を得ることができます。どの操作が典型的なものとみなさるでしょうか?
課題に対応するためには、コード分析だけでは十分ではありません。したがって、アナライザはエミュレータになります。これは、アンチウィルスエンジン内でプログラムが実行されることを意味します。アンチウィルスエンジンは、もはやシグネチャの一致を探すのではなく、プログラムが起動されたことを監視します。
マルウェアメーカーとアンチウイルス開発者との間の軍備拡大競争は、ポリモーフィック型マルウェアをまれにしました。この種のプログラムを作ることは、それほど困難で費用がかかることです。
セキュリティ研究者を少なくとも数日間占有する優れた変成エンジンを作成し、アンチウイルスがどのようなシグネチャを検出して高品質の crackme を検出するかを判断するエミュレータを設計することができれば、メッセージしてください。私は募集人ではありませんが、そこに多くの人がいるなら、私は職を変えて、あなたを情報セキュリティの会社に紹介し始めます。あなたの収入と人生における安定性は、マルウェアの配布や正当なアプリケーションのクラッキングから得られる可能性のある利益よりもはるかに重要です。
Tell us what you think
To ask Doctor Web’s site administration about a news item, enter @admin at the beginning of your comment. If your question is for the author of one of the comments, put @ before their names.
Other comments