- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 2375字
- 2020-10-30 17:56:32
前言
1988年11月爆發的Morris蠕蟲事件造成當時全球10%的互聯網系統陷入癱瘓,作為對該事件的回應,當月美國國防部高級研究計劃局(Defense Advanced Research Projects Agency,DARPA)成立了CERT。CERT位于賓夕法尼亞州匹茲堡市的軟件工程研究院(Software Engineering Institute,SEI)內,這是一個由美國國防部發起的研發中心,并受聯邦政府資助。
CERT最初的工作重點是對各種網絡事件做出快速響應和分析。這里所說的事件既包括得逞的攻擊(如系統受損與拒絕服務等),也包括未得逞的攻擊企圖、探測和掃描。自1988年以來,CERT共已接到逾22665個報告計算機安全事件或咨詢有關信息的熱線電話,已處理逾319992起計算機安全事件,而且每年報告的事件數目呈持續增長的態勢。
雖然對事件做出及時響應必不可少,但是這還不足以保護互聯網和互聯的信息系統的安全。分析表明,大部分計算機安全事件是由特洛伊木馬、社會工程學(social engineering)以及軟件漏洞利用(exploitation)造成的,包括軟件缺陷、設計決策、配置決策以及非預期的系統間交互等。CERT監控漏洞信息的公共來源并且經常性地收到漏洞報告。自1995年以來,CERT已經收到超過16726份漏洞報告。每收到一份報告,CERT就會分析報告所述的可能的漏洞,并與軟件制造者協作,通知其產品中存在安全缺陷,促進并追蹤其對問題的響應 [1]。
和事件報告相似,漏洞報告也以驚人的速度持續增長 [2]。雖然對漏洞的管理抑制了這一進程的發展,但是對于解決互聯網和信息系統的安全問題來說,這同樣遠遠不夠。為了解決日益增加的漏洞和事件問題,必須采取相應的措施:在源頭有效地控制它們,即必須在軟件的開發階段和隨后的維護工作中避免引入軟件漏洞。對現有漏洞的分析表明,大部分漏洞都是由少數根本原因導致。本書旨在傳授開發者有關這些根本原因的知識,并介紹避免引入漏洞的措施。
本書讀者對象
對任何采用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來訪問與本書配套的安全編碼在線課程。
- C++面向對象程序設計(第三版)
- 精通Nginx(第2版)
- Power Up Your PowToon Studio Project
- CentOS 7 Server Deployment Cookbook
- 算法大爆炸:面試通關步步為營
- Java Web程序設計
- SQL基礎教程(視頻教學版)
- Getting Started with Python
- Python函數式編程(第2版)
- 視窗軟件設計和開發自動化:可視化D++語言
- After Effects CC案例設計與經典插件(視頻教學版)
- 實驗編程:PsychoPy從入門到精通
- Visual FoxPro程序設計習題及實驗指導
- 川哥教你Spring Boot 2實戰
- HTML5 Game Development by Example:Beginner's Guide(Second Edition)