バッファオーバフローとは?ばっふぁおーばふろー
バッファオーバフローとは、確保した領域の大きさを超えてデータを書き込ませ、隣接するメモリ(スタック上の戻り番地やローカル変数)を破壊して制御を奪う攻撃。任意コード実行へ直結する代表的な脆弱性で、境界検査を持たないC/C++の文字列・配列操作が発生源になる。
最終更新:2026-10-06
エンベデッドSPを最短で暗記・合格する →背景
C言語は速度と占有量のために境界検査を言語仕様から外しており、書き込みが領域をはみ出しても実行時に止まらない。スタックは戻り番地とローカル変数を隣り合わせに置くため、はみ出しがそのまま制御の乗っ取りへつながる。組込みでは前提がさらに厳しく、MMUを持たない機種では領域の分離すら効かないので、通信で受けた長さフィールドを検査しないまま複写関数へ渡す1行が、そのまま遠隔からの任意コード実行になる。外部から長さを受け取る箇所を洗い出す作業が、設計レビューの定番項目になっている。
具体例
受信フレームのヘッダに書かれた長さをそのまま信じて固定長バッファへ複写すると、長さを偽ったフレーム1つで戻り番地が書き換わる。受信バッファの上限と長さフィールドを突き合わせてから複写する書き方へ統一するのが対策で、MISRA CやCERT Cのコーディング規約が境界検査のない標準関数の使用を制限しているのも同じ理由による。
試験での引っ掛け
緩和策と根本対策を区別して問われる。DEP/NX(データ領域の実行禁止)、ASLR(アドレス配置のランダム化)、スタックカナリアはいずれも攻撃を難しくする緩和策であって、脆弱性そのものは残る。根本対策は境界検査を伴う関数の使用とメモリ安全な言語の採用。加えて、MMUもMPUも持たない機種ではNXやASLRがそもそも効かないため、緩和策があることを前提に設計しない。
関連用語
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。