{"id":"CVE-2026-48808","title":"Twig: Sandbox property allowlist bypass via the `column` filter under `SourcePolicyInterface`","summary":"Twig: Sandbox property allowlist bypass via the `column` filter under `SourcePolicyInterface`","severity":"medium","cwe":["CWE-693","CWE-863"],"vendor":"twig","product":"twig/twig","ecosystem":"composer","affected":["twig/twig <= 3.26.0"],"patched":["twig/twig 3.27.0"],"published":"2026-06-30","updated":"2026-06-30","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-h8vq-8gpg-mhcg","references":[{"url":"https://github.com/twigphp/Twig/security/advisories/GHSA-h8vq-8gpg-mhcg"},{"url":"https://github.com/FriendsOfPHP/security-advisories/blob/master/twig/twig/CVE-2026-48808.yaml"},{"url":"https://github.com/twigphp/Twig/releases/tag/v3.27.0"},{"url":"https://symfony.com/blog/cve-2026-48808-sandbox-property-allowlist-bypass-via-the-column-filter-under-sourcepolicyinterface"},{"url":"https://github.com/advisories/GHSA-h8vq-8gpg-mhcg"}],"tags":["ghsa","composer"],"ingestedAt":"2026-06-30T21:24:14.389Z","epss":0.00407,"epssPercentile":0.34743,"slug":"CVE-2026-48808","body":"## Overview\n\n### Description\n\nThis 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).\n\n`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.\n\nA 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.\n\n### Resolution\n\n`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.\n\n### Credits\n\nTwig would like to thank Vincent55 Yang for reporting the issue and Fabien Potencier for providing the fix.\n\n## Affected packages\n\n- `twig/twig <= 3.26.0`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `twig/twig 3.27.0`","depth":"sunlit","depthScore":28,"depthScoreParts":{"impact":27.5,"likelihood":0.1,"exploitation":0,"ransomware":0},"changes":[]}