【问题标题】:OS Command Injection Security Threat操作系统命令注入安全威胁
【发布时间】:2014-10-15 09:34:28
【问题描述】:

我们通过使用以下代码来使用命令注入概念,

Runtime.getRuntime().exec(cmd);

但系统将此识别为安全威胁,因此有人可以建议任何其他方式或任何第三方 API 可用于执行此命令注入。任何帮助将不胜感激。

【问题讨论】:

  • 一旦您执行系统命令,威胁就在这里。无论您使用什么 API
  • 我在 Owasp wiki 中读到命令注入始终是一种安全威胁。参考见Command injection in Java
  • 这个问题可能过于宽泛而无法回答,因为给出的上下文太少了。
  • 那么,有没有其他方法可以解决这个问题?
  • 我强烈建议避免在命令行中放置不受信任的输入。或者至少 Base64 对其进行编码。对运行第三方二进制文件没有帮助。 / 另请注意,Java exec API 是松散指定的。

标签: java security runtime.exec


【解决方案1】:

我认为你应该使用 ProcessBuilder,这个类用于创建操作系统进程,因为开发人员应该避免使用 Runtime.exec 调用 shell 来调用操作系统特定的命令,而应该使用 Java API。

每个 ProcessBuilder 实例管理一个流程属性的集合。 start() 方法使用这些属性创建一个新的 Process 实例。可以从同一个实例重复调用 start() 方法来创建具有相同或相关属性的新子流程。

启动一个使用默认工作目录和环境的新进程很容易:

 Process p = new ProcessBuilder("myCommand", "myArg").start();

这是一个使用修改的工作目录和环境启动进程的示例,并将标准输出和错误重定向到附加到日志文件:

 ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 File log = new File("log");
 pb.redirectErrorStream(true);
 pb.redirectOutput(Redirect.appendTo(log));
 Process p = pb.start();
 assert pb.redirectInput() == Redirect.PIPE;
 assert pb.redirectOutput().file() == log;
 assert p.getInputStream().read() == -1;

请记住,它从 java 5 开始受支持,并且 Class 不同步。

检查链接--

Source Doc

Code Samples

【讨论】:

  • 即使使用 ProcessBuilder 也无济于事。 Veracode 仍将其标记为非常高的安全风险。
【解决方案2】:

你可以使用ProcessBuilder

有关减少威胁的更多详细信息,请参阅here 提供的指南。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2021-01-31
    相关资源
    最近更新 更多