Shellshock - почему допускается внедрение переменных среды?

Есть две вещи, которые я не понимаю об уязвимости снарядов:

  1. Почему введение переменных среды разрешено в непроверенные соединения? Для чего это хорошо?

  2. Какие реальные услуги предоставляют возможность вводить переменные?

Есть идеи?

2 ответа

Переменные среды - довольно распространенный способ общения с дочерним процессом. Вы также можете спросить: "Почему разрешено передавать аргументы дочернему процессу?" Конечно, с переменными среды требуется немного больше предосторожности, потому что некоторые переменные среды (PATH, например) влияет на семантику некоторых системных вызовов. Таким образом, обычное соглашение состоит в том, чтобы ограничить переменные среды, которые могут быть установлены от ненадежного ввода, до набора известных имен.

Например, протокол CGI, который использует переменные среды для передачи информации о HTTP-запросе, ограничивается набором имен переменных среды, указанных в том, что в общих чертах можно назвать стандартом CGI, плюс произвольные переменные среды, имена которых начинаются с персонажи HTTP_,

Хотя CGI, возможно, имеет самый большой перечень переменных среды, вводимых пользователем, этот метод довольно распространен. Одним из хорошо известных примеров является использование TERM определить тип терминала удаленного терминала, но есть еще много.

Переменные среды, такие как параметры командной строки, должны обрабатываться с осторожностью, а иногда и барьеры. /bin/env утилита предоставляет механизм для очистки среды, предоставляемой, например, исполняемому файлу; это полезно, если среда не заслуживает доверия и необходима, если исполняемый файл запущен с повышенными привилегиями.

Помимо конкретных случаев (например, PATH), ни одно приложение не должно полагаться на чистоту переменной среды. Выполнение чего-либо на основе значения переменной среды без предварительной проверки ее достоверности является такой же ошибкой, как и любое другое непроверенное использование предоставленных пользователем данных. (qv Атака SQL-инъекцией.) И вот что у нас здесь: ошибка, простая и понятная. Эти вещи случаются. Мы не идеальны. (Тот факт, что эта ошибка существовала более двух десятилетий, очевидно, никто не заметил, по крайней мере, интересен.)

1) Уязвимость является ошибкой реализации. Внедрение инструкций в переменные среды из ненадежного источника не было преднамеренно разрешено - поэтому это ошибка.

2) См. http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html для хорошего примера того, как уязвимость может быть использована.

Другие вопросы по тегам