先日、freebsd-announceメーリングリストで流れた情報は、かなり異例のことのようで、事態が深刻であることをうかがわせるものでした。
このときのメールでは、パッチが示されているだけで、どうやってそれを使うのかまったく説明がなくて、初心者は置いてけぼり・・・な感じもしてました。
どうやら、先ほど、正式にセキュリティ・アドバイザリ(SA)が出たみたいです。
同時に3件出ていて、例のものはこちら。
これには↑ パッチのあてかたも、記載されています(・・・ですが、難しいかな?)
今回正式に出たパッチは、ぱっと見では、最初に出たものと同じっぽいです。
ところで、rtdlってのは、/libexec/ld-elf.so.1のことらしいです。
☆
パッチを見ても、最初、私には何がなんだかわかんなかったです。
ところが、「セキュリティホールmemo」を見たら
http://www.st.ryukoku.ac.jp/~kjm/security/memo/2009/12.html#20091201_FreeBSD
exploit codeそのものが掲載されてて、そっちを見たらわかりました。
/sbin/pingなど、rootでsetuidされたプログラムを実行するときに、LD_PRELOADを使って、悪意のあるコードもついでに実行させてしまう、という仕組みでした。
ただし、もともとは、LD_PRELOADなどの環境変数を無効化する処理が入ってるんですが、その処理が不完全だったため、ちょっとした仕込みをすることで、あーあ、できちゃった、というのが今回のセキュリティーホールでした。
たとえば、ラジオ番組などで、リスナーから送られてきたメールを読むとき、事前にスタッフが不適切な部分をカットするんだけど、巧妙に仕込んだメールが、事前チェックをすり抜けて、放送でヤバい内容がそのまま流れちゃいました~ みたいな?
わかりにくい比喩だね。
☆
なんとなく仕組みはわかったんですが、あのパッチでどうしてOKなの?と、個人的に納得できていないところもありました。
unsetenv(3)のマニュアル
http://www.freebsd.org/cgi/man.cgi?query=unsetenv&apropos=0&sektion=3&manpath=FreeBSD+8.0-RELEASE&format=html
ちょっとコードを書いて確認してみたんですが、もともと設定されていない環境変数をunsetenv(3)したとき、return valueは、-1ではなく、0になるみたいですね。
というわけで、今回出てきたrtldパッチは、unsetenvで失敗したとき、それってフツーありえないぞ! ってことで、処理を止めてしまう、というもの。
パッチをあてる前は、unsetenvが失敗することを考慮してなかった、というわけですか。
もっとも、環境変数のメモリ領域でナニな仕込みがされてても、なんだかうまく通ってしまってた、ってのもヤバいわけですね。
なお、unsetenvのソースコードは、ここにあるやつみたいです。
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/getenv.c
どうも、今回のセキュリティホールに関連してか、Revision 1.16、1.17と変更が入ってるみたいです。
0 件のコメント:
コメントを投稿