【发布时间】:2012-07-01 08:42:52
【问题描述】:
我正在使用 Runtime.exec() 来运行一个可执行文件。我一直在研究并发现在应用程序中使用它时可能存在安全问题。使用 Runtime.exec() 运行可执行文件时是否存在任何安全问题?
【问题讨论】:
-
该区域“棘手”。我强烈建议不要将任何不受信任的数据放在命令行上,即使您已尝试“清理”它。
-
支持安全意识。做得很好。
标签: java
我正在使用 Runtime.exec() 来运行一个可执行文件。我一直在研究并发现在应用程序中使用它时可能存在安全问题。使用 Runtime.exec() 运行可执行文件时是否存在任何安全问题?
【问题讨论】:
标签: java
我能想到的最大的是Command Injection。您想将运行的内容列入白名单,这样某人就无法通过您的 Runtime.exec 运行“rm /”。发生这种情况的方法比您想象的要多。例如,如果“目录”名称作为“foo; rm -r ; ls”传入会怎样。
另一个问题 - 如果这是一个 Web 应用程序 - 是应用程序的权限(因此您的 Runtime.exec() 命令行与访问网页的人所拥有的权限不同。这意味着该人可以删除您的 Tomcat 或将数据插入数据库或...
【讨论】:
java.io.File 对象并检查file.exists() 作为您的清理检查的一部分。
@Jeanne Boyarsky:显然你不能以你提到的方式注入 Runtime.exec(),除非 Runtime.exec() 首先产生一个 shell(Windows 上的 cmd.exe 或 Linux 上的 sh/bash/csh/ksh)运行命令。 Here 是一个很好的链接,可以讨论这个问题。
我写了一个小程序来测试一下。它将命令作为用户输入。因此,如果我输入 'pwd'(Linux 系统),它会将当前目录打印到系统控制台。这非常有效。
但是,如果我尝试运行两个命令,这在 Linux 中是允许的,例如 pwd;id,它会立即抛出异常。抛出的异常如下。
javax.faces.el.EvaluationException: java.io.IOException: Cannot run program "pwd;ls": error=2, No such file or directory
话虽如此,但在某些情况下这可能是个问题。如果我有一段代码如下:
进程 proc = runtime.exec(cmd);
...用户可以提供 sh -c pwd;id 的输入,从而导致 shell 运行,然后在其中链接命令。
简而言之,如果您能提供帮助,最好不要使用 Runtime.exec()。如果您必须使用它,请确保规范化所有用户输入并仅允许特定字符和命令。
Here 是一本关于如何编写安全代码的好书。
【讨论】: