> For the complete documentation index, see [llms.txt](https://firmianay.gitbook.io/cissp-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://firmianay.gitbook.io/cissp-notes/d8_software_development_security.md).

# 域8：軟體開發安全

* [域8：軟體開發安全](#域8軟體開發安全)
  * [D8-1：系統開發概述](#d8-1系統開發概述)
    * [一、軟體開發](#一軟體開發)
    * [二、系統開發生命週期](#二系統開發生命週期)
    * [三、生命週期模型](#三生命週期模型)
    * [四、甘特圖和PERT](#四甘特圖和pert)
    * [五、變更和配置管理](#五變更和配置管理)
    * [六、DevOps方法](#六devops方法)
    * [七、應用程式程式設計介面](#七應用程式程式設計介面)
    * [八、軟體測試](#八軟體測試)
    * [九、程式碼倉庫](#九程式碼倉庫)
    * [十、服務水平協議](#十服務水平協議)
    * [十一、第三方軟體購置](#十一第三方軟體購置)
  * [D8-2：建立資料庫和資料倉儲](#d8-2建立資料庫和資料倉儲)
    * [一、資料庫管理系統架構](#一資料庫管理系統架構)
    * [二、資料庫事務](#二資料庫事務)
    * [三、多級資料庫安全](#三多級資料庫安全)
    * [四、開放資料庫連線](#四開放資料庫連線)
    * [五、NoSQL](#五nosql)
    * [六、儲存器威脅](#六儲存器威脅)
  * [D8-3：理解基於知識的系統](#d8-3理解基於知識的系統)
    * [一、專家系統](#一專家系統)
    * [二、機器學習](#二機器學習)
    * [三、神經網路](#三神經網路)
  * [D8-4：惡意軟體](#d8-4惡意軟體)
    * [一、惡意程式碼來源](#一惡意程式碼來源)
    * [二、病毒](#二病毒)
    * [三、邏輯炸彈](#三邏輯炸彈)
    * [四、特洛伊木馬](#四特洛伊木馬)
    * [五、蠕蟲](#五蠕蟲)
    * [六、間諜軟體和廣告軟體](#六間諜軟體和廣告軟體)
    * [七、勒索軟體](#七勒索軟體)
    * [八、惡意指令碼](#八惡意指令碼)
    * [九、零日攻擊](#九零日攻擊)
  * [D8-5：惡意軟體預防](#d8-5惡意軟體預防)
    * [一、易受惡意軟體攻擊的平臺](#一易受惡意軟體攻擊的平臺)
    * [二、反惡意軟體](#二反惡意軟體)
    * [三、完整性監控](#三完整性監控)
    * [四、高階威脅保護](#四高階威脅保護)
  * [D8-6：應用程式風險和措施](#d8-6應用程式風險和措施)
    * [一、應用程式攻擊](#一應用程式攻擊)
    * [二、注入漏洞](#二注入漏洞)
    * [三、利用授權漏洞](#三利用授權漏洞)
    * [四、利用Web應用程式漏洞](#四利用web應用程式漏洞)
    * [五、應用程式安全控制](#五應用程式安全控制)
    * [六、安全編碼實踐](#六安全編碼實踐)

## D8-1：系統開發概述

### 一、軟體開發

1. 程式語言

* 機器語言（machine language）：1和0組成，人類無法直接理解。
* 組合語言（Assembly language）：較機器語言高階點，但仍很麻煩。
* 編譯型語言（compiled languages）：如C、Java等，通常無法直接檢視到原始碼，但可透過逆向工程嘗試獲取原始碼。
* 解釋型語言（interpreted languages）:如Python、Java Script等，使用者能夠直接檢視程式設計人員的原始指令。

某些情況下，語言依賴執行時環境（runtime environments）來允許跨不同作業系統執行程式碼，如JVM。

1. 庫檔案

開發人員依賴包含重用程式碼的共享軟體庫檔案（software libraries），能給提高開發人員的效率。使用共享庫檔案會導致安全問題，如心臟滴血漏洞（Heartbleed），因此在使用共享庫檔案前應評估其安全性。

1. 開發工具集

開發人員也使用整合開發環境（IDE）來提升工作效率，IDE可以編寫、測試、除錯、和編譯程式碼，如PyCharm。

1. 物件導向程式設計（OOP）

OOP關注互動所涉及的物件，物件協調工作提供系統功能。OOP提倡高內聚、低耦合，每個開發人員只需要負責開發自己的物件方法，不需要關心其他人的程式碼是如何實現的，提高了程式設計的效率、故障排查效率。

1. 保證

管理員使用保證程式（assurance procedures）來確保新應用程式中內建的安全控制機制在整個生命週期內正確地實施安全策略，可參考通用準則（CC）。

1. 避免和緩解系統故障

* 輸入驗證：對輸入的值進行檢查，對數字範圍進行檢查被稱為限制檢查（limit check），如日轉賬限制；對特殊字元進行檢查並替換被稱為轉義輸入（escaping input），如替換等號或尖括號等；輸入驗證建議在伺服器端實現，客戶端瀏覽器程式碼易被繞過。
* 身份驗證和會話管理：應用程式應要求使用者完成身份驗證才可進行後續行動，並對使用者的會話進行全程跟蹤。
* 錯誤處理：詳細的錯誤訊息，對定位bug非常便利，但也可能洩漏資訊造成安全風險，應禁止非授權訪問錯誤訊息。
* 日誌記錄：詳細的日誌記錄能夠協助定位安全事故。
* 故障防護和應急開放：故障防護（fail-secure）適用於安全性要求高的環境中，故障後什麼也做不了；應急開放（fail-open）適用於安全性要求不高的環境中，故障後所有安全控制失效，優先保證使用者行動。

### 二、系統開發生命週期

1. 概念定義

定義要開發一個什麼系統，如OA。該階段也涉及開發高階別安全需求，在控制規範開發階段完善，如資料分類和安全要求。

1. 功能需求確定

確定系統所擁有的功能，如OA中的流程審批功能。功能需求涉及輸入、行為和輸出。

1. 控制規範開發

完成系統控制規範的開發，如身份驗證和授權、日誌記錄、容錯性等，安全性設計的融入應該貫穿整個生命週期。

1. 設計審查

設計人員完成系統各功能如何協同工作、工作任務清單、以及階段里程碑對應的時間表，並上會進行審查。

1. 編碼

開發人員依據設計文件開始寫程式碼，並遵循控制規範。

1. 程式碼審查走查

專案經理在里程碑處組織程式碼評審會議，修復程式碼編寫的漏洞。

1. 系統測試審查

程式碼完成編寫和審查後，模擬使用者常規和非常規行為進行系統測試，多次迴歸測試（regression testing）系統穩定後進入使用者驗收測試（UAT），UAT完成後程式碼就可以部署到生產環境中。

1. 維護和變更管理

隨著系統的使用，可能會有新漏洞、新需求、環境變化等因素需要進行維護，任何改變都需要走變更管理流程。

### 三、生命週期模型

1. 瀑布模型

一個階段完成後經過驗證後才能進入下一個階段，如果發生錯誤只能回退一個階段，適合嚴謹、安全要求高的軟體開發專案。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-49277847e2e61a5f9a004a307f7fd1e8bdddab67%2F8_waterfall.png?alt=media)

1. 螺旋模型

由於瀑布的死板，開發了可以多次反覆、靈活性高的螺旋模型。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-970cea2db7741a145e9b38d8a6435215c342f2c5%2F8_spiral.png?alt=media)

1. 敏捷軟體開發

敏捷開發宣言核心就一個字“快”：

* 個體與互動優於過程與工具
* 有效的軟體優於完整的文件
* 客戶合作優於合同談判
* 響應變更優於遵循計劃

敏捷開發具體的方法有：

* 迭代式增量軟體開發過程（Scrum）
* 看板管理（Kanban）
* 快速應用開發(RAD)
* 敏捷統一過程(AUP)
* 動態系統開發模型(DSDM)
* 極限程式設計(XP)

其中，Scrum最受歡迎。Scrum的特色是每天要開會，由Scrum Master主持，負責推動專案進度，即專案經理的角色。Scrum將任務組織成衝刺（sprints）活動，即開發活動，每完成一次衝刺，系統就能夠上線執行，可能功能不全，但後續的每次衝刺都完善其功能，可參考微信的開發模式。

1. 能力成熟度模型

軟體成熟度模型（SCMM、SW-CMM、CMM，同義詞）描述了從事軟體開發組織經歷的不同成熟階段。

* L1-初始（Initial）：通常很少或沒有定義軟體開發過程。
* L2-重複（Repeatable）：基本生命週期管理流程出現。
* L3-定義（Defined）：開發人員依照一系列正式、文件化的軟體開發過程進行操作。
* L4-管理（Managed）：量化軟體開發過程。
* L5-最佳化（Optimizing）：持續改進軟體開發過程。

CMM已經被CMMI（能力成熟度模型整合）替代，CMMI第四階段稱為定量管理（Quantitatively Managed），且側重於不同階段間整合。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-c02e8b3e667fa3e91dc4c3d415a36505cbff7a5c%2F8_cmm.png?alt=media)

1. 軟體保證成熟度模型

軟體保證成熟度模型（SAMM）是OWASP維護的開源專案，將安全活動整合到軟體開發和維護過程中，為組織提供評估其成熟度的能力。SAMM將軟體開發過程劃分為五個業務功能：

* 治理（Governance）：組織為管理軟體開發過程而進行的活動。
* 設計（Design）：組織用於定義軟體需求和建立軟體的過程。
* 實施（Implementation）：建立和部署軟體元件並管理這些元件缺陷的過程。
* 驗證（Verification）：組織為確認程式碼滿足業務和安全要求而開展的活動。
* 運營（Operations）：組織在生命週期中維護安全性而採取的行動。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-f12855507faf2990aa8dda8e67f111422e148f0c%2F8_samm.png?alt=media)

1. IDEAL模型

代表過程改進活動的生命週期，共有五個階段：

* 啟動（Initiating）：確定改進的目標並活動相關支援。
* 診斷（Diagnosing）：確定目標與現狀的差異。
* 建立（Establishing）：制定實現目的的計劃。
* 行動（Acting）：根據計劃開始幹。
* 學習（Learning）：總結經驗教訓。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-071c932d23844035d4c9f974fb1d13ce0bf1745a%2F8_ideal.png?alt=media)

### 四、甘特圖和PERT

甘特圖是一種顯示不同時間專案和進度之間相互關係的條形圖。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-6a86789a0a0b75f96446782f62030e05589bc44a%2F8_gantt.png?alt=media)

專案評估審查技術（PERT）是一種專案排程工具，用於判斷軟體產品大小和計算風險評估標準差。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-9d44634d068c86620a25c14221bcaa216aa84c19%2F8_PERT.png?alt=media)

### 五、變更和配置管理

軟體投入使用後也會面臨各種變更（如新功能、改bug等），因此需要進行變更管理。

* 請求控制：該過程使用者請求軟體變更，管理人員執行成本/效益分析，開發人員最佳化任務。
* 變更控制：該過程開發人員解決使用者需求，開發新功能或修復漏洞。
* 釋出控制：完成新程式碼的開發後，經過使用者驗收測試釋出到生產環境。

除了變更管理外，軟體配置管理也非常重要，用於控制軟體版本、跟蹤和控制軟體配置的變更。

* 配置標識：管理員文件化組織內容軟體產品的配置。
* 配置控制：確保軟體版本的變更符合變更控制和配置管理策略。
* 配置狀態統計：跟蹤所有授權變更。
* 配置審計：定期開展配置審計，確保沒有發生未授權配置變更。

### 六、DevOps方法

DevOps用於解決IT部門間互不合作、提皮球等問題，將軟體開發、質量保證和技術運營整合到一起。DevOps模型與敏捷開發方法緊密配合，減少開發、測試、部署軟體所需的時間。DevOps基於自動化可實現持續整合/持續交付（CI/CD）的目標。快速開發和投產不能忽略安全性，也需要整合安全控制，因此提出了DevSecOps方法。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-f1ebacbad28a4f1f4df77adb359b333c97dcbb49%2F8_devops.png?alt=media)

### 七、應用程式程式設計介面

現如今的系統都不在是獨立系統，往往需要系統間互動，因此提供了應用程式程式設計介面（API）。

* API必須考慮身份驗證，通常透過API金鑰來完成。
* API也必須經過安全測試，以避免出現安全漏洞。
* curl可用於測試API，也可被駭客用於攻擊API。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-e895028235e9c40651c5c88d83f660e379a38b7b%2F8_api.png?alt=media)

### 八、軟體測試

程式碼在投產前應進行徹底地測試，需要考慮以下內容：

1. 合理性檢查（reasonableness check）：確保返回的值符合常理，如身高超過10米、存款餘額-1000元等。
2. 用例和誤用案例（use cases/misuse cases）：測試應結合正常使用者和非正常使用者活動進行測試。
3. 職責分離：軟體測試應該由非開發人員進行，保持軟體測試的獨立性。
4. 軟體測試理念：根據檢視程式碼的多少，有黑盒測試、灰盒測試、白盒測試，與滲透測試理念一致。

### 九、程式碼倉庫

程式碼倉庫（Code repositories）用於集中儲存程式碼，還提供版本控制、bug跟蹤、Web託管等功能，如GitHub。

程式碼倉庫的風險之一就是訪問控制，涉及機密資訊的程式碼需管控訪問許可權，避免敏感資訊洩密。

### 十、服務水平協議

服務水平協議（SLA）確保供應商提供的服務或產品滿足合同要求，不滿足則會涉及對供應商的處罰措施。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-8d2f572eadea373d83e1c7a796ee4692ea47e6f6%2F8_sla.png?alt=media)

### 十一、第三方軟體購置

組織的大多數軟體不是內部開發的，通常有幾個途徑：

1. 商用現貨（COTS）：具有標準協議或介面的軟體或硬體產品，也就是成熟的商業產品，如用友的財務軟體。
2. 軟體即服務（SaaS）：雲服務，如郵件系統。
3. 開源軟體（OSS）：開源專案提供的免費軟體。

無論採用哪種方法獲取軟體，都需要進行安全測試以確保安全性。

## D8-2：建立資料庫和資料倉儲

### 一、資料庫管理系統架構

1. 層次式和分散式資料庫

層次式資料庫以分層方式儲存資料，分散式資料庫將資料儲存在多個資料庫中，但在邏輯上是一個資料庫。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-5846dd4f1c547fb7e4d8e0d1d1586c73fe70f9ff%2F8_hierarchical.png?alt=media)

1. 關係型資料庫

關係型資料庫的主要元件是表，即關係，是非常流行的資料庫型別，如MySQL。

* 表中的列對應屬性（attributes）或欄位（fields），列的數量被視為度數（degree），通常不變；
* 表中的行對應記錄（record）或元組（tuple），行的數量被視為基數（cardinality），通常會發生變化。

鍵的型別

* 候選鍵（candidate key）：用於唯一標識表中記錄的屬性子集。
* 主鍵（primary key）：從候選鍵中選出用於唯一標識表中記錄的鍵。
* 備用鍵（alternate key）：未被選為主鍵的候選鍵。
* 外來鍵（foreign key）：用於建立兩個表之間關係，也叫參照完整性。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-1e2825493d26456d2ba0c4b28fd268a884f3fff2%2F8_relational.png?alt=media)

關係型資料庫使用的標準語言是結構化查詢語言（SQL），為使用者與資料庫互動提供了介面。SQL有兩個元件：資料定義語言（DDL）允許運算元據庫結構，資料操作語言（DML）允許運算元據庫資料。

### 二、資料庫事務

1. 定義

資料庫事務（database transactions）是指包含一個或多個資料庫操作的命令集合，要麼全部執行成功，要麼全部執行失敗。

* 以end結尾的每個SQL操作都具有獨立性，執行成功與失敗不影響其他操作；
* 以commit結尾的每個SQL操作都屬於一個事務，其中一個執行失敗，其他操作都會回滾。

1. ACID模型

* 原子性（Atomicity）：要麼全部成功、要麼全部失敗。
* 一致性（Consistency）：事務執行前後環境是一致的。
* 隔離性（Isolation）：事務之間互不影響。
* 永續性（Durability）：事務一旦提交資料不會丟失。

### 三、多級資料庫安全

多級安全資料庫指的是包含不同分類級別的資訊，應用安全標籤、知其所需等對使用者的訪問進行限制。

資料庫檢視（database views）透過限制可執行的SQL語句來進行許可權控制也可實現多級安全性。

1. 併發性

併發性（Concurrency）或編輯控制（edit control）是一種預防性安全機制，用以解決不同程序同時運算元據庫時保障資訊的正確性。

* 丟失更新：當兩個進行同時更新資料庫某條資料時，而互相不清楚對方活動，則會出現丟失更新。
* 髒讀：當程序從沒有成功提交的事務中讀取記錄時，則會出現髒讀。
* 髒寫：一個程序的事務回滾導致另一個程序已提交的資訊也回滾，則會出現髒寫。
* 不可重複度：一個程序讀取一個資料兩次，但讀取的結果不一致，則會出現不可重複讀。

併發性使用鎖特性，在同一時間僅允許一個使用者對某資料進行變更，拒絕其他使用者對該資料的訪問。

1. 聚合

聚合（aggregation）攻擊指的是使用SQL函式來獲取一個或多個表的記錄，以生成高價值的資料的過程。

1. 推理

推理（inference）攻擊是在聚合攻擊的基礎上，利用人類思維的演繹能力來獲取高價值資料。

1. 其他安全機制

* 時間標記：按時間順序執行事務來維護資料的完整性和可用性。
* 細粒度控制：基於內容的訪問控制、基於上下文的訪問控制以及單元抑制（cell suppression）都是細粒度控制的體現。
* 資料庫分割槽：根據資料的安全級別或內容型別對資料庫進行分割槽。
* 多例項（Polyinstantiation）：額外增加記錄或表，不同安全級別能訪問的資料的值是不同的。
* 噪聲和干擾（noise and perturbation）：在資料庫中插入錯誤或欺騙性資料來保護真實資料。

### 四、開放資料庫連線

開放資料庫連線（ODBC）用以解決應用程式與不同型別資料庫的通訊，即翻譯官的作用。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-daac3917c0d6e6846e2a0d6ea6cea4c42e514faa%2F8_OBDC.png?alt=media)

### 五、NoSQL

因資料庫效能或儲存型別的限制，許多組織開始使用非關係型資料庫，即NoSQL。

1. 鍵值儲存（key/value stores）

以鍵/值對儲存資訊，與程式設計中的字典一樣，適合高速存取和大資料場景。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-dcc8889c7687e67b9b6efdc08eabaf09a92c574b%2F8_key_value.png?alt=media)

1. 圖形資料庫（graph databases）

適合物件之間關係極其複雜的場景，如社交關係。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-2c697f9a969a2e595c21ea8ef462fa0845bb7040%2F8_graph.png?alt=media)

1. 文件儲存（document stores）

類似於鍵值儲存，但以文件形式儲存，儲存資訊可以非常複雜，如JSON。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-1d10743352a657de0d489b35f57288088fe4130c%2F8_document.png?alt=media)

### 六、儲存器威脅

資料庫是執行在作業系統、物理硬體之上的，因此也需要在其他方面加強風險控制。

1. 非法訪問

包括邏輯和物理上的，邏輯上透過許可權控制、資料機密等方式應對，物理上透過門鎖、保安等方式應對。

1. 隱蔽通道

透過非正常傳輸通道造成資料洩密。

## D8-3：理解基於知識的系統

### 一、專家系統

專家系統（expert systems）嘗試將人類在某個領域的知識具體化，用以在未來進行決策。

1. 知識庫

指的是包含專家經驗總結的已知規則，用if/then語句形式存在。如下所示：

* 如果使用者在夜晚1點～5點嘗試登入系統，則可能是駭客攻擊。
* 如果使用者多次嘗試登入系統失敗，則可能是駭客攻擊。
* 如果使用者登入系統成功後提升許可權，則可能是駭客攻擊。

1. 推理引擎 根據知識庫的規則與實際發生的資訊進行分析，從而做出正確決策的引擎。如下所示：

* 駭客攻擊的條件命中3及以上，做出駭客攻擊的報警。

專家系統的優劣取決於以上兩個元件的能力，適合於風險控制場景，不受制於人類情緒影響。

### 二、機器學習

機器學習（machine learning）技術使用分析能力從資料中發現知識，而不直接使用人類知識（如知識庫）。有兩種技術型別：

1. 監督學習（supervised learning）

使用標記資料進行訓練，即明確了哪是正確的結果，基於標杆進行模型開發。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-7192da94c508a95f25defcb542a18b3697f385fe%2F8_supervised.png?alt=media)

1. 無監督學習（unsupervised learning）

使用未標記資料進行訓練，即未明確哪些是正確的結果，主要是對資料進行分類。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-a1bc076a755878efcd1a007de4625290944a46f7%2F8_unsupervised.png?alt=media)

### 三、神經網路

計算單元鏈用來嘗試模仿人腦的生物推理過程，是機器學習技術的延伸，也被稱為深度學習或認知系統。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-b5a92dc57c2e3e43156f477d3d2176bb8becfd04%2F8_neural.jpeg?alt=media)

## D8-4：惡意軟體

### 一、惡意程式碼來源

最早由開發人員研製，後來經過傳播和演變已經形成來產業鏈，有開發的、投放的、收尾的等等。

### 二、病毒

計算機病毒主要有兩個功能：傳播和破壞。

1. 病毒傳播技術

* 主開機記錄（MBR）病毒：利用可引導介質傳播，如硬碟、隨身碟。
* 檔案感染病毒（File Infector Virus）：利用可執行程式進行傳播，如exe、com、msc。
* 同伴病毒（Companion Virus）：檔案感染病毒的變種，利用系統檔案相似的名稱來偽裝自己。
* 宏病毒（Macro Viruses）：利用VBA實現病毒功能，常見於Microsoft Office全家桶。
* 服務注入病毒（Service Injection Viruses）：將自己注入可信系統程序中，如svchost.exe。

1. 病毒技術

* 複合病毒（Multipartite Viruses）：使用多種傳播技術，如Marzia病毒。
* 隱形病毒（Stealth Viruses）：篡改作業系統欺騙反病毒軟體進而達到隱形目的。
* 多型病毒（Polymorphic Viruses）：每次感染都修改自身程式碼特徵從而讓反病毒軟體無法檢測。
* 加密病毒（Encrypted Viruses）：使用金鑰對自身進行加解密，形式上與多型病毒基本一樣。

1. 騙局

謊稱有一個賊牛逼的病毒要爆發，讓很多組織浪費時間和資源進行研究和防禦，這就是病毒騙局（hoaxes）。

### 三、邏輯炸彈

感染系統後在滿足一個或多個條件時才觸發的惡意程式碼，常見於員工離職前為伺服器植入邏輯炸彈，離職後數月才觸發破壞伺服器。

### 四、特洛伊木馬

不同的特洛伊木馬在功能上有很大區別，常見有如下型別：

* 破壞型：儘可能短時間內產生大規模破壞，如刪除資料。
* 黑產型：每次執行木馬都會訪問指定網站刷訪問量。
* 流氓殺軟：偽裝成防毒軟體誘導安裝，實際竊取使用者資料或欺騙付費。
* 遠端訪問木馬（RATs）：在系統中開啟後門，使攻擊者能夠遠端控制系統。
* 資源竊取：竊取系統的計算資源用於挖掘數字貨幣。

### 五、蠕蟲

具備自主傳播能力，破壞力很強大。

* CodeRed蠕蟲：隨機掃描IP地址，利用IIS版本漏洞進行傳播，再統一對白宮主頁發動DDoS攻擊。
* 震網病毒（Stuxnet）：利用0 day漏洞發動攻擊，首個針對基礎設施造成嚴重破壞的、國與國間網路戰爭的惡意程式碼。

### 六、間諜軟體和廣告軟體

* 間諜軟體（spyware）：監控使用者行為並向外傳送，如竊取你的鍵盤輸入。
* 廣告軟體（adware）：會瘋狂給你彈廣告視窗，或監視的購物行為並訪問購物網站。

這些軟體型別被稱為潛在不需要的程式（PUPs）。

### 七、勒索軟體

勒索軟體（ransomware）感染系統後加密整個或部分資料進行勒索，已成為當今非常流行的攻擊方式。

存在一個道德問題：被勒索後是否支付贖金？不支付恢復不了業務，支付了助長攻擊者的囂張氣焰。

### 八、惡意指令碼

安全運維人員使用指令碼來提升工作效率，如指令碼檢查系統配置是否符合基線要求。

攻擊者使用惡意指令碼來提升攻擊效率，如自動提權、建立賬號等等。

惡意指令碼除了落地成為檔案外，還有種無檔案惡意軟體（fileless malware），直接從惡意連結下載後再記憶體中執行，因此常規殺軟無法檢測。

### 九、零日攻擊

未有補丁能夠修復的漏洞被稱為零日漏洞。系統受影響的主要原因：

* 脆弱性視窗（window of vulnerability），補丁釋出和病毒庫更新與漏洞發現之間的延遲。
* 管理員未及時更新補丁，最不該、最容易出現的原因。

## D8-5：惡意軟體預防

### 一、易受惡意軟體攻擊的平臺

跟平臺的流行程度基本一致，早些時候都集中在Windows平臺，現在Mac、androids等系統的惡意軟體越來越多。

### 二、反惡意軟體

反惡意軟體即防毒軟體是最基礎的安全措施。主要有兩種檢測機制：

1. 特徵型

基於龐大病毒庫來進行檢測，誤報率低、檢測效率高、僅能檢測已知惡意軟體，檢測能力與病毒庫強繫結關係，因此需及時更新病毒庫。

1. 啟發式

基於惡意軟體行為進行檢測，誤報率高、檢測效率低、可以檢測未知惡意軟體。

### 三、完整性監控

完整性監控工具（如Tripwire）也提供了輔助反惡意軟體的能力，透過計算檔案雜湊值並定期檢查來發現惡意軟體感染跡象。

### 四、高階威脅保護

1. 終端檢測和響應（EDR）

除了包含反惡意軟體功能外，還加入了檢測和消除威脅的能力。

* 分析終端記憶體、檔案系統和網路活動是否存在惡意活動跡象；
* 自動隔離可能的惡意活動控制潛在危害；
* 整合威脅情報源，實施洞察其他地區的惡意行為；
* 與其他事故響應機制整合以自動化方式工作。

許多安全廠商提供託管服務，被稱為託管檢測和響應（MDR）服務。

1. 使用者和實體行為分析（UEBA）

關注使用者活動並構建正常活動模型，基於模型偏差檢測惡意行為。

1. 下一代終端保護工具

反惡意軟體保護、檔案完整性監控、終端檢測與響應和使用者實體行為分析整合使用。

## D8-6：應用程式風險和措施

### 一、應用程式攻擊

1. 緩衝區溢位

未對使用者的輸入進行驗證，輸入太大溢位到其他記憶體空間，可造成系統崩潰、執行任意程式碼等等。

1. TOCTOU

* 檢查時間（TOC）指的是主體檢查物件狀態的時間。
* 使用時間（TOU）指的是主體訪問物件的時間。
* TOCTOU攻擊被稱為競爭條件（race conditions）。

舉個例子：一個URL允許上傳檔案，但會對上傳的檔案格式進行檢查，不符合的要求的檔案會被刪除。如果上傳了一個webshell.php檔案，然後瘋狂訪問這個webshell檔案，就可能會在檔案被刪除前訪問到，那麼這個就是競爭條件攻擊。

1. 後門

開發人員在測試階段留的、用於除錯目的的後門叫維護鉤子，而攻擊者留的遠端控制的後門就是後門。

1. 特權提升和Rootkis

攻擊者拿到普通管理員許可權後，會使用rootkit（利用系統漏洞攻擊）工具獲得管理員許可權。

### 二、注入漏洞

1. SQL隱碼攻擊

SQL隱碼攻擊利用SQL命令拼接的方式來執行額外的命令獲取許可權之外的資訊。許多情況下SQL隱碼攻擊無法直接檢視返回結果，這種情況下則使用盲注攻擊（blind SQL injection）。通常有兩種型別：

* 基於內容盲注：根據不同的輸入得到不同的返回結果判斷是否存在注入點。
* 基於時間盲注：輸入加入延遲命令看返回時間是否延遲而判斷是否存在注入點。

1. 程式碼注入攻擊

試圖將攻擊者編寫的程式碼插入web應用程式合法程式碼的攻擊都是程式碼注入攻擊，如SQL隱碼攻擊。

* LDAP注入攻擊

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-918112e132886704818eabe763a547037845803e%2F8_ldap.png?alt=media)

* XML注入

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-09c61b46f1dbbe704af4c91208ac8fad8c6b87d9%2F8_xml.png?alt=media)

* 跨站指令碼XSS

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-4fee98d6cac44870e7a6c838a20fc003285e1b74%2F8_xss.jpg?alt=media)

1. 命令注入攻擊

某些情況下，應用程式程式碼可能會返回到作業系統以執行命令，那就可能出現命令注入攻擊。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-85dd6eb2abb6606054161dca56e7b78fb0a1797a%2F8_cmd.jpg?alt=media)

### 三、利用授權漏洞

1. 不安全的直接物件引用（Insecure Direct Object References）

根據使用者輸入的引數直接查詢相關資料，而不對使用者的許可權再次判斷就會出現不安全的直接物件引用。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-2a6d0edc8dcae4d7f7803a62b30738e0d79f86c0%2F8_object.png?alt=media)

1. 目錄遍歷（Directory Traversal）

當允許使用者瀏覽web伺服器目錄結構並訪問相應檔案時，使攻擊者可以透過目錄遍歷攻擊獲取密碼檔案或備份檔案。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-734c5571df1887c11c756b2d68b54bb7ba48bfe3%2F8_traversal.png?alt=media)

1. 檔案包含（File Inclusion）

檔案包含攻擊可執行檔案中包含的程式碼，從而使web伺服器執行目的碼。通常有兩種型別：

* 本地檔案包含：執行本地伺服器上的程式碼。
* 遠端檔案包含：執行遠端伺服器上的程式碼。

![](https://366271701-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8rn090lRzHL4UfRBIqer%2Fuploads%2Fgit-blob-238f87595cb7f75c6d974a9994af0992505ae06d%2F8_inclusion.png?alt=media)

### 四、利用Web應用程式漏洞

1. 跨站指令碼攻擊（XSS）

攻擊者將惡意程式碼插入網頁中用以攻擊客戶端。

* 反射型XSS：通常發生在應用程式允許反射輸入時，最典型是彈窗告警。
* 儲存型/持久型XSS：將跨站指令碼程式碼儲存在web伺服器上，就是儲存型XSS，又因為能夠持久存在，也稱為持久型XSS。

透過輸入驗證和輸出編碼進行防範。

1. 請求偽造（Request Forgery）

利用信任關係並試圖讓使用者無意中對遠端伺服器執行命令。有兩種形式：

* 跨站請求偽造（CSRF/XSRF）：利用遠端站點對使用者系統的信任來冒充使用者執行命令。
* 服務端請求偽造（SSRF）：透過篡改提及的URL可以對內網其他系統進行攻擊。

1. 會話劫持（Session Hijacking）

攻擊者攔截授權使用者和資源直接的通訊，使用劫持技術接管會話。常用劫持技術有：

* 抓取客戶端和伺服器間的身份驗證資訊進行客戶端偽裝
* 誘使客戶端認為攻擊者就是目標伺服器
* 使用使用者cookies資料訪問伺服器

透過反重放認證技術和cookies過期時間進行防範。

### 五、應用程式安全控制

1. 輸入驗證

對使用者的輸入進行驗證，以降低包含攻擊程式碼的可能性。

* 輸入白名單（input whitelisting）：僅允許清單裡的值進行輸入。
* 輸入黑名單（input blacklisting）：不允許清單裡的值進行輸入。
* 元字元（Metacharacters）：被賦予特殊程式設計含義的字元，通常使用轉義（Escaping）將其轉換成普通符號。
* 引數汙染（Parameter Pollution）：攻擊者向web應用程式同一個輸入變數傳送多個值，用以實現繞過輸入驗證機制。

執行輸入驗證必須在伺服器端實現，客戶端輸入驗證極容易被繞過。

1. Web應用防火牆

Web應用防火牆（WAF）工作在應用層，根據規則庫對網路流量中的惡意行為進行過濾，是對應用程式安全控制的補充措施。

1. 資料庫安全

* 引數化查詢（Parameterized queries）：開發人員準備SQL語句，僅允許使用者輸入變數的值，不允許插入額外程式碼。
* 儲存過程（Stored procedures）：與引數化查詢原理類似，但實現程式碼在資料庫伺服器上。
* 資料最小化（Data minimization）：最好的防禦，資料越少、風險越小。
* 令牌化（Tokenization）：使用唯一識別符號替代敏感資訊。
* 雜湊（Hashing）：將敏感資料透過雜湊計算形成替代識別符號，通常會加入鹽或胡椒用以抵抗彩虹表攻擊。

1. 程式碼安全

* 程式碼簽名（Code Signing）：使用私鑰對程式碼進行數字簽名，可提供完整性和不可否認性。
* 程式碼重用（Code Reuse）：透過使用第三方軟體庫和軟體開發工具包（SDK）來重用程式碼。
* 軟體多樣性（Software Diversity）：避免依賴於單個原始碼、二進位制可執行檔案或編譯器。
* 程式碼儲存庫（Code Repositories）：用於儲存和管理應用程式原始碼的位置。
* 完整性測量（Integrity Measurement）：利用雜湊演算法確保部署的程式碼與程式碼庫中的程式碼是一致的。
* 應用彈性（Application Resilience）：設計應用程式時需要考慮其能夠適應不斷變化的需求，有兩個方面：可伸縮性（Scalability）和彈性（Elasticity），參考雲端計算特性。

### 六、安全編碼實踐

1. 原始碼註釋（Source Code Comments）

原始碼註釋可以幫助開發人員理解程式碼實現的功能和原理，但也向攻擊者提供了便利，程式碼釋出前應刪除相關注釋。

1. 錯誤處理（Error Handling）

攻擊者會利用程式碼中的錯誤進行攻擊，因此開發人員應在程式碼中加入對錯誤的處理機制。另一方面，錯誤處理輸出的資訊也不能太過詳細，也容易被駭客利用。

1. 硬編碼憑證（Hard-Coded Credentials）

在某些情況下，開發人員可能會在原始碼中包含使用者名稱和密碼，有兩種情況：保留維護賬號用於開發維護，即後門漏洞；程式碼中的使用者名稱和密碼可能會被外人得知，即資訊洩漏風險。

1. 記憶體管理（Memory Management）

* 資源耗竭（Resource Exhaustion）

系統的資源是有限的，一旦全部用完就會造成系統拒絕服務，如記憶體洩漏（Memory leaks）。

* 指標解引用（Pointer Dereferencing）

指標是在記憶體中儲存另一個位置地址的記憶體的一個區域。如果應用程式訪問某一個資源，則會執行一個指標解引用的操作，即訪問指標指示的記憶體地址。如果指標是空的，那麼可能會導致系統崩潰或繞過安全控制，進而產生風險。
