【问题标题】:Tainted string in CC中被污染的字符串
【发布时间】:2014-03-09 08:32:00
【问题描述】:

我在文件操作函数中运行 Coverity 工具,出现以下错误。

正如您在下面看到的,在将有问题的变量传递给错误消息中显示的行号之前,我使用了 snprintf()。我想必须对字符串进行一些清理,作为 snprintf() 的一部分。但仍然显示警告。

Error:TAINTED_STRING (TAINTED string "fn" was passed to a tainted string sink content.) [coverity]

char fn[100]; int id = 0;
char* id_str = getenv("ID");
if (id_str) {
    id = atoi(id_str);
}
memset(fn, '\0', sizeof(fn));
snprintf(fn, 100, LOG_FILE, id);
if(fn[100-1] != '\0') {
     fn[100-1] = '\0';
}
log_fp = fopen (fn, "a");

任何帮助将不胜感激。

【问题讨论】:

  • LOG_FILE 设置为什么?
  • 它的“/log/test%d.log”
  • LOG_FILE 中没有 %d。为什么要将id 传递给snprintf()
  • 对不起。我已经编辑了上面的回复。
  • 没有行号。哪条线?

标签: c string coverity


【解决方案1】:

Coverity 希望确保您清理来自程序外部的任何字符串,无论是 getenv、argv 还是读取的某个文件。

您可能有一个功能来清理输入(污染的字符串),并有一个由 Coverty 提供的注释,告诉 Coverty 输入字符串已被清理并且 SA 警告将消失。

// coverity[ +tainted_string_sanitize_content : arg-0 ]
int sanitize_mystring(char* s) 
{
    // Do some string validation
    if validated()
        return SUCCESS;
    else
        return FAILED;
}

// Coverity[ +tainted_string_sanitize_content : arg-0 ] 是 Coverty 正在寻找的行

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    Error:TAINTED_STRING 警告说(据 Coverity 所知)行为的某些方面受到某些外部输入的影响,并且在影响执行之前不会检查外部输入的“安全性”。

    在这个特定示例中,Coverity 似乎是错误的,因为 LOG_FILE 的值是“/log/test%d.log”,并且在snprintf 中与int 一起使用,这意味着@ 的内容987654324@ 总是很好定义的。

    因此,合理的做法是将错误标记为非问题,以便在以后的运行中将其忽略。

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      char* id_str = getenv("ID");
      if (id_str) {
         id_str = strdup(id_str);
         id = atoi(id_str);
         free( id_str );
      }
      

      传递给 fopen 的 fn 字符串被环境变量污染。使用 strdup 可能会起到“消毒”的作用。

      【讨论】:

      • 给定的答案引入了一个错误:如果 getenv("ID") 返回 NULL 则 strdup 的行为是未定义的,据我从手册页可以看出。 (并在实践中为我崩溃)
      • @manuell 它解决了我的观点,但是我最好避免完全使用 C 函数来支持 C++ std::string 等......但最初的问题似乎是 C 所以......更容易用 C++ 编写 Coverity-clean 代码而不是 C IMO
      • 我猜另一点是“充当消毒”,而不是实际解决 TAINTED_STRING 错误。例如,如果此代码以提升的权限运行,它可能会导致系统文件被打开和写入。
      • @SimonD 文件名是用 LOG_FILE 字符串和“污染”整数构建的。我看不到您如何打开系统文件。你将如何解决这个问题(在 C 中)?
      • 啊,是的。我现在在评论中看到 LOG_FILE 的值是“/log/test%d.log”,并且在 printf 中与 int 一起使用 - 之前并没有真正正确地阅读问题并且说得太笼统了。
      猜你喜欢
      • 1970-01-01
      • 2021-03-16
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2013-02-07
      • 2012-01-08
      相关资源
      最近更新 更多