Чтобы успокоить некоторых, я не обнаружил ошибку, наблюдая за эксплойтами, у меня нет оснований полагать, что она использовалась до того, как была раскрыта (хотя, конечно, я не могу исключить ее). Я не нашел его, посмотрев на bash
код тоже.
Не могу сказать, что точно помню свой ход мыслей в то время.
Это более или менее произошло из-за некоторых размышлений о поведении некоторых программ, которые я считаю опасными (поведений, а не программ). Такое поведение заставляет вас думать: это не похоже на хорошую идею .
В этом случае я размышлял об общей конфигурации ssh, которая позволяет передавать переменные среды без клиента из клиента при условии, что их имя начинается с LC_
. Идея состоит в том, чтобы люди могли продолжать использовать свой собственный язык при работе ssh
на других машинах. Хорошая идея, пока вы не начнете рассматривать, насколько сложна обработка локализации, особенно когда UTF-8 введен в уравнение (и посмотреть, насколько плохо он обрабатывается многими приложениями).
Еще в июле 2014 года, я уже сообщал уязвимость в GLibC обработки локализации , которая в сочетании с этой sshd
конфигурацией, а два других опасного поведением на bash
оболочке
разрешено ( с проверкой подлинности) хакеры взломать GIT сервера при условии , что они были в состоянии загрузить файлы там и bash
был использован в качестве оболочки входа пользователя git unix (CVE-2014-0475).
Я подумал, что, вероятно, было бы плохой идеей использовать bash
в качестве оболочки для входа пользователей, предлагающих услуги через ssh, учитывая, что это довольно сложная оболочка (когда все, что вам нужно, это просто разбор очень простой командной строки) и унаследовавший большинство неверных конструкций кш. Поскольку я уже определил несколько проблем с bash
использованием в этом контексте (для интерпретации ssh ForceCommand
s), мне было интересно, есть ли там потенциально больше.
AcceptEnv LC_*
разрешает любую переменную, имя которой начинается с, LC_
и у меня было смутное воспоминание о том, что bash
экспортируемые функции ( опасная, хотя и полезная функция) использовали переменные окружения, имя которых было чем-то похожим,
myfunction()
и было интересно, нет ли там чего-нибудь интересного, чтобы посмотреть на него.
Я собирался отклонить его на том основании, что худшее, что можно сделать, - это переопределить команду, LC_something
которая называется, что не может быть проблемой, поскольку это не существующие имена команд, но затем я начал задумываться, как bash
импортировать эти переменные среды.
Что, если переменные были вызваны, LC_foo;echo test; f()
например? Поэтому я решил присмотреться.
A:
$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() { :
}
показал, что мои воспоминания были неверными в том смысле, что переменные не были вызваны, myfunction()
но myfunction
(и это
значение начинается с ()
).
И быстрый тест:
$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'
подтвердил мое подозрение, что имя переменной не было обработано, и код был оценен при запуске .
Хуже того, стоимость не была продезинфицирована:
$ env 'foo=() { :;}; echo test' bash -c :
test
Это означало, что любая переменная среды может быть вектором.
Именно тогда я осознал масштабы проблемы, подтвердил, что ее можно использовать и через HTTP ( HTTP_xxx
/ QUERYSTRING
... env vars), другие, такие как службы обработки почты, позже DHCP (и, вероятно, длинный список), и сообщил об этом (осторожно) ,