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によって選択的にサンドボックスが有効化されている場合、sort・filter・map・reduceでの非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次ソース)
- Twig 3.26.0 released(Symfony公式ブログ・Fabien Potencier・2026年5月20日)
- Twig v3.26.0 Release Notes(GitHub・twigphp/Twig)
- CVE-2026-46640(Symfony公式アドバイザリ)
- CVE-2026-46633(Symfony公式アドバイザリ)
- Dual Sandbox Bypasses Threaten PHP Applications(SecurityOnline・2026年5月27日)
- CVE-2026-46633: Twig Code Injection(DailyCVE)
- 【当サイト関連記事】AnthropicのProject Glasswing初回報告書——Claude Mythos Previewが1,000以上のOSSで23,019件の脆弱性を検出
- 【当サイト関連記事】AnthropicがClaude Code・Claude SecurityにMythos 1(claude-mythos-1-preview)の文字列が出現——「公開しない」から「一般公開予定」への方針転換
- 【当サイト関連記事】GitHub Enterprise Server 3.20.3——Critical SSRF・Dirty Frag権限昇格・サイバー攻撃検知による署名鍵ローテーション
- 【関連記事(当サイト)】DrupalコアのSQLインジェクション脆弱性CVE-2026-9082——実攻撃確認・CISA KEV登録
- 【関連記事(当サイト)】2025〜2026年 サイバー攻撃・情報漏洩の最新事例まとめ








