首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于由用于漏洞检测的静态分析工具生成的警告,我们可以信任多少?

对于由用于漏洞检测的静态分析工具生成的警告,我们可以信任多少?
EN

Stack Overflow用户
提问于 2022-07-23 23:51:41
回答 1查看 49关注 0票数 1

我正在用C/C++编写的一组库上运行完美查找程序。我有很多由完美查找者生成的警告。我的问题是,我在多大程度上可以依赖这些生成的警告?例如,考虑numpy库(https://github.com/numpy/numpy/blob/4ada0641ed1a50a2473f8061f4808b4b0d68eff5/numpy/f2py/src/fortranobject.c)中的以下函数:

代码语言:javascript
复制
static PyObject *
fortran_doc(FortranDataDef def)
{
    char *buf, *p;
    PyObject *s = NULL;
    Py_ssize_t n, origsize, size = 100;

    if (def.doc != NULL) {
        size += strlen(def.doc);
    }
    origsize = size;
    buf = p = (char *)PyMem_Malloc(size);
    if (buf == NULL) {
        return PyErr_NoMemory();
    }

    if (def.rank == -1) {
        if (def.doc) {
            n = strlen(def.doc);
            if (n > size) {
                goto fail;
            }
            memcpy(p, def.doc, n);
            p += n;
            size -= n;
        }
        else {
            n = PyOS_snprintf(p, size, "%s - no docs available", def.name);
            if (n < 0 || n >= size) {
                goto fail;
            }
            p += n;
            size -= n;
        }
    }
    else {
        PyArray_Descr *d = PyArray_DescrFromType(def.type);
        n = PyOS_snprintf(p, size, "'%c'-", d->type);
        Py_DECREF(d);
        if (n < 0 || n >= size) {
            goto fail;
        }
        p += n;
        size -= n;

        if (def.data == NULL) {
            n = format_def(p, size, def) == -1;
            if (n < 0) {
                goto fail;
            }
            p += n;
            size -= n;
        }
        else if (def.rank > 0) {
            n = format_def(p, size, def);
            if (n < 0) {
                goto fail;
            }
            p += n;
            size -= n;
        }
        else {
            n = strlen("scalar");
            if (size < n) {
                goto fail;
            }
            memcpy(p, "scalar", n);
            p += n;
            size -= n;
        }
    }
    if (size <= 1) {
        goto fail;
    }
    *p++ = '\n';
    size--;

    /* p now points one beyond the last character of the string in buf */
#if PY_VERSION_HEX >= 0x03000000
    s = PyUnicode_FromStringAndSize(buf, p - buf);
#else
    s = PyString_FromStringAndSize(buf, p - buf);
#endif

    PyMem_Free(buf);
    return s;

 fail:
    fprintf(stderr, "fortranobject.c: fortran_doc: len(p)=%zd>%zd=size:"
                    " too long docstring required, increase size\n",
            p - buf, origsize);
    PyMem_Free(buf);
    return NULL;
}

这里有两个memcpy() API调用,完美查找器告诉我:

代码语言:javascript
复制
['vul_fortranobject.c:216: [2] (buffer) memcpy:\\n Does not check for buffer overflows when copying to destination (CWE-120).\\n Make sure destination can always hold the source data.\\n memcpy(p, "scalar", n);']

我不知道这份报告是否属实。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-24 00:08:53

要回答您的问题:静态分析工具(如FlawFinder)可以生成许多“假阳性”。

我在谷歌上搜索了一些可量化的信息,并找到了一篇关于“DeFP”的有趣文章:

https://arxiv.org/pdf/2110.03296.pdf

静态分析工具经常用于检测软件系统中的潜在漏洞。然而,这些工具的一个不可避免的问题是其大量的警告和高的假阳性率,这需要花费时间和精力进行调查。本文提出了一种新的静态分析警告排序方法-- DeFP。

基于具有相似上下文的警告往往具有相似的标签(真正或假阳性)的直觉,DeFP构建了两个BiLSTM模型来捕获与标记警告的上下文相关的模式。在此之后,对于一组新的警告,DeFP可以根据它们成为真正的积极因素(即实际漏洞)的可能性对它们进行计算和排序。

我们在10个现实世界项目的数据集上的实验结果表明,使用DeFP,只要对60%的警告进行调查,开发人员就可以发现+90%的实际漏洞。此外,DeFP提高了最先进的方法,无论是精确性还是召回率都达到了30% .

显然,作者建立了一个神经网络来分析FlawFinder结果,并对其进行排序。

我怀疑DeFP对你来说是一个实用的“解决方案”。但是是的:如果你认为特定的"memcpy()“警告是”假阳性“,那么我倾向于同意。很有可能是:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73094915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档