Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
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]