緊急: FreeBSDゼロデイ(2009/12/04追記)

以下のセキュリティホールFreeBSD-SA-09:16.rtldにより修正されました。ユーザランドの更新を実行すれば修正されるはずです。
2009年12月1日FreeBSD 7系以後のものに、セキュリティホールが発見されました。
セキュリティアップデートが完了する前に実証コードが配布されてしまいましたので、"at your own risk"なパッチとはいえ、対処した方が良いかもしれません。以下実証とパッチ当てについて。

exploitコード実行してみたよ

$ sh ./zerodaytest.sh 
by Kingcope
November 2009
env.c: In function 'main':
env.c:5: warning: incompatible implicit declaration of built-in function 'malloc'
env.c:9: warning: incompatible implicit declaration of built-in function 'strcpy'
env.c:11: warning: incompatible implicit declaration of built-in function 'execl'
/libexec/ld-elf.so.1: environment corrupt; missing value for 
/libexec/ld-elf.so.1: environment corrupt; missing value for 
/libexec/ld-elf.so.1: environment corrupt; missing value for 
/libexec/ld-elf.so.1: environment corrupt; missing value for 
/libexec/ld-elf.so.1: environment corrupt; missing value for 
/libexec/ld-elf.so.1: environment corrupt; missing value for 
ALEX-ALEX
# whoami
root

怖いね、たえちゃん。。。

ってことで、対処しよう。

パッチを当てよう

てややー!っと緊急パッチが流れてます。こいつを当ててやりましょう。
FreeBSD MLより
freebsd-updateしか使ったことがなくて、/usr/srcがない!って人は以下のURLを参考に、/usr/srcを引っ張ってきてから作業してください。なお、cvsupコマンドはレガシーですので、csupコマンドと置き換えて読むのが良いでしょう。csupコマンドは、portsコレクションよりインストールする必要はありません。
CVSupを使う
では、当ててみましょう。

# cd /usr/src/libexec/rtld-elf
# sha256 rtld.patch 
SHA256 (rtld.patch) = ffcba0c20335dd83e9ac0d0e920faf5b4aedf366ee5a41f548b95027e3b770c1

# patch < rtld.patch 
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Index: rtld.c
|===================================================================
|--- rtld.c	(revision 199977)
|+++ rtld.c	(working copy)
--------------------------
Patching file rtld.c using Plan A...
Hunk #1 succeeded at 366.
done

ちゃんと適用されてるのか一応確認しましょう。

# diff rtld.c rtld.c.orig 
369,374c369,374
<         if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
< 	    unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
< 	    unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH")) {
< 		_rtld_error("environment corrupt; aborting");
< 		die();
< 	}
---
>         unsetenv(LD_ "PRELOAD");
>         unsetenv(LD_ "LIBMAP");
>         unsetenv(LD_ "LIBRARY_PATH");
>         unsetenv(LD_ "LIBMAP_DISABLE");
>         unsetenv(LD_ "DEBUG");
>         unsetenv(LD_ "ELF_HINTS_PATH");

何か頑張ってunsetenvしているパッチが当たったことがわかります。後はbuildworldしてinstallworldすればおkです。
freebsd-updateしか使ったことがなくて、/usr/srcがない!buildworld/installworldなどわからん!って人は、次のURLを参考にしてください。
“World” の再構築

ezjail使いの人は

jailの中のユーザランドも更新する必要があります。忘れないように以下の作業でjailマシンのユーザランドを更新します。
なお、一旦jailマシンを止めますので、jailマシンを踏み台にしてホストマシンに接続している人は気をつけて下さい。

# /usr/local/etc/rc.d/ezjail.sh stop
# ezjail-admin update -i
かく☆にん!

さて、冒頭でrootを奪取したスクリプトを実行してみましょう。

$ sh zerodaytest.sh
by Kingcope
November 2009
env.c: In function 'main':
env.c:5: warning: incompatible implicit declaration of built-in function 'malloc'
env.c:9: warning: incompatible implicit declaration of built-in function 'strcpy'
env.c:11: warning: incompatible implicit declaration of built-in function 'execl'
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; aborting
$

問題ないよ!やったねたえちゃん!

最後に

2009/12/03現在、FreeBSD-Announceはまだ流れていませんので、以上の手順でパッチを当てるしかないでしょう。なお、作業は慎重に、失敗しても泣かない気持ちでいきましょう。
詳しい内容については、Geekなページさんのエントリが詳しいです。また、間違ってもこのコードを他人の計算機で実行しないようにしましょう。
ちなみに、さくらインターネットさんは爆速で対応されたそうです。さすがっすね。。。!