危険はすぐそばに

ボンヂーア、たけけんです。

もともと脆弱性やその対策とか、ユーザーのセキュリティについては興味がありましたが、前回の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 ~]$

ログインできないです。

a

相当焦りましたが(笑)

ちゃんとこういうものもあります。

[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に置いてあるので、興味のある方は是非。

 

脆弱性はとても身近に潜んでいるのでした。

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です