我正在对具有嵌入式 TCL 解释器的系统进行安全测试。系统从 Internet (HTTP) 接收输入,对其进行解析并传递给可定制的 TCL 脚本。在模糊测试期间(在 HTTP header 中发送二进制垃圾),我注意到日志中有以下错误:
或者
这里的 XXXXX 是一个命令,返回一个由系统解析的 HTTP header 数组。抱歉混淆了真正的命令,我希望你明白我不想在供应商被告知这个问题之前公开太多细节(如果结果证明是一个问题)。
产生错误的 TCL 代码非常简单:
据我所知,HTTP 解析是在 TCL 之外完成的,解析值可以通过自定义命令(可能作为 TCL 扩展实现)供 TCL 访问。
所以我的问题是:
最佳答案
你在 comp.lang.tcl 上问过这个问题,我回答说:
它们表明解析代码中存在问题。我猜
代码假设它可以假设标题是格式良好的
Tcl 列表,您发现它完全不安全。 sanitizer 是为了
使用这样的东西:
set listOfWords [regexp -all -inline {\S+} $someString]
生成的单词集合保证是一个格式良好的
列表,用于任意输入字符串。
可能不会,除非您将该列表视为代码。
最简单的方法是在安全解释器中进行解析:
interp create -safe parsingInterp
parsingInterp eval { make the procedures }
parsingInterp eval [list doTheParse $stringToParse]
请注意,我们还保证构造的列表(例如,那些来自
list
以及除此之外的许多其他命令)都是 eval 安全的。那是:eval [list $a $b $c]
完全相同:
$a $b $c
无论在这些变量中是什么,这都是正确的。
关于validation - 这些 tcl 错误是否表明代码不安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5762993/