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

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

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

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

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

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

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

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

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

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

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

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




■デジタル用語辞典:

▲このページの上へ

■ プロセッサの保護機能 ■

前回はWEBページの表示を要求する文字列「GET / HTTP/1.0」
を受けたサーバーがどのような動きをするのか解説を行いまし
た。
文字列は文字コードと呼ばれる数字としてバッファに格納され
ますが、そのバッファには限度がある為に、Code REDウィルス
より多量の文字列を受けたサーバーは、その文字列を格納しき
れずにバッファが溢れて(オーバーフロー)しまう事の解説を行
いました。

また、バッファオーバーフローの為に、本来WINDOWS2000への
復帰情報が格納されているはずの場所に「004E 004E」という
値が格納されてしまう事の説明を行いました。

さて、以下に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 │ 場所が格納されているはず。
           └───┘

一番下の限界点の次に「N」の文字が格納されています。
本来は、ここにWINDOWS2000に復帰する場所が格納されている
はずなのですが、バッファオーバーフローにより壊れてしまっ
ています。

一般的には、この「004E 004E」の部分、ここにウィルスの場
所情報を入れるとウィルスが活動開始します。
以下に、そのイメージを示します。

 ┌──────────────┐                  
 │WINDOWS2000の動作│                  
 └──────────────┘                  
       ・                           
       ・                           
    OSの処理                          
       ・                           
       ・                    バッファ   
       │                  ┌───────┐
  1.IIS機能呼出し           ┌─→│復帰する場所 │
       ├───────────────┘  └───────┘
       │  バッファを1つ確保し、復帰する場所情報格納    
       ├─────────┐                 
       │         ↓呼出               
       │   ┌──────────────┐        
       ・   │   IIS機能の動作   │        
       ・   └─────┬────────┘        
       ・         │          バッファ   
    続きの処理 2.バッファを確保       ┌───────┐
       ・         ├───────→│       │
       ・         │        ├───────┤
       ・         │        │復帰する場所 │
                 │        └───────┘
          3.リクエストをUNICODE          
            で格納  │        ┌───────┐
                 ├───────→│GET ・・・  │
           ×バッファオーバーフローのバグ├───────┤
                 ├───────→│ウィルスの場所│
                 │        └───────┘
                 │                 
          4.呼出し元へ復帰                
                 │        ┌───────┐
                 │←───────┤ウィルスの場所│
                 │どこへ戻るか参照└───────┘
                 │                 
                 └─────┐           
                       ↓           
                 ┌────────────┐    
                 │  ウィルス活動開始  │    
                 └────────────┘    
                                   

1項の「IIS機能呼出し」時に行われる「バッファを一つ確
保し、復帰する場所情報格納」する処理と、4項の「呼出し元
へ復帰」時に行われる「どこへ戻るか参照」する処理は、イン
テルプロセッサの仕様によりハード的に行われるのでした。

ところで、「ウィルスの場所」ってどこなのでしょうか?

ウィルスの場所が分かっている場合、上の図の様にバッファオ
ーバーフローを故意に発生させ、ウィルスの場所を入れる事が
出来ます。
Windows2000上で動作する全てのWEBサーバーにおいて、「ウィ
ルスの場所」が固定的に決まっていれば、上のような方法が可
能なのです。
しかし、残念ながら(?)ウィルスの場所はそれぞれのサーバ
ー毎に異なります。

ウィルスの場所が分からない場合、どのようにしてウィルスが
活動開始する事が出来るのでしょうか?

実は、「復帰する場所」が格納されているはずの部分に故意に
意味の無い異常な値を入れてしまいます。
これがまず第一段階です。

ここで、以前に使用した図を再び使用します。

 ┌──────────────┐                  
 │アプリケーションソフトの動作│                  
 └──────────────┘            バッファ  
  1.バッファを確保               ┌───────┐
       ├─────────────────→│       │
       │                  └───────┘
  2.バッファに細かい指示を格納            バッファ  
       │                  ┌───────┐
       ├─────────────────→│丸い絵を表示 │
       │                  ├───────┤
  3.絵を表示する機能呼出し        ┌─→│復帰する場所 │
       ├───────────────┘  └───────┘
       │  バッファをもう1つ確保し、復帰する場所情報格納  
       ├─────────┐                 
       │         ↓呼出               
       │   ┌──────────────┐        
       ・   │ 絵を表示する機能の動作  │        
       ・   └──────────────┘ バッファ   
       ・    4.バッファを読出し    ┌───────┐
    続きの処理        │←───────┤丸い絵を表示 │
       ・   ×バッファオーバーフローのバグ├───────┤
       ・         ├───────→│  変な値  │
       ・         │        └───────┘
            5.丸い絵を画面に表示      画面    
                 │        ┌───────┐
                 │        │       │
                 │        │       │
                 ├────────┼─→○    │
                 │        │       │
                 │        └───────┘
            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                                   

4項にてバッファオーバーフローのバグが発生した為に、本来
「復帰する場所」が格納されているはずのバッファが壊れてし
まいます。

6項にて「変な値」を参照してしまい、本来、行ってはいけな
い場所に復帰しようとします。

こうなってしまった場合、プロセッサの保護機能が働き、多く
の場合、「一般保護例外が発生しました。」とか、「ページ違
反が発生しました。」とか表示され、アプリケーションソフト
が強制終了されます。

さて、上の説明は以前に行ったものです。
今回の一番最初に示した図で、復帰する場所に「004E 004E」
が格納されている事を説明しました。実はこれは全く意味を持
たない値です。
つまり、上の図で言うところの「変な値」に相当します。

「復帰する場所」が格納されているはずの場所に「変な値」が
格納されている為、プロセッサの保護機能が働くようになりま
す。
このプロセッサの保護機能を利用してウィルスが活動する訳で
すが、今回は、この「プロセッサの保護機能」について、もう
少し詳しく解説します。

インテルプロセッサの保護機能が働くと、OS起動時に登録し
てあるプログラムが動作するようになっています。
これはインテルプロセッサの仕様であり、この時に動作開始す
るプログラムの事をハンドラと呼びます。

以下に、上の図6項においてハンドラが動作開始する時の図を
示します。

            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                 プロセッサの保護機能動作      
                        │          
         ┌──────────────┘          
         ↓                         
   7. ハンドラ動作開始                     
     (OS起動時にあらかじめ登録されている)          
                                   

このハンドラは何をするのかというと、UNIXの場合コンピュ
ータ情報(COREダンプと呼ばれる)を収集する為のプログラ
ムを起動します。

また、WINDOWSの場合「ページ違反がありました。」等のメッ
セージを表示するプログラムを起動します。
WINDOWSユーザーであれば、何度も(^^;見た事があるはずです。
以下にWINDOWSの場合において、メッセージを表示するプログ
ラムが起動する図を示します。

            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                 プロセッサの保護機能動作      
                        │          
         ┌──────────────┘          
         │                         
         ↓                         
   7.ハンドラ動作開始                      
     (OS起動時にあらかじめ登録されている)          
         │                         
         │                         
         ↓                         
   8.メッセージを表示するプログラム起動             
         │                         
         ↓                         
   9.「一般保護例外が発生しました。」              
     「ページ違反が発生しました。」               
     等のメッセージを表示し、アプリケ              
     ーションソフトが強制終了された事              
     をユーザーに伝える                     
                                   

このメッセージを表示するプログラムですが、実はアプリケー
ションソフト毎に指定する事が出来ます。
つまり各アプリケーションソフト毎に、強制終了してしまう時
に起動するプログラムを指定出来ます。


実は、アプリケーションソフトが強制終了してしまった時に
起動するプログラムの場所情報は、「変な値」が入っている
バッファのすぐ近くに格納されています。
これはWINDOWSの仕様です。

以下に、ハンドラがメッセージを表示するプログラムを起動す
る図を示します。上の図とは、7項の部分が異なりますので注
意して見て下さい。

            6.呼出し元へ復帰       バッファ   
                 │        ┌───────┐
                 │←───────┤  変な値  │
                 │どこへ戻るか参照└───────┘
                 │どこへ戻ればいいのか分からない。 
                 └───┐             
                     └─→×          
                 プロセッサの保護機能動作      
                        │          
         ┌──────────────┘   バッファ   
         │                ┌───────┐
         ↓                │  変な値  │
   7.ハンドラ動作開始             └───────┘
     (OS起動時にあらかじめ登録されている)     ・    
         │                    ・    
         │ 何を起動するか参照      ┌───────┐
         ↓←───────────────┤メッセージを表│
   8.メッセージを表示するプログラム起動    │示するプログラ│
         │                │ムの場所   │
         ↓                └───────┘
   9.「一般保護例外が発生しました。」              
     「ページ違反が発生しました。」               
     等のメッセージを表示し、アプリケ              
     ーションソフトが強制終了された事              
     をユーザーに伝える                     

7項で「メッセージを表示するプログラムの場所」を参照して
いますね。

しかし、ここでもまた、バッファオーバーフロー発生時にウィ
ルスの場所がどこなのか分からない為、単純に入れてしまう事
は出来ません。

問題は、ウィルスの場所がどこなのか分からない、という点に
つきます。

どうやってウィルスの場所を特定するのでしょうか?
その説明は次回に行う事にします。




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