第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
© Copyright 2025 ExpyDoc