主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 21.21

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

自 R2021a 起

描述

规则定义

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-family 函数不受命令注入攻击的影响。

检查信息

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

版本历史记录

在 R2021a 中推出


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.