使用字符串连接构建命令行¶
ID: java/concatenated-command-line
Kind: problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-078
- external/cwe/cwe-088
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
通过连接用户输入的字符串构建命令行的代码允许用户执行恶意代码。
建议¶
使用字符串数组而不是单个字符串执行外部命令。通过使用数组,可以避免字符串格式化中的许多可能的漏洞。
示例¶
在以下示例中,latlonCoords
包含一个由用户输入但未经程序验证的字符串。这允许用户例如在字符串末尾附加一个和号 (&),然后附加恶意程序的命令。和号指示 Windows 执行另一个程序。在标记为“BAD”的块中,latlonCoords
作为串联字符串的一部分传递给 exec
,这允许执行多个命令。然而,在标记为“GOOD”的块中,latlonCoords
作为数组的一部分传递,这意味着 exec
仅将其视为一个参数。
class Test {
public static void main(String[] args) {
// BAD: user input might include special characters such as ampersands
{
String latlonCoords = args[1];
Runtime rt = Runtime.getRuntime();
Process exec = rt.exec("cmd.exe /C latlon2utm.exe " + latlonCoords);
}
// GOOD: use an array of arguments instead of executing a string
{
String latlonCoords = args[1];
Runtime rt = Runtime.getRuntime();
Process exec = rt.exec(new String[] {
"c:\\path\to\latlon2utm.exe",
latlonCoords });
}
}
}
参考文献¶
OWASP:命令注入。
SEI CERT Oracle Java 编码标准:IDS07-J. 清理传递给 Runtime.exec() 方法的不受信任数据。
常见弱点枚举:CWE-78。
常见弱点枚举:CWE-88。