Claude MythosがPHPのテンプレートエンジンのTwig(ツイッグ)の脆弱性を発見、危険な脆弱性(CVE-2026-46640・CVE-2026-46633)を含む13件の脆弱性を修正済み

セキュリティニュース

投稿日時: 更新日時:

Claude MythosがPHPのテンプレートエンジンのTwig(ツイッグ)の脆弱性を発見、危険な脆弱性を含む13件の脆弱性を修正済み

PHPで最も広く使われているテンプレートエンジンの一つ「Twig(ツイッグ)」の開発チームは2026年5月20日、計13件のセキュリティアドバイザリを修正したバージョン3.26.0をリリースしました(Twig 3.26.0 released・Symfony公式ブログ・Fabien Potencier・2026年5月20日)。

13件のうち2件がCritical・3件がHighであり、そのほぼすべてが「信頼されていないテンプレートをポリシー制限付きで実行するための安全機構」であるTwigのサンドボックスコンポーネントを標的としています。Fabien Potencier氏は「サンドボックスを通じて信頼されていないテンプレートを実行しているすべてのユーザーは直ちにアップグレードするべき」と明言しています。

本リリースが特に注目される点として、クレジットセクションに「Claude Mythos Preview(via Project Glasswing)」が脆弱性の発見者および修正コードの著者として明記されています。これは当サイトが過去に詳報したProject Glasswingの初回報告書——「Claude Mythos Previewが1,000以上のOSSプロジェクトで23,019件の脆弱性を検出した」という活動——の成果が、主要OSSの公式パッチとして具体化した最初の事例の一つです。

この記事のサマリー

13件の脆弱性の深刻度別分類

深刻度 件数 主なCVE
Critical 2件 CVE-2026-46640・CVE-2026-46633
High 3件 CVE-2026-46639・CVE-2026-47732・CVE-2026-24425
Medium 4件 CVE-2026-46635・CVE-2026-46638・CVE-2026-46634・CVE-2026-46627
Low 4件 CVE-2026-46628・CVE-2026-46637・CVE-2026-47730・CVE-2026-46629
  • 影響バージョン:Twig 3.26.0未満のすべてのバージョン(一部CVEはv3.15.0以降・v3.24.0以降)
  • 修正済みバージョンTwig 3.26.0
  • 影響を受けるフレームワーク・CMS:Symfony・Drupal・Laravel(一部)・Craft CMS・Mezzio・Bolt CMS等Twigを使用するすべてのPHPアプリケーション
  • 最重要の行動:サンドボックスを通じて信頼されていないテンプレートを処理している環境は直ちに3.26.0へのアップグレードが必要
  • 注目点:Claude Mythos Preview(via Project Glasswing)がTwig 3.26.0の脆弱性の一部を発見・修正コードを提供したとして公式クレジットに登場

Claude Mythos Preview(via Project Glasswing)」が公式クレジットに登場

今回のTwig 3.26.0リリースブログ(Symfony公式・Fabien Potencier著)のクレジットセクションには以下の記述があります。

「Thanks to the reporters who responsibly disclosed these issues: Claude Mythos Preview (via Project Glasswing), El Kharoubi Iosif, Kai Aizen (Snailsploit), Christophe Coevoet, Anvil Secure (in collaboration with Claude and Anthropic Research), Pierre Rudloff, and Nicolò Ribaudo.(本脆弱性を責任を持って開示した報告者に感謝する)」

「Fixes were authored by Fabien Potencier, Alexandre Daubois, Nicolas Grekas, Claude Mythos Preview (via Project Glasswing), and Anvil Secure (in collaboration with Claude and Anthropic Research).(修正は以下の者によって実装された)」

これはClaude Mythos PreviewがTwig本体の脆弱性を発見しただけでなく、修正コードの一部を実際に実装したことを公式リポジトリのメンテナーが認めた形です。当サイトの既報で詳述したAnthropicのProject Glasswing初回報告書が示した「1か月で10,000件超の高・重大深刻度脆弱性を発見し、OSSプロジェクトに開示・修正に貢献している」という活動の具体的な成果が、世界中の主要PHPアプリケーションに組み込まれるTwigのセキュリティリリースとして現実化した事例です。

Critical 2件の技術詳細——「コンパイルされたキャッシュへのPHPコードインジェクション」

今回の2件のCritical脆弱性はどちらもTwigがテンプレートをコンパイルしてキャッシュファイルを生成する際に、攻撃者が制御する文字列が未検証のままPHPソースコードとして埋め込まれるという同一の本質的な問題を持っています。キャッシュファイルはテンプレートが最初にレンダリングされる際に実行されるため、インジェクションされたPHPコードはホストサーバー上で実行されます。

CVE-2026-46640——_self.(<string>)によるPHPコードインジェクション

Symfony公式ブログによれば、本脆弱性はTwig 3.15.0で導入されたobj.(expr)ダイナミック属性構文に起因します。

具体的には、レシーバーが_self(または任意の{% import %}エイリアス)であり、括弧内の式が文字列リテラルである場合、パーサーが通常の識別子検証を短絡処理してしまいます。その結果、攻撃者が制御する文字列がマクロ参照名に検証なしで結合され、コンパイラがその名前をPHPソースコードにそのまま出力します。

{# 攻撃例:任意のPHPが実行される #}
{{ _self.('attacker controlled string') }}

このテンプレートソースを供給できる攻撃者は、テンプレートの最初のロード時(コンパイル・キャッシュ生成時)に悪意あるコマンドを実行できます。設定されているSandboxExtensionの保護を完全に回避します。修正はダイナミック属性がマクロコールパスに入る前に有効なマクロ識別子に解決されるかどうかを検証する処理を追加しました。

CVE-2026-46633——{% use %}タグのシングルクォートエスケープ漏れ

SecurityOnlineおよびDailyCVEの分析によれば、本脆弱性はCompiler::string()のエスケープ処理の漏れに起因します。コアコンパイラはPHPのダブルクォート文字列リテラル生成時に"$\・NUL・TABを安全にエスケープしていましたが、シングルクォート(')のエスケープを完全に失念していました。

{% use %}タグからのテンプレート名はコンパイル済みキャッシュファイル内でPHPのシングルクォートリテラルの中に配置されます。このため、シングルクォートを含む悪意あるテンプレート名がそのリテラルを早期に終端させ、任意のPHP式がアプリケーションのキャッシュに直接ロードされます。

// 脆弱なコンパイル結果のイメージ
$template->getParent($context)->foo;  // ← 本来の処理
// ↓ 攻撃者がテンプレート名に "'); system('id'); //" を入れると
$template = ''); system('id'); //';   // ← キャッシュに注入

修正としてCompiler::string()がシングルクォートを\x27としてエンコードするよう変更されました。


High 3件の技術詳細—「サンドボックスの多段バイパス」

CVE-2026-46639——オブジェクト分割代入で$sandboxedがfalseにハードコード

Symfony公式ブログの説明によれば、Twig 3.24.0で追加されたオブジェクト分割代入がCoreExtension::getAttribute()を呼び出す際に、$sandboxed引数をSandboxExtensionがアクティブかどうかにかかわらずfalseにハードコードしていました。

{# 3.26.0未満ではサンドボックスチェックが無効化される #}
{name: userName, email: userEmail} = user

このコードは両方のプロパティ読み取りをサンドボックスのallow-listチェックなしで実行しており、分割代入を使うだけでサンドボックスポリシーを無音で無効化できました。修正はコンパイラが正しいサンドボックスフラグを渡すよう変更しました。

CVE-2026-47732——__toString()強制変換の広範なポリシーバイパス

SandboxNodeVisitorがハードコードされたノードタイプのリストのみをCheckToStringNodeでラップしていたため、それ以外のノード——三項演算子・matches・比較演算子・範囲式・doタグ・ダイナミック属性名・スプレッド引数・is emptyテスト——はStringableオペランドをポリシーチェックなしで文字列に強制変換していました。

これにより、サンドボックス化されたテンプレートの作成者は、そのメソッドがallow-listになくても、レンダリングコンテキストからアクセス可能な任意のオブジェクトで__toString()を呼び出せました。修正として新しいTwig\Node\CoercesChildrenToStringInterfaceが導入され、各ノードがどの子ノードをガードする必要があるかを宣言し、ビジターが体系的にそれらをラップするよう変更されました。

CVE-2026-24425——SourcePolicyInterface使用時のコールバック検証が非サンドボックス扱いに

SourcePolicyInterfaceによって選択的にサンドボックスが有効化されている場合、sortfiltermapreduceでの非Closureコールバックを禁止するランタイムチェックが現在のテンプレートのSourceを考慮せず、非サンドボックスとして扱っていました。修正はcheckArrow()Sourceを受け取ることでソースポリシーが正しく参照されるよう変更しました。


Medium 4件・Low 4件の概要

深刻度の高いものの概要を以下に整理します。

CVE-2026-46635(Medium)として、columnフィルターがPHPネイティブのarray_column()にそのまま入力を渡しており、オブジェクトの場合は$obj->$nameを直接読み取り(__get__issetを含む)、CoreExtension::getAttribute()を経由しないためプロパティのallow-listが参照されませんでした。

CVE-2026-46638(Medium)として、CVE-2024-45411の修正がCoreExtension::include()にcheckSecurity()再チェックを追加しましたが、非推奨の{% sandbox %}{% include %}{% endsandbox %}タグのパスが漏れており、サンドボックス外で一度ロードされたテンプレートは2回目のインクルード時にcheckSecurity()をスキップしていました。

CVE-2026-46628(Low)として、spacelessフィルターがis_safe => ['html']で登録されており、攻撃者が制御するマークアップにこのフィルターを適用するとオートエスケープが無効化され、エスケープなしで出力されるXSS脆弱性がありました。

CVE-2026-47730(Low)として、Twig\Profiler\Dumper\HtmlDumperがテンプレート名をエスケープせずにHTML出力に書き込んでおり、テンプレート名が攻撃者制御の場合(ArrayLoaderのキー・データベースの行ID等)にプロファイラダンプを閲覧すると任意のHTMLが実行されました。


影響を受けるフレームワーク・CMSと対応の優先度

Twigは以下の広範なエコシステムで採用されています。影響の深刻度と対応優先度を整理します。

Symfonyとして、Twigの最大のユーザーであり公式管理者でもあります。Symfony本体のアップデートに追従することで自動的に修正されますが、Twigを直接利用している場合は独立したアップデートが必要です。Drupalとして、コアでTwigを使用しており、本脆弱性への対応が含まれるDrupalコアのアップデートがすでに配信されています(当サイト関連記事:Drupal CVE-2026-9082参照)。なお今回のGHES 3.20.3リリースでもTwigのセキュリティアップデートが同梱されていたことを当サイトの既報で報告しています。Craft CMSとして、TwigのSSTI脆弱性(CVE-2026-28784・CVE-2026-28695等)との複合的なリスクに注意が必要です。Laravel(Blade使用時はTwig非採用・但しTwig Bridge使用時は影響あり)・Mezzio・Bolt CMS等、Twigを直接採用しているすべてのPHPアプリケーションが対象です。

サンドボックスを使用していない場合でも対応が推奨される理由として、Low分類のCVE-2026-46628(spacelessフィルターのXSS)・CVE-2026-47730(プロファイラダンプのXSS)・CVE-2026-46629(IntlExtensionの無制限メモリ使用)はサンドボックスの有無にかかわらず影響します。


対応手順


# Composerでのアップデート
composer require "twig/twig:^3.26"

# または
composer update twig/twig

# バージョン確認
composer show twig/twig

# twig extrasを使用している場合は以下も更新
composer update twig/cssinliner-extra twig/inky-extra twig/markdown-extra

アップグレードが即座に困難な場合は、信頼されていないユーザーが提供するテンプレート名やテンプレートコンテンツのサニタイズを徹底し、{% use %}タグへの外部入力の混入を防いでください。ただしあくまでも一時的な緩和措置であり、Twig 3.26.0への更新が唯一の根本的な解決策です。


FAQ

Q. Twig 2.x系を使用しています。影響を受けますか? A. Twig 2.x系は現在EOL(サポート終了)です。Symfony公式ブログはv3.26.0への修正のみを言及しており、2.x系への修正バックポートは確認されていません。速やかに3.x系への移行を強く推奨します。

Q. Twigのサンドボックスを使用していませんが、今回の修正は関係ありますか? A. Critical 2件・High 3件はサンドボックスを使用している環境が主な対象ですが、Low分類のCVE-2026-46628(spacelessフィルターのXSS)・CVE-2026-47730(プロファイラダンプのXSS)・CVE-2026-46629(メモリ使用の問題)はサンドボックスの有無にかかわらず影響します。すべてのTwigユーザーにアップデートを推奨します。

Q. Twigのサンドボックスとは何ですか?使っているかどうかの確認方法は? A. Twigのサンドボックスは、ユーザーが入力した任意のテンプレートを安全に実行するための機能です。SandboxExtensionが設定されているかどうかをコードベースで確認してください(new \Twig\Extension\SandboxExtension($policy)という記述の有無)。CMS等で「カスタムテンプレートの入力を許可する」機能を持つ場合はサンドボックスを使用している可能性があります。

Q. 「Claude Mythos Preview(via Project Glasswing)」が今回の修正にどの程度貢献しましたか? A. Symfony公式ブログのクレジットでは「脆弱性の報告者」かつ「修正コードの著者」として明記されており、複数の脆弱性の発見と修正実装に直接関与したことが示されています。具体的にどのCVEを担当したかは公式ブログには明記されていませんが、Anvil Secure(in collaboration with Claude and Anthropic Research)との協働で複数件に対応したとみられます。


参考情報(1次ソース)