Эти ошибки tcl указывают на небезопасный код?

Я делаю тест безопасности на системе, имеющей встроенный интерпретатор TCL. Система получает данные из Интернета (HTTP), анализирует их и передает настраиваемые сценарии TCL. Во время теста фаззинга (отправки двоичного мусора в заголовках HTTP) я заметил следующие ошибки в журнале:

Ошибка TCL: элемент списка в кавычках с последующим "{}x" вместо пробела при выполнении "foreach header [ XXXXX ] { }"

или же

Ошибка TCL: несоответствующая открытая кавычка в списке при выполнении "foreach header [ XXXXX ] { }"

Здесь XXXXX - это команда, возвращающая массив заголовков HTTP, проанализированных системой. Извините, что запутываете настоящую команду, надеюсь, вы понимаете, что я не хочу обнародовать слишком много деталей до того, как поставщик будет проинформирован о проблеме (если она окажется проблемой).

Код TCL, выдающий ошибку, очень прост:

заголовок foreach [XXXXX] {}

Насколько я могу судить, HTTP-разбор выполняется вне TCL, а проанализированные значения становятся доступными для TCL с помощью пользовательских команд (возможно, реализованных как расширение TCL).

Итак, мои вопросы:

  1. Являются ли эти контрольные признаки ошибок безопасности системы, таких как недостаточная проверка ввода пользователя?

  2. Если да, можно ли использовать это условие для выполнения произвольных операторов TCL, посылая в систему специально созданный запрос, своего рода атаку с внедрением кода?

  3. Существуют ли какие-либо документы "Практика безопасного кодирования 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 

Это правда, что бы ни было в этих переменных.

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