2009年12月4日金曜日

FreeBSD 7/8でローカルユーザーがroot権限を奪取できるセキュリティホール (FreeBSD-SA-09:16.rtld)

先日、freebsd-announceメーリングリストで流れた情報は、かなり異例のことのようで、事態が深刻であることをうかがわせるものでした。



[FreeBSD-Announce] Upcoming FreeBSD Security Advisory
http://docs.freebsd.org/cgi/mid.cgi?200912010120.nB11KeaW086655



このときのメールでは、パッチが示されているだけで、どうやってそれを使うのかまったく説明がなくて、初心者は置いてけぼり・・・な感じもしてました。



どうやら、先ほど、正式にセキュリティ・アドバイザリ(SA)が出たみたいです。



同時に3件出ていて、例のものはこちら。



[FreeBSD-Announce] FreeBSD Security Advisory FreeBSD-SA-09:16.rtld
http://docs.freebsd.org/cgi/mid.cgi?200912030930.nB39UhT7038204



これには↑ パッチのあてかたも、記載されています(・・・ですが、難しいかな?)



今回正式に出たパッチは、ぱっと見では、最初に出たものと同じっぽいです。



ところで、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 件のコメント:

コメントを投稿