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



或者



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

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



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

所以我的问题是:

  • 这些错误是否表明系统存在安全问题,例如用户输入验证不足?
  • 如果是,是否可以通过发送系统特制的请求,一种 code injection attack 来利用该条件执行任意 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/

    10-13 07:06