コンピュータウィルス

コンピューターウィルスやセキュリティ対策ソフト等のメカニズムを考えてみます。
更新日 2016-02-13

ウィルス

ユーザーに悟られぬように起動し、悪さをするプログラムの事をコンピュータウィルスといいます。

発生起源

プログラマによって、通常のプログラムと同じ手順で作成されます。突然変異だとか自然発生などという事はありえません。

ウィルスと通常のソフトの違い

主にウィルス対策ソフトベンダーが認定したものをウィルスと言います。どちらもプログラム上での違いはありません。

いかにして実行されるか

プログラムなのだから、実行されなければ害はありません。実行するにはユーザーが明示的にクリックする必要があります。メールで送られてきたからといって、ディスクに 保存されているからといって、それだけでは害はありません。勝手に起動する事もありません。
注)スタートアップフォルダに保存していたり、そこにショートカットが張られていると再起動時に自動実行されます。
逆に一度でも実行してしまったら例えそのプロセスをその時殺せたとしても、自動起動がひっそりとレジストリに設定され、以降は何度でも勝手に甦ってくる事でしょう。

感染

ネットワーク自体は単なるパケットの伝送メカニズムに過ぎず、ウィルス感染の経路にはなりえても仕組みにはなりえません。つまり繋いでいるから感染するというのは 誤解です。一般にネットワークを利用するソフトウェアの代表であるブラウザやメールソフトを経由して感染する訳ですが、単純なデータの送受信であれば害は無いというのが プログラムの設計思想です。ではなぜ感染するかという事になりますが、それは後に詳しく検討する事とします。

ウィルス対策ソフト

ウィルス感染を予防したり、また感染したファイルを検出したり、はたまた除去したりするソフトの事です。最近はセキュリティソフトとも呼ばれています。

ウィルスの発見

ウィルスとその他のプログラムとの間に明確な違いはありません。見つけるには事前にデータベースに保存されているウィルスのバイナリイメージと完全にマッチする 実行ファイルをひたすら探す事になります。その為ファイル名を偽装していても簡単に見つけられます。また完全に一致した上でファイルサイズが異なるものは、 別の実行ファイルの(おそらく)末尾に感染しているという事になります。
逆に未知の最新のウィルスについては当然その対象にはなりません。

予防

いかなるウィルスも実行されてこそのプログラムです。それゆえに起動直前にその実行ファイルをウィルスチェックする事で予防する事が可能です。イメージとしては、 実行ファイルにウィルスチェックを関連付けし、ウィルスチェック後に本来の関連付けへと繋げる感じ。起動時のみ負荷なので動作が軽快です。
パケットキャプチャよろしく通信データをリアルタイムで覗き見して、ウィルスチェックを行う事も不可能では無いです。不効率で負荷が高く実装するメリットには疑問が残りますが、 素晴らしいコーディングはきっとそれを可能にする事でしょう。

除去

ウィルスとされる実行ファイルそのものを消す。また実行されているようであれば、その起動されたプロセスを強制的に終了させる。他の実行ファイルにくっついている場合は その部位を削除し、実行ファイルの中の起動手順について変更されたであろう部位を修正する。(実行ファイル中のPEヘッダ のエントリポイントと思われる。またウィルスによって 異なるかもしれないし、それが修正できるレベルかどうかはそれぞれで異なる)

防御

Windows のユーザーアカウント制御は、システムに影響しうるプログラムを一時停止して、ユーザーに実行の再確認を行います。プログラムからこれを無効にする事は出来ない ようなので、事実上の防御となります。しかしながら、日々頻繁に現れるUAC に辟易している一般ユーザーの判断の多くは盲目的に続行をクリックする事でしょう。 私などはもはやUAC を無効にしちゃってます。

ファイアーウォール

届いたパケットが過去に自身が行ったリクエストに基づく物であるかどうかをチェックします。一方的に送りつけられてくるパケットは破棄されます。たとえばトロイの木馬といった ウィルスが外部からのパケットをリスニングしている場合には、そのパケットをブロックしたり、逆にリクエストパケットを破棄したりできます。逆に言えば、ファイアーウォールは ウィルス感染後に効果が出る、つまりウィルスに感染するのを予防できるものではないという事です。
ウィルスの悪意ある行動による2次被害の拡大を抑える為のものです。

感染経路

ウィルスの一つの特徴に感染があります。もちろんそれもプログラマがそのような動作を意図して実装しています。

ブラウザ

ブラウザ自体はそもそもはHTML といったデータを表示する為のものであり、ウィルスの入る余地は無いはずです。しかしFTP のように バイナリファイルをローカルのディスクに保存できる機能が実装された事で、まず一つの感染経路が成立しました。
次にJavaScript が狙われました。JavaScript はもちろんウィルス足りえない仕様のはずでしたが、機能の拡張とともにバグが生まれ、そこに付けいる形でOSから 実行を勝ち取る手法が編み出されました。もっともブラウザのバグ(セキュリティホール)狙いなので、修正されればそこは脅威では無くなります。全てのバグが セキュリティホールになる訳ではないし、むしろよくまぁセキュリティホールたらしめる(つまり利用できた)ものだと感心せざるえません。
見るだけで感染するサイトというのは上記のバグに由来します。これもブラウザのバグ(というよりも設計ミス)を利用したものであり、修正を施された 最新のもの利用する大半のユーザーにとっては問題とはなりえません。(古いブラウザを使う人が多いのはまた別の問題)

ブラウザアドオン

ブラウザの拡張機能としてActiveX、Java、Flash、Adobe Reader とさまざまなアドオンが各所から提供されています。アドオン自体は最初にユーザーに許可をもらってから インストールと以降の自動実行へと進む単一のアプリケーションです。ユーザーには必ず最初にその利用の有無の選択肢が表示されます。大手ベンダーは それを適切なソフトウェアとして自信を持って提供しており、また我々もそうであるに違いないと考えて受け入れています。ですが中には悪意のあるアドオンプログラムを 配信している所もあります。アドオンのインストールダイアログが出たら注意しましょう。信頼された発行元以外であれば、一度それについてググって確認されたり、 インストールされない方が良いでしょう。
Flash などのアドオン上で動く個別のFlash アプリケーションもまた、仕組み上ではウィルス足りえません。こういったアプリはアドオン上で解析実行されるという インタープリターという設計であり、それによってプログラムに悪さが出来ないように制限を設けているのです。しかし残念ながらアドオン上のセキュリティに隙があり、 許されぬ動作が可能となる事があり、それを利用して悪意あるプログラムを作成できたりして問題になりました。(信頼性の最たるFlash においても一時期はそれが発見され、 IE においてFlash コンテンツの自動実行が初期設定でオフとなるという時期もありました) この手のミスは、アドオンベンダーにとっても死活問題で、あってはならない事です。
一般ユーザーのブラウザを見ると、いろんなツールバーが何段も不要に入ってるブラウザを良く見かけます。検索ボックスの類もそうです。どんなにセキュリティ対策をしていても、 ユーザーの認識が無ければこうなっちゃうという矛盾の良い例です(いつ入れたのかの認識すら無いのです)。

メール

起動したウィルスは何でもできます。例えばメールにウィルス自身を添付して、ランダムにメール配信する事だってできます。メールの受信者が不注意であれば、その添付ファイルを 疑う事なしにクリックしてしまう事でしょう。大抵のウィルスは起動直後は何事もなかったような振る舞いをしますが、確実に感染し隙を見ては悪さする事でしょう。
一時期はエクセルなどのデータファイルが問題になりました。データファイルにはマクロというエクセル上で動く簡易のプログラムを含める事もできました。そのマクロを 用いてウィルスが作成できたのです。もっともマクロ言語自体はその仕様上はアドオンアプリ同様にバグを利用しなければウィルス足りえないはずなので、エクセルが バージョンアップされる度に終息へと進んだようである。(ブラウザ同様に、古いエクセルを修正もせずに使い続けるユーザーもまだまだいるでしょう)
基本的に添付ファイルは実行ファイル(つまり拡張子が.EXE or .COM、.BAT) でなければ安心です。しかしウィンドウズではエクスプローラーにおいては デフォルトで拡張子を非表示としているようで、わざとアイコンリソースを安全なもの(例えばテキストファイルのメモ帳アイコンといった具合)に見せかけて ユーザーの不注意なクリックを目論むケースが有名です。
添付されたものは必ず、実行ファイルでない事を確認してからクリックしましょう。ウィルス対策ソフトは、このタイミングでウィルスチェックを実行します。

CD 自動実行

CD-ROM 等で自動的に起動するのは便利ですが、しかしそれがウィルスだったら結果は最悪です。自動実行は面倒であってもオフに設定しましょう。

ウィルスの起動と除去

ウィルスに感染したPC の修繕経験です。

症状の発現

趣味でパソコンの有償修理(4000円ポッキリ)を行なっているのですが、その依頼の半分がウィルス除去です。それもWindows XP でアダルトサイトを見てしまい、 高額の利用請求画面が頻繁に表示されてしまい手に負えないというケースです。
毎回違う画面表示ですが、元は同じかもしれません。

除去する

架空請求のポップアップウィンドウが消えません。IE のポップアップのように見えますが、そうではないのでしょう。タスクマネージャーのアプリケーションにも 表示されません。プロセスを見て、怪しげなものにアタリを付けて順番に強制終了させていきます。ポップアップが消えたら、それが該当のプロセス(ファイル名)です。
つぎにエクスプローラでこのファイルを検索するといくつかヒットします。片っ端から消していきます(ただし重要なシステムファイルと同じ名前である場合、 誤って消してしまうと後々トラブルとなるかも)
regedit でレジストリを、先ほどのファイル名で検索します。大抵いくつか見つかりますが、みんな消していきます。Run とかに設定されているのは安易ですね。
これで解決なんですが、ウィルス製作者がここまでの対策を想定して別の無害なプロセスでもって再度ウィルスの生成とレジストリへの登録を行う処理を 含めているとお手上げです。その上で、OSの再インストールを提案しています。

まとめ

ウィルスへの対策は、基本的には 安易に実行しない 事に尽きます。セキュリティホールに起因するのであれば、修正パッチが当てられない限り回避しようがありませんが、それはリスクを定量化してみれば微々たるものです。
ウィルス対策ソフトの導入で安心感は得られるが、基本的には既知のウィルスにしか有効で無い。フリーソフトのようにウィルスにひっかからないソフトでも作者が 細工を潜ませる分には検出のしようも無い。(実際そういう事件はいくつもあるし、ジョークソフトなら自分もわけなく作れてしまう。最終的にはソースコードを 全て読みきり、自分でビルドして使う以外にフリーソフトを信頼しきる方法はない。)
近年のセキュリティ対策ソフトの中には、Vista 以降に組み込まれたWindows Defender とファイアーウォールを無効にする品もあり、こうなると本末転倒な感じもします。 クッキーにまつわる誤解も良くきかれます。
Vista 以降に搭載のWindows Defender とファイアーウォール(UAC はオフ) 、そしてMicrosoft security essentials(無料)を入れていれば、実運用上の危機感は感じていません。 リスクを定量化して考えずに対策ソフトの導入に過度の期待をかけるのは、ややヒステリックな反応ではないかと考える次第です。

Microsoft security essentials

マイクロソフトがOS にウィルス対策を標準機能として組み込む為に買収したメーカーのウィルス対策ソフト。しかし独占禁止法の絡みで別インストールとなった経緯があります。

ウィルス以外の悪意ある仕組み等

ウィルスとは異なるメカニズムの悪意あるシステムについてです。

クロスサイトスクリプティング

フォームタグによってユーザーからの文字列の入力を受け、それをエスケープ処理する事なく表示するWeb サイトのデザインにおいて、JavaScript が実行できてしまう事が原因となります。 文字列中にフォームタグとSubmit() を含める事でユーザーからのリクエストを偽装発行できます。
サイト側において、入力文字列を表示する際にエスケープ処理を施すのはJSP なら簡単です。

クロスサイトリクエストフォージェリ(CSRF, XSRF)

フォームタグとJavaScript によるOnLoad()=>Submit() を利用した目的のWeb サイトに対するリクエストの発行を行わせる手法です。サイトの設計者が、リクエスト毎にサイトが発行した一意の トークンを常に求める仕様としたり、リクエストについていちいち認証リクエストを再度求めるように実装すれば防げます。
ユーザーの持つCookie がこの偽装リクエストにも含まれるため、ログイン済みで管理コンソール画面を簡易に変更できる仕様のWeb サイトシステムにおいて、 意図しない設定変更をさせられるケースがあるようです。