簡體   English   中英

我們對靜態分析工具生成的用於漏洞檢測的警告有多少信任?

[英]How much can we trust to warnings generated by static analysis tools for vulnerablity detection?

我在一組用 C/C++ 編寫的庫上運行故障查找器。 我有很多由漏洞發現者生成的警告。 我的問題是,我可以在多大程度上依賴這些生成的警告? 例如,考慮 numpy 庫 ( https://github.com/numpy/numpy/blob/4ada0641ed1a50a2473f8061f4808b4b0d68eff5/numpy/f2py/src/fortranobject.c ) 中的以下函數:

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 調用,faultfinder 告訴我:

['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);']

我不確定報道是否屬實。

回答您的問題:靜態分析工具(如FlawFinder )會產生大量“誤報”。

我在 Google 上為您找到了一些可量化的信息,並找到了一篇關於“DeFP”的感興趣的文章:

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

靜態分析工具經常用於檢測軟件系統中的潛在漏洞。 然而,這些工具不可避免的問題是它們的大量警告和高誤報率,這耗費了調查的時間和精力。 在本文中,我們提出了 DEFP,一種對靜態分析警告進行排名的新方法。

基於具有相似上下文的警告往往具有相似標簽(真陽性或假陽性)的直覺,DEFP 使用兩個 BiLSTM 模型構建,以捕獲與標記警告的上下文相關的模式。 之后,對於一組新的警告,DEFP 可以根據它們成為真陽性的可能性(即實際漏洞)來計算和排名。

我們在 10 個真實項目的數據集上的實驗結果表明,使用 DEFP,只需調查 60% 的警告,開發人員就可以發現 +90% 的實際漏洞。 此外,DEFP 在精度和召回率方面都將最先進的方法提高了 30%。

顯然,作者建立了一個神經網絡來分析 FlawFinder 結果,並對它們進行排名。

我懷疑DeFP對你來說是一個實用的“解決方案”。 但是是的:如果您認為特定的“memcpy()”警告是“誤報”——那么我傾向於同意。 很可能是:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM