本書旨在介紹代碼審計及缺陷剖析的相關知識。本書首先介紹了代碼檢測技術和代碼檢測工具;然后講述了C/C++安全標準,展示了與標準不兼容的案例和兼容的案例,并對案例對應的知識點進行講解,以幫助開發(fā)人員、評測人員理解和運用標準;接著分析了C/C++語言源代碼漏洞測試,展示了包含安全漏洞的案例,以及修復安全漏洞的案例;最后介紹了常見運行時缺陷,主要基于C/C++案例代碼進行剖析,這些運行時缺陷是在對C/C++項目進行代碼檢測和代碼審計時需要重點關注的。
本書不僅適合開發(fā)人員、測試人員閱讀,還適合作為相關培訓機構的教材。
1.本書詳細介紹了代碼審計的原理、技術和工具,幫助讀者深入了解代碼審計的基本概念和方法,為實際應用奠定堅實的基礎。
2.本書深入講解了C/C++安全標準,通過實際案例分析,展示了與標準不兼容和兼容的情況,幫助讀者更好地理解和運用安全標準,提高代碼質量。
3.本書提供了豐富的C/C++源代碼漏洞測試案例,展示了如何發(fā)現(xiàn)和修復安全漏洞,幫助讀者提高代碼安全性,降低潛在風險。
從事軟件測試、軟件安全工作超過20年,擅長分析軟件質量和代碼質量,目前在軟件應用安全領域從事SDL(Security Development Lifecycle,安全開發(fā)生命周期)與DevSecOps方面的研發(fā)工作,出版過軟件測試管理、性能測試、APP測試等方面的圖書,曾為多家大型企業(yè)提供內訓。
馬森
北京大學軟件工程國家工程研究中心副研究員,在軟件代碼分析領域發(fā)表論文數(shù)十篇,獲得專利數(shù)十個,作為項目負責人承擔代碼分析領域的項目十余個。
陳能技
具有20年IT從業(yè)經驗,擔任過測試工程師、項目經理、培訓講師、咨詢顧問、架構師、技術總監(jiān)等職位,研究方向包括DevOps、DevSecOps、GitOps以及軟件專業(yè)化交付能力,編寫過《軟件測試技術大全:測試基礎、流程工具、項目實戰(zhàn)》《大規(guī)模組織DevOps實踐》等圖書。
目 錄
第 1章 代碼檢測和工具 1
1.1 背景 1
1.2 代碼審計 1
1.2.1 代碼審計的思路 2
1.2.2 代碼審計的步驟 2
1.2.3 安全審計的標準 3
1.2.4 代碼審計中的常見概念 5
1.3 代碼檢測工具 5
1.3.1 代碼檢測工具的原理 6
1.3.2 代碼檢測技術 7
1.3.3 代碼檢測的主要方法 9
1.3.4 代碼檢測工具的主要功能 14
1.3.5 常見的代碼檢測工具 14
1.3.6 代碼檢測工具的評價基準 16
1.4 軟件成分分析工具 19
1.4.1 軟件成分分析工具的
原理 20
1.4.2 軟件成分分析工具使用的
關鍵技術 21
1.4.3 SCA工具技術指標 27
1.5 如何成為一名代碼安全檢測
工程師 27
1.6 代碼安全審計/檢測練習靶場 28
第 2章 C語言安全標準(一) 30
2.1 C語言安全標準產生的背景 30
2.2 如何理解和使用GJB 8114標準 30
2.3 C和C++的共用規(guī)則 31
2.3.1 聲明定義規(guī)則 31
2.3.2 版面書寫規(guī)則 57
2.3.3 指針使用規(guī)則 63
2.3.4 分支控制規(guī)則 77
2.3.5 跳轉控制規(guī)則 91
2.3.6 運算處理 93
2.3.7 函數(shù)調用 113
第3章 C語言安全標準(二) 127
3.1 關于語句使用的規(guī)則 127
3.1.1 關于循環(huán)控制的規(guī)則 131
3.1.2 關于類型轉換的規(guī)則 135
3.1.3 關于初始化的規(guī)則 141
3.1.4 關于比較判斷的規(guī)則 146
3.1.5 關于變量使用的規(guī)則 152
3.2 C++的專用規(guī)則 162
3.2.1 關于類與對象的強制規(guī)則 162
3.2.2 關于構造函數(shù)的強制規(guī)則 169
3.2.3 關于虛函數(shù)的強制規(guī)則 173
3.2.4 關于類型轉換的強制規(guī)則 176
3.2.5 關于內存釋放的強制規(guī)則 177
第4章 C/C++語言源代碼漏洞測試
規(guī)范 180
4.1 不可控的內存分配 180
4.2 路徑錯誤 181
4.3 數(shù)據(jù)處理 182
4.3.1 相對路徑遍歷 182
4.3.2 絕對路徑遍歷 184
4.3.3 命令行注入 185
4.3.4 SQL注入 186
4.3.5 進程控制 188
4.3.6 緩沖區(qū)溢出 189
4.3.7 使用外部控制的格式化
字符串 189
4.3.8 整數(shù)溢出 190
4.3.9 信息通過錯誤消息泄露 191
4.3.10 信息通過服務器日志文件
泄露 192
4.3.11 信息通過調試日志文件
泄露 193
4.3.12 以未檢查的輸入作為
循環(huán)條件 193
4.4 錯誤的API實現(xiàn) 194
4.5 劣質代碼 195
4.6 不充分的封裝 196
4.7 安全功能 197
4.7.1 明文存儲密碼 197
4.7.2 存儲可恢復的密碼 197
4.7.3 密碼硬編碼 198
4.7.4 明文傳輸敏感信息 199
4.7.5 使用已破解或危險的
加密算法 199
4.7.6 可逆的哈希算法 200
4.7.7 密碼分組鏈接模式未使用
隨機初始化向量 201
4.7.8 不充分的隨機數(shù) 202
4.7.9 安全關鍵的行為依賴反向
域名解析 203
4.7.10 沒有要求使用強密碼 204
4.7.11 沒有對密碼域進行掩飾 205
4.7.12 通過用戶控制的SQL關鍵字
繞過授權 206
4.7.13 未使用鹽值計算哈希值 207
4.7.14 RSA算法未使用最優(yōu)
非對稱加密填充 208
4.8 Web問題 209
第5章 常見運行時缺陷 211
5.1 緩沖區(qū)溢出 211
5.1.1 緩沖區(qū)溢出的原理 211
5.1.2 防范緩沖區(qū)溢出 216
5.1.3 棧緩沖區(qū)溢出 216
5.1.4 緩沖區(qū)溢出案例 217
5.2 內存泄漏 223
5.2.1 內存泄漏的原理 223
5.2.2 內存泄漏案例 224
5.3 代碼不可達 235
5.4 整數(shù)溢出或環(huán)繞 236
5.5 資源泄露 237
5.6 線程死鎖 238
5.6.1 加鎖后未判斷是否成功 238
5.6.2 線程死鎖 239
5.6.3 加鎖后未解鎖 240
5.7 無限循環(huán) 240
5.7.1 可能不變的循環(huán)因子 240
5.7.2 循環(huán)跳出條件無法滿足 241
5.7.3 函數(shù)循環(huán)調用 241
5.7.4 控制表達式有邏輯錯誤 241
5.7.5 以外部輸入作為循環(huán)
跳出條件 242