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