不受控制的命令行¶
ID: java/command-line-injection
Kind: path-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
将用户输入直接传递给 Runtime.exec
或其他执行命令的库例程的代码,允许用户执行恶意代码。
建议¶
如果可能,使用硬编码字符串文字来指定要运行的命令或要加载的库。不要将用户输入直接传递给进程或库函数,而是检查用户输入,然后从硬编码字符串文字中选择。
如果在编译时无法确定适用的库或命令,则添加代码以验证用户输入字符串在使用之前是否安全。
示例¶
以下示例显示了接受可以被用户恶意更改的 shell 脚本并将其直接传递给 Runtime.exec
而不先检查的代码。
class Test {
public static void main(String[] args) {
String script = System.getenv("SCRIPTNAME");
if (script != null) {
// BAD: The script to be executed is controlled by the user.
Runtime.getRuntime().exec(script);
}
}
}
参考¶
OWASP: 命令注入.
SEI CERT Oracle Java 编码标准: IDS07-J. 对传递给 Runtime.exec() 方法的不可信数据进行清理.
常见漏洞枚举: CWE-78.
常见漏洞枚举: CWE-88.