【问题标题】:TOCTTOU - Using access before handling fileTOCTTOU - 在处理文件之前使用访问权限
【发布时间】:2019-08-20 07:31:40
【问题描述】:

我有这个功能,将文件复制到镜像目录,然后删除旧的。它运行良好,但是在 Coverity 中,我的代码显示为 TOCTTOU 警告。

void function(){
    const char *original_key = "path/to/file/filename";
    const char *mirror_key = "path/to/another/file/filename";

    if((access(original_key, F_OK) == 0) && (access(mirror_key, F_OK) == 0)){
        copy_file("/bin/cp %s %s", original_key, mirror_key); /*copy function in another cpp file*/
        unlink(original_key);
    }
}

/* in another cpp file */
int copy_file(const char*command, ...){
    int rc = -1;
    va_list args;
    char *buffer = NULL;
    va_start(args, command);
    vasprintf(&buffer, command, args);
    va_end(args);
    if (buffer)
    {
        char *wrd;
        char *ptr = buffer;
        std::vector<const char *> list;
        while ((wrd = strsep(&ptr, " ")) != NULL)
        {
            if (strlen(wrd))
            {
                list.push_back(wrd);
            }
        }
        if (list.size() > 0)
        {
            char *argv[list.size() + 1];
            for (size_t idx = 0; idx < list.size(); idx++)
            {
                argv[idx] = (char *)list[idx];
            }
            argv[list.size()] = NULL;
            rc = system_spawn_args(argv);
        }
        free(buffer);
    }
    return(rc);
}

在这种情况下有没有办法防止TOCTTOU?

注意:移动不起作用 - 跨设备错误。

谢谢

【问题讨论】:

  • 缺少很多代码。所以,很难判断。我猜实际上“original_key”和“mirror_key”有不同的内容。此外,“访问”检查文件而不是路径。还有,你如何复制?如何打开镜像文件?我认为,缺少这些重要信息。顺便提一句。我只遇到过来自 Coverity 的极少数误报。和 QAC 或者 SonarCube 或者 Lint 相比,确实靠谱(我个人经验……)
  • 这非常依赖于应用程序。原文件不删除有多大问题?
  • @Armin Montigny - 根据您的问题添加了缺失的部分。我希望这会有所帮助
  • @user1937198 - 我需要实际删除它
  • @JezT 如果文件在传输过程中丢失,会有问题吗?如果是这样,您可以打开文件,将其删除,然后将内容复制到新位置?

标签: c++ file-handling coverity tocttou


【解决方案1】:

问题可能是使用函数访问的典型 Unix/Linux 错误。 here 描述了确切的细节,即使有一个例子。还有关于如何降低风险的建议。

由于在链接的维基百科文章中描述得非常好,这里不再赘述。

而且,由于您的示例中没有 C++ 代码,您可能需要用 C++ 重写代码。此外,您使用系统调用的“复制功能”似乎过于复杂。

请考虑重构它。因此,我还建议您阅读有关在 stackoverflow 上复制文件 here 的文章。

如果您的代码是非生产性的并且仅供家庭使用,那么您也可以忽略此消息。

【讨论】:

    【解决方案2】:

    因为我的主要功能基本上是将一个文件移动到另一个文件。我只是使用 rename() 完成了这项工作,也没有警告我作为 Coverity 中的 TOCTTOU

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2021-07-12
      • 2021-03-04
      相关资源
      最近更新 更多