
最近公開された CVE-2026-14628 を実世界の参照点として用いた、パストラバーサル(CWE-22) 脆弱性クラスの最小限で実行可能なデモです。
CVE-2026-14628 は 'NousResearch/hermes-agent' (< 2026.5.16) に影響します。
gateway/platforms/base.py の extract_media 関数は、受信した Webhook ペイロードから検証なしにファイルシステムパスを構築するため、リモートの認証されていない攻撃者が、意図されたメディアディレクトリの外にあるファイルを読み取ることができます。
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:Nhermes-agent コードベースを標的としたり、悪用したりするものではありません。代わりに、自己完結した小さな例で脆弱性のパターンを正確に再現し、他のコードをレビューするときに、欠陥とその修正を簡単に研究・参照できるようにしています。| ファイル | 目的 |
|---|---|
vulnerable_example.py | 欠陥のあるロジックを再現: 検証なしに単純な文字列連結でパスを構築します |
secure_example.py | 修正版: 解決された絶対パスが意図されたルートディレクトリ内に収まることを検証します |
python3 vulnerable_example.py
出力では、../secret_outside_media_root.txt のような入力を使用して、意図された media_storage/ ディレクトリの外にあるファイル (secret_outside_media_root.txt) を「攻撃者」が読み取ることに成功する様子が示されます。
python3 secure_example.py
同じ悪意のある入力は、明確な PathTraversalError で拒否されます。
secure_example.py では、2 つの補完的な防御策が適用されています:
.. またはパス区切り文字を含むファイル名は、ファイルシステムに一切触れる前に拒否されます (フェイルファストで、正当な呼び出し元には明確なエラーを返します)。candidate_path = os.path.abspath(os.path.join(MEDIA_ROOT, filename))
if not candidate_path.startswith(MEDIA_ROOT + os.sep):
raise PathTraversalError(...)
パストラバーサルは、ファイルのアップロード、ダウンロード、またはユーザーが制御する任意のファイル名を扱うソフトウェアにおいて、最も一般的で、かつ最も回避しやすい脆弱性クラスの 1 つです — Webhook ハンドラー、メディアプロセッサー、ログビューアー、テンプレートエンジン、ファイル配信 API は頻繁に標的になります。修正は安価です (わずか数行) 。それを省略した場合のコストは任意のファイル開示であり、さらに悪いケース (書き込みアクセスと組み合わさった場合) ではリモートコード実行になります。
このプロジェクトは教育目的のみです。これは既知の脆弱性クラスを一般的に再現したものであり、特定の稼働中または未パッチのソフトウェアに対する実用的なエクスプロイトではありません。所有していないシステム、またはテストする明示的な許可を得ていないシステムに対して、これらの手法を使用しないでください。