32bitOSにおいてASLRは16bit分しか提供しない といった旨の記述がReturn-to-libc攻撃のwikipediaに書いてあり、理由が気になったので雑にメモ。
2通りで調べたのでそれぞれ書きます。
-
まず、英語版の出典はスタンフォードの論文pdfでした。
この3.3.2によれば、32bitのうち12bitはオフセットに(後述)、残り20bitのうち、4bitは仮想メモリ空間のフラグメンテーションを防ぐためにランダム化できないため、残りの16bit分のみASLRが提供される とのこと。 (これは最大16ということで、実際は12bitなども見られるようで....)
64bitOS上の32bit互換で実行する場合も同様に脆弱であると述べてあります。
64bitOSにおいては最低でも40bitがランダム化されるとのことです。 -
また、32bitOS(x86)のメモリ管理の観点から、まずセグメント方式について知る必要がありそうだと考えました。 結果として間違いではありませんでしたが....
元々、ASLRは12bitに働いていたという検証も見ており、セグメントのリアルモードのオフセット12bitをランダム化しているのかな などと思っていたのですが全く的を射ない思考でした。
実際は上記の通り、残りの20bitの中から一部ランダム化されているようです。
32bitの半分だから16bit という訳ではなくメモリ管理との兼ね合いがあるようですね。
ソース: https://web.stanford.edu/~blp/papers/asrandom.pdf