我正在对具有嵌入式TCL解释器的系统进行安全测试。系统从Internet接收输入(HTTP),解析它并传递给可自定义的TCL脚本。在模糊测试(在HTTP头中发送二进制垃圾)期间,我注意到日志中存在以下错误:
TCL错误:在执行“foreach header [XXXXX] {}”
时,在引号中列出元素,后跟“{} x”而不是空格
或
TCL错误:执行“foreach header [XXXXX] {}”时列表中的不匹配开放引号
此处XXXXX是一个返回HTTP标头数组的命令,由系统解析。很抱歉混淆了真正的命令,我希望你理解我不想在供应商被告知这个问题之前公开过多的细节(如果结果是一个问题)。
产生错误的TCL代码非常简单:
foreach标题[XXXXX] {}
据我所知,HTTP解析是在TCL之外完成的,解析后的值可以通过自定义命令(可能实现为TCL扩展)访问TCL。
所以我的问题是:
这些错误是系统安全问题的迹象,例如用户输入验证不足吗?
如果是,可以通过发送系统特制请求(一种code injection attack?
是否有“安全TCL编码实践”文档?我找不到任何。
答案 0 :(得分:7)
你在我comp.lang.tcl回复的地方问了这个问题:
1)这些错误是否存在安全问题的迹象 系统,如用户输入验证不足?
它们表示解析代码中存在问题。我猜是的 代码假设它可以假设标头是格式良好的 Tcl列表,您发现它完全不安全。消毒是为了 使用这样的东西:
set listOfWords [regexp -all -inline {\S+} $someString]
由此产生的单词集合保证是一个格式良好的 list,用于任意输入字符串。
2)如果是,可以利用这个条件来执行任意TCL 语句通过发送系统特制的请求,一种 http://en.wikipedia.org/wiki/Code_injection攻击?
可能不会,除非您将该列表视为代码。
3)是否有“安全TCL编码实践”文件?任何其他 有关如何安全处理不受信任数据的信息来源?
最简单的方法是在安全解释器中进行解析:
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
这些变量无论如何都是如此。