-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

C和C++安全編碼(原書第2版)

( 簡體 字)
作者:(美)Robert C.Seacord 著類別:1. -> 程式設計 -> C -> C
   2. -> C++ -> C++
   3. -> 安全 -> 網路安全 -> 駭客攻擊與入侵
譯者:
出版社:機械工業出版社C和C++安全編碼(原書第2版) 3dWoo書號: 37376
詢問書籍請說出此書號!

缺書
不接受訂購

出版日:12/1/2013
頁數:376
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
不接受訂購
ISBN:9787111442790
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

年11月爆發的Morris蠕蟲事件造成當時全球10%的互聯網系統陷入癱瘓,作為對該事件的回應,當月美國國防部高級研究計劃局(Defense Advanced Research Projects Agency,DARPA)成立了CERT。CERT位于賓夕法尼亞州匹茲堡市的軟件工程研究院(Software Engineering Institute,SEI)內,這是一個由美國國防部發起的研發中心,并受聯邦政府資助。

CERT最初的工作重點是對各種網絡事件做出快速響應和分析。這里所說的事件既包括得逞的攻擊(如系統受損與拒絕服務等),也包括未得逞的攻擊企圖、探測和掃描。自1988年以來,CERT共已接到逾22 665個報告計算機安全事件或咨詢有關信息的熱線電話,已處理逾319 992起計算機安全事件,而且每年報告的事件數目呈持續增長的態勢。

雖然對事件做出及時響應必不可少,但是這還不足以保護互聯網和互聯的信息系統的安全。分析表明,大部分計算機安全事件是由特洛伊木馬、社會工程學(social engineering)以及軟件漏洞利用(exploitation)造成的,包括軟件缺陷、設計決策、配置決策以及非預期的系統間交互等。CERT監控漏洞信息的公共來源并且經常性地收到漏洞報告。自1995年以來,CERT已經收到超過16 726份漏洞報告。每收到一份報告,CERT就會分析報告所述的可能的漏洞,并與軟件制造者協作,通知其產品中存在安全缺陷,促進并追蹤其對問題的響應。

和事件報告相似,漏洞報告也以驚人的速度持續增長。雖然對漏洞的管理抑制了這一進程的發展,但是對于解決互聯網和信息系統的安全問題來說,這同樣遠遠不夠。為了解決日益增加的漏洞和事件問題,必須采取相應的措施:在源頭有效地控制它們,即必須在軟件的開發階段和隨后的維護工作中避免引入軟件漏洞。對現有漏洞的分析表明,大部分漏洞都是由少數根本原因導致。本書旨在傳授開發者有關這些根本原因的知識,并介紹避免引入漏洞的措施。

本書讀者對象

對任何采用C和C++開發或維護軟件的人來說,本書都是非常有價值的。

如果你是一位C/C++程序員,本書將教你如何識別會導致軟件漏洞的常見編程錯誤,理解這些錯誤是如何被利用的,并以安全的方式實現解決方案。

如果你是一位軟件項目經理,本書將教你識別軟件漏洞的風險及導致的后果,對投資開發安全軟件給出指導。

如果你是一位計算機專業的學生,本書將教你有用的編程實踐,幫助你避免不良的開發習慣,使你能夠在職業生涯中開發出安全的程序。

如果你是一位安全分析師,本書對常見的漏洞提供了細致的描述,并提供了檢測漏洞的方法和實用的規避措施。

本書組織和內容

本書提供了C和C++編程中關于安全實踐方面的實用指導。安全的程序需要安全的設計,然而,如果開發者不了解C和C++編程中許多固有的安全陷阱,那么即便是最佳設計也可能最終導致不安全的程序。本書對C和C++中常見的編程錯誤提供了詳細的解釋,并描述了這些錯誤是如何導致有漏洞的代碼的。本書重點討論C和C++編程語言以及相關庫固有的安全問題,而不強調和外部系統(如數據庫和Web服務器等)的交互中牽涉的安全問題。這些方面話題豐富,應單獨討論。希望本書對于涉及開發安全的C和C++程序的任何人都有所裨益,而不管具體開發何種應用。

本書圍繞著軟件工程師經常實現的、可能會導致安全問題的功能(例如,格式化輸出和算術運算等)組織內容。每一章都描述了一些會導致漏洞的不安全編程實踐和常見的錯誤、這些編程缺陷如何被利用、這種惡意利用所導致的后果,以及替代的安全做法等。對于軟件漏洞的根源問題,例如,緩沖區溢出、整型范圍錯誤和無效的格式字符串等,都有詳細的解釋。每一章都包含檢測既有代碼中漏洞的技術,以及如何安全地實現所需功能的措施。

本書包含以下各章。

第1章:概述問題,介紹安全術語和概念,并對為何C和C++程序中存在如此多的漏洞發表看法。

第2章:描述C和C++中的字符串操作、常見的安全缺陷以及由此導致的漏洞(包括緩沖區溢出攻擊和棧溢出攻擊),還介紹了代碼注入(code injection)和弧注入(arc injection)兩種漏洞利用方式。

第3章:介紹任意內存寫(arbitrary memory write)漏洞利用方式,它允許攻擊者對內存中任意位置的一個地址進行寫操作。該章描述這些漏洞利用方式如何用于在受害機器上執行任意的代碼。由“任意內存寫”導致的漏洞在稍后的章節中討論。

第4章:描述動態內存管理,討論動態分配的緩沖區溢出、寫入已釋放內存,以及重復釋放(double-free)漏洞。

第5章:討論整數安全問題(即與整數操作相關的安全主題),包括整數溢出、符號錯誤以及截斷錯誤等。

第6章:描述格式化輸出函數的正確和錯誤的用法。對因這些函數的錯誤使用所導致的格式字符串和緩沖區溢出漏洞都有討論。

第7章:重點介紹并發和可能導致死鎖、競爭條件和無效的內存訪問序列的漏洞。

第8章:描述和文件I/O相關的常見漏洞,包括競爭條件(race condition)和檢查時間與使用時間(Time Of Check, Time Of Use, TOCTOU)漏洞。

第9章:推薦一些可以整體改善C/C++應用程序安全性的具體開發實踐。 這些建議是對每一章中用于解決特定漏洞問題的推薦做法的補充。

本書包含數百個安全和不安全的代碼示例以及漏洞利用示例。盡管其中有一些涉及與其他語言的比較,但是幾乎所有例子都是用C和C++編寫的。這些例子都在Windows和Linux操作系統上驗證過。具體的示例程序通常已在一個或多個特定環境下編譯和測試過,同時漏洞都被予以評估,以確定它們是否具體相關于以下因素,或者具有包含以下因素的普遍性:編譯器版本、操作系統、微處理器、適用的C或C++標準、小端表示法(即低位在前、高位在后)或大端表示法(即高位在前、低位在后)架構,以及執行棧架構等。

本書以及基于它的在線課程,重點討論通常導致軟件漏洞的常見C和C++編程缺陷。盡管如此,限于篇幅,本書并未涵蓋漏洞的每一個可能來源。與本書有關的附加與更新信息、活動時間表以及新聞參見www.cert.org/books/secure-coding/。書中討論的漏洞也是參照來自US-CERT漏洞數據庫(參見www.kb.cert.org/vuls/)的實際例子。

可以通過位于https://oli.cmu.edu/的卡內基梅隆大學開放學習計劃(Open Learning Initiative,OLI)。輸入課程的密鑰0321822137來訪問與本書配套的安全編碼在線課程。
內容簡介:

件漏洞的成因,熟知規避之道
常被利用的軟件漏洞通常都由本可避免的軟件缺陷造成。通過對1988年以來幾萬份漏洞報告的分析,CERT確定了引起絕大多數漏洞的少數原因。本書識別并解釋了這些原因,并展示了可以采取哪些措施來防止它們被利用。此外,本書鼓勵程序員采用安全的最佳實踐,培養安全的理念,以保護軟件不僅免受現在的攻擊,也免受未來的攻擊。根據CERT的報告和結論,Robert C. Seacord系統地識別了最有可能導致安全漏洞的程序錯誤,顯示了它們被利用的方式,考察了其潛在的后果,并提出了安全的替代方案。
本書主要內容
提高任何C或C++應用程序的整體安全性
阻止利用不安全的字符串操作邏輯進行緩沖區溢出、棧溢出以及面向返回值的編程攻擊
避免因不正確使用動態內存管理函數而導致的漏洞和安全缺陷
消除因有符號整數溢出、無符號整數回繞和截斷誤差而導致的整數相關問題
執行安全的I/O操作,避免文件系統漏洞
正確使用格式化輸出函數,避免引入格式字符串漏洞
在開發并發代碼時,避免競爭條件和其他可利用的漏洞
第2版特色
針對C11和C++11進行了更新
對字符串(第2章)、動態內存管理(第4章)、整數安全(第5章)等章節做了重大修改
增加了新的一章“并發”(第7章)
增加了可以通過卡內基-梅隆大學的開放式學習計劃(OLI)訪問的在線安全編碼課程
本書介紹了Windows和Linux上數以百計的例子,包括安全的代碼、不安全的代碼和利用方法。如果你負責創建安全的C或C++軟件,或者需要保證它們的安全,本書將為你提供詳盡的專家級援助。
目錄:

譯者序



前言

致謝

第1章 夾縫求生 1

1.1 衡量危險 4

1.1.1 損失的現狀 4

1.1.2 威脅的來源 6

1.1.3 軟件安全 7

1.2 安全概念 8

1.2.1 安全策略 9

1.2.2 安全缺陷 10

1.2.3 漏洞 10

1.2.4 漏洞利用 11

1.2.5 緩解措施 12

1.3 C和C++ 12

1.3.1 C和C++簡史 13

1.3.2 C存在的問題 14

1.3.3 遺留代碼 17

1.3.4 其他語言 17

1.4 開發平臺 17

1.4.1 操作系統 18

1.4.2 編譯器 18

1.5 小結 18

1.6 閱讀材料 19

第2章 字符串 20

2.1 字符串 20

2.1.1 字符串數據類型 20

2.1.2 UTF-8 22

2.1.3 寬字符串 23

2.1.4 字符串字面值 23

2.1.5 C++中的字符串 25

2.1.6 字符類型 26

2.1.7 計算字符串大小 27

2.2 常見的字符串操作錯誤 29

2.2.1 無界字符串復制 29

2.2.2 差一錯誤 32

2.2.3 空字符結尾錯誤 33

2.2.4 字符串截斷 34

2.2.5 與函數無關的字符串錯誤 34

2.3 字符串漏洞及其利用 35

2.3.1 被污染的數據 35

2.3.2 IsPasswordOK()的安全缺陷 36

2.3.3 緩沖區溢出 37

2.3.4 進程內存組織 37

2.3.5 棧管理 38

2.3.6 棧溢出 40

2.3.7 代碼注入 44

2.3.8 弧注入 47

2.3.9 返回導向編程 48

2.4 字符串漏洞緩解策略 49

2.4.1 字符串處理 49

2.4.2 C11附錄K邊界檢查接口 50

2.4.3 動態分配函數 52

2.4.4 C++ std::basic_string 54

2.4.5 使字符串對象的引用失效 55

2.4.6 使用basic_string的其他常見錯誤 57

2.5 字符串處理函數 57

2.5.1 gets() 57

2.5.2 C99 57

2.5.3 C11附錄K邊界檢查接口:gets_s() 59

2.5.4 動態分配函數 60

2.5.5 strcpy()和strcat() 61

2.5.6 C99 61

2.5.7 strncpy()和strncat() 64

2.5.8 memcpy()和memmove() 68

2.5.9 strlen() 68

2.6 運行時保護策略 69

2.6.1 檢測和恢復 69

2.6.2 輸入驗證 70

2.6.3 對象大小檢查 70

2.6.4 Visual Studio中編譯器生成的運行時檢查 73

2.6.5 棧探測儀 74

2.6.6 棧溢出保護器 75

2.6.7 操作系統策略 76

2.6.8 檢測和恢復 76

2.6.9 不可執行棧 77

2.6.10 W^X 77

2.6.11 PaX 79

2.6.12 未來發展方向 79

2.7 著名的漏洞 80

2.7.1 遠程登錄 80

2.7.2 Kerberos 81

2.8 小結 81

2.9 閱讀材料 82

第3章 指針詭計 83

3.1 數據位置 83

3.2 函數指針 84

3.3 對象指針 85

3.4 修改指令指針 86

3.5 全局偏移表 87

3.6 .dtors區 89

3.7 虛指針 90

3.8 atexit()和on_exit()函數 91

3.9 longjmp()函數 93

3.10 異常處理 94

3.10.1 結構化異常處理 94

3.10.2 系統默認異常處理 96

3.11 緩解策略 96

3.11.1 棧探測儀 96

3.11.2 W^X 97

3.11.3 對函數指針編碼和解碼 97

3.12 小結 98

3.13 閱讀材料 98

第4章 動態內存管理 99

4.1 C內存管理 100

4.1.1 C標準內存管理函數 100

4.1.2 對齊 101

4.1.3 alloca()和變長數組 102

4.2 常見的C內存管理錯誤 103

4.2.1 初始化錯誤 103

4.2.2 未檢查返回值 104

4.2.3 Null或無效指針解引用 106

4.2.4 引用已釋放內存 106

4.2.5 多次釋放內存 107

4.2.6 內存泄漏 108

4.2.7 零長度分配 108

4.2.8 DR # 400 110

4.3 C++的動態內存管理 110

4.3.1 分配函數 111

4.3.2 釋放函數 115

4.3.3 垃圾回收 115

4.4 常見的C++內存管理錯誤 117

4.4.1 未能正確檢查分配失敗 117

4.4.2 不正確配對的內存管理函數 118

4.4.3 多次釋放內存 120

4.4.4 釋放函數拋出一個異常 123

4.5 內存管理器 123

4.6 Doug Lea的內存分配器 124

4.7 雙重釋放漏洞 131

4.7.1 寫入已釋放的內存 134

4.7.2 RtlHeap 135

4.7.3 緩沖區溢出(終極版) 140

4.8 緩解策略 146

4.8.1 空指針 146

4.8.2 一致的內存管理約定 146

4.8.3 phkmalloc 147

4.8.4 隨機化 148

4.8.5 OpenBSD 148

4.8.6 jemalloc內存管理器 149

4.8.7 靜態分析 149

4.8.8 運行時分析工具 150

4.9 值得注意的漏洞 153

4.9.1 CVS緩沖區溢出漏洞 153

4.9.2 Microsoft數據訪問組件 153

4.9.3 CVS服務器雙重釋放漏洞 154

4.9.4 MIT Kerberos 5中的漏洞 154

4.10 小結 154

第5章 整數安全 155

5.1 整數安全導論 155

5.2 整數數據類型 156

5.2.1 無符號整數類型 156

5.2.2 回繞 157

5.2.3 有符號整數類型 159

5.2.4 有符號整數的取值范圍 162

5.2.5 整數溢出 163

5.2.6 字符類型 165

5.2.7 數據模型 165

5.2.8 其他整數類型 166

5.3 整數轉換 169

5.3.1 轉換整數 169

5.3.2 整數轉換級別 169

5.3.3 整數類型提升 170

5.3.4 普通算術轉換 171

5.3.5 由無符號整數類型轉換 171

5.3.6 由有符號整數類型轉換 173

5.3.7 轉換的影響 176

5.4 整數操作 176

5.4.1 賦值 177

5.4.2 加法 179

5.4.3 減法 183

5.4.4 乘法 185

5.4.5 除法和求余 188

5.4.6 移位 192

5.5 整數漏洞 194

5.5.1 漏洞 194

5.5.2 回繞 194

5.5.3 轉換和截斷錯誤 196

5.5.4 非異常的整數邏輯錯誤 197

5.6 緩解策略 198

5.6.1 整數類型的選擇 198

5.6.2 抽象數據類型 200

5.6.3 任意精度算術 200

5.6.4 范圍檢查 201

5.6.5 前提條件和后驗條件測試 203

5.6.6 安全整數庫 204

5.6.7 溢出檢測 205

5.6.8 編譯器生成的運行時檢查 206

5.6.9 可驗證范圍操作 207

5.6.10 仿佛無限范圍整數模型 208

5.6.11 測試與分析 208

5.7 小結 210

第6章 格式化輸出 211

6.1 變參函數 212

6.2 格式化輸出函數 214

6.2.1 格式字符串 215

6.2.2 GCC 216

6.2.3 Visual C++ 217

6.3 對格式化輸出函數的漏洞利用 217

6.3.1 緩沖區溢出 218

6.3.2 輸出流 219

6.3.3 使程序崩潰 219

6.3.4 查看棧內容 219

6.3.5 查看內存內容 221

6.3.6 覆寫內存 222

6.3.7 國際化 226

6.3.8 寬字符格式字符串漏洞 226

6.4 棧隨機化 226

6.4.1 阻礙棧隨機化 227

6.4.2 以雙字的格式寫地址 227

6.4.3 直接參數訪問 228

6.5 緩解策略 230

6.5.1 排除用戶輸入的格式字符串 230

6.5.2 靜態內容的動態使用 230

6.5.3 限制字節寫入 231

6.5.4 C11附錄K邊界檢查接口 232

6.5.5 iostream與stdio 233

6.5.6 測試 234

6.5.7 編譯器檢查 234

6.5.8 靜態污點分析 234

6.5.9 調整變參函數的實現 235

6.5.10 Exec Shield 236

6.5.11 FormatGuard 236

6.5.12 靜態二進制分析 237

6.6 著名的漏洞 238

6.6.1 華盛頓大學FTP Daemon 238

6.6.2 CDE ToolTalk 238

6.6.3 Ettercap NG-0.7.2版 238

6.7 小結 239

6.8 閱讀材料 240

第7章 并發 241

7.1 多線程 241

7.2 并行 242

7.2.1 數據并行 243

7.2.2 任務并行 245

7.3 性能目標 245

7.4 常見錯誤 247

7.4.1 競爭條件 247

7.4.2 損壞的值 248

7.4.3 易變的對象 249

7.5 緩解策略 250

7.5.1 內存模型 251

7.5.2 同步原語 253

7.5.3 線程角色分析(研究) 259

7.5.4 不可變的數據結構 260

7.5.5 并發代碼屬性 261

7.6 緩解陷阱 261

7.6.1 死鎖 262

7.6.2 過早釋放鎖 266

7.6.3 爭用 267

7.6.4 ABA問題 268

7.7 值得注意的漏洞 272

7.7.1 在多核動態隨機訪問存儲器系統中的DoS攻擊 272

7.7.2 系統調用包裝器中的并發漏洞 272

7.8 小結 273

第8章 文件I/O 275

8.1 文件I/O基礎 275

8.1.1 文件系統 275

8.1.2 特殊文件 277

8.2 文件I/O接口 278

8.2.1 數據流 278

8.2.2 打開和關閉文件 279

8.2.3 POSIX 280

8.2.4 C++中的文件I/O 281

8.3 訪問控制 282

8.3.1 UNIX文件權限 282

8.3.2 進程特權 284

8.3.3 更改特權 285

8.3.4 管理特權 288

8.3.5 管理權限 292

8.4 文件鑒定 295

8.4.1 目錄遍歷 295

8.4.2 等價錯誤 297

8.4.3 符號鏈接 298

8.4.4 規范化 300

8.4.5 硬鏈接 302

8.4.6 設備文件 304

8.4.7 文件屬性 306

8.5 競爭條件 308

8.5.1 檢查時間和使用時間 308

8.5.2 創建而不替換 309

8.5.3 獨占訪問 312

8.5.4 共享目錄 313

8.6 緩解策略 315

8.6.1 關閉競爭窗口 315

8.6.2 消除競爭對象 319

8.6.3 控制對競爭對象的訪問 320

8.6.4 競爭檢測工具 322

8.7 小結 322

第9章 推薦的實踐 324

9.1 安全開發生命周期 324

9.1.1 TSP-Secure 326

9.1.2 計劃和跟蹤 327

9.1.3 質量管理 328

9.2 安全培訓 329

9.3 要求 330

9.3.1 安全編碼標準 330

9.3.2 安全質量需求工程 330

9.3.3 用例/誤用例 332

9.4 設計 333

9.4.1 安全的軟件開發原則 334

9.4.2 威脅建模 337

9.4.3 分析攻擊面 338

9.4.4 現有代碼中的漏洞 338

9.4.5 安全包裝器 339

9.4.6 輸入驗證 339

9.4.7 信任邊界 340

9.4.8 黑名單 342

9.4.9 白名單 343

9.4.10 測試 343

9.5 實現 344

9.5.1 編譯器檢查 344

9.5.2 仿佛無限范圍整數模型 345

9.5.3 有安全保證的C/C++ 345

9.5.4 靜態分析 346

9.5.5 源代碼分析實驗室 348

9.5.6 深層防御 349

9.6 驗證 350

9.6.1 靜態分析 350

9.6.2 滲透測試 350

9.6.3 模糊測試 351

9.6.4 代碼審計 352

9.6.5 開發人員準則與檢查清單 352

9.6.6 獨立安全審查 353

9.6.7 攻擊面回顧 353

9.7 小結 354

9.8 閱讀材料 354

參考文獻 355

縮略語 373
序: