
| Exec-Shieldとは |
Exec-Shieldとはバッファオーバーフロー攻撃を防御する仕組みです。
プログラムのバグを利用してプロセスを乗っ取る攻撃はいくつか存在しますが、
バッファオーバーフローはそのうちの1つの手法です。
プログラムのバグを狙った攻撃を回避する一番の方法は、パッチを適用することです。
ただ、まだ見つかっていないバグに対する攻撃に対しては、パッチはもちろん提供されていないので
回避することはできません。このような潜在的な攻撃への対処として、力を発揮するのが
Exec-Shieldです。
ただ、Exec-Shieldは万能ではありませんので、Exec-Shieldがあるからと言って、パッチの適用を
放置したりとかは絶対にしないでください。またバッファオーバーフローの防御に関しても
確実に防げるわけでは無いので、これまた安心してはいけません。
| Exec-Shieldを有効にする |
Exec-Shieldを有効にするには以下のようにします。
| # echo 2 > /proc/sys/kernel/exec-shield |
これで常に有効という設定になります。数字の意味は以下の通りです。
| 2 常に有効 1 実行ファイルごとに有効にしたもの以外は無効 0 常に無効 |
デフォルトでは、1になっています。ここでは、2にし常に有効にしました。
また、再起動と同時に1に戻ってしまうので、/etc/rc.d/rc.localの最下行にでも以下の1行を追加します。
| # vi /etc/rc.d/rc.local echo 2 > /proc/sys/kernel/exec-shield |
これで起動と同時に2にしてくれます。
| 実行ファイルごとに有効と無効を切り替える |
上では、Exec-Shieldの値を2にし、常に有効という状態にしましたが、まれに不具合が出てしまう
プログラムがあったりします。ちゃんと起動しなくなったりしてしまうのです。
そうなった場合に、Exec-Shield自体を無効にするのも1つの手ですが、それでは無駄が多いので、
そのプログラムだけ、Exec-Shieldの対象から外すようにします。
例えば、Exec-Shieldを常に有効にしたら、Apacheが上手く動作しなくなったとします。
その場合には、以下のようにすれば、ApacheをExec-Shieldの対象から外すことができます。
| # execstack -s /usr/sbin/httpd |
逆に有効にする場合は、以下のようにします。
| # execstack -c /usr/sbin/httpd |
有効か無効になってるかの確認は以下のようにします。
| # execstack -q /usr/sbin/httpd - /usr/sbin/httpd |
上のように先頭が「-」となってる場合には、有効になっています。なので、Exec-Shieldの
保護の対象になっています。無効になってる場合は、先頭が「X」になります。
まとめると以下のようになります。
| 無効にする : execstack -s 実行ファイルのパス 有効にする : execstack -c 実行ファイルのパス 有効、無効の確認 : execstack -q 実行ファイルのパス |
なお、ここではApacheを例に取り、実行ファイルを/usr/sbin/httpdとしましたが、
実行ファイルのパスを確認するには、whichコマンドを使用します。
Apacheの実行ファイルのパスを調べたい場合には、以下のようにします。
| # which httpd |
| Exec-Shieldを常に有効にしたら、DiCEが動かなくなった場合への対処 |
Exec-Shieldの値を2にしたら、IPアドレスの自動更新ツールであるDiCEが動かなくなってしまいました。
FC2でもFC3でも動かなくなってしまったので、以下にExec-Shieldを2にしてもDiCEが無事に動く回避策を紹介します。
なお、この回避策については以下のサイト様を参考にさせていただきました。
それでは、早速回避策の紹介です。先ずは、/etc/sysconfig/prelinkの編集をします。
| # vi /etc/sysconfig/prelink PRELINK_OPTS=-mR ←14行目 ↓ PRELINK_OPTS="-mR --no-exec-shield" |
青地部分の変更をしてください。続いて、以下を順番に実行します。
| # touch /var/lib/misc/prelink.force # /etc/cron.daily/prelink # execstack -s /usr/local/bin/DiCE/diced |
なお、2つ目の/etc/cron.daily/prelinkは結構時間かかります。
また3番目のexecstack -sはやらなくても、DiCEは動くようになりました。
以上で、Exec-Shieldの値を2にしてもDiCEが問題無く動くようになりました。
最終更新 : 05/23/2005