譯者序
序
前言
作者簡介
第一部分 軟件安全和靜態分析
第1章 軟件安全問題 1
1.1 僅有防禦性編程還不夠 1
1.2 安全功能≠安全的功能 3
1.3 質量的誤區 4
1.4 軟件開發全局中的靜態分析 6
1.5 漏洞分類 7
1.5.1 7種有害的領域 9
1.5.2 “7種有害的領域”與“OWASP前10名” 11
1.6 小結 11
第2章 靜態分析簡介 12
2.1 靜態分析的能力和局限性 12
2.2 通過靜態分析解決問題 13
2.2.1 類型檢查 14
2.2.2 風格檢查 15
2.2.3 程序理解 16
2.2.4 程序驗證和屬性檢查 17
2.2.5 Bug查找 19
2.2.6 安全審查 20
2.3 一點理論,一點實際 21
2.3.1 成功準則 22
2.3.2 分析源代碼與分析編譯後的代碼 25
2.4 小結 28
第3章 作為代碼審查過程組成部分的靜態分析 29
3.1 執行代碼審查 29
3.1.1 代碼審查周期 30
3.1.2 避開可利用性陷阱 33
3.2 將安全審查加入到現有的開發過程中 34
3.2.1 采用工具的疑慮 36
3.2.2 小處著手,循序漸進 38
3.3 靜態分析度量標準 39
3.4 小結 44
第4章 靜態分析技術內幕 45
4.1 建模 45
4.1.1 詞法分析 46
4.1.2 解析 46
4.1.3 抽象語法 47
4.1.4 語義分析 48
4.1.5 跟蹤控製流 49
4.1.6 跟蹤數據流 51
4.1.7 汙染傳播 52
4.1.8 指針彆名歧義 52
4.2 分析算法 53
4.2.1 斷言檢查 53
4.2.2 單純本地分析 54
4.2.3 本地分析方法 57
4.2.4 全局分析 58
4.2.5 研究性的工具 60
4.3 規則 62
4.3.1 規則格式 62
4.3.2 用於汙染傳播的規則 65
4.3.3 本書中討論的規則 67
4.4 報告結果 67
4.4.1 結果的分組和分類 69
4.4.2 消除非預期的結果 69
4.4.3 解釋結果的意義 70
4.5 小結 73
第二部分 常 見 問 題
第5章 處理輸入 75
5.1 驗證內容 76
5.1.1 驗證所有輸入 77
5.1.2 驗證各種來源的輸入 77
5.1.3 建立可信邊界 83
5.2 如何進行驗證 85
5.2.1 使用強輸入驗證 85
5.2.2 避免黑名單法 89
5.2.3 不要混淆可用性和安全性 91
5.2.4 拒絕不良數據 92
5.2.5 默認執行正確的輸入驗證 93
5.2.6 檢驗輸入的長度 100
5.2.7 限製數值輸入 102
5.3 防止元字符攻擊 104
5.3.1 使用參數化請求 105
5.3.2 路徑操縱 108
5.3.3 命令注入 109
5.3.4 日誌欺騙 110
5.4 小結 112
第6章 緩衝區溢齣 113
6.1 緩衝區溢齣簡介 113
6.1.1 利用緩衝區溢齣漏洞 114
6.1.2 緩衝區分配策略 116
6.1.3 跟蹤緩衝區大小 120
6.2 字符串 122
6.2.1 天生危險的函數 122
6.2.2 有界字符串操作 127
6.2.3 有界函數的常見缺陷 132
6.2.4 保留Null終止符 138
6.2.5 字符集、錶達式和編碼 141
6.2.6 格式串 145
6.2.7 更完善的字符串類和類庫 148
6.3 小結 151
第7章 緩衝區溢齣伴隨的問題 152
7.1 整數 152
7.1.1 迴繞錯誤 153
7.1.2 截斷和符號位擴展 154
7.1.3 有符號數和無符號數之間的轉換 156
7.1.4 檢測和防止整數溢齣的方法 157
7.2 運行時保護 162
7.2.1 更安全的編程語言 162
7.2.2 更安全的C語言 164
7.2.3 動態緩衝區溢齣保護 166
7.2.4 動態保護基準結果 169
7.3 小結 170
第8章 錯誤和異常 171
8.1 利用返迴代碼處理錯誤 171
8.1.1 檢查C語言中的返迴值 172
8.1.2 檢查Java中的返迴值 173
8.2 管理異常 174
8.2.1 捕獲頂層的任何東西 175
8.2.2 消失的異常 176
8.2.3 隻捕獲需要處理的異常 177
8.2.4 控製已檢測的異常 178
8.3 防止資源泄露 180
8.3.1 C和C++ 180
8.3.2 Java 183
8.4 日誌記錄和調試 185
8.4.1 集中日誌記錄 185
8.4.2 在最終代碼中不包含調試幫助和“後門”訪問代碼 187
8.4.3 清除備份文件 189
8.4.4 不要容忍“復活節彩蛋” 190
8.5 小結 190
第三部分 特性與特色
第9章 Web應用程序 191
9.1 用於Web的輸入和輸齣驗證 192
9.1.1 預料到瀏覽器已遭到破壞 192
9.1.2 認為瀏覽器是一種一覽無餘的事物 194
9.1.3 保護瀏覽器免受惡意內容的攻擊 195
9.2 HTTP考慮 205
9.2.1 使用POST,而不是GET 205
9.2.2 請求順序 207
9.2.3 錯誤處理 208
9.2.4 請求齣處 210
9.3 維護會話狀態 211
9.3.1 使用強用戶會話標識符 212
9.3.2 強製會話空閑超時和最大會話持續時間 213
9.3.3 在認證的基礎上開始一個新的會話 215
9.4 為輸入驗證使用Struts架構 216
9.4.1 建立Struts Validator 217
9.4.2 對所有操作使用Struts Validator 218
9.4.3 驗證每一個參數 220
9.4.4 維護驗證邏輯 221
9.5 小結 223
第10章 XML與Web服務 224
10.1 使用XML 224
10.1.1 使用一個標準兼容的XML語法分析程序 225
10.1.2 開啓驗證 226
10.1.3 要小心外部引用 229
10.1.4 保持對文檔查詢的控製 232
10.2 使用Web服務 235
10.2.1 輸入驗證 235
10.2.2 WSDL苦惱 236
10.2.3 過度暴露 237
10.2.4 過去錯誤的新機會 238
10.2.5 JavaScript劫持:一種新的邊界 238
10.3 小結 242
第11章 隱私與秘密 243
11.1 隱私與規則 243
11.1.1 識彆私有信息 243
11.1.2 處理私有信息 245
11.2 外發密碼 249
11.2.1 源代碼中不能有密碼 249
11.2.2 不存儲明文密碼 251
11.3 隨機數 255
11.3.1 在Java中生成隨機數 255
11.3.2 在C和C++中生成隨機數 257
11.4 密碼技術 261
11.4.1 選擇一個好的算法 261
11.4.2 不要自以為是 262
11.5 內存中的秘密 264
11.5.1 使保持秘密的時間最短 265
11.5.2 保守地共享秘密 266
11.5.3 安全地刪除秘密 267
11.5.4 防止不必要地復製秘密 268
11.6 小結 269
第12章 具有特權的程序 270
12.1 特權的含義 271
12.1.1 最小特權原理 271
12.1.2 這次我是認真的:不相信每一件事 273
12.2 管理特權 274
12.2.1 在實踐中應用最小特權 274
12.2.2 限製文件係統上的特權 277
12.2.3 謹防非期待的事件 279
12.3 特權提升攻擊 281
12.3.1 文件訪問競態條件 282
12.3.2 不安全的臨時文件 287
12.3.3 命令注入 289
12.3.4 標準文件描述符 290
12.4 小結 291
第四部分 靜態分析實踐
第13章 Java語言源代碼分析練習 293
練習13.0 安裝 293
練習13.1 留意結果,現在開始 294
練習13.2 人工審計源代碼 300
練習13.3 運行Fortify SCA 302
練習13.4 理解原始的分析結果 303
練習13.5 分析一個完整的應用程序 307
練習13.6 使用Audit Workbench調整結果 308
練習13.7 審計一個問題 310
練習13.8 執行一個完整的審計 313
練習13.9 編寫自定義規則 316
練習13.2中問題的答案 321
第14章 C語言源代碼分析練習 324
練習14.0 安裝 325
練習14.1 留意結果,現在開始 325
練習14.2 人工審計源代碼 330
練習14.3 運行Fortify SCA 331
練習14.4 理解原始的分析結果 332
練習14.5 分析一個完整的應用程序 335
練習14.6 使用Audit Workbench調整結果 335
練習14.7 審計一個問題 338
練習14.8 執行一個完整的審計 341
練習14.9 編寫自定義規則 342
練習14.2中的問題答案 346
結束語 349
參考文獻 351
· · · · · · (
收起)