C和C++安全編碼pdf

下載地址:網盤下載ios

 

 

內容簡介  · · · · · ·

目錄  · · · · · ·

譯者序
序言
前言
做譯者簡介
第1章 夾縫求生 1
1.1 衡量危險 3
1.1.1 損失的現狀 4
1.1.2 威脅的來源 5
1.1.3 軟件安全 6
1.2 安全概念 7
1.2.1 安全策略 8
1.2.2 安全缺陷 8
1.2.3 漏洞 9
1.2.4 利用 10
1.2.5 緩解措施 10
1.3 C和C++ 11
1.3.1 C和C++簡史 11
1.3.2 C存在的問題 12
1.3.3 遺留代碼 13
1.3.4 其餘語言 13
1.4 開發平臺 13
1.4.1 操做系統 13
1.4.2 編譯器 15
1.5 本章小結 16
1.6 閱讀材料 16
第2章 字符串 17
2.1 字符串特徵 17
2.2 常見的字符串操做錯誤 18
2.2.1 無界字符串複製 18
2.2.2 差一錯誤 20
2.2.3 空結尾錯誤 21
2.2.4 字符串截斷 21
2.2.5 與函數無關的字符串錯誤 21
2.3 字符串漏洞 22
2.3.1 安全缺陷 23
2.3.2 緩衝區溢出 24
2.4 進程內存組織 24
2.5 棧粉碎 27
2.6 代碼注入 30
2.7 弧注入 32
2.8 緩解策略 34
2.8.1 預防 34
2.8.2 字符串流 44
2.8.3 檢測和恢復 45
2.9 著名的漏洞 48
2.9.1 遠程登陸 49
2.9.2 Kerberos 49
2.9.3 Metamail 49
2.10 本章小結 50
2.11 閱讀材料 51
第3章 指針詭計 52
3.1 數據位置 52
3.2 函數指針 53
3.3 數據指針 54
3.4 修改指令指針 54
3.5 全局偏移表 56
3.6 .dtors區 57
3.7 虛指針 58
3.8 atexit()和on_exit()函數 60
3.9 longjmp()函數 61
3.10 異常處理 62
3.10.1 結構化異常處理 62
3.10.2 系統默認異常處理 64
3.11 緩解策略 65
3.11.1 W^X 65
3.11.2 Canaries 65
3.12 本章小結 65
3.13 閱讀材料 66
第4章 動態內存管理 67
4.1 動態內存管理 67
4.2 常見的動態內存管理錯誤 69
4.2.1 初始化 69
4.2.2 檢查返回值失敗 70
4.2.3 引用已釋放的內存 71
4.2.4 屢次釋放內存 72
4.2.5 不匹配的內存管理函數 73
4.2.6 未正確區分標量和數組 73
4.2.7 對分配函數的不當使用 73
4.3 Doug Lea的內存分配器 74
4.3.1 內存管理 74
4.3.2 緩衝區溢出 76
4.3.3 雙重釋放漏洞 80
4.3.4 寫入已釋放的內存 83
4.4 RtlHeap 83
4.4.1 Win32中的內存管理 83
4.4.2 RtlHeap的數據結構 85
4.4.3 緩衝區溢出 88
4.4.4 緩衝區溢出(再回顧) 89
4.4.5 寫入已釋放內存 92
4.4.6 雙重釋放 92
4.4.7 look-aside表 95
4.5 緩解策略 95
4.5.1 空指針 95
4.5.2 一致的內存管理約定 96
4.5.3 堆完整性檢測 96
4.5.4 phkmalloc 97
4.5.5 隨機化 98
4.5.6 哨位頁 98
4.5.7 OpenBSD 98
4.5.8 運行時分析工具 99
4.5.9 Windows XP SP2 100
4.6 著名的漏洞 101
4.6.1 CVS緩衝區溢出漏洞 102
4.6.2 微軟數據訪問組件(MDAC) 102
4.6.3 CVS服務器雙重釋放漏洞 103
4.6.4 MIT Kerberos 5中的漏洞 103
4.7 本章小結 103
4.8 閱讀材料 103
第5章 整數安全 105
5.1 整數 105
5.1.1 整數表示法 106
5.1.2 整數類型 106
5.1.3 整數取值範圍 108
5.2 整型轉換 109
5.2.1 整型提高 109
5.2.2 整數轉換級別 109
5.2.3 從無符號整型轉換 111
5.2.4 從帶符號整型轉換 112
5.2.5 帶符號或無符號字符 113
5.2.6 普通算術轉換 113
5.3 整數錯誤情形 113
5.3.1 整數溢出 114
5.3.2 符號錯誤 115
5.3.3 截斷錯誤 115
5.4 整數操做 116
5.4.1 加法 117
5.4.2 減法 119
5.4.3 乘法 120
5.4.4 除法 122
5.5 漏洞 126
5.5.1 整數溢出 126
5.5.2 符號錯誤 127
5.5.3 截斷錯誤 128
5.6 非異常的整數邏輯錯誤 129
5.7 緩解策略 130
5.7.1 範圍檢查 130
5.7.2 強類型 131
5.7.3 編譯器運行時檢查 131
5.7.4 安全的整數操做 132
5.7.5 任意精度的算術 136
5.7.6 測試 137
5.7.7 源代碼審查 137
5.8 著名的漏洞 137
5.8.1 XDR庫 137
5.8.2 Windows DirectX MIDI庫 138
5.8.3 bash 138
5.9 本章小結 139
5.10 閱讀材料 140
第6章 格式化輸出 141
6.1 變參函數 142
6.1.1 ANSI C標準參數 142
6.1.2 Unix System V Varargs 144
6.2 格式化輸出函數 144
6.2.1 格式字符串 145
6.2.2 GCC 147
6.2.3 Visual C++.NET 147
6.3 對格式化輸出函數的漏洞利用 148
6.3.1 緩衝區溢出 148
6.3.2 輸出流 149
6.3.3 使程序崩潰 149
6.3.4 查看棧內容 150
6.3.5 查看內存內容 151
6.3.6 覆寫內存 152
6.3.7 國際化 156
6.4 棧隨機化 156
6.4.1 阻礙棧隨機化 156
6.4.2 以雙字的格式寫地址 157
6.4.3 直接參數存取 158
6.5 緩解策略 160
6.5.1 靜態內容的動態使用 160
6.5.2 限制字節寫入 161
6.5.3 ISO/IEC TR 24731 162
6.5.4 iostream與stdio 162
6.5.5 測試 163
6.5.6 編譯器檢查 164
6.5.7 詞法分析 164
6.5.8 靜態污點分析 164
6.5.9 調整變參函數的實現 165
6.5.10 Exec Shield 166
6.5.11 FormatGuard 166
6.5.12 Libsafe 167
6.5.13 靜態二進制分析 167
6.6 著名的漏洞 168
6.6.1 華盛頓大學FTP Daemon 168
6.6.2 CDE ToolTalk 168
6.7 本章小結 169
6.8 閱讀材料 170
第7章 文件I/O 171
7.1 併發 171
7.1.1 競爭條件 171
7.1.2 互斥和死鎖 172
7.2 檢查時間和使用時間 173
7.3 做爲鎖的文件和文件鎖定 174
7.4 文件系統利用 176
7.4.1 符號連接利用 176
7.4.2 臨時文件打開利用 178
7.4.3 unlink()競爭利用 180
7.4.4 受信文件名 180
7.4.5 非惟一的臨時文件名 181
7.5 緩解策略 181
7.5.1 關閉競爭窗口 182
7.5.2 消除競爭對象 184
7.5.3 控制對競爭對象的訪問 187
7.5.4 競爭偵測工具 188
7.6 本章小結 189
第8章 推薦的實踐 190
8.1 安全的軟件開發原則 191
8.1.1 機制經濟性原則 192
8.1.2 失敗-保險默認原則 192
8.1.3 徹底仲裁原則 192
8.1.4 開放式設計原則 192
8.1.5 特權分離原則 192
8.1.6 最小特權原則 193
8.1.7 最少公共機制原則 193
8.1.8 心理可接受性原則 194
8.2 系統質量需求工程 194
8.3 威脅建模 195
8.4 使用/誤用案例 196
8.5 架構與設計 196
8.6 現成軟件 198
8.6.1 現有代碼中的漏洞 198
8.6.2 安全的包裝器 199
8.7 編譯器檢查 199
8.8 輸入驗證 200
8.9 數據淨化 201
8.9.1 黑名單 201
8.9.2 白名單 202
8.9.3 測試 203
8.10 靜態分析 203
8.10.1 Fortify 203
8.10.2 Prexis 204
8.10.3 Prevent 204
8.10.4 PREfix和PREfast 205
8.11 質量保證 205
8.11.1 滲透測試 205
8.11.2 模糊測試 206
8.11.3 代碼審計 206
8.11.4 開發人員準則與檢查清單 206
8.11.5 獨立安全審查 207
8.12 內存權限 207
8.12.1 W^X 207
8.12.2 PaX 208
8.12.3 數據執行防禦 208
8.13 深層防護 209
8.14 TSP-Secure 209
8.14.1 計劃和跟蹤 209
8.14.2 質量管理 210
8.15 本章小結 211
8.16 閱讀材料 211
參考文獻 212
縮略語 223

 

 

下載地址: 網盤下載
相關文章
相關標籤/搜索