我正在使用Runtime.exec()运行一个可执行文件。我一直在研究,发现在应用程序中使用它时可能会有安全问题。在使用Runtime.exec()运行可执行文件时,是否存在任何安全问题?
发布于 2012-06-30 04:10:12
我能想到的最大的一个是Command Injection。YOu希望将要运行的内容列入白名单,这样别人就不能通过您的Runtime.exec运行"rm /“。实现这一点的方法比你想象的要多得多。例如,如果“目录”名称作为"foo;rm -r;ls“传入,会发生什么情况?
另一个问题-如果这是一个web应用程序-是应用程序的权限(因此您的Runtime.exec()命令行与点击web页面的人所拥有的权限不同)。这意味着这个人可以删除你的Tomcat或者在数据库中插入数据,或者...
发布于 2014-01-25 01:58:34
@Jeanne Boyarsky:显然,您不能以您提到的方式注入Runtime.exec(),除非Runtime.exec()首先生成一个外壳(在Windows上是cmd.exe,或者在Linux上是sh/bash/csh/ksh )来运行命令。关于这一点,Here是一个很好的链接。
我写了一个小程序来测试它。它接受一个命令作为用户输入。因此,如果我输入‘Linux pwd’(Linux系统),它会将当前目录打印到系统控制台。这个可以完美地工作。
但是,如果我尝试运行两个命令,例如pwd;id,它会立即抛出一个异常。抛出的异常如下。
javax.faces.el.EvaluationException: java.io.IOException:无法运行程序"pwd;ls":error=2,没有这样的文件或目录
话虽如此,但在某些情况下,这可能是一个问题。如果我有一段代码如下所示:
进程proc =runtime.exec(命令);
..。用户可以提供sh -c pwd;id的输入,从而导致外壳运行,然后在其中链接命令。
因此,简而言之,如果可以的话,最好不要使用Runtime.exec()。如果您必须使用它,请确保规范化所有用户输入,并且只允许特定的字符和命令。
Here是关于如何编写安全代码的很好的读物。
https://stackoverflow.com/questions/11268189
复制相似问题