■ 異常な動作 ■
今回から講座「バッファオーバーフロー」を始めます。
皆さんは各種セキュリティ情報サイトを定期的にチェックした
りする事はあるでしょうか?
そんなサイト知らない、という方の為にいくつか紹介しておき
ます。
マイクロソフトセキュリティ情報一覧
マイクロソフト製品全般に関するセキュリティ情報やパッチ情
報
>>>
http://www.microsoft.com/japan/technet/security/current.asp?frame=true
情報処理振興事業協会セキュリティセンター
セキュリティ情報全般、各種ウィルス情報や新種ウィルス情報
届出など
>>>
http://www.ipa.go.jp/security/
シマンテックセキュリティレスポンス
新種のウィルス情報やウィルス駆除ツールなど
>>>
http://www.symantec.com/region/jp/sarcj/
これらのサイトに掲載されているセキュリティ情報を見ていく
と、時々「バッファオーバーフロー」という言葉を見かけると
思います。
「未チェックのバッファ」とか、「バッファオーバーラン」等
という表現がされる事もありますが、基本的に全て同じ意味で
す。
例えば、最近マイクロソフトのサイトにおいてパッチが公開、
更新された脆弱性レポートには以下の様なものがあります。
─↓ここから──────────────────────
SQL Server Web タスクで権限が昇格する (Q316333) (MS02-
061) 2002/10/17
Windows XP 「ヘルプとサポート センター」 の問題により
ファイルが削除される (Q328940) (MS02-060) 2002/10/17
Word フィールドおよび Excel の外部データ更新の問題によ
り、情報が漏えいされる (Q330008)」 (MS02-059) 2002/10/
17
証明書確認の問題により、ID が偽装される (Q328145) (MS02
-050) 2002/10/17
●Services for Unix 3.0 に含まれる Interix SDK の問題に
よりコードが実行される (Q329209) (MS02-057) 2002/10/16
●ファイル展開機能に含まれる未チェックのバッファにより、
コードが実行される (Q329048) (MS02-054) 2002/10/16
●Outlook Express の S/MIME 解析の未チェックのバッファに
よりシステムが侵害される(Q328676) (MS02-058) 2002/10/15
●Windows ヘルプ機能の未チェックのバッファにより、コード
が実行される (Q323255) (MS02-055) 2002/10/15
●TSAC ActiveX コントロールのバッファ オーバーランにより、
コードが実行される (Q327521) (MS02-046) 2002/10/11
●SQL Server 用の累積的な修正プログラム (Q316333) (MS02-
056) 2002/10/10
●Windows Shell の未チェックのバッファにより、コードが実
行される (MS02-014) 2002/10/09
─↑ここまで──────────────────────
全て見たい方はこちら。
マイクロソフトセキュリティ情報一覧
>>>
http://www.microsoft.com/japan/technet/security/current.asp?frame=true
ここに示した情報は2002年10月1日から2002年10月18日までの
間で提供&更新された情報です。
この中で、「●」印が付いている物は全て「バッファオーバー
フロー」が原因になっているものです。
結構ありますよね?
バッファオーバーフローというのは、一体何なのでしょうか?
「そんな事、簡単に答えられる。」という方もいらっしゃるか
もしれません。
バッファオーバーフローというのは、「バッファが溢れて(オ
ーバーフローして)しまうバグ(プログラムの誤り)」の事で
す。
バッファが溢れると何かいけない事でもあるのでしょうか?
ちょっと図を見てみましょう。
例えば、aというバッファとbというバッファがあるとします。
分かりやすくなるように、「b」というバッファには「■」を
入れておきます。
バッファa
┌───────┐
┌───────┐
│ │
└───────┘
┌───────────────┐
│■■■■■■■■■■■■■■■│
└───────────────┘
└───────────────┘
バッファb
図を見てもらえると分かりますが、「b」というバッファの方
が大きいです。
そして、「a」というバッファのすぐ隣には、他の用途で使わ
れているバッファ「c」があるとします。
以下にその図を示します。
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│ │ │
└───────┴───────┘
┌───────────────┐
│■■■■■■■■■■■■■■■│
└───────────────┘
└───────────────┘
バッファb
この状態の時に、バッファ「b」をバッファ「a」にコピーす
るとどうなるでしょうか?
まず、正常な処理を見てみましょう。
バッファオーバーフローのバグが無いプログラムの場合、コピ
ー処理を行なう時には、必ず「バッファの長さがチェック」さ
れます。
長さチェックが行なわれるので、正常なプログラムの場合は以
下の様になります。
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│■■■■■■■│ │
└───────┴───────┘
↑コピー
┌───────────────┐
│■■■■■■■■■■■■■■■│
└───────────────┘
└───────────────┘
バッファb
きちんと長さチェックが行なわれるので、バッファ「a」の大
きさを超えないようにコピー処理が行なわれています。
次にバッファオーバーフローのバグがある場合の処理を見てみ
ましょう。
以下にバッファ「b」をバッファ「a」にコピーしたイメージ
を示します。
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│■■■■■■■■■■■■■■■│
└───────┴───────┘
↑コピー
┌───────────────┐
│■■■■■■■■■■■■■■■│
└───────────────┘
└───────────────┘
バッファb
バッファ「a」がバッファ「b」により上書きされています。
しかし問題はバッファ「c」の方です。
他の用途で使わなければいけないはずのバッファ「c」までも
上書きされてしまいました。
これは明らかなバグです。
何故なら、この後、バッファ「c」を使う処理を行なおうとし
ても、既にバッファ「c」は他の物で上書きされてしまってい
るからです。
もう少し具体的に書きます。
例えば、バッファ「c」が、「1+1の計算結果」を格納する
用途に使用されていたとしましょう。
「バッファオーバーフローが発生する前」までは普通に「1+
1の答え」である「2」が格納されます。
以下にそのイメージを示します。
●バッファオーバーフローが発生する前
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│ │ 2 │
└───────┴───────┘
↑
1+1の答え
┌───────────────┐
│ │
└───────────────┘
└───────────────┘
バッファb
バッファ「c」に「2」が格納されていますね。
ここで、バッファ「b」には「12345678」という数字
が格納されているとします。
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│ │ 2 │
└───────┴───────┘
┌───────────────┐
│1 2 3 4 5 6 7 8│
└───────────────┘
└───────────────┘
バッファb
それでは、ここでバッファオーバーフローが発生したとしまし
ょう。
●バッファオーバーフローが発生した後
バッファa バッファc
┌───────┬───────┐
┌───────┬───────┐
│1 2 3 4 5 6 7 8│
└───────┴───────┘
↑コピー ↑コピー
┌───────────────┐
│1 2 3 4 5 6 7 8│
└───────────────┘
└───────────────┘
バッファb
図を見ていただくとすぐに分かりますが、「1+1の答え」を
格納しなければならない部分に対して「5678」という、訳
の分からない値が書き込まれてしまっています。
これだけでもバッファオーバーフローの異常な動作がお分かり
頂けたかと思いますが、実はバッファオーバーフローの怖いと
ころはここからです。
続きは次回に説明します。