たわごと・ざつだん・そのた

-- 2007年2月12日分 --
こんにちはです。
この内容に関する苦情やツッコミがございましたら、教えてやってください。
理不尽または意味不明だと却下したり、反応できない場合もあります。
内容に関して一切保証いたしません。この点については理解をお願いします。
ガセ、勘違いなど、ナンボでも考えられますので。
情報の転載についてですが、情報元の紹介や連絡する必要は特にありません。

# 近年はテンション低くてネタを見過ごすこと多いのでした‥‥orz

Last-modified: Mon, 25 Oct 2010 01:55:46 JST
279,112/10(1)
[dynamic,site,style:asada,cache:on]
powered by tds-1.7.4

2007/2/12(Mon)

§1 SunOS 5.10/5.11 in.telnetd に認証迂回の脆弱性

SunOS 5.10/5.11 in.telnetd Remote Exploit by Kingcope (セキュリティホール memo)
exploit の説明を読めばわかりますが、どえらく簡単なコマンド\で認証なしのログインが実行できてしまいます。
/etc/default/loginCONSOLE=/dev/console をコメントアウトしてあると最悪ですが、そうでなくとも各種システムアカウントがログインし放題ですので大問題。

Live Upgrade に残っていた SunOS 5.9 FCS や SunOS 5.8 Update 7 からバイナリを取り出して試験しましたが、問題はありませんでした。
どうやら SunOS 5.10 以降で加えられた機能拡張の際に、この脆弱性が作り込まれてしまったようです。
ちなみに 5.10 リリース前の Solaris Express 9/04 も試しましたが、バッチリ『アウト』でした。

0day exploit ということで、公式のパッチはまだありません。
Solaris 10 もしくは問題の in.telnetd を含む OpenSolaris 派生ディストリビューションを利用しているなら、TELNET を殺して SSH での運用に切り替えておくのが吉かと思います。
サービス状況の確認: svcs telnet
サービスを停止する: svcadm disable telnet

※Solaris 10 11/06 や最近の OpenSolaris ではネットワークサービスの大半を無効とする secure by default 構成が選択可能となっていて、制約をかけるよう選択した場合は TELNET が無効となっているはずです。→ netservice limited

あるいは問題点を修正したバイナリを作成し、/usr/sbin/in.telnetd を置き換えるか、ですね。
私家版パッチ(もちろん無保証)は次のとおり:

--- in.telnetd.c.org	Tue Jul  4 20:15:44 2006
+++ in.telnetd.c	Mon Feb 12 05:08:14 2007
@@ -2736,6 +2736,7 @@
 	int len;
 	uchar_t passthru;
 	char *slavename;
+	char *userenv;
 
 	if ((p = open("/dev/ptmx", O_RDWR | O_NOCTTY)) == -1) {
 		fatalperror(f, "open /dev/ptmx", errno);
@@ -3027,8 +3028,11 @@
 	 * Show banner that getty never gave, but
 	 * only if the user did not automatically authenticate.
 	 */
-	if (getenv("USER") == '\0' && auth_status < AUTH_USER)
+	userenv = getenv("USER");
+	if (userenv == '\0' && auth_status < AUTH_USER)
 		showbanner();
+	if (userenv != NULL && *userenv == '-')
+		showbanner();
 
 	/*
 	 * If the user automatically authenticated with Kerberos
@@ -3182,7 +3186,7 @@
 	} else if (auth_level >= 0 &&
 		auth_status >= AUTH_USER &&
 		(((AuthenticatingUser != NULL) && strlen(AuthenticatingUser)) ||
-		getenv("USER"))) {
+		userenv)) {
 		/*
 		 * If we only know the name but not the principal,
 		 * login will have to authenticate further.
@@ -3193,13 +3197,13 @@
 			    "-h", host,
 			    "-s", pam_svc_name,
 			    (AuthenticatingUser != NULL ? AuthenticatingUser :
-			    getenv("USER")),
+			    userenv),
 			    0);
 
 	} else /* default, no auth. info available, login does it all */ {
 		(void) execl(LOGIN_PROGRAM, "login",
 			    "-p", "-h", host, "-d", slavename,
-			    getenv("USER"), 0);
+			    userenv, 0);
 	}
 
 	fatalperror(netfd, LOGIN_PROGRAM, errno);

いや〜、与えられたパラメータの内容をチェックなしでそのまま渡しちゃマズいですよね〜
手元の開発環境(OpenSolaris 20061009 amd64; ちと古い)に上記パッチを適用した in.telnetd を入れ、対策できたことを確認しています。
※作業に用いたソースコードは on-20060703 と古いですが、最新のソースコードにも問題なく適用できます。

追記:
[security-discuss] telnetd exploit によれば、バグID 6523815 としてファイルされたそうです。

以上、1日分です。 (直前の日記
[一覧] << == >> < = >
前月 2007年2月 次月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28

検索


Titleonly Ignorecase

ジャンプ

[最新版] [更新] << == >> [上旬] [中旬] [下旬] [一覧] [タイトル]
[back]
Copyright(C) 2007
浅田和久 <asada+uced@solarism.org 実際には加算記号から単価記号まで削除>
http://diary.sytes.net/solaris/
back