C++源代碼審計問題整改記錄

一、緩衝區溢出,使用不安全的函數

例如strcpy、sprintf、strcat、scanf等

應換用更安全的函數或者判斷傳入參數的大小,防止超過緩衝區大小。

strcpy()可改用strncpy(),並在最後添加0結尾符;sprintf()可改用snprintf();strcat()可改用strncat();scanf()可改用scanf_s()

 

二、處理問題時出錯

  1. 未檢查返回值的情況下調用函數
  2. 將負值用作了期望正值的函數的參數.

三、錯誤的表達式

  1.  可能除零
  2. .錯誤的sizeof()
    1. ​
      S2IDString tIDString;
      memset(&tIDString,0,sizeof(SIDString));
      ​

       

  3.  複製錯誤。
    Jint32 baseDirIndex = baseDirStr.find('/');
    	if(baseDirIndex!=-1)
    	{
    		baseDirStr = baseDirStr.mid(baseDirStr.find('/')+1);
    	}
    	else 
    	{
    		baseDirStr = QString::null;
    	}
    	Jint32 currentIndex  = currentDirStr.find('/');
    	if(currentIndex!=-1)
    	{
    		currentDirStr = currentDirStr.mid(currentDirStr.find('/')+1);
    	}
    	else 
    	{
    		baseDirStr = QString::null;
    	}
    1.  
  4. 條件是多餘的,無論結果如何,執行的代碼相同
    1.    if(pTermStruct == G_NULL)
          {
              return 1;
          }
          return 1 ;

四、控制流問題

無法到達的語句:不帶符號的值判斷>0,值永遠爲true

五、內存泄漏

  1. 非法訪問

    strlen:將不以 null 終止的字符緩衝區傳遞給了期望獲得以 null 終止的字符串的函數
    strncpy:大小應減1,並結尾加0

  1. 內存泄漏

    針對標量或使用 new[] 分配的指針數組使用了非數組刪除

六、初始化

  1.  非void函數需要有返回值
  2. 變量使用前未初始化
  3. 標量字段未被構造函數初始化

    非靜態類成員,在此構造函數或其調用的任何函數中未初始化

七、API使用錯誤

  1. 使用 va_start 或 va_copy 來開始處理;未使用 va_end 來結束
  2. 參數過多或過少,例如:未使用,但卻傳入了參數。
    1. sprintf(tmpBuf, "YVal", ProcTime.GetMonth()); 
      sql.Format("SELECT %s, %s FROM ",sHours[0]);

       

  3. 格式轉換不兼容,例如%d,期望"int",但傳入參數爲"unsigned long";%s期望"char *",但傳入"QString"
  4. 源緩衝區可能與目標緩衝區重疊,這會導致 "memcpy" 的未定義行爲
    1.     memcpy(chPos, chPos+2, sizeof(char)*(strlen(i_pData->szBJName) - nPos-2));
          memset(chPos+strlen(chPos)-2, 0, sizeof(char)*2);

       

八、明文存儲密碼

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章