古典的ウィルス

§1.概要

コンピュータウィルスの起源は定かではありません。私達が現実にコンピュータというものを認識した1970年代半ば、Univax 1108 と IBM 360/370 がリリースされる以前に、既にコンピュータウィルスの考えは存在しています。そして、コンピュータ史学者は、最初のコンピュータウィルスが何か未だ特定出 来ずにいます。

一般的にウィルスとして取り上げられる最初の出来事は、1970年代にARPANETに捧げられたものからのようです。コンピュータウィルスが爆発的に問 題になるのは、1980年代前半にアップルによって開始されたパーソナルコンピュータの一大ブームからといって良いと思います。多くの人々がコンピュータ を扱うようになることに比例して、悪意ある人々はコンピュータの動作を学び、彼らの知識を悪用するようになってきました。

コンピュータ技術の発展はウィルスの発展を招きました。当初、様々なOSに対して作成されていたウィルスは、Windowsの巨大シェアの確立と共に Windowsの脆弱性にターゲットを絞って作成されるようになっています。

1990年代に現れたウイルスは更に多くの脅威を示してきます。銀行口座番号やパスワードの詐取が行われ始めたのは、この頃からです。

一般的にウィルスと呼ばれますが、ワームやトロイの木馬と区別して古典的ウィルスと呼ぶことにします。これに類別されるマルウェアは単一マシン中で自分自 身のコピーを拡散するプログラムを含んでいます。

  • * このコードをユーザに起動もしくは実行させることで意図された行動を完成させる。
  • * 生贄のマシン中の他のリソースに侵入する。

コンピュータウィルスは生息環境と感染方法に応じて分類されます。生息環境とはシステムのファイルに感染したウィルスによって要求されるアプリケーション やOSのことです。感染方法とはオブジェクト中にコードを注入するために使用する技術のことです。

§2.生息環境

大部分のウィルスは以下の環境中で発見されます。

  • * ファイルシステム
  • * ブートセクター
  • * マクロ環境
  • * スクリプトホスト

ファイルウィルスは拡散するために、生贄のマシンのOSのファイルシステムを使用すします。ファイルウィルスは更に挙動により分類されます。

  • * 実行ファイルに感染するもの(ファイルウィルスの大部分を占める)
  • * ファイルの複製を作成するもの(コンパニオンウィルス)
  • * 様々なディレクトリ中に自分自身の複製を作成するもの
  • * ファイルシステムの機能を利用するもの(リンクウィルス)

ブートセクターウィルスは自分自身をブートセクターやマスターブートレコード(MBR)に書き込むか、あるいはアクティブなブートセクターに取って代わり ます。この種のウィルスは1990年代に流行しました。しかし、32bitプロセスが標準となり、フロッピーディスクが衰退した現在ほとんど消滅してきて います。CDやUSBフラッシュロム用のブートセクタウィルスを書くことは技術的には可能とされます。しかし、そのようなウィルスは現在まで検出されてい ません。

殆どのワープロソフト、会計ソフト、編集ソフトおよびプロジェクトアプリケーションは、マクロスクリプトと呼ばれる一連の操作を自動化したコードを内蔵し ています。マクロ言語は複合的であり広範なコマンドを含んでいます。マクロウィルスはマクロ言語で書かれており、マクロを内蔵するアプリケーションに感染 します。マクロウィルスは感染にあたりマクロ言語のプロパティを利用して、あるファイルから別のファイルへ拡散します。

§3.感染方法

上述した分類はオブジェクトへの感染方法によって細分化されます。

3-1.File Viruses(ファイルウィルス)

ファイルウィルスは以下の感染方法を使用します。

  • * 上書き
  • * 寄生
  • * 仲間(コンパニオン)
  • * リンク
  • * オブジェクトモジュール
  • * コンパイルライブラリ
  • * アプリケーション ソースコード

3-1-1.上書き

最も簡単な感染方法。ウィルスは感染したファイルのコードを自分自身に置き換え、オリジナルのコードを削除します。改竄されたファイルは役に立たなくな り、修復することも出来なくなります。この種のウィルスの感染は、OSや影響を受けるアプリケーションが感染後直ちに機能を停止することから容易に判断で きます。

3-1-2.Parasitic(パラサイト・寄生)

パラサイトウィルスは感染したファイルのコードを改竄します。感染したファイルは上書きウィルスに感染した場合と異なり、一部もしくは全ての機能が利用可 能です。

パラサイトウィルスはウィルスがコードを書き込むファイルのセクションによってグループ化されています。

  • * プレペンディング : 悪意あるコードをファイルの先頭部分に書き込む。
  • * アペンディング : 悪意あるコードをファイルの末尾に書き込む。
  • * インサーティング : 悪意あるコードをファイルの中間部分に書き込む。

インサーティング ファイル ウィルスはファイルの中間にコードを書くために様々な方法を使用します。この種のウィルスはオリジナルファイルの一部をファイルの末尾に動かすか、ター ゲットファイルの空いたセクションに彼ら自身のコードをコピーします。キャビティー(空洞)ウィルスもこの分類に属します。

Prepending viruses(プレペンディング・ウィルス)

プレペンディング・ウィルスは二つの方法を用いてターゲットファイルにコードを書き込みます。
  • 第一の手法 : ウィルスはターゲットファイルの先頭から末尾にコードを移動する。そして、この空きスペースに彼ら自身のコード を書き込む。
  • 第二の手法 : ウィルスはターゲットファイルのコードを自身のコードに加える。
いずれの場合にも、常に感染ファイルは起動され、ウィルスコードは最初に実行されます。アプリケーションの完全性を維持するために、ウィルスは感染した ファイルをクリーンにし、そのファイルを改めて起動し、そのファイルが実行されるのを待ち、そして一旦このプロセスを終了し、ウィルス自身をファイルの先 頭部分に再びコピーします。ウィルスの中には感染ファイルのクリーン版を保存しておく場所としてTempファイルを使用するものもあります。ウィルスの中 にはメモリ中のアプリケーションコードを修復するものもあります。まるでOSの複製業務のようにボディー中の必要なメモリアドレスをリセットします。

Appending viruses(アペンディング・ウィルス)

大部分のウィルスはこの分類に属します。アペンディング・ウィルスは感染ファイルの末尾に自身を書き込みます。しかしながら、この種のウィルスは感染した オブジェクトがコマンドを発生させる前に、ウィルスコードを含むコマンドが実行されるようにファイルを改竄します。これをファイルヘッダのエントリポイン トの改竄と言います。

Inserting viruses(インサーティング・ウィルス)

ウィルス製作者はファイルの中間にウィスルを注入するために様々な方法を用います。最も単純な方法は、オリジナルファイルの一部をファイルの末尾に移動さ せたり、ウィルスのための空きスペースを作成するためにオリジナルコードを詰め込むことです。

キャビティー・ウィルスと呼ばれるものもインサーティング・ウィルスに含まれます。キャビティー・ウィルスは空っぽであることが知られているファイルのセ クションに自身のコードを書き込みます。例えば、キャビティー・ウィルスは exeファイル(実行ファイル)のヘッダーの使用されていない部分、即ち exeファイル(実行ファイル)セクション間のギャップや汎用コンパイラのテキスト領域に自身をコピーします。キャビティー・ウィルスの中には一定のデー タ領域が一定のバイト数を含むファイルにだけ感染するものもあります。選択されたデータブロック領域はウィルスコードで上書きされます。

結局、ある種のインサーティング・ウィルスは感染ファイルが機能するために必須のコードセクションを悪く書いたり上書きしたりします。これはファイルに、 もはや修正不能の破壊を発生させます。

Entry point obscuring viruses - EPOs(エントリポイントを曖昧にしているウィルス)

この種のウィルスはパラサイト・ウィルスの一部です。アペンディング・ウィルスとインサーティング・ウィルスの両方に含まれます。この種のウィルスは exeファイルのヘッダー中のエントリポイントを改竄しません。EPOウィルスは感染したファイルの中間にウィルスボディーへのルーチンポイントを書き込 みます。感染ファイルが実行され、実行可能なウィルスを包含しているルーチンが呼び出された場合だけウィルスコードは実行されます。このルーチンが極めて 稀にしか使用されない場合は、極めて稀なエラー警告が発生します。EPOウィルスは長い時間休止状態でいることが出来ます。

ウィルス製作者は注意深くエントリポイントを選択しています。劣悪なエントリポイントを作成してしまうとhostファイルを破壊したり、ウィルスが感染し たファイルが削除されるまで機能しなかったりとなってしまうからです。

ウィルス製作者は有用なエントリポイントを見つけるのに様々な方法を使用します。

  • * フレームを探し感染開始ポイントとしてそれらを上書きする。
  • * hostファイルのコードを逆アッセンブルする。
  • * あるいは、重要な関数のアドレスを変更する。

3-1-3.Companion viruses(コンパニオン・ウィルス)

コンパニオンウィルスがhostファイルを改竄することはありません。代わりに、ウィルスを含む複製ファイルを作成します。感染ファイルが起動された時、 ウィルスを含む複製ファイルが最初に実行されます。

コンパニオンウィルスはhostファイルをリネームし、後日に参照するために新しい名前を記録します。それからオリジナルファイルにウィルスコードを上書 きします。たとえば、ウィルスはNotepad.exeをNotepad.exdにリネームします。そして、Notepad.exeにウィルス自身のコー ドを書き込みます。これで生贄のマシンのユーザがNotepad.exeを起動したときはいつもウィルスコードが実行され、その後本来のNotepadで あるNotepad.exdが呼び出され実行されることになります。

オリジナルの感染テクニックを使用したり、特定のOSの脆弱性を利用するコンパニオンウィルスも存在します。例えば、Path-Companionウィル スはWindowsシステムディレクトリ中に自身のコピーを置きます。WindowsシステムディレクトリはPATHリスト中の先頭にあるので、 Windowsが起動したときシステムはこのディレクトリからスタートします。現在フィールドに存在する大部分のWormとTroyはこのような自動起動 テクニックを使用しています。

3-1-4.Other infection techniques(その他の感染テクニック)

ウィルスがファイルに感染する場合、実行ファイルに感染します。ところが、ある種のウィルスはコンピュータの感染に実行ファイルを使用しません。希望する フォルダレンジに自分自身をコピーするだけです。遅かれ早かれそれらはユーザによって起動されます。ウィルス製作者のなかにはウィルスを含むファイルを起 動させるように、install.exe や winstart.bat のようなファイルを組み込み、ユーザを罠に掛ける者もいます。

また、ARJ、ZIP、RAR等にフォーマットされた圧縮ファイル中に自身をコピーするウィルスもいます。このウィルスは、他のウィルスがバッチファイル に感染ファイルを起動するコマンドを書き込んでくれるまでじっとしています。

リンクウィルスもhostファイルを改竄しません。しかし、この種のウィルスはファイルシステム中の適切なフィールドを改竄することでOSにウィルスコー ドを実行するよう仕向けます。

3-2.Boot Sector Viruses(ブートセクタウィルス)

ブートウィルスはフロッピーディスクのブートセクションやハードディスクのマスターブートレコードに感染するウィルスとして知られています。ブートウィル スはコンピュータのスイッチを入れたり、再起動したときにOSを起動するために使用するアルゴリズムに基づいて活動するウィルスです。
システムの立ち上げに際し、最初にメモリとディスクのための必要なチェックが行われます。システムブートプログラムはブートディスク(BIOSセットアッ プ中の設定/インストールパラメータに対応した A:、C:、CD-ROM)の最初の物理セクターを読み出して実行し、ブートセクターに制御を渡します。

ディスクが感染すると、ブートウィルスはシステムが起動したとき制御を獲得するために自身のコードを代用します。システムが感染すると、ウィルスはシステ ムにメモリを読み出すことを強制し、それから本来ののブートプログラムコードではなくウィルスコードに制御を与えるよう動作します。 フロッピーディスクの場合の感染方法一つしかありません。ディスクのブートセクターのオリジナルコードの場所に自身のコードを書き込むテクニックだけで す。
ハードディスクの場合の感染方法には以下の三つがあります。

  • * ウィルスはMBRコードの場所に自身のコードを書き込む。
  • * ウィルスはブートディスクのブートセクタコードの場所に自身のコードを書き込む。
  • * ウィルスはハードディスクMBR中のディスクパーティションテーブル内のアクティブブックセクタのアドレスを改竄する。

非常に多くの場合、ディスクが感染した時ウィルスはオリジナルブートセクタ(または、MBR)をディスクの別のセクタに移動させます。通常は最初の空領域 です。ウィルスがそのセクタより長い場合は、感染セクタはウィルスコードの先頭部分を含むことになります。そして、コードの残りは他のセクタに置かれま す。

3-3.Macro Viruses(マクロ・ウィルス)

最も拡散しているマクロウィルスはOLE2フォーマットで情報を保存するMicrosoft Office用(Word, Excel and PowerPoint)のものです。そして、これ以外のアプリケーションに関するウィルスは極めて稀です。。 (OLEは、Object Linking and EmbeddingのStandForで現在はActiveXと名称変更されています。)

MS Office用のウィルスが実際に寄生する場所はファイルフォーマットに依存します。困ったことにMicrosoft製品のファイルフォーマットは非常に 複雑です。全てのWord、Office97、Excelテーブルは一連のデータブロック(個別のフォーマットで)を構成しています。そして、これらは サービスデータによって結合されたり、リンクされたりして組み合わされます。Word、Excel、 Office 97ファイルの複合的フォーマットの所為で、そのようなファイル中のマクロウィルスの位置を言葉で言い表すことは困難です。そこで、以下にダイアグラムを 示しておきます。

Uninfected document or table file   Infected document or table file
File header
Service data (directories, FAT)
Text
Fonts
Macros (if any)
Other data
 
File header
Service data (directories, FAT)
Text
Fonts
Macros (if any)
Virus macros
Other data

ドキュメントやテーブルを使用する作業を使用したとき、Ms Officeは異なった数多くのアクションを実行します。アプリケーションはドキュメントを開き、それを保存したりプリントしたり、閉じたり等のことを実 行します。MS Wordは適切な内蔵マクロを探し、そして実行・起動します。例えば、ファイルの「保存」コマンドを使用することはFileSaveマクロを呼び出すこと です。「名前を付けて保存」コマンドはFileSaveAsマクロを呼び出すことです。他も同様です。常に、そのようなマクロが定義され構築されているこ とが仮定されているのです。

Ms Officeにはオートマクロ(自動実行マクロ)なる代物もあります。これは状況に応じて、その状況の範囲内で自動的に呼び出されるマクロです。例えば、 ドキュメントが開かれた時、MS WordはAutoOpenマクロが存在するか否かドキュメントをチェックします。もし、マクロが存在すればWordはそのドキュメントを実行します。ド キュメントが閉じられる時、WordはAutoCloseマクロを実行します。Wordが起動される時、アプリケーションはAutoExecマクロ等を実 行します。これらのマクロはユーザの指示なしに自動的に実行されるものです。オートマクロは特定のキー、指定の時間、データのいずれかに関連付けられたマ クロ関数です。

原則として、MS Officeに感染するマクロウィルスは上述のテクニックの一つを使用します。ウィルスは自動マクロ(自動関数)か、メニューアイテムに関連付けられてい るような再定義される標準システムマクロを含みます。もしくはウィルスマクロは所定のキーストロークやキーコンビネーションによって自動的に呼び出されま す。一度マクロウィルスが制御を獲得すると、他のファイルにウィルスコードを転送します。通常、現在編集中のファイル。極めて稀に感染させるファイルを ディスク上で探すウィルスもいます。

3-4.Script Viruses(スクリプト・ウィルス)

スクリプトウィルスはファイルウィルスの部分集合といえます。様々なスクリプト言語で書かれています(VBS、JavaScript、BAT、PHP 等)。これらは他のスクリプト、例えばWindowsあるいはLinuxのコマンドやサービスファイルに感染したり、マルチコンポーネントの一部を形成し たりします。スクリプトウィルスは、そのファイルフォーマットがスクリプトの存在を許可しさえすればHTMLのような他のファイルフォーマットに感染する ことができます。