强化问题 - 命令注入

问题描述 投票:0回答:1

我正在尝试对我的 java 应用程序进行 hp fortify 安全扫描。我有几个问题,我已经解决了。但我无法找到以下问题的解决方案。

  1. 命令注入

    String hostname = execReadToString("hostname").split("\\.")[0];
    public static String execReadToString(String execCommand) throws IOException {
     try (Scanner s = new Scanner(Runtime.getRuntime().exec(execCommand).getInputStream()).useDelimiter("\\A")) {
        return s.hasNext() ? s.next() : "";
    }
    

    方法 execReadToString() 调用 exec() 来执行命令。此调用可能允许攻击者注入恶意命令。

所以我也尝试过流程构建器。

private static void gethostname(String cmd1) throws IOException {
        if(Pattern.matches("[A-Za-z]+", cmd1)) {
        ProcessBuilder pb = new ProcessBuilder(cmd1);
        Process p = pb.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));
            String readline;
            while ((readline = reader.readLine()) != null) {
                System.out.println(readline);
            }
        }
    }

即使这给我带来了安全问题此 start() 调用可能允许攻击者注入恶意命令。

此问题的理想解决方案是什么?

提前致谢

java command code-injection processbuilder fortify
1个回答
0
投票

通常这是因为您使用用户输入来构建命令字符串,其中用户可以注入恶意代码来操纵最终运行的命令(即使您添加验证,也会有方法绕过它)。

在您的情况下,您似乎对命令进行了硬编码,因此这应该不是问题,但是,请参阅 OWASP 页面上的 硬编码命令调用(重点是我的):

与前面的示例不同,本示例中的命令是 硬编码,因此攻击者无法控制传递给的参数 系统()。但是由于程序没有指定绝对路径 对于 make,并且不会在之前清除任何环境变量 调用该命令,攻击者可以将其 $PATH 变量修改为 指向名为 make 的恶意二进制文件并执行其中的 CGI 脚本 shell 提示符。并且由于程序已经安装setuid root, 攻击者的 make 版本现在以 root 权限运行。

环境对系统的执行起着强大的作用 程序内的命令。 像 system() 和 exec() 这样的函数使用 调用它们的程序的环境,因此攻击者 有潜在机会影响这些调用的行为

分辨率:

  1. 使用本机 Java API/库来实现您想要的,而不是运行命令 - 这可能是最好的选择。仅在不可避免时才使用命令,例如:没有 Java 客户端库的第三方工具。这种方法的另一个优点是更便携,并且在大多数情况下也更高效。 这个库可能会对您的场景有所帮助。
  2. 如果您必须运行命令,请确保您不使用用户提供的数据或外部数据(即使是间接的)来构造它。
  3. 或者,如果您对命令进行硬编码以从代码运行,请使用命令的绝对路径,并且不要使用环境变量作为其中的一部分。对于
    hostname
    (假设您使用内置命令),这通常是
    /usr/bin/hostname
    ,但您可以使用
    which hostname
    找到适合您环境的命令路径。
© www.soinside.com 2019 - 2024. All rights reserved.