Twig: Раскрытие информации о песочнице

Затронутые версии

Twig 1.0.0 до 1.37.1 и 2.0.0 до 2.6.2 подвержены этой проблеме безопасности.

Проблема была исправлена ​​в Twig 1.38.0 и 2.7.0.

Описание

Эта уязвимость влияет на режим песочницы Twig. Если вы не используете песочницу, ваш код не будет затронут.

Twig позволяет оценивать ненадежные шаблоны в песочнице, где все запрещено, если это явно не разрешено политикой песочницы (теги, фильтры, функции, вызовы методов, …).

Например, {% if true%} … {% endif%} не допускается в песочнице, если тег if явно не разрешен в политике песочницы.

Существует крайний случай, связанный с тем, как работает PHP. При использовании {{var}}, когда var является объектом, PHP автоматически приведёт объект к строке (echo $var эквивалентно echo $var->__toString()).

Если вы не разрешите __toString() для класса var, этот код вызовет исключение политики песочницы.

Но, к сожалению, защита от вызова __toString() работает только для простых случаев, подобных упомянутому выше. Например, он не работает со следующим шаблоном: {{var | upper}}, где будет вызываться __toString(), даже если он не является частью политики.

Поскольку __toString() иногда используется в классах для возврата некоторой отладочной информации, обход политики может раскрыть конфиденциальную информацию, такую ​​как идентификаторы записей в базе данных, имена пользователей или другие.

Решение

Была переписана текущая стратегая, которая запрещает вызов __toString(), когда он не входит в белый список, с другим подходом, который пытается определить, когда PHP автоматически приведёт объекты к строкам (echo — одно из них, сцепление — другое). Патч для этой проблемы доступен здесь для ветки 1.x.

Credits

Эта проблема была найдена во время работы над Twig 3.x, и был представлен патч, чтобы решить эту проблему.