5

我想使用org.apache.commons.execJava 库来调用可执行文件。该CommandLine对象是否可以防止命令行注入?例如,如果我打电话:

String singleStringArgument = "-whatever;rm -rf ~/*"; // evil looking argument!
CommandLine cl = new CommandLine(new File(pathToExe,exeName)); 

cl.addArgument(singleStringArgument);  // oh no!

Executor exe = new DefaultExecutor();
exe.execute(cl);

rm -rf ~/*除了预期的命令之外还会运行吗?如果是这样,防止这种情况的最佳方法是什么?

API 说addArgument()“处理引用”,但我不确定在这种情况下这意味着什么。我可以创建一个测试用例来看看我的 linux 机器上会发生什么,但我想确保它在其他平台上也是安全的。

4

3 回答 3

4

;是外壳的一个特点。如果你不创建一个命令行sh -c或类似的东西,你就不能被注入。并不是说公地是安全的,而是您甚至没有运行具有漏洞的程序。

Commons CLI 正在包装 Process 类。没有记录 Process 类来启动 shell。它记录了exec使用您告诉它的指定参数来执行操作。

根据评论,开源的奇迹之一是您可以阅读源代码。如果 commons-CLI X 版本做你喜欢的事,请依赖它,不要在没有重新检查的情况下升级。

于 2011-06-14T00:41:31.840 回答
1

所以你控制命令(pathToExe)并且只担心参数?你对命令的了解程度如何?它有没有可能执行另一个程序?即使不调用辅助命令,它是否有可能做一些破坏性的事情?该程序是否有任何其他漏洞(缓冲区溢出等)?

作为一般性答案,这种方法对我来说似乎很可疑,特别是如果您希望它跨平台工作。如果您知道要执行的命令并且可以限制输入,那么您可能会勉强通过,但我个人不会使用这种方法,除非有非常好的理由这样做。

于 2011-06-14T01:00:36.223 回答
0

我的建议是尽可能让程序在安全方面犯错,并且只发出命令本身,而不是愚蠢地执行命令片段或传递最终用户发出的参数。注射有很多变化。;是一个已经讨论过的。您还可以使用反引号(rm -rf ~/*包含在反引号中使 shell 首先解释它)用户还可以意外或有意调用别名。可能出错的事情的清单是无穷无尽的。

于 2011-06-14T04:16:45.237 回答