Affected versions
Twig versions 2.16.*, >=3.9.0, <3.26.0 are affected by this security issue.
The issue has been fixed in Twig 3.26.0.
Description
When using the sandbox with a SourcePolicyInterface, Twig does not always
apply the sandbox restriction that forbids non-Closure callbacks for
callback-accepting filters.
The issue affects the sort, filter, map, and reduce filters.
In the affected versions, the runtime check that rejects non-Closure
callbacks in sandbox mode does not use the current template Source. As a
result, when the sandbox is enabled through a source policy instead of
being enabled globally, Twig can incorrectly treat the current execution as
non-sandboxed for these callback checks.
This can allow user-controlled templates to pass arbitrary PHP callables to callback-accepting filters even though the template is being sandboxed through a source policy.
The issue happens when all these conditions are met:
- The sandbox is not enabled globally;
- A
SourcePolicyInterfaceenables the sandbox for the rendered template; - The template uses one of the
sort,filter,map, orreducefilters; - The callback is not a
Closure.
Resolution
The patch makes callback sandbox checks source-aware by propagating the
current template Source to callback-accepting filters and using it when
deciding whether sandbox restrictions apply.
Credits
We would like to thank Wade Sparks for reporting the issue and Fabien Potencier for fixing the issue.