用途:该技能面向 OS 命令注入(CWE-78)这一严重级别的安全反模式,帮助在编写或审查会执行 shell 命令、运行系统程序的代码时发现并修复漏洞。命令注入源于把用户输入拼接进 shell 命令字符串,攻击者可借此执行任意系统命令,导致系统被完全控制、数据外泄、植入恶意软件和横向移动。资料指出此类问题在 AI 生成的代码中较为常见。
主要能力:给出各语言的脆弱与安全写法对照。Python 中 os.system() 拼接用户输入、subprocess 使用 shell=True 属危险;安全做法是用参数数组并 shell=False,如 subprocess.run(["ping", "-c", "4", hostname], check=True, shell=False)。Node.js 中 child_process.exec() 拼接模板字符串危险,应改用 execFile 传参数数组。Java 中 Runtime.getRuntime().exec() 拼接字符串危险,应改用 ProcessBuilder 参数数组。PHP 中 exec()、system()、shell_exec()、passthru() 拼接用户输入危险。
检测方式:Python 关注 os.system()、shell=True、字符串拼接与 f-string;Node.js 关注 child_process.exec()、模板字面量与拼接;Java 关注 Runtime.exec() 单字符串参数;PHP 关注上述执行函数与拼接。可用 grep 模式 shell=True|exec(|system(|child_process.exec 辅助排查,并检查命令构造中是否含用户输入变量。
防护要点:使用参数数组而非 shell 字符串;不要对用户可控输入使用 shell=True;对输入做严格白名单校验(如主机名匹配 ^[a-zA-Z0-9.-]+$);尽量用语言自带库替代外部 shell 命令;对执行进程应用最小权限原则。
测试与修复:手工测试可注入 ;、|、&、$()、`、&&、|| 等元字符及 ; ls、| whoami 等载荷,确认元字符被当作字面量。自动化可用 Semgrep、Bandit、ESLint 安全插件、SpotBugs 做静态分析,用 Burp Suite、OWASP ZAP 做动态测试。修复步骤为:定位脆弱代码、评估能否完全避免 shell、改用安全 API、转为参数数组、移除 shell=True、加入输入校验、验证修复、排查同类代码。
适用场景与限制:适用于代码生成、代码审查和安全测试环节。资料未提供该技能的安装命令、收费方式或平台支持信息,暂未提供。