Python でMarkdownをHTMLに変える部品「Mistune」のIncludeのディレクティブ(別のファイルを取り込む書き方)に、脆弱性 CVE-2026-115355が公表されました。深刻度はHighで、対象は3.2.0以下、修正版は3.3.0です。
当たるかどうかは、Includeを有効にしているかで決まります。Mistuneを入れているだけの会社が、すぐ慌てる話ではありません。
Mistuneの勧告。3.2.0以下が対象で、3.3.0で修正 出典: GitHub Advisory Database「GHSA-h7ww-273w-6cm8」 (引用)
Includeが「置き場所の外」まで読んでしまう
勧告によると、問題は2つあります。
パストラバーサル: Includeは、取り込むファイルのパスが、元のMarkdownの置き場所の中に収まっているかを検証していません。../ を含む相対パスで、外にあるファイルを読めてしまいます
XSS (クロスサイトスクリプティング): エラーメッセージと、取り込んだファイルの中身が、HTMLのエスケープなしで出力されます。escape=True を指定していても同じです
勧告の分類はCWE-22(パストラバーサル)で、深刻度はHighです。勧告のデータベース には、CVSSの数値はまだ入っていません(2026年10月26日時点)。GitHub が示す悪用の見込み(EPSS)は0.461%でした。
Includeは、Mistuneの既定では有効になっていません。勧告は「プラグインとして明示的に有効にする必要がある」としています。Mistuneの文書は、Includeを「ドキュメント生成ツール向けの強力なプラグイン」と紹介しており、ほかのファイルを章として取り込む使い方が想定されています。
修正は6月に出ていた
修正のコミットは6月21日、修正版の3.3.0も同じ日に公開されています。GitHubの勧告のページにも、リポジトリ側では「6月21日公開」と表示されています。一方、CVE番号を付けた形で勧告のデータベースに載ったのは10月23日です(GitHubのAPIの記録)。
版
PyPIに出た日
状態
3.2.0
2025年12月23日
対象(勧告の表記)
3.2.1
2026年5月3日
3.3.0より前。修正のコミットより前のため、更新の対象(編集部の見立て)
3.3.0
2026年6月21日
修正版
3.4.0
2026年10月19日
修正済み。確認した時点の最新版で、Python 3.10以上が必要
勧告の表には「3.2.0以下」とありますが、修正のコミットは3.2.1のあとに入っています。VulnCheckの勧告も題で「3.3.0より前」としているため、3.2.1も更新の対象として扱うのが安全です。
修正の中身は、取り込むファイルの場所を実際のパス(シンボリックリンクを解いたあと)で調べ、元のディレクトリの外なら「Could not include outside source dir」というエラーにすることです。ファイルが自分自身や、互いを取り込み合う循環も止めます。取り込んだ中身は、エスケープが有効なら、HTMLにする前にエスケープされます。
3.3.0には、Includeのほかにも、処理が極端に遅くなる問題の修正(リンクの解析など)や、危険なURLスキームを止める修正が入っています。Includeを使っていなくても、更新する理由はあります。
Mistuneを使う代表的な部品
Mistuneは、ほかのツールの内部で使われることが多い部品です。確かめられた範囲は次のとおりです。
部品
Mistuneとの関係
当たるか
nbconvert(Jupyter Notebookの変換)
2.0.3以上4未満のMistuneを使う指定
mainブランチの既定のプラグインにIncludeは無い(10月26日確認)。自社で足していなければ当たらない
m2r2
最新の2.1.0が、Mistune 3.3以上3.4未満を要求
最新版を入れていれば、修正版の範囲に入る。古いm2r2を固定している環境は個別に確認
上の2つ以外は、確かめられていません。社内の文書の生成や、メモ・Wikiの表示に使っているPythonのアプリは、自社のコードで mistune を呼んでいる箇所を探すのが早道です。
影響する会社・しない会社
影響する: Mistune 3.3.0より前の版を使い、Includeのディレクティブを有効にして変換している会社。Markdownを書く人が社外の人や、信頼できない入力(投稿・アップロード・外部のリポジトリ)を含む場合は、特に当たります
影響しにくい: Includeを有効にしているが、Markdownを書くのが社内の文書の担当者だけで、変換の実行の権限も絞ってある会社。取り込める範囲が広いこと自体は変わらないので、更新はします(編集部の見立て)
影響しない: Includeのプラグインを有効にしていない会社。Mistune 3.3.0以降(確認した時点の最新は3.4.0)を使っている会社
なお、Includeは、変換するファイルの場所が分かるときだけ働きます。3.3.0のコードでは、場所が渡されない変換は「Missing source file」というエラーになります。文字列だけを渡して変換している使い方は、さらに当たりにくくなります(編集部の見立て)。
更新できないときの対処
Includeのプラグインを外します。取り込みが要らなければ、これが確実です
外せないときは、Markdownを書ける人を信頼できる範囲に絞ります。変換を動かすアカウントも、読ませてよいファイルだけにアクセスできる権限にします
変換した結果のHTMLを、ブラウザーに出す前に、別のサニタイズの処理にも通します
確かめる手順
入っている版を調べます。 開発や運用のサーバー、CIの実行機、コンテナのイメージで pip show mistune を実行します。ロックファイル(requirements.txt、poetry.lock、uv.lockなど)でも、版を一覧にします。
Includeを有効にしているかを調べます。 自社のPythonのコードで mistune を使う箇所を検索し、directives、FencedDirective、RSTDirective、Include の指定があるかを見ます。委託先が作ったアプリは、依頼先に同じ調査を頼みます。
3.3.0以降に更新します。 対象の版が入っていれば、3.3.0以降(最新の3.4.0はPython 3.10以上が必要なので、古いPythonでは3.3.0)に上げ、コンテナのイメージは作り直します。nbconvertのように別の部品が入れているときは、親の部品ごと更新します。
版を固定した環境を見直します。 版を固定していると、依存を入れ直しても古いままです。固定した理由を確かめ、更新の日取りを決めます。
同じ型の脆弱性を探します。 ほかの部品の include や「別のファイルを取り込む」機能も、パスの検証が同じように抜けていないかを、開発の部門に確認してもらいます。
同じPythonの部品では、filelockの脆弱性も10月に公表されています(Pythonのfilelockに脆弱性2件 )。依存の版を一覧にする作業は、まとめて済ませると手間が減ります。