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」ですが、これは何を表しているので
しょうか?
その答えは次回に行います。
←前へ戻る ▲このページの上へ 続きを読む→