再びNXビットについて

以前のポストで、NXビットとバッファオーバーフローの
関係がイマイチ分からんぞ!というお叱りを受けました。
拙生もそんなに詳しくはないのですが、口ではなかなか
説明しづらいので、分かる範囲で書いておきますという
約束を半ば強制的にさせられました。。^^;;
同じ内容で何度もポストしてるんですけどねぇ。。。

ではご指示の小学生でも分かる説明は到底無理ですが
極力易しく丁寧に・・・w

■ バッファーオーバーフローとは

メモリにバッファ領域として確保してあるアドレス範囲を
超えるような予期せぬデータを入力することで、隣接する
領域のデータを上書きし破壊してしまうという現象ですが、
プログラミングのミスの場合を除き、悪意を持って攻撃に
利用した場合はバッファーオーバーフロー攻撃と呼び、
現在もっとも重大なセキュリティホールのひとつであります。
悪意のあるデータで上書きすることで、主にコンピュータを
乗っ取る目的で使用されるからです。

■ 乗っ取る手順の一例

1 インターネットに接続された脆弱性のあるパソコンを
  ランダムに抽出する。
2 脆弱性のあるパソコンでバッファオーバーフローを起こす。
3 リモートシェルからリモートコントロールするための
  プログラムを実行。
4 FTPサーバー機能により悪意のあるプログラムをダウンロード。
5 ダウンロードしたプログラムを実行。

怖いのは脆弱なパソコンは、インターネットに接続しているだけで
乗っ取られる可能性があるということです。
ランダムにIPアドレスを抽出ということは、企業・公的機関・
個人などは全く区別せずに攻撃対象となりえます。

■ なぜそのようなことが起きるのか。。。

それはプログラムが用意してあるバッファ長からはみ出して
しまうような入力データでも、チェックしないで書き込んで
しまうというC/C++言語のバクであります。
端的な例ではC言語のgets関数は、標準入力をバッファ長の
チェックなしで書き込んでしまうため、オーバーフローを防げません。
ですから実用するためのプログラムでは使ってはいけないのです。
バッファ長のサイズを指定し、それ以上のサイズの書き込みは
行うことの出来ないというfgets関数を使うべきなのです。

■ NXビット(No eXecute)

バッファオーバーフローは上記だけが原因ではなく、
様々な要因に個別に対応することは困難です。
そこで逆の発想で、バッファオーバーフローは防げないという
前提でセキュリティを考えだされたのがNXビットです。

バッファオーバーフローが問題になるのは、データ領域として
扱うはずのバッファなはずなのに、はみ出したバッファ上で
プログラムが実行されてしまうことにあります。
ならばプロセッサ(ハード)とプログラミング(ソフト)の
連携で実行させないという仕組みがNXビットです。

NXビットを有効にするとバッファ領域は実行できない領域として
フラッグが立ち、CPUはNXビットが有効になっているメモリ領域の
プログラムを実行せずにエラーを返します。
この機能によりバッファオーバーフローによる攻撃から回避します。

バッファ長以上の入力データを拒否するか、オーバフローした
バッファでプログラムが走ろうとした時にプログラム自体が
単にエラーで返してくれれば、な〜んの問題もないんはず
なんですけどねぇ。。

 実行ファイルの基底・ライブラリ・ヒープ・スタック・
 戻りアドレスやらサブルーチンやら、仮想メモリと実メモリとの
 係るタイミング なんて小難しい話は飛ばしましたが、
 こんなもんで勘弁してくだせぇ。。。

ちなみにこのあたりの拙生の知識は何年も前の古いままなので、
世の中もっと進んでいるかも・・・です。

関連技術

ASLR(address space layout randomization)

アドレス空間配置のランダム化のことで、データ領域を
ランダムに配置することで、メモリアドレスを攻撃者から
隠してしまうというセキュリティ技術。

HOME

おすすめ