---
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.34748
---

## Overview

### 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.

## Affected packages

- `twig/twig <= 3.26.0`

## Remediation

Upgrade to a patched release:

- `twig/twig 3.27.0`
