簡體   English   中英

這段代碼容易受到緩沖區溢出的影響

[英]Is this code vulnerable to buffer overflow?

Fortify在下面的代碼中報告了一個緩沖區溢出漏洞,理由如下:

在這種情況下,我們主要關注案例“取決於在代碼的直接范圍之外強制執行的數據的屬性”。 ,因為我們無法驗證abc.cpp中memcpy()執行的操作的安全性

void create_dir(const char *sys_tmp_dir,  const char *base_name,
                size_t     base_name_len)
{
    char        *tmp_dir;
    size_t      sys_tmp_dir_len;

    sys_tmp_dir_len = strlen(sys_tmp_dir);

   tmp_dir = (char*) malloc(sys_tmp_dir_len + 1 + base_name_len + 1);
   if(NULL == tmp_dir) 
     return;

memcpy(tmp_dir, sys_tmp_dir, sys_tmp_dir_len);
tmp_dir[sys_tmp_dir_len] = FN_LIBCHAR;
memcpy(tmp_dir + sys_tmp_dir_len + 1, base_name, base_name_len);
tmp_dir[sys_tmp_dir_len + base_name_len + 1] = '\0';
..........
..........

}

在我看來這是一個誤報,因為我們首先得到數據的大小,分配大量的空間,然后調用memcpy大小來復制。 但我正在尋找有充分理由說服其他開發人員擺脫當前的實現,而不是使用c ++字符串。 這個問題已經分配給他了。 他只是認為這是一個誤報,所以不想改變任何東西。

編輯我看到對當前代碼的快速,有效的批評。 希望我現在能夠說服他。 否則,我會拿着接力棒。 :)

看看strlen() ,它有輸入字符串,但它沒有上限,然后它會繼續搜索,直到它找到\\0 這是一個漏洞,因為您將執行memcpy()信任其結果(如果由於搜索時的訪問沖突而不會崩潰)。 想像:

create_dir((const char*)12345, baseDir, strlen(baseDir));

你標記了C和C ++ ......如果你使用的是C ++,那么std::string保護你免受這些問題的困擾。

在我看來,這是誤報,因為我們首先獲得數據的大小,分配了大量的空間

該假設是與警告/錯誤匹配的問題。 在您的代碼中,您假設 malloc成功分配了請求的內存。 如果您的系統沒有備用內存, malloc將失敗並返回NULL 當你嘗試memcpy進入tmp_dir ,你將復制到NULL ,這將是個壞消息。

在將malloc視為有效指針之前,應檢查以確保malloc返回的值不為NULL

暫無
暫無

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

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