在调用 CreateProcess 时,使用未加引号的路径指定 NULL 应用程序名称¶
ID: cpp/unsafe-create-process-call
Kind: problem
Security severity: 7.8
Severity: error
Precision: medium
Tags:
- security
- external/cwe/cwe-428
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此查询表明存在对 CreateProcess*
函数族中某个函数的调用,这会引入安全漏洞。
建议¶
不要对 CreateProcess*
函数的 lpApplicationName
参数使用 NULL
。
如果对 lpApplicationName
传递 NULL
,请在 lpCommandLine
中对可执行文件路径使用引号。
示例¶
在以下示例中,CreateProcessW
被调用,其中 lpApplicationName
为 NULL
,而 lpCommandLine
代表应用程序路径的值未加引号,并且包含空格。
如果攻击者可以访问文件系统,他们可以通过创建诸如 C:\Program.exe
之类的文件来提升权限,该文件将被执行,而不是预期的应用程序。
STARTUPINFOW si;
PROCESS_INFORMATION pi;
// ...
CreateProcessW( // BUG
NULL, // lpApplicationName
(LPWSTR)L"C:\\Program Files\\MyApp", // lpCommandLine
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
// ...
要解决此问题,请为 lpApplicationName
指定有效的字符串,或为 lpCommandLine
加引号。例如
(LPWSTR)L"\"C:\\Program Files\\MyApp\"", // lpCommandLine