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