ウィルス(Virus)

ウィルス(Virus)

ウィルスとは?

ウィルス(Virus)とは本来、他のプログラムに寄生して自己増殖する ことができる(つまり自身の複製を作成することができる)コンピュータープログラム のことを言います。

「他のプログラムに寄生する」というとちょっとわかりずらいかも 知れないので、もう少し平たく言うとあるプログラムが起動されるたびに自動的に 実行されるくらいの意味です。

※生物学上のウィルス(Virus)と同様、寄生されるプログラムのことを宿主(Host) といいます

現在では、ウィルス(Virus)という用語の適用範囲がもう少し広いものになっている 為上記の定義のウィルスは狭義のウィルスといった言葉で表現される ようになっています。

上述のようにウィルス(Virus)という用語の今日な定義では、適用範囲がもう少し拡大されていて、 ユーザーの意図とは無関係に自身を複製し、悪意を持った活動を行うプログラム全般を指すようになっています。

狭義のウィルスとの対比を強調するために広義のウィルスなんて言葉が使われることもありますが、 普通にウィルス(Virus)という言葉が使われる場合には、一般的にこちらの定義を意味することが多いようです

従って今日的な定義で言えば、別のプログラムに寄生しないものも、ウィルスに含まれるということになります。 私見ですが、狭義のウィルスのように当てはまらないようなタイプの悪意を持ったプログラムが 増えてきたので、用語の定義が変化してきたというのが実状だと思います。ウィルス対策ソフト (アンチウィルスソフト)がこのような悪意をもったプログラム全般に対応するように なってきている事情もあると思います。アンチウィルスソフトのチェックにひっかかるもの=ウィルス という考え方をする人が多いのでしょう。

※アンチウィルスソフトのチェックに引っかかるもの=ウィルスという考え方は間違っています。 最近のアンチウィルスソフトはパスワードクラッカー等のツールにも反応するようになっているので アンチウィルスソフトが反応したから、実行したプログラムがウィルスに感染しているとは限りません. アンチウィルスソフトが表示するメッセージにきちんとその旨説明が出ます。

ウィルスの分類

狭義のウィルス

本来の意味のウィルス。作成に際してはOSに関する詳しい知識(特にプログラム起動の仕組み≒ローダーの 仕組み)やアセンブラに関する知識が必要なので、作成者の技術レベルは一般的に 高いとされています。Windows用のウィルスでは、PE File Formatに関する知識、 アセンブラに関する知識を 使って作成されます。

ワーム(Worm)

主に特定のOSやプログラムのセキュリティホールを悪用して自己増殖する プログラム。主にネットワークを介して感染します。

トロイの木馬(Trojan Horse)

有用なプログラムを装って配布され、ユーザーが実行するとシステムにバックドアを あけてリモートから操作可能にします。

ボット(Bot)

コンピューターに感染すると外部からリモートコントロールする為にバックドアを あけるプログラム。トロイの木馬と似ていますが、単一の指令サーバーから大量のコンピューター を制御できるようになっている点が特長です。このようにして作成されたネットワークを ボットネットワーク(Bot Network)といいます。DDoS攻撃やスパムメールの送信に使われることも多いようです。

※複数の性質を持つような悪意を持つプログラムが出現しているので、この辺りの分類はかなり曖昧に なってきています。ワームであり、トロイの木馬の機能も持っているしボットとしての機能も持っている なんてものも結構ありますしね。

狭義のウィルスの種類

アンチウィルスソフトが普及してきたため、より検出を困難にする技術が開発されてきています。

ブートセクタ感染型ウィルス(boot sector virus)

ハードディスクを起動する為に使われるブートセクタに感染するウィルス。 感染時に既存のブートセクタを書き換えるか移動させます。皆さんが使っている アンチウィルスソフトは、恐らくブートセクタをチェックするというオプションが 入っていると思います。(恐らくデフォルトでONになっているはず)

マクロウィルス(marcro virus)

なんらかのスクリプトで記述されたウィルス。作成にあたってアセンブラに関する知識は 必要なくて、比較的簡単なスクリプトが理解できれば作成できます。 一斉風靡したLove Letterなんかがこれ

メモリ常駐型ウィルス(memory-resident virus)

感染プログラムが実行されるとメモリに常駐し、コンピュータが再起動するまで実行され続けます。 有名なところではCode Redがこのタイプに分類されます。

レトロウィルス(Retrovirus)

特定のアンチウィルスソフトの弱点を悪用して、検出を回避したり、アンチウィルスに攻撃 を行うウィルス

ポリモフィック型ウィルス(polymorphic virus)

アンチウィルスソフトによる検出を回避するために、感染するたびごとに自身の暗号化コード ・復号化コードを変化させて自身の形態を変化させるタイプのウィルス。感染ファイルのバイナリパターンが 多種多様なものになるため、単純なパターンファイルでは 検出できません。ただし復号化後のコード(暗号化前のコード)は一定。従って、エミュレーションルーチンを使って 復号化後のコード(暗号化前のコード)を抜き出せば、パターンファイルで対応することが可能になります

ポリモフィック型ウィルス

メタモフィック型ウィルス(metamorphic virus)

ウィルス本体のコードに多態性を持たせるようにするウィルス。事実上パターンファイルによる 検出は事実上不可能。例えば

  1. ウィルスコードをいくつかのパーツにわけておいて、順番を入れ替える
  2. 個々のパーツについても異なるコードで同じ機能を実行できるようにする。

みたいな処理を実装すると結果として、非常に多くのパターンのバイナリイメージが生成されるように なります

メタモフィック型ウィルス

上の例でいけば、ウィルスの基本機能を4つのパーツに分類すれば、パーツの並べ替えだけで 4 x 3 x 2 x 1 = 24通りの順列組み合わせができ、個々のパーツを256通りで作成可能なメタモフィック エンジンを作成した場合、該当ウィルスのバイナリパターンは6,144通りになります。1つのウィルスに 対してこれだけ多くのパターンファイルを用意するのは非現実的です。個々のパーツにだけ注目して 検出するという手法も考えられますが、その場合でも256 x 4 = 1024通りにもなってしまいます。 あまりに多くのパターンを使ってウィルスを検出すると、誤検出が多発してしまう危険性が高まるので パターンファイルを使う検出方法を使うのは非現実的な選択肢になります。しかももっと基本的な 問題があります。1024通りなら1024通りになるという事実を限られた時間内で突き止めなければならず、 その場合には該当ウィルスのメタモフィックエンジンを完全にリバースエンジニアリングしないといけません。もたもたしているとウィルスが蔓延してしまいますからね。結局 メタモフィックエンジンを搭載したウィルスの場合にはパターンファイルを使った検出方法は現実的では 無いということになります。

※メタモフィックなトロイの木馬とか出てきたら、かなりの被害が出ると思います。

ウィルス検出手法

パターンファイル(定義ファイル)を使った検出

従来のように感染ファイルのバイナリパターンを見てウィルスかどうかを判定する 方法です。ウィルスのソースコードが公開されるケースもあり、亜種出現までの時間が 短縮されてきているようです。複雑なパッキング技術が使用されている場合は別ですが 簡単なものだとリバースエンジニアリングされて、それを元に亜種が作成されるケース も多いとのこと。狭義のウィルス以外は、アセンブラでコーディングされるケースは そう多くなくて、C/C++やDelphi、Visual Basic等の高級言語が使用されているケース が多いのでソースコードが公開されているケースを除けば、リバースエンジニアリングに よって手に入れたコードを流用して亜種を作成するのは難しいと考えられます。ただし 高級言語を使っている場合には、ウィルスの機能をモジュール化することが可能なので 作者自身が亜種を作成するのは簡単だと思います。要は基本的な機能を持つ部品を予め 作成しておいて、これを使って最終的なウィルスを作成するということです。このような 手法はプログラミングの世界では普通に行われていることなので、高級言語で作成 されるウィルスに限らずにアセンブラでゴリゴリ書かれたウィルスでも実現可能です。

ただ単純なパターンファイル方式だとポリモフィック型ウィルスやメタモフィック型 ウィルスには対応できないという問題があります。ポリモフィック型なら復号化後の ウィルスコード自体は一定なので、復号化をエミュレートするようなモジュールを 作成した上で、パターンファイルと照合すれば検出できます。しかしメタモフィック型 ウィルスの場合にはウィルスコード自体が多態性を持つため、全く別の検出技術が 必要になってきます。

ヒューリスティック - heuristic な手法を使った検出(日本語で言うと発見的手法)

上記のパターンファイルを使った方法では、既知のウィルスにしか対応できず、未知のウィルスに 遭遇した場合には検出できずに感染してしまうことになります。パターンファイルによる検出の このような弱点を克服するために考案されたのがヒューリスティックな手法を使った検出で、 単純にウィルスコードのバイナリパターンを見るのではなくて、プログラムの活動パターンを 見てウィルスかどうかを判定する方法。システムに影響を与えない仮想環境で対象プログラムを 動作させて、ウィルス特有の活動をするかどうかを判断します。ただしウィルスと似たような 活動をプログラムがあると誤検出が発生するという問題があります。

このような考え方は、ネットワークを経由した攻撃の検出等にも適用されはじめていて、かなり研究が 進んできているようです。

ウィルスに関連するコンテンツ

Pickup

  • セキュリティ実験用ツール
  • PIC作成マニュアル
  • 詳説PEファイルフォーマット
  • クラックの手法と対策
  • TCP/IP概論

カレンダー

Valid XHTML & CSS