【问题标题】:How to avoid code injection in Jenkins shell calls?如何避免 Jenkins shell 调用中的代码注入?
【发布时间】:2022-08-14 02:28:27
【问题描述】:

考虑以下代码:

String malicious_input = \'\"\"; rm -rf / #yikes\'
sh \"echo Hello ${malicious_input}!\"

然后生成的 shell 脚本是

echo Hello \"\"; rm -rf / #yikes!

简单、经典的代码注入。没有什么闻所未闻的。我一直在努力寻找的是一种妥善处理此案的方法。解决此问题的第一种方法是:

  • 只需在 shell 调用中的字符串周围添加单引号,例如 sh \"echo Hello \'${malicious_input}\'!\"。是的,但不,我只需要切换到malicious_input = \"\'; rm -rf / #yikes\" 来规避它。
  • 那就加双引号吧!仍然没有,这些不仅很容易规避,而且甚至容易发生路径通配/扩展。
  • 然后在调用 Groovy 字符串插值之前在输入字符串周围添加引号。同样的,shell 命令行没有改变。
  • 然后,添加单引号,但在字符串中的每个单引号前加上反斜杠,以防止 shell 将其解释为元字符。是的,如果我也用第二个反斜杠转义每个现有的反斜杠,这种方法就可以了。尽管如此,如何防止这种扩展的细节仍然取决于外壳(POSIX-ish,Windows bat,不确定 powershell)。此外,每个参数都需要三行代码。另外,如果没有明确的 shebang 行,我什至无法确定使用了哪个 shell。

所以,我的问题是:为我执行此操作的内置函数在哪里?我很难相信这不存在,但我找不到它。另外,让我很困惑的是我是第一个遇到这个问题的人......

    标签: shell groovy code-injection jenkins-groovy


    【解决方案1】:

    你所描述的被称为参数注入引用为CWE-88,它是命令注入引用为CWE-77

    这些 CWE 中描述的一些潜在缓解措施是:

    • 如果可能,请使用库调用而不是外部进程来重新创建所需的功能。
    • (参数化)尽可能避免构建包含命令及其参数的单个字符串。
    • (输入验证)假设所有输入都是恶意的。使用“接受已知良好”的输入验证策略,即使用严格符合规范的可接受输入列表。拒绝任何不严格符合规范的输入,或将其转换为符合规范的输入。

    转义单引号也是How to prevent command injection through command options? 中讨论的一种选择

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多