Эти ошибки tcl указывают на небезопасный код?
Я делаю тест безопасности на системе, имеющей встроенный интерпретатор TCL. Система получает данные из Интернета (HTTP), анализирует их и передает настраиваемые сценарии TCL. Во время теста фаззинга (отправки двоичного мусора в заголовках HTTP) я заметил следующие ошибки в журнале:
Ошибка TCL: элемент списка в кавычках с последующим "{}x" вместо пробела при выполнении "foreach header [ XXXXX ] { }"
или же
Ошибка TCL: несоответствующая открытая кавычка в списке при выполнении "foreach header [ XXXXX ] { }"
Здесь XXXXX - это команда, возвращающая массив заголовков HTTP, проанализированных системой. Извините, что запутываете настоящую команду, надеюсь, вы понимаете, что я не хочу обнародовать слишком много деталей до того, как поставщик будет проинформирован о проблеме (если она окажется проблемой).
Код TCL, выдающий ошибку, очень прост:
заголовок foreach [XXXXX] {}
Насколько я могу судить, HTTP-разбор выполняется вне TCL, а проанализированные значения становятся доступными для TCL с помощью пользовательских команд (возможно, реализованных как расширение TCL).
Итак, мои вопросы:
Являются ли эти контрольные признаки ошибок безопасности системы, таких как недостаточная проверка ввода пользователя?
Если да, можно ли использовать это условие для выполнения произвольных операторов TCL, посылая в систему специально созданный запрос, своего рода атаку с внедрением кода?
Существуют ли какие-либо документы "Практика безопасного кодирования TCL"? Я не мог найти ни одного.
1 ответ
Вы спрашивали об этом на comp.lang.tcl, где я ответил:
1) Являются ли эти контрольные признаки ошибок безопасности системы, таких как недостаточная проверка ввода пользователя?
Они указывают на проблемы в коде синтаксического анализа. Я предполагаю, что код предполагает, что он может предполагать, что заголовок - это правильно сформированный список Tcl, который вы считаете совершенно небезопасным. Санитарная обработка заключается в использовании чего-то вроде этого:
set listOfWords [regexp -all -inline {\S+} $someString]
Результирующий набор слов гарантированно будет правильно сформированным списком для произвольной входной строки.
2) Если да, можно ли использовать это условие для выполнения произвольных операторов TCL, отправив в систему специально созданный запрос, своего рода http://en.wikipedia.org/wiki/Code_injection?
Скорее всего, нет, если только вы потом не обработаете этот список как код.
3) Существуют ли какие-либо документы "Практика безопасного кодирования TCL"? Любой другой источник информации о том, как безопасно обрабатывать ненадежные данные?
Самый простой способ - выполнить анализ в Safe Interpreter:
interp create -safe parsingInterp
parsingInterp eval { make the procedures }
parsingInterp eval [list doTheParse $stringToParse]
Обратите внимание, что мы также гарантируем, что построенные списки (например, те из list
и многие другие команды) eval-safe. То есть:
eval [list $a $b $c]
точно так же, как:
$a $b $c
Это правда, что бы ни было в этих переменных.