SV.USAGERULES.PROCESS_VARIANTS
进程中的权限提升风险
某些进程创建系统调用会为本地权限提升带来风险。这些调用容易遭受攻击,此类攻击会通过主机进程权限来允许执行恶意代码。SV.USAGERULES.PROCESS_VARIANTS 检查器标记出以下系统调用:
- CreateProcess
- CreateProcessAsUser
- CreateProcessWithLogon
- ShellExecute
- ShellExecuteEx
- WinExec
- system
- _wsystem
- _*exec*
- _*spawn*
漏洞与风险
如果在调用进程创建 API 之前,进程创建系统调用不包含 .exe 可执行文件的完整路径,则它可能带来攻击风险。搜索路径漏洞可能允许本地用户通过使用恶意 .exe 文件来获得权限。
缓解与预防
要防止这种风险,请使用 fork(而非 vfork)、execve 以及管道来完全控制进程的执行。
漏洞代码示例 1
在此示例中,Klocwork 标记出在第 4 行中使用了函数 execlp。该系统调用可能造成通过恶意 .exe 文件实现本地权限提升的风险。
复制
#include <process.h>
void foo() {
_execlp("li", "li", "-al", 0);
_wexeclp((wchar_t *)"li", (wchar_t *)"li", (wchar_t *)"-al", 0);
}
修正代码示例 1
在经修复的代码中,函数 execlp 被替换为 execve,它将控制进程执行,消除权限提升的可能性。
复制
#include <process.h>
void foo() {
execve("li", "li", "-al", 0);
}
漏洞代码示例 2
在此示例中,Klocwork 在第 13 行报告 SV.USAGERULES.PROCESS_VARIANTS 错误。系统函数调用命令由主机环境 shell 在不进行任何检查的情况下执行,会产生本地权限升级的风险。
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
int fd;
if ((fd = open(argv[1], 0)) == -1) {
error("can't open %s", argv[1]);
return -1;
}
if (argc == 2) {/* execute command */
if (system("/bin/sh/", "sh", "-c", argv[1], (char*) 0)) { /* SV.USAGERULES.PROCESS_VARIANTS reported here */
/* some code */
} else {
error("can't execute %s", argv[1]);
}
}
}
修正代码示例 2
在经修复的示例中,系统函数 execlp 再次被替换为 execve,它将控制进程执行,消除权限提升的可能性。
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
int fd;
if ((fd = open(argv[1], 0)) == -1) {
error("can't open %s", argv[1]);
return -1;
}
if (argc == 2) {/* execute command */
if (execve ("/bin/sh/", "sh", "-c", argv[1], (char*) 0)) { * / SV.USAGERULES.PROCESS_VARIANTS not reported */
/* some code */
} else {
error("can't execute %s", argv[1]);
}
}
}