CVE-2026-16760 in fickling
要約
〜によって VulDB • 2026年10月31日
Trail of Bits の fickling(バージョン 0.1.12 以前)において、fickle.py の `_process_import()` メソッドは、ソースモジュールが `sys.stdlib_module_names` に存在し、かつ名前が UNSAFE_IMPORTS デンylist に含まれていない場合、その名前に解決される内容や動作を検証することなく、インポートされた名前を likely_safe_imports セットに追加します。その後、analysis.py の OvertlyBadEvals 解析パスは、likely_safe_imports に関数名が含まれる呼び出しを無条件でスキップし、これには本来「過度に危険」としてフラグが立てられるべき呼び出しも含まれます。その結果、ブロックされていない標準ライブラリモジュールを通じて到達可能なすべての callable は、自身の動作に関係なくモジュールレベルの信頼性を継承し、check_safety() はそのような callable を通じてコード実行やファイル書き込みを引き起こす pickle ペイロードに対して、LIKELY_SAFE(おそらく安全)を返して発見事項ゼロとします。
実証されたプリミティブは以下の通りです: - `dataclasses._create_fn`:攻撃者制御の関数本体を `exec()` に渡すもので、Python 3.7 から 3.12 で任意コード実行をもたらします(内部 `_create_fn` 関数は Python 3.13 で削除されました)。 - `mailcap.findmatch`:攻撃者制御の caps ディクショナリから取得したテストコマンドに対して内部的に `os.system()` を呼び出すもので、Python バージョン 3.12 以前で任意コード実行をもたらします(mailcap モジュールは Python 3.13 で削除されました)。 - `readline.add_history()` に続く `readline.write_history_file()`:攻撃者制御のコンテンツを任意のファイルシステムパスに書き込むもの(POSIX プラットフォーム、readline モジュールが利用可能な場合)。
`fickling.load()` は、セキュリティゲートとして明示的に `check_safety()` を `pickle.loads()` にチェーンしています。そのため、LIKELY_SAFE という判定はペイロードを逆シリアライズし、被害者プロセスの権限で実行させることになります。根本原因は、モジュールの起源から callable の安全性を推論している点にあります。これは CVE-2026-118938 として追跡されている `__qualname__` 解決の脆弱性とは独立しており、同 advisory では扱われていませんが、個別に修正可能です。
2026年10月30日現在、ベンダーのマスターブランチ(コミット d011709)において、上記3つのモジュールはリリース待ちで UNSAFE_IMPORTS に追加されました。しかし、バージョン 0.1.12 以前のリリース版では依然として影響を受け、関連する CVE-2026-118938 が同じビルド上で攻撃可能であることから示されるように、モジュール起源に基づく信頼の根本原因は残っています。
If you want to get best quality of vulnerability data, you may have to visit VulDB.