我正在使用 Runtime.exec() 来运行可执行文件。我一直在研究并发现在应用程序中使用它时可能存在安全问题。使用 Runtime.exec() 运行可执行文件时是否存在任何安全问题?
2 回答
@Jeanne Boyarsky:显然你不能以你提到的方式注入 Runtime.exec() ,除非 Runtime.exec() 首先生成一个 shell(Windows 上的 cmd.exe 或 Linux 上的 sh/bash/csh/ksh)来运行命令。这是一个很好的链接,它谈到了这一点。
我写了一个小程序来测试一下。它将命令作为用户输入。因此,如果我输入“ pwd ”(Linux 系统),它会将当前目录打印到系统控制台。这完美地工作。
但是,如果我尝试运行两个命令,这在 Linux 中是允许的,例如pwd;id它会立即抛出异常。抛出的异常如下。
javax.faces.el.EvaluationException:java.io.IOException:无法运行程序“pwd;ls”:错误=2,没有这样的文件或目录
话虽如此,尽管在某些情况下这可能是个问题。如果我有一段代码如下:
进程 proc = runtime.exec(cmd);
...用户可以提供sh -c pwd;id的输入,从而导致 shell 运行,然后在其中链接命令。
所以简而言之,如果你能提供帮助,最好不要使用 Runtime.exec() 。如果您必须使用它,请确保规范化所有用户输入并仅允许特定字符和命令。
这是有关如何编写安全代码的好读物。
我能想到的最大的一个是Command Injection。你想把运行的东西列入白名单,这样别人就不能通过你的 Runtime.exec 运行“rm /”。发生这种情况的方法比您想象的要多。例如,如果“目录”名称作为“foo; rm -r ; ls”传入会怎样。
另一个 - 如果这是一个 Web 应用程序 - 是应用程序的权限(因此您的 Runtime.exec() 命令行与访问网页的人所拥有的不同。这意味着该人可以删除您的Tomcat或将数据插入数据库或...