サイバー攻撃手法・脆弱性分析 重要度:★★★出題: AM2・PM1
バッファオーバーフロー と メモリ保護機構 (ASLR / DEP / カナリア)
ばっふぁおーばーふろー / えーえすえるあーる / でっぷ / Buffer Overflow / ASLR / DEP (NX bit) / Stack Canary
C/C++等のプログラムで確保されたメモリ領域の境界を超えてデータを書き込み、関数からの戻り番地(リターンアドレス)を書き換えて任意コードを実行させる攻撃とOS/コンパイラ防御機構。
3行速習ポイント
- スタックバッファオーバーフロー:境界チェックのない関数(strcpy, gets, sprintf等)の悪用により、スタック上のリターンアドレスを攻撃コードの番地に上書き
- DEP(データ実行防止 / NXビット):スタックやヒープなどのデータ領域上のメモリページに「実行不可」属性を付与し、注入されたシェルコードの直接実行を阻止
- ASLR(アドレス空間配置のランダム化):プログラム起動ごとに実行ファイルや共有ライブラリ(libc等)のメモリ配置アドレスをランダム化し、ROP(Return-Oriented Programming)攻撃を困難化
図解
図バッファオーバーフローに対するコンパイラ・OSの3層メモリ保護機構
1. コンパイラ検知
スタックカナリア (Stack Canary / StackGuard)
バッファとリターンアドレスの間にランダム検証値を配置
関数から戻る(RET命令)直前にカナリア値が書き換えられていないか検査し、スタックオーバーフローによるリターンアドレス改ざんを即時検知・強制終了
↕
2. 実行防止
DEP (データ実行防止 / NXビット)
スタック・ヒープ領域のメモリページを「コード実行不可」に設定
入力データとしてバッファに注入された機械語(シェルコード)へプログラムカウンタが飛ばされても、CPUレベルで命令実行を拒否
↕
3. アドレス秘匿
ASLR (アドレス空間配置のランダム化)
起動ごとにプログラムや共有ライブラリの配置番地をランダム化
既存コード片を繋ぎ合わせるROP(Return-Oriented Programming)攻撃に対し、ジャンプ先関数(libc等)のメモリアドレス特定を困難化
💡 実装上の根本対策は「境界チェックを行う安全な関数(snprintf / strncpy等)への置換」またはメモリ安全言語(Rust / Go / Java等)の採用
概要と本質
OSカーネルやネットワークデーモン、組込みファームウェア(C/C++製)において今なお深刻なRCE(リモートコード実行)脆弱性の主要因です。現代ではメモリ安全な言語(Rust, Go, Java等)への移行(Memory Safety)も政府機関(CISA/NSA等)から強く推奨されています。
重要ポイント・コア概念
- スタックカナリア(Stack Canary / StackGuard):バッファとリターンアドレスの間にランダムな検証値(カナリア)を配置し、関数リターン直前に値が書き換えられていないかチェック
- 安全な関数への置き換え:strcpy → strncpy / strlcpy、sprintf → snprintf のように最大書き込みバイト数を明示指定して境界チェックを行う
- Use-After-Free(解放後メモリ使用)とヒープオーバーフロー:動的に確保・解放したヒープ領域のポインタ管理不備を突くメモリ破壊攻撃
午後記述・情報セキュリティ対策での攻略ポイント
午前IIでASLR・DEP・スタックカナリアの役割が頻出。午後C言語ソースコード問題では「配列サイズを超えた書き込みが発生する箇所の特定」と「最大文字数を制限する関数(snprintf等)への修正」が出題されます。
午後記述で使える加点キーワード(クリックでコピー)
関連する重要用語
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着情報処理安全確保支援士 過去問演習で実践力を鍛える