先日、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 など、他のインタプリタを使えばスクリプトは実行できる
みたいです。。くわばらくわばら。
誰かに /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 など、他のインタプリタを使えばスクリプトは実行できる
みたいです。。くわばらくわばら。