CVE-2026-48808: Twig · Sandbox property allowlist bypass via the `column` filter under `SourcePolicyInterface`
Affects twig/twigSource GCVE Database
Mentioned vulnerabilities
Not known to be exploited : upgrade to 3.27.0 when convenient.
Data as of 26 Oct 2026, 17:16 UTC
Rated by Threat Radar · No CVSS score from NVD or the CNA
- EPSS
- 0.4% chance of exploitation in 30 days – higher than 34% of CVEsExploit Prediction Scoring System: the likelihood attackers will use this flaw soon.
- Patch
- Available – fixed in 3.27.0
Exploitation evidence
Disclosed: evidence found.
CVE published 30 Jun 2026
Detectable: no evidence on record.
No public nuclei template indexed
Weaponised: no evidence on record.
No public exploit code indexed in Metasploit or Exploit-DB
Exploited in the wildExploited: no evidence on record.
Not in CISA KEV and no source reports exploitation
Observed by OffSeq MirageSeen by Mirage: no evidence on record.
No attack traffic recorded by OffSeq Mirage sensors
A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 26 Oct 2026.
What to do
Upgrade twig/twig to 3.27.0.
Affected software
| Product | Affected | Fixed in |
|---|---|---|
| Packagisttwig/twig | Affected
| Fixed in
|
Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.
Description
### Description This is a residual bypass of CVE-2026-46635 / GHSA-vcc8-phrv-43wj that only affects sandboxing enabled through `SourcePolicyInterface` (and not the regular global sandbox mode). `CoreExtension::column()` receives the active sandbox state via the `needs_is_sandboxed` channel as a boolean `$isSandboxed`, but then routes the per-element property reads through `SandboxExtension::checkPropertyAllowed()` without forwarding the current `Source`. `SandboxExtension::checkPropertyAllowed()` re-evaluates `isSandboxed($source)` internally; with `$source = null` the `SourcePolicyInterface`-driven decision is lost, the method short-circuits to "not sandboxed", and the property allowlist is never consulted. A template author whose sandbox is gated by a `SourcePolicyInterface` and who has `column` on their `allowedFilters` list can therefore read any public or magic property of any object reachable in the render context, regardless of `SecurityPolicy::$allowedProperties`. Direct attribute access to the same property is blocked, and the same payload is also blocked under global sandbox mode, which makes this a clear policy enforcement gap rather than a configuration issue. ### Resolution `CoreExtension::column()` no longer goes through the `SandboxExtension` wrapper for the property check. It calls the security policy directly: the per-source decision is already captured by the `$isSandboxed` boolean computed at the call site, so the property allowlist is enforced consistently for both global and source-policy sandboxing. ### Credits Twig would like to thank Vincent55 Yang for reporting the issue and Fabien Potencier for providing the fix.
References
- github.com/twigphp/Twig/security/advisories/GHSA-h8vq-8gpg-mhcg (opens in a new tab)
- github.com/FriendsOfPHP/security-advisories/blob/master/twig/twig/CVE-2026-48808.yaml (opens in a new tab)
- github.com/twigphp/Twig (opens in a new tab)
- github.com/twigphp/Twig/releases/tag/v3.27.0 (opens in a new tab)
- symfony.com/blog/cve-2026-48808-sandbox-property-allowlist-bypass-via-the-column-filter-under-sourcepolicyinterface (opens in a new tab)