主要内容

MISRA C:2023 Rule 21.21

The Standard Library function system of <stdlib.h> shall not be used

自 R2024a 起

描述

规则定义

The Standard Library function system of <stdlib.h> shall not be used 1 .

此规则来自 MISRA C™:2012 Amendment 2。

理由

如果 system 函数的参量没有经过安全处理,可能会导致可被利用的漏洞。攻击者可能会执行任意命令,或在系统的任何位置读取和修改数据。

Polyspace 实现

检查项会标记对标准库函数 system 的使用。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

enum { 
SIZE512=512,
SIZE3=3};

void func_noncompliant(char *arg)
{
    char buf[SIZE512];
    int retval=sprintf(buf, "/usr/bin/any_cmd %s", arg);

    if (retval<=0 || retval>SIZE512){
      /* Handle error */
      abort();
    }
    /* Use of system() to pass any_cmd with 
    unsanitized argument to command processor */

    if (system(buf) == -1) { //Noncompliant
    /* Handle error */
  }
} 

void func_compliant(char *arg)
{
    char *const args[SIZE3] = {"any_cmd", arg, NULL};
    char  *const env[] = {NULL}; 
  
    /* Sanitize argument */
  
    /* Use execve() to execute any_cmd. */

    if (execve("/usr/bin/time", args, env) == -1) { //Compliant
      /* Handle error */
    }
} 

在此示例中,在 func_noncompliant 函数中,system 函数将其参量传递给主机环境,供命令处理器执行。这段代码容易受到命令注入攻击。

在同一函数的合规版本 func_compliant 中,any_cmd 的参量经过安全处理后,再传递给 execve 函数进行执行。exec 系列函数不易遭受命令注入攻击。

检查信息

组:标准库
类别:必需
AGC 类别:必需

版本历史记录

在 R2024a 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.