miyapiのひとりごと

blogこと始め。コンピュータと映画、そしてお酒の好きなmiyapiが気ままに書きつづる日記。。。

怖い話(Linux)

2007-06-30 12:42:00 | Weblog
先日、Security Focus の incidents メーリングリストで、

誰かに /tmp へ Perl のスクリプトを勝手に置かれて
実行権の無い状態にもかかわらず( chmod -x )、実行
されてしまった。

という投稿がありました。

実行されたのは、指定したホストにシェルを返す、バックドア
のようなスクリプトでしたが、びっくりしたのは、chmod -x の
状態でも、「ファイルが読めさえすれば実行できる」ということ
でした。

まぁ、Perl のスクリプトなら、ファイル自体に実行権がなくても
Perl に渡せば実行してくれるのはあきらかです。

$ chmod -x foo.pl
$ /usr/bin/perl foo.pl

実はバイナリの場合でも、同じ芸当ができて ダイナミックリンカ
に実行させる方法があります。

ld-so とか ld-linux.so.2 とかがそれで、バイナリのフルパスを
引数に指定すると実行できてしまいます。

実際、適当なプログラムを書いて

[foo@LinuxBox foo]$ cat foo.c
#include <stdio.h>
void
main( void ){
printf("Hello World.\n");
}

コンパイルして、

[foo@LinuxBox foo]$ gcc -o foo foo.c
foo.c: 関数 `main' 内:
foo.c:3: 警告: `main' の戻り値の型が `int' ではありません

フツーに実行すると、

[foo@LinuxBox foo]$ ./foo
Hello World.

実行権を外すと( chmod -x )

[foo@LinuxBox foo]$ chmod -x ./foo
[foo@LinuxBox foo]$ ./foo
bash: ./foo: 許可がありません

でも、ダイナミックリンカーから起動すると、

[foo@LinuxBox foo]$ /lib/ld-linux.so.2 /home/foo/foo
Hello World.

つまり、第三者によるファイルの実行を防ぐために chmod -x
をやっても、根本的な対策にはならない、というわけで、
ホントに怖い話ですね。。

ちなみに、パーティションを実行権為し( noexec )オプション
付きでマウントすればいいじゃないか、という話もあり、これ
だと確かに、ld-linux.so.2 経由では実行できなくなりますが、
Perl など、他のインタプリタを使えばスクリプトは実行できる
みたいです。。くわばらくわばら。