You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java应用HP Fortify扫描:命令注入问题修复求助

修复HP Fortify检测到的命令注入问题

这个命令注入风险的核心原因很明确:你的execReadToString方法直接接收任意字符串作为执行命令,一旦这个参数被不可信输入(比如用户可控的内容)污染,攻击者就能拼接恶意指令执行。下面给你几个针对性的修复方案,你可以根据实际业务场景选择:

方案1:硬编码固定命令(最安全,适合仅执行特定命令的场景)

如果这个方法只用来执行hostname这类固定命令,完全不需要动态传入参数,直接把命令硬编码在方法里,彻底消除注入风险:

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

调用时直接用getShortHostname()即可,命令完全由你控制,不存在被篡改的可能。

方案2:实现命令白名单(适合需要执行多个固定命令的场景)

如果这个方法需要支持多个预定义的命令,先做白名单校验,只允许执行你预先批准的命令:

// 预先定义允许执行的命令集合
private static final Set<String> ALLOWED_COMMANDS = new HashSet<>(Arrays.asList("hostname", "date", "whoami"));

public static String execReadToString(String execCommand) throws IOException {
    // 先校验命令是否在白名单内,不在则直接抛出异常
    if (!ALLOWED_COMMANDS.contains(execCommand)) {
        throw new IllegalArgumentException("不允许执行的命令:" + execCommand);
    }
    try (Scanner s = new Scanner(Runtime.getRuntime().exec(execCommand).getInputStream()).useDelimiter("\\A")) {
        return s.hasNext() ? s.next() : "";
    }
}

这样即使有人传入恶意命令,也会被直接拦截,从根源上杜绝注入。

方案3:使用exec的数组重载版本(适合需要动态参数的场景)

如果你的方法需要支持带参数的命令,绝对不要直接拼接字符串,而是用Runtime.exec(String[] cmdarray)的重载方法,把命令和参数分开传递——这样shell不会解析额外的命令:

public static String execReadToString(String command, String... args) throws IOException {
    // 构建命令数组:第一个元素是命令,后续是参数
    String[] cmdArray = new String[args.length + 1];
    cmdArray[0] = command;
    System.arraycopy(args, 0, cmdArray, 1, args.length);
    
    try (Scanner s = new Scanner(Runtime.getRuntime().exec(cmdArray).getInputStream()).useDelimiter("\\A")) {
        return s.hasNext() ? s.next() : "";
    }
}

调用示例:execReadToString("ping", "-c", "4", "localhost"),即使参数里有;、|这类特殊字符,也只会被当作参数传递,不会被解析成新的恶意命令。

核心原则提醒

Fortify标记这个风险,本质是因为方法允许不可信输入直接控制执行的命令/参数。所以修复的核心就是:绝对不要让外部输入直接决定要执行的命令或参数,要么固定命令,要么严格校验,要么拆分命令与参数。

内容的提问来源于stack exchange,提问作者Vamshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:31:43