バッファオーバーフロー防御設定でハマった・・・orz。

Linux には、バッファオーバーフロー攻撃を防御するため、exec-shield 設定が設けられています。

  1. マークされたバイナリを有効にし、以外は無効
  2. マークされたバイナリを無効にし、以外は有効
  3. 常に有効

デフォルトの設定値を確認すると CentOS では、1になっています。

# cat /proc/sys/kernel/exec-shield
1

この設定値を、2 (有効) にするには、echo コマンドで

# echo 2 > /proc/sys/kernel/exec-shield

とします。

またこの設定を永続的にするには、

vi /etc/sysctl.conf
[最下行に以下を追記]
kernel.exec-shield = 2

・修正後

# sysctl -p

とします。しかしこの設定は、以下のリンクにもある通り kernel パニックになり最悪、システムが起動しなくなる恐れがあります。

http://ja.528p.com/linux/centos/B007-security_tips.html

実際、当方の環境で上記設定を施したところ、certmonger サービス起動不能となりフリーズしました。試みに、grub 画面からシングルユーザーモードで起動、

startx

コマンドを打つと、/bin/dbus-daemon: failed: Permission denied となりXウィンドウが起動しませんでした。grub の kernel オプションで、[ exec-shield=0 を与えると良い ] とあるのでその通りにやってみましたが、キーレイアウトが違うのか、オプションを読み込んでいない感じでした。

バックアップの HDD に換装してシステム復旧したのですが、どうしても諦められません。

もう一度、HDD を元に戻してシングルユーザーモードから、

vi /etc/sysctl.conf
[以下設定を削除]
kernel.exec-shield = 2
# sysctl -p
# chkconfig certmonger off
# reboot

と、叩いたところ無事起動しました。ついでに、SELinux のリラベルも行われて postfix も自動起動してくれるようになりました。めでたし、めでたし。