ハッカーが利用する、Off-By-One(1バイト溢れ)

ペネトレーションテスト&バグバウンティ

Off-By-One(オフ・バイ・ワン)は、配列やバッファに対して「本来必要なバイト数より1バイトだけ多く/少なく扱ってしまう」ことで生じるバグです。
 
小さなミスに見えますが、メモリ上の隣接データ(フラグや戻り番地の一部)を壊したり読み出したりでき、深刻なセキュリティ問題に発展します。


※イメージです。

Off-By-Oneとは

配列・バッファ操作で境界チェックを1バイトだけ誤り、隣接するメモリに影響を与えるバグ。
たった1バイトのずれが、プログラムの状態や制御を変えてしまう脆弱性です。
 
 

Off-By-Oneの背景

C言語など低レベル言語では、配列長やヌル終端(`\0`)の扱いをプログラマが管理します。古いコード・速さ重視の実装・不十分な入力検証で境界チェックが甘くなり、1バイトだけ越える/足りないミスが発生します。設計上「効率と柔軟性」を優先した結果、境界処理の明確化が疎かになることが背景です。攻撃者はこの隙を使って状態を書き換えたり、情報を読み取ったりします。
 
 

Off-By-Oneが引き起こす影響

1.攻撃者視点
・近接するフラグ変数を1バイトだけ書き換え、認可チェックを回避する。
・隣接メタデータを書き換えて未定義動作(バッファの隣に置かれている制御用データ(メタデータ)を1バイトでも壊すと、プログラムが想定していない挙動、クラッシュ・情報漏洩・処理の乗っ取りなどを起こす可能性)を誘発し、より高度な侵害(メモリ書換)に繋げる。
 
2.防御者視点
・小さなバグでも重大な挙動変化を招くため、コードレビューや自動テストで見逃さないことが重要。
・本番環境での被害は情報漏えいやサービス停止につながり得る。
 
 

Off-By-Oneの仕組み・動作の理解

たとえば、箱(バッファ)が7個サイズで、それぞれに大事な物(データ)が入っているとします。箱に入る最大数を「7」と決めている場面で、8個目をちょっとだけ押し込んでしまうと、隣の「鍵」や「フラグ」が少しだけずれてしまいます。この“少し”が1バイトで、鍵の一部が壊れると扉が簡単に開く、というイメージです。
 
メモリは連続した領域。オフ・バイ・ワンで書き込むと、隣接する変数や制御データ(例えば、スタックに置かれたフラグやローカル変数の1バイト)が変化し、プログラムの論理分岐や状態遷移を不正に変える可能性があります。
 
 

Off-By-Oneの対策・防御方法

1.セキュアコーディング(最重要)
・入力長は必ず最大長チェック(`size-1`でヌル終端を確保)する。
・`strncpy`, `snprintf`など境界を明確にする関数を利用。ただし使い方に注意が必要。
・危険な関数(`gets`, `strcpy`など)は使用禁止ルールを設定。
 
2.ビルド・運用での対策
・コンパイラの警告(`-Wall -Wextra -Wformat-security`)を有効化。
・ASLRやStack Canary、DEPなどランタイム保護を有効にする(ただしバグを完全に防げるわけではない)。
・静的解析/動的解析ツール(clang-tidy, AddressSanitizer, Valgrind)で開発段階に検出する。
 
 

ハッカーが利用する、Off-By-One(1バイト溢れ)のまとめ

 Off-By-Oneは「たかが1バイト」のミスに見えますが、メモリの連続性を利用するプログラムにとっては重大な脆弱性です。配列終端やヌル終端の扱いを誤ると、隣接する変数や制御データに影響を与え、認可回避や未定義動作を引き起こす可能性があります。
実際には、入力検証・境界チェック・コンパイラ警告・動的解析(ASan等)を組み合わせることでリスクを低減できます。