SV.USAGERULES.PROCESS_VARIANTS

进程中的权限提升风险

该检查器仅报告 Windows 平台上的问题。

某些进程创建系统调用会为本地权限提升带来风险。这些调用容易遭受攻击,此类攻击会通过主机进程权限来允许执行恶意代码。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]);
        }
    }
  }

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。