- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- DB保存
第8週(番地)と第9週(仮想メモリ)の続きです。第41週が「値が構文になる」越境だったのに対し、今回は「値が隣の領域に届く」越境を見ます。
まず結論
第8週で**アドレスはバイト単位で振られた通し番号**だと見ました。番号が連続しているということは、ある領域の「続き」が別の何かの領域だということです。**書き込みの範囲が検査されなければ、続きを書くことは隣を書き換えることになります。**
CWE-121 によれば、スタック上でバッファの近くに置かれているものの中で最も目立つ(most prominent)のは **stored return address** — 現在の関数が終わったときに実行を続ける先のアドレスです。CWE-787 は結果として “modify control data such as return addresses” が起こりうると述べています。
CWE-787 (Out-of-bounds Write) の Description は、何が起きることを指していますか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
通し番号には、続きがある
第8週の最後に、次のように整理しました。**アドレスとは「バイト単位で振られた通し番号」**であって、物理的な座標ではない、と。
この一文から、今回の話はほとんど出てきます。通し番号なら、ある領域の最後の次の番号にも、何かが置かれています。空白ではありません。
番号 n … 確保した領域の最後のバイト番号 n+1 … 確保していない番号。しかし空ではなく、別の用途の何かがある
CWE-787 (Out-of-bounds Write) の Description は、この n+1 側へ書くことを指しています。
The product writes data past the end, or before the beginning, of the intended buffer.
past the end, or before the beginning — 後ろだけでなく手前も含まれます。「溢れる」という語感だと後ろ側だけを想像しがちですが、定義はより広いことに注意してください。
そして、ここが今回の主題です。なぜ書けてしまうのか。 特別な仕掛けは要りません。番号が連続していて、書き込むときに範囲が検査されない——その2つだけで、続きを書く操作が隣を書き換える操作になります。
隣に何が置かれているか
書き換えが届く先に何があるかによって、結果の重さが変わります。CWE-121 (Stack-based Buffer Overflow) は、スタック上の状況を説明しています。まず定義から。
A stack-based buffer overflow condition is a condition where the buffer being overwritten is allocated on the stack (i.e., is a local variable or, rarely, a parameter to a function).
そのうえで、近くにある重要なデータを挙げています。最も目立つものは——
the most prominent is the stored return address, the memory address at which execution should continue once the current function is finished executing
CWE-121 は他にも “stack pointer and frame pointer, two values that indicate offsets for computing memory addresses” を挙げています。
要点は、置かれているものの性質です。
ローカル変数 … 計算に使う値stored return address … 次にどこへ行くかを決める値stack pointer /frame pointer … アドレス計算に使うオフセット
値を入れておく場所と、次の行き先を決める値が、同じ場所に並んでいます。 片方を書く操作が、もう片方に届きうる理由はこれです。
CWE-121 は、スタック上でバッファの近くにある重要なデータとして何を最も目立つものに挙げていますか。
結果について、CWE が書いている範囲
CWE-787 の Common Consequences (Integrity) はこう述べています。
Write operations could cause memory corruption. In some cases, an adversary can modify control data such as return addresses in order to execute unexpected code.
読むときに落としてはいけないのが could と in some cases です。常にそうなるとは書かれていません。範囲外書き込みが起きれば必ず乗っ取られる、という因果ではなく、条件が揃えば制御用データの書き換えに至りうるという書き方です。
本教材はここで止めます。どうすれば条件が揃うか、という手順は扱いません。理解に必要なのは次の因果だけです。
1. アドレスは連続した通し番号 (第8週)2. 書き込み時に範囲が検査されない3. → 続きを書くことが隣を書き換えることになる (CWE-787)4. 隣に制御用データが並んでいることがある (CWE-121)
第9週で見た仮想メモリの保護は、この問題を防いでくれますか。
範囲外書き込み(今回)
アドレスが連続した通し番号であるため、確保した領域の続きには別の用途のものが置かれています。書き込みの範囲が検査されなければ、データを書く操作が、CWE-121 の言う stored return address のような「次にどこへ行くか」を決める値に届きうる、という構造です。
越えるもの 確保した領域の終端(番地の境目)届く先 同じスタック上に並ぶ制御用データ成立条件 範囲が検査されないこと
値が構文になる(第41週)
組み立てて渡した文字列の中では、命令と値が1本の並びに溶けています。受け取った側は並びから境界を決め直すため、値として入れたものが構文の一部として読まれる余地が生まれます。OWASP の対処は、コードを先に確定させて値を後から渡すことでした。
越えるもの 値と構文の境目届く先 受け取り側が実行する命令の並び成立条件 組み立ててから渡すこと
範囲外書き込みと、値が構文になること。扱う層はまったく違いますが、共通している構造は何でしょうか。
どちらも、越えた先にあるものの性質が同じです。
この章のまとめ
- 第8週の**「アドレスはバイト単位で振られた通し番号」**から出発する。連続しているので、確保した領域の続きにも何かが置かれている。
- CWE-787 の Description は “past the end, or before the beginning” — 後ろだけでなく手前も含む。
- 成立条件は範囲が検査されないこと。特別な仕掛けは要らない。
- CWE-121 によれば、スタック上で最も目立つのは stored return address(関数終了後に実行を続けるアドレス)。リターンアドレスは第1〜3期では扱っていない新出の語。
- CWE-787 の結果は could / in some cases つきで書かれている。必ず乗っ取られる、ではない。
- 第9週の保護はプロセス間を守るもので、プロセス内の隣接領域への書き込みはその対象ではない。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
「なぜ上書きが可能なのか」の説明として、最も因果に忠実なものはどれですか。
用語集(3語)
- CWE-787: Out-of-bounds Write
- 逐語の Description は “The product writes data past the end, or before the beginning, of the intended buffer.” 意図したバッファの**終わりより後ろ、または始まりより手前**に書くこと。
- CWE-121: Stack-based Buffer Overflow
- 逐語では “a condition where the buffer being overwritten is allocated on the stack (i.e., is a local variable or, rarely, a parameter to a function)”。**Variant** に分類され、親は CWE-787 と CWE-788 の双方。
- stored return address
- CWE-121 の説明では “the memory address at which execution should continue once the current function is finished executing”。現在の関数が終わったあと実行を続けるべきアドレス。本教材で新たに導入する語であり、第1〜3期では扱っていない。