ボンヂーア、たけけんです。
もともと脆弱性やその対策とか、ユーザーのセキュリティについては興味がありましたが、前回のKernelいじいじをしてみてサンプルがあれば以外と簡単なんだという事も分かったので、いろいろ調査を続けていました。
そんな中で、夏はまだ遠いですが、かなりヒヤっとした体験をしました。
サーバーのプログラムやアプリケーションやユーザーの権限を扱うような役割をしている人は要チェックな話ですが、2002年の話だし、そんなポジションの人は当然知ってる内容なのかもしれない。
参考サイト
IPA
http://www.ipa.go.jp/index.html
今日の参考サイトはIPAさんです。
内容はsetuid、create関数の脆弱性を使ったものですが、悪用した場合、あまりにも簡単に利用不可状態に陥れられてしまいます。
setuidについて
ユーザーが実行ファイルを実行する際にその実行ファイルの所有者やグループの権限で実行できるようにする。byWikipedia
create関数について
int creat(const char *filename, int amode);
filenameで指定したファイル名で新しいファイルをamodeで指定した属性で作成します。
すでに同じファイルが存在していれば、ファイルのサイズを0にします。
というものです。
あまりにも簡単にって書きましたが、下準備は必要で、問題のプログラムの所有者をrootにする事と、setuid/setgid ビットをセットする事が必要です。
前回やったKernelモードでバッファオーバーフローさせるプログラムも下準備は必要でしたが、さすがにKernelを再構築するのと比べると、今回のものはずっとシンプルです。
それにしたって、脆弱性であることは変わりないですし、誤ってこういった事の種を自分が作ってしまわないように注意しよう。
プログラムの状態はこんな感じです。
ダイジェストでいきます。
ユーザーフォルダにroot権限のプログラムがある事じたいがおかしいですが、まあそこはおいときましょう。
[takeken@testserver_centos ~]$ pwd /home/takeken [takeken@testserver_centos ~]$ ls -l setuid -rwsrwsr-x. 1 root nobody 6574 5月 13 15:33 2014 setuid
何をするかというと、/etc/passwdを消します。
今はあるよ。
[takeken@testserver_centos ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/zsh bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
プログラム実行します。
[takeken@testserver_centos ~]$ ./setuid [takeken@testserver_centos ~]$
はい、消えた。
[takeken@testserver_centos ~]$ cat /etc/passwd | head [takeken@testserver_centos ~]$
ログインできないです。
相当焦りましたが(笑)
ちゃんとこういうものもあります。
[takeken@testserver_centos ~]$ cat /etc/passwd- | head root:x:0:0:root:/root:/bin/zsh bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
公開は2002年とかなり古いですが、実際にsetuidとcreate関数で消せてしまうという事実は残ってますので、要注意ですね。
IPAによるとcreateではなくて、openを使おうという事でした。
Perlでもopen関数は引数2個のものは脆弱なので、3個で記述するようにとありましたね。
プログラムはIPAに置いてあるので、興味のある方は是非。
脆弱性はとても身近に潜んでいるのでした。