Japanese: http://people.allbsd.org/~hrs/FreeBSD/freebsd_audit_bash_ja.txt English: http://people.allbsd.org/~hrs/FreeBSD/freebsd_audit_bash.txt FreeBSD で bash shellshock を監視するには [2014100101] Hiroki Sato FreeBSD の audit 機能を使って、bash の環境変数バグを利用した攻撃を 検出する方法です。 1. /etc/security/audit_control に次の内容を入れましょう。 dir:/var/audit dist:off flags:ex minfree:5 naflags:ex policy:cnt,argv,arge filesz:100M expire-after:200M 元に戻せるように、標準で入っているものはどこかに保存しておくと良いです。 デフォルトから変更しているのは、flags, naflags, policy, filesz, expire-after の行です。 2. auditd を起動しましょう。 /etc/rc.conf に auditd_enable="YES" を追加して、 # service auditd start を実行すると起動します。システム再起動後は自動的に起動するので、 要らなくなったら /etc/rc.conf の auditd_enable 行を消しましょう。 3. ログを監視しましょう。 1, 2 でコマンドの起動が監査ログに記録されるようになります。 まず、次のコマンドで、リアルタイムにログをテキスト形式で 表示させることができます。 # praudit -nl /dev/auditpipe 1. の設定だと、コマンドの起動時の引数と環境変数がすべて記録されます。 bash を起動してみましょう。 # bash こんな感じのログが出てきます。 header,877,11,execve(2),0,Wed Oct 1 11:13:20 2014, + 600 msec,exec arg,bash,exec env,USER=hrs,LOGNAME=hrs,HOME=/var/home/hrs,MAIL=/var/mail/hrs,PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin,TERM=xterm,BLOCKSIZE=K,SHELL=/bin/tcsh,PWD=/var/home/hrs,GROUP=hrs,path,/usr/local/bin/bash,attribute,755,root,wheel,94,647827,2414384,subject,hrs,hrs,hrs,hrs,hrs,1030,1022,60357,172.16.87.129,return,success,0,trailer,877, 攻撃コードを入れてみます。 # env X="() { :;}; echo test" bash -c "echo ok" test ok ログを見ましょう。exec arg と path のところに bash が表示され、攻撃コードは exec env のところに出てきます。 header,910,11,execve(2),0,Wed Oct 1 11:18:44 2014, + 202 msec,exec arg,bash,-c,echo ok,exec env,X=() { :;}; echo test,USER=hrs,LOGNAME=hrs, ... ,path,/usr/local/bin/bash,attribute, ... 4. 監視するには? bash を直接起動した場合は、bash のパス名がログに入ります。 ただし、先頭行が #!/usr/local/bin/bash になっている 実行属性付きのシェルスクリプトを直接実行した場合は、パスがシェルスクリプトの ものになってしまい、bash になりません。 攻撃に使われる環境変数の記述パターンは複数ありますが、 "=() { " を使うものがほとんどですので、それが現れるかどうかを 見るのが現実的かも知れません。 ログは /var/audit に保存されます。1 の設定では 100MB 単位で 分割するようになっていて、最新版は常に /var/audit/current になります。 次のようにすると "=() { " があるかどうか調べることができます。 # praudit -nl /var/audit/current | grep '[=]() { ' /etc/crontab に次の行を追加すると、5 分おきにログを調べて該当があれば root 宛にメールを送るようになります。 */5 * * * * root praudit -nl /var/audit/current | grep '[=]() { ' && audit -n "audit -n" は、ログファイルを強制的にローテーションするコマンドです。 これがないと 5 分おきに同じメールが何度も送られてしまうため、 該当があった時にだけ実行するように追加しています。 5. その他 - auditdistd を使うと、ログを TCP でリモートマシンに送ることができます。 ローカルに保存されるログは、攻撃が成功すると消されてしまう可能性が ありますが、それを防ぐ手段として使えます。 - audit 機能は 2007 年ごろに GENERIC カーネルに入りました。 最近のリリースは全部使えるようになっていますが、とても古いリリースには 入っていないかも知れません。 [EOF]