どのような問題が発生?

Download Report

Transcript どのような問題が発生?

第4回
バッファオーバーフロー
その攻撃と対処
NECラーニング
山崎 明子
バッファオーバーフローとは?


バッファ(メモリ上に用意した領域)に対し、それ
より大きなデーが渡されると、領域があふれてし
まう
これを悪用すると・・・

さまざまな問題が発生!
どのような問題が発生?

悪意のあるコードの埋め込み

独自のコードを実行




重要なビジネス データの悪用
破壊的な処理の実行
システムの不安定性


高い特権を取得して実行すると被害は大
ソフトウェアの誤動作
アクセス違反

サーバーに対するサービス拒否攻撃の実行
どのような場所で発生?

C言語やC++言語のプログラム


OSやライブラリはC/C++で記述されていることが多
い
VB、C#では発生しない

しかし、そのプログラムが呼び出しているプログラム
がC/C++なら問題が発生する可能性がある
バッファオーバーフローの種類と
発生するポイント

スタックオーバーフロー


ヒープオーバーフロー



静的なバッファ
動的なバッファ
配列のインデックス操作
誤った文字列処理

UNICODEとANSIのバッファサイズの不一致
スタックオーバーフローの例
0x0000000
main()
function1(x, y);
function1( param1,param2 )
char buf[4];
strcpy(buf, “abcdefghijklmn”);
return;
a
ローカル変数
b
c
Buf[4]
d
悪意のある
e:
コード
のアドレス
XXXXXXXX
リターンアドレス
f
パラメータ
パラメータ
0xffffffff
スタックオーバーフローの例
このプログラムに潜む問題
0x0000000
main()
strcpy関数自体の問題
function1(x, y);
プログラムで大きさを ローカル変数
チェックしていないという問題 Buf[4]
function1(param1,param2)
:
あらかじめ十分なバッファを
char buf[4];
用意していないという問題
strcpy(buf, “abcdefghijklmn”);
リターンアドレス
return;
パラメータ
C/C++言語自体の問題
パラメータ
0xffffffff
ヒープオーバーフロー

動的なメモリ確保ではオーバーフローさせること
は困難?

攻撃には、スタックオーバーフロー以上のスキルが必
要



ただし、不可能ではない
多くのプログラマはスタックオーバーフローは気にす
るが、ヒープは安全と思っている
スタックオーバーフローを防ぐツールはあるが同様の
ツールはヒープオーバーフローにはない
基本な対策





コピーするデータをチェックする
コピー元のデータの大きさをチェックする
コピー先の領域の大きさをチェックする
予想される最大の領域を確保する
以下のようなコピー先バッファの大きさをチェックしない
関数を利用する際には注意する(できれば使わない)




strcpy
strncpy
CopyMemory
MultiByteToWideChar
効果的な対策

ライブラリやツールの利用



安全な文字列処理のクラスを使用する
安全な配列処理のクラスを使用する
Visual C++ の /GS コンパイル オプション

バッファ オーバーフローを検出
注意点

マネージ コード(VB.NETやC#)は安全?

PInvoke や COMの利用に注意



Declareステートメント
COM相互運用
マネージコードが利用しているコードが安全でなけれ
ば、安全ではない
バッファオーバーフローのまとめ

その攻撃を知り、適切に対処することが重要

C/C++言語で発生


C/C++言語を利用するプログラムで発生
適切な対策

多層防御も大切




プログラミングとツールの活用
データと領域の大きさに注意
既存の安全なライブラリやツールを利用
マネージコードを利用

ただし、その呼び出し先に注意
リファレンス

開発者のためのセキュリティサイト


MSDNデベロッパーセキュリティセンター
 http://www.microsoft.com/japan/msdn/security/
開発者向け セキュリティ オンライン セミナー
 http://www.microsoft.com/japan/msdn/security/seminars/
 アプリケーションセキュリティの基礎
 実践! セキュアなコード記述 Part 1
 実践! セキュアなコード記述 Part 2