3

我正在对具有嵌入式 TCL 解释器的系统进行安全测试。系统从 Internet (HTTP) 接收输入,对其进行解析并传递给可定制的 TCL 脚本。在模糊测试期间(在 HTTP 标头中发送二进制垃圾),我注意到日志中有以下错误:

TCL 错误:在执行“foreach header [XXXXX] {}”时,引号中的列表元素后跟“{}x”而不是空格

或者

TCL 错误:执行“foreach header [XXXXX] {}”时列表中的未匹配打开引号

这里的 XXXXX 是一个返回系统解析的 HTTP 标头数组的命令。很抱歉混淆了真正的命令,我希望你理解我不想在供应商被告知问题之前公开太多细节(如果它被证明是一个问题)。

产生错误的 TCL 代码非常简单:

foreach 标头 [ XXXX ] { }

据我所知,HTTP 解析是在 TCL 之外完成的,解析后的值可以通过自定义命令(可能作为 TCL 扩展实现)供 TCL 访问。

所以我的问题是:

  1. 这些错误是否表明系统存在安全问题,例如用户输入验证不足?

  2. 如果是,是否可以通过向系统发送特制请求(一种代码注入攻击)来利用此条件执行任意 TCL 语句?

  3. 是否有任何“安全 TCL 编码实践”文档?我找不到任何东西。

4

1 回答 1

7

你在comp.lang.tcl上问过这个问题,我回答说:

1) 这些错误是否表明系统存在安全问题,例如用户输入验证不足?

它们表明解析代码中存在问题。我猜代码假设它可以假设一个标题是一个格式良好的 Tcl 列表,你发现它是完全不安全的。消毒是使用这样的东西:

set listOfWords [regexp -all -inline {\S+} $someString] 

对于任意输入字符串,生成的单词集合保证是格式良好的列表。

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] 

请注意,我们还保证构造的列表(例如,那些 out of list以及许多其他命令)是 eval 安全的。那是:

eval [list $a $b $c] 

与以下内容完全相同

$a $b $c 

无论这些变量是什么,这都是真的。

于 2011-04-23T08:37:33.413 回答