補足(いいわけ?)005
p.075のList2-1において、ウインドウをふたつ開いてまったく同じプログラムを同時に動かしたとき、それぞれのプログラムのローカル変数hogeのアドレスが同じになる、という実験をしています。アプリケーションプログラムに見えているのは仮想アドレスであり、物理メモリのアドレス(物理アドレス)とは異なる、ということを示すための実験です。
本書出版当時は、PCやワークステーションならたいていの環境でこのような結果になったと思いますが、今時のOSでは、アドレス空間のランダム配置(ASLR)という機能により、必ずしも同じアドレスにはなってくれません。
p.100のList2-4でも実験している通り、自動変数(staticでないローカル変数)の配列で領域破壊を起こすと、それがリターンアドレスを上書きしてしまうので、悪意を持った攻撃者が配列のオーバーランを意図的に発生させると、リターンアドレスを書き換えることで狙ったアドレスにジャンプさせ、攻撃用の機械語コードを実行される恐れがあります。これがバッファオーバーフロー脆弱性と言われる脆弱性です。
これは大変にタチの悪い脆弱性なので、OSによっては対策がなされており、その手法の一つがASLR(address space layout randomization)です。
この機能がONになっていると、スタックやヒープのアドレスを、プロセスの起動時にランダムに決めるようになります。攻撃者がなんとかして攻撃用のコードをメモリに紛れ込ませたとして、そのアドレスがわからなければ実行できないので、アプリケーションプログラマが配列の範囲チェックをさぼっていても「任意の攻撃用コードが実行される」という最悪の事態は避けられる、というわけです。
私の環境(Ubuntu Linux)では、randomize_va_spaceというパラメータにより、ASLRのレベルを制御することができます。
3.15 カーネル・セキュリティ・メカニズムの構成および使用
このパラメータの変更は、私は以下の方法で行いました。
kernel.randomize_va_space = 0
$ sudo sysctl -p
このようにして、randomize_va_spaceを0, 1, 2と変更すると、私の環境では以下のようになりました。
List2-1(vmtest.c)で比較している変数hogeは自動変数なので、このような環境では、同じアドレスにはなってくれません。
「補足(いいわけ?)」の目次に戻る | ひとつ前のページ | ひとつ後のページ | 「C言語 ポインタ完全制覇」のページに戻る | トップページに戻る