我正在尝试对我的 java 应用程序进行 hp fortify 安全扫描。我有几个问题,我已经解决了。但我无法找到以下问题的解决方案。
命令注入
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() 调用可能允许攻击者注入恶意命令。
此问题的理想解决方案是什么?
提前致谢
通常这是因为您使用用户输入来构建命令字符串,其中用户可以注入恶意代码来操纵最终运行的命令(即使您添加验证,也会有方法绕过它)。
在您的情况下,您似乎对命令进行了硬编码,因此这应该不是问题,但是,请参阅 OWASP 页面上的 硬编码命令调用(重点是我的):
与前面的示例不同,本示例中的命令是 硬编码,因此攻击者无法控制传递给的参数 系统()。但是由于程序没有指定绝对路径 对于 make,并且不会在之前清除任何环境变量 调用该命令,攻击者可以将其 $PATH 变量修改为 指向名为 make 的恶意二进制文件并执行其中的 CGI 脚本 shell 提示符。并且由于程序已经安装setuid root, 攻击者的 make 版本现在以 root 权限运行。
环境对系统的执行起着强大的作用 程序内的命令。 像 system() 和 exec() 这样的函数使用 调用它们的程序的环境,因此攻击者 有潜在机会影响这些调用的行为。
分辨率:
hostname
(假设您使用内置命令),这通常是 /usr/bin/hostname
,但您可以使用 which hostname
找到适合您环境的命令路径。