分かりやす〜い
コンピュータ技術情報

TOPに戻る
▼Virus
Code REDウィルスとは?
┣ マイクロソフトの説明
┃ とIIS機能

┣ アプリケーションソフ
┃ トは機能の寄集め

┣ 呼出・復帰時に行わ
┃ れる事

┣ 復帰の場所を変え
┃ てみると・・

┣ 感染したCode R
┃ EDは何を行うか

┣ 異常データをサーバ
┃ ーのバッファに格納

┣ プロセッサの保護機
┃ 能

┣ ウィルスの場所を特
┃ 定する

┣ウィルスコードを実
┃ 行する

┣ CodeREDの正体1
┗ CodeREDの正体2

Copyright(C) 2001-2002.ugpop. All rights reserved.




■デジタル用語辞典:

▲このページの上へ

■ 異常データをサーバーのバッファに格納 ■

前回はCode REDウィルスがどのような動作をするのか説明しま
した。また、WEBページを表示する時に、クライアントとサー
バーとの間で、少量の文字列のやり取りが行われる事を説明し
ました。この「少量の」という部分がミソです。

今回は、Code REDウィルスにより攻撃を受けたサーバーがどの
ような動きをするのか解説を行います。

まず、正常な文字列がサーバーに対して送られて来た時の動作
を説明しましょう。

WEBページの表示を要求する文字列「GET / HTTP/1.0」がサー
バーに対して送られてきます。

サーバーは、この文字列を一旦バッファに格納(コピー)しま
す。

以下に格納する時の図を示します。


クライアントから   サーバーの
送られてきた文字列  バッファ
           ┌───┐
      G───→│ G  │
    格      ├───┤
    納 E───→│ E  │
    |      ├───┤
    │ T───→│ T  │
    │      ├───┤
    │  ───→│   │
    │      ├───┤
    ↓ /───→│ /  │
    │      ├───┤
    │  ───→│   │
    │      ├───┤
    │ H───→│ H  │
    │      ├───┤
    ↓ T───→│ T  │
    │      ├───┤
    │ T───→│ T  │
    │      ├───┤
    │ P───→│ P  │
    │      ├───┤
    ↓ /───→│ /  │
    │      ├───┤
    │ 1───→│ 1  │
    │      ├───┤
    │ .───→│ .  │
    │      ├───┤
    ↓ 0───→│ 0  │
           └───┘

ところで、上の図で表されている「GET / HTTP/1.0」の文字列
ですが、人間が見た場合には「GET」というアルファベットや
「/」という記号や「1.0」という数字が並んでいると理解でき
ます。
メルマガ読者もアルファベットや記号や数字が組み合わさって
「GET / HTTP/1.0」の文字列が構成されていると理解できます
よね?

しかしながら、プロセッサという物は数字だけしか理解する事
が出来ません。これは、インテルプロセッサだけでなく、全て
のプロセッサに共通する事です。

全てのプロセッサ(コンピュータ)という物は数字だけしか扱
えないのです。

では、「GET / HTTP/1.0」という文字列をプロセッサはどのよ
うに処理しているのでしょうか?

それは、文字列を数字に変換して処理しているのです。
知っている方も多いと思いますが、文字コードと呼ばれている
物です。

なぜこのような話をするのかというと、上の図でバッファに文
字列を格納しているイメージがあるのですが、これは分かり易
くする為に書いてあるのであって、厳密にはこの図の通りでは
ない、という事を言いたかったからです。

もう少しだけ文字コードについて解説を続けさせてください。

文字コードにはいろいろ種類があり、JIS(ジス)やSHIFT-JIS
(シフトジス)、UNICODE(ユニコード)等があります。
その中でマイクロソフトのIIS機能はUNICODEと呼ばれる文字コ
ードを使用しています。

以下に、UNICODEの文字コード表のほんの一部分を示します。
(文字コード表は膨大な量がある為、ここに全て載せる事が出
来ません。興味のある方はフリーウェア等でいくつか種類があ
りますのでダウンロードしてみてください。)

           UNICODEの文字コード表(16進数)
     ┌───────────────────────────────┐
     │              1桁目              │
     ├─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┤
     │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│ A│ B│ C│ D│ E│ F│
┌─┬──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│2│0040│ @│ A│ B│ C│ D│ E│ F│ G│ H│ I│ J│ K│ L│ M│ N│ O│
│桁├──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│目│0050│ P│ Q│ R│ S│ T│ U│ V│ W│ X│ Y│ Z│ [│ \│ ]│ ^│ _│
│以├──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│降│0060│ `│ a│ b│ c│ d│ e│ f│ g│ h│ i│ j│ k│ l│ m│ n│ o│
└─┴──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

文字コード表の見方は分かるでしょうか?

例えば、文字の「A」は数字の「0041」(16進数)としてプロセ
ッサに処理されます。
同じように、文字の「B」は数字の「0042」(16進数)としてプ
ロセッサに処理されます。

文字コードについての説明はここまでです。
文字列という物は、コンピュータ内部では全て数字として扱わ
れている、という事が分かれば良いです。

それでは先ほどの「サーバーのバッファに文字列を格納するイ
メージ」を、UNICODEで格納するイメージに書換えたものを以
下に示します。

クライアントから   サーバーの
送られてきた文字列  バッファ
           ┌───┐
      G───→│ 0047 │
    U      ├───┤
    N E───→│ 0045 │
    I      ├───┤
    C T───→│ 0054 │
    O      ├───┤
    D  ───→│ 0020 │
    E      ├───┤
    で /───→│ 002F │
    格      ├───┤
    納  ───→│ 0020 │
    │      ├───┤
    │ H───→│ 0048 │
    │      ├───┤
    ↓ T───→│ 0054 │
    │      ├───┤
    │ T───→│ 0054 │
    │      ├───┤
    │ P───→│ 0050 │
    │      ├───┤
    ↓ /───→│ 002F │
    │      ├───┤
    │ 1───→│ 0031 │
    │      ├───┤
    │ .───→│ 002E │
    │      ├───┤
    ↓ 0───→│ 0030 │
           └───┘

文字列が数字として格納されていますね。

さて、このコピーする時に使用されるバッファですが、無限に
使えるわけではありません。必ず限度があります。

以下に限度があるバッファに文字列を格納する時の図を示しま
す。上の図とは一番下の部分だけ異なりますので注意して見て
下さい。


クライアントから   サーバーの
送られてきた文字列  バッファ
           ┌───┐
      G───→│ 0047 │
    U      ├───┤
    N E───→│ 0045 │
    I      ├───┤
    C T───→│ 0054 │
    O      ├───┤
    D  ───→│ 0020 │
    E      ├───┤
    で /───→│ 002F │
    格      ├───┤
    納  ───→│ 0020 │
    │      ├───┤
    │ H───→│ 0048 │
    │      ├───┤
    ↓ T───→│ 0054 │
    │      ├───┤
    │ T───→│ 0054 │
    │      ├───┤
    │ P───→│ 0050 │
    │      ├───┤
    ↓ /───→│ 002F │
    │      ├───┤
    │ 1───→│ 0031 │
    │      ├───┤
    │ .───→│ 002E │
    │      ├───┤
    ↓ 0───→│ 0030 │
           ├───┤
           │   │
           │   │
           〜   〜
           │   │
           │   │
        限界点└───┘


一番下に「限界点」がありますね。

ここまではいいでしょうか?
サーバーはクライアントから送られてきた文字列を数字として
バッファに格納しますが、そのバッファには限度がある、とい
う事です。

WEBページを表示するサーバー機能はこのバッファに格納され
たものを解析してWEBページを表示する為のデータをクライア
ント側に送出します。

以上が、正常な文字列が送られてきた時のサーバーの動作です。



ところで、このWEBページを表示するサーバー機能ですが、こ
れもアプリケーションソフトです。ですから、サーバーの機能
を呼出してあげる人が必要です。

サーバーの機能はマイクロソフトのIIS(Internet Information
Service)という、WINDOWS2000の機能の一部分です。
つまりWINDOWS2000がサーバーの機能を呼出します。

ここでインテルプロセッサの「呼出し」「復帰」時の仕様を思
い出してください。

この「限界点」の先には何が格納されているでしょうか?

WINDOWS2000がサーバーの機能を呼出します。
この時、インテルプロセッサの仕様によりバッファには「復帰
する場所」が格納されます。
以下にWINDOWS2000がサーバー機能を呼出した直後の図を示し
ます。

           サーバーの
           バッファ
           ┌───┐
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           ├───┤
           │   │
           │   │
           〜   〜
           │   │
           │   │
        限界点├───┤
           │WINDOW│
           │S2000 │
           │に復帰│
           └───┘

ここでCode REDウィルスがサーバーに対して攻撃を行う時に送
出する文字列を見てみましょう。

GET /default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNN%u9090%u6858%ucbd3%u7801%u9090%u6858%uc
bd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c
3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a

この文字列の後半部分に「%u・・・・」という部分があります。
これは「UNICODEで格納してください」という指示です。
IIS機能は、この「%u」を受けると、続きの4桁の数字を文字
コード変換せずに格納します。

Code REDウィルスが送出した文字列をサーバーがバッファに格
納する時の図を以下に示します。

クライアントから   サーバーの
送られてきた文字列  バッファ
           ┌───┐
      G───→│ 0047 │
    U      ├───┤
    N E───→│ 0045 │
    I      ├───┤
    C T───→│ 0054 │
    O      ├───┤
    D  ───→│ 0020 │
    E      ├───┤
    で /───→│ 002F │
    格      ├───┤
    納 d───→│ 0064 │
    │      ├───┤
    │ e───→│ 0065 │
    │      ├───┤
    ↓ f───→│ 0066 │
    │      ├───┤
    │ a───→│ 0061 │
    │      ├───┤
    │ u───→│ 0075 │
    │      ├───┤
    ↓ l───→│ 006C │
    │      ├───┤
    │ t───→│ 0074 │
    │      ├───┤
    │ .───→│ 002E │
    │      ├───┤
    ↓ i───→│ 0069 │
    │ :    ├───┤
    │ :    │ : │
    │ :    │ : │
    │ :    〜 : 〜
    │ :    │ : │
    │ :    │ : │
    │   限界点├───┤    
    │ N───→│ 004E │←本来WINDOWS2000に復帰する
    ↓ N───→│ 004E │ 場所が格納されているはず。
           └───┘

限界点を越えて文字列をバッファに格納してしまう為に、本来
WINDOWS2000に復帰する場所が格納されているはずの場所が壊
れてしまっています。

バッファの限界点からデータが溢れてしまって(オーバーフロ
ーして)コピーが行われる為、この処理の事をバッファオーバ
ーフローと呼びます。

もちろん、バッファオーバーフローはバグ(誤り)ですので、発
生しないようにチェックしなければなりません。

「GET /default.ida?・・・ 」の文字列が何文字あるかチェッ
クし、限界点を越えるようであればバッファに格納しないで、
捨ててしまう等の処理を入れなければいけません。

皆さんの中にも、プログラムを作成している方がいると思いま
す。ユーザーから入力されるデータや、インターネットから送
られてくるデータ等、予想しない値が入っている可能性のある
データをバッファに格納する時には、入力されたデータにより
バッファが溢れてしまう事のないように必ず文字数チェックを
行うようにしましょう。

さて、バッファオーバーフローにより限界点の次に格納されて
しまった値「004E 004E」ですが、これは何を表しているので
しょうか?

その答えは次回に行います。



←前へ戻る    ▲このページの上へ    続きを読む→