ttt

getttyent

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

2009-12-03 23:39:11 | デジタル・インターネット

先日、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と変更が入ってるみたいです。