home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Perl/codepiece/setuid01

Perl/codepiece/setuid01

Perl / codepiece / setuid01
id: 136 所有者: msakamoto-sf    作成日: 2007-04-03 17:18:57
カテゴリ: Perl 

setuidされたPerlについての調査を行った。

kernelレベルではまたどうもややこしくなるようである。ここでは、単純にTaintモードの確認を行う。

  • コードピース(setuserid.pl)
#!/usr/bin/perl -T
use strict;
use warnings;

#my $fn = sprintf("/tmp/%ld.tmp", time);
my $fn = shift || die "usage: $0 touch_file_name\n";
print $fn, "\n";

open FH, ">$fn" || die "open failure. $!\n";

print FH "REAL_USER_ID(UID) = $<\n";
print FH "EFFECTIVE_USER_ID(EUID) = $>\n";
print FH "REAL_GROUP_ID(GID) = $(\n";
print FH "EFFECTIVE_GROUP_ID(EGID) = $)\n";

close FH;
  • 実行結果
$ chmod u+s setuserid.pl
$ chmod g+s setuserid.pl
$ ls -l setuserid.pl
-rwsr-sr-x  ... setuserid.pl*
$ su xxxxx(別のユーザ)
$ ./setuserid.pl /tmp/hoge
Insecure dependency in open while running setuid at /.../setuserid.pl line xx.

perlsecにあるとおり、引数から渡されてきたものをそのままファイル名としてopen私用とすると、汚染されていると見なされ、上記のようなエラーになる。これを回避するには、正規表現をバイパスさせる手法がperlsecに挙げられている。

ここでは、ファイル名をtimeの秒数で生成するようにしてみる。

#my $fn = sprintf("/tmp/%ld.tmp", time);
my $fn = shift || die "usage: $0 touch_file_name\n";
→
my $fn = sprintf("/tmp/%ld.tmp", time);
#my $fn = shift || die "usage: $0 touch_file_name\n";
実行結果
$ su xxxxx(別のユーザ)
$ ./setuserid.pl
/tmp/1175567398.tmp
$ more /tmp/1175567398.tmp
REAL_USER_ID(UID) = 600
EFFECTIVE_USER_ID(EUID) = 500
REAL_GROUP_ID(GID) = 600 600
EFFECTIVE_GROUP_ID(EGID) = 500 600

とりあえず今回はここまで。setuid、難しい・・・。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2008-12-29 17:20:04
md5:473373bc63092913c67e4123b767e30a
sha1:6d8ab58052c5a521bb9633f1d32d5822dc7a557c
コメント
コメントを投稿するにはログインして下さい。