Здравствуйте, BlackEric, Вы писали:
BE>Очень хорошая статья на Security Lab, объясняющая уязвимость и механизм ее эксплуатации и как ее частично пофиксили. Полезно для понимания как оно вообще бывает даже тем, кто не работает с Java.
BE>Подробнее: https://www.securitylab.ru/analytics/534471.php
Как и в прошлом случае, публикуется масса малоинтересных подробностей (вроде фрагментов стека), и обходятся главные вопросы:
1. Для чего вообще используется интерполятор строк?
2. В каких сценариях может потребоваться применение небезопасных string-лукапов в интерполяции?
3. Зачем кому-то в голову приходит скармливать в интерполятор пользовательский ввод?
4. Как правильно пользоваться интерполяцией для сценариев, в которых нужна комбинация пунктов 1, 2 и 3?
Советы вроде "просто экранируйте пользовательский ввод" попахивают бесполезным капитанством.
Смотрите за руками: если кто-то передаёт в в
interpolator.replace() пользовательский ввод, то ему это зачем-то нужно. Т.е. приложение спроектировано так, что пользователь может указывать какие-то строковые формулы с подстановками. Если мы "выкосим", т.е. заэкранируем все шаблоны для замены, то пользовательский ввод перестанет интерполироваться.
Нафига козе баян?
Просто заменяем
output = interpolator.replace(input) на
output = input и получаем тот же результат безо всякой интерполяции.
Если же нас интересует сохранение функциональности приложения, то надо понять, как же делать интерполяцию
без риска исполнить произвольный код под привилегиями приложения или открыть иную дыру в неведомые измерения.