Затронутые версии
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, и был представлен патч, чтобы решить эту проблему.