本書旨在介紹代碼審計及缺陷剖析的相關(guān)知識。本書首先介紹了代碼檢測技術(shù)和代碼檢測工具;然后講述了C/C++安全標準,展示了與標準不兼容的案例和兼容的案例,并對案例對應的知識點進行講解,以幫助開發(fā)人員、評測人員理解和運用標準;接著分析了C/C++語言源代碼漏洞測試,展示了包含安全漏洞的案例,以及修復安全漏洞的案例;最后介紹了常見運行時缺陷,主要基于C/C++案例代碼進行剖析,這些運行時缺陷是在對C/C++項目進行代碼檢測和代碼審計時需要重點關(guān)注的。
本書不僅適合開發(fā)人員、測試人員閱讀,還適合作為相關(guān)培訓機構(gòu)的教材。
1.本書詳細介紹了代碼審計的原理、技術(shù)和工具,幫助讀者深入了解代碼審計的基本概念和方法,為實際應用奠定堅實的基礎。
2.本書深入講解了C/C++安全標準,通過實際案例分析,展示了與標準不兼容和兼容的情況,幫助讀者更好地理解和運用安全標準,提高代碼質(zhì)量。
3.本書提供了豐富的C/C++源代碼漏洞測試案例,展示了如何發(fā)現(xiàn)和修復安全漏洞,幫助讀者提高代碼安全性,降低潛在風險。
從事軟件測試、軟件安全工作超過20年,擅長分析軟件質(zhì)量和代碼質(zhì)量,目前在軟件應用安全領(lǐng)域從事SDL(Security Development Lifecycle,安全開發(fā)生命周期)與DevSecOps方面的研發(fā)工作,出版過軟件測試管理、性能測試、APP測試等方面的圖書,曾為多家大型企業(yè)提供內(nèi)訓。
馬森
北京大學軟件工程國家工程研究中心副研究員,在軟件代碼分析領(lǐng)域發(fā)表論文數(shù)十篇,獲得專利數(shù)十個,作為項目負責人承擔代碼分析領(lǐng)域的項目十余個。
陳能技
具有20年IT從業(yè)經(jīng)驗,擔任過測試工程師、項目經(jīng)理、培訓講師、咨詢顧問、架構(gòu)師、技術(shù)總監(jiān)等職位,研究方向包括DevOps、DevSecOps、GitOps以及軟件專業(yè)化交付能力,編寫過《軟件測試技術(shù)大全:測試基礎、流程工具、項目實戰(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 代碼檢測技術(shù) 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 軟件成分分析工具使用的
關(guān)鍵技術(shù) 21
1.4.3 SCA工具技術(shù)指標 27
1.5 如何成為一名代碼安全檢測
工程師 27
1.6 代碼安全審計/檢測練習靶場 28
第 2章 C語言安全標準(一) 30
2.1 C語言安全標準產(chǎn)生的背景 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 跳轉(zhuǎn)控制規(guī)則 91
2.3.6 運算處理 93
2.3.7 函數(shù)調(diào)用 113
第3章 C語言安全標準(二) 127
3.1 關(guān)于語句使用的規(guī)則 127
3.1.1 關(guān)于循環(huán)控制的規(guī)則 131
3.1.2 關(guān)于類型轉(zhuǎn)換的規(guī)則 135
3.1.3 關(guān)于初始化的規(guī)則 141
3.1.4 關(guān)于比較判斷的規(guī)則 146
3.1.5 關(guān)于變量使用的規(guī)則 152
3.2 C++的專用規(guī)則 162
3.2.1 關(guān)于類與對象的強制規(guī)則 162
3.2.2 關(guān)于構(gòu)造函數(shù)的強制規(guī)則 169
3.2.3 關(guān)于虛函數(shù)的強制規(guī)則 173
3.2.4 關(guān)于類型轉(zhuǎn)換的強制規(guī)則 176
3.2.5 關(guān)于內(nèi)存釋放的強制規(guī)則 177
第4章 C/C++語言源代碼漏洞測試
規(guī)范 180
4.1 不可控的內(nèi)存分配 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 信息通過調(diào)試日志文件
泄露 193
4.3.12 以未檢查的輸入作為
循環(huán)條件 193
4.4 錯誤的API實現(xiàn) 194
4.5 劣質(zhì)代碼 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 安全關(guān)鍵的行為依賴反向
域名解析 203
4.7.10 沒有要求使用強密碼 204
4.7.11 沒有對密碼域進行掩飾 205
4.7.12 通過用戶控制的SQL關(guān)鍵字
繞過授權(quán) 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 內(nèi)存泄漏 223
5.2.1 內(nèi)存泄漏的原理 223
5.2.2 內(nèi)存泄漏案例 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)調(diào)用 241
5.7.4 控制表達式有邏輯錯誤 241
5.7.5 以外部輸入作為循環(huán)
跳出條件 242