ASVS 應用程式安全驗證標準(六)、Level 2A & 2B 要求細項
什麼是 Level 2A 安全測試(Penetration Test)?
本階段的要求細項又稱為人工滲透測試要求。你必須建立動態測試以驗證應用程式符合適當的設計、適當的實作和適當的使用安全控制措施。以下是 2A 的安全架構要求:
Code Review 指的是對應用程式的原始碼以人工搜尋和分析,來驗證應用程式符合適當的設計、適當的實作和適當的使用安全控制措施。以下是 2B 的安全架構要求:
詳細的的驗證要求有哪些?
ASVS 驗證要求細項共分為14大項。
V1. 建立安全架構的文件(Security Architecture)
為了滿足基礎安全,你應該了解應用程式架構並制定相關文件。如此檢測分析的結果才能追蹤到高階安全架構。Level 2A 應滿足,Level 2B應滿足:
V1.1 能正確識別應用程式中所有的原始檔、函式庫、執行檔。
V2. 身分鑑別(Authentication)
本項目將要求你安全的建立和控管使用者的認證資訊。Level 2A 應滿足,Level 2B應滿足:
V2.1 除了公開資源以外,所有頁面和資源都須經過身分鑑別,才能存取。
V2.2 所有密碼不能以任何方式顯示在網頁上。
V2.3 當身分鑑別的失敗次數過多,應用程式需自動將該帳號鎖定,而鎖定時間至少要能抵抗暴力破解法(Brute Force Attack)。
V5. 輸入資料驗證(Input Validation)
當所有輸入資料都是通過合法驗證的,才能保證安全的使用應用程式。Level 2A 應滿足,Level 2B應滿足:
V5.1 應用程式的執行環境不能有緩衝區溢位問題,即使有也能避免影響到應用程式。
V5.2 所有輸入資料都使用正向驗證規則(Positive Validation、又稱白名單規則)。
V5.3 當輸入資料驗證失敗後,應該退回、或消毒(過濾特殊字元)此筆資料。
V5.4 任何來源的輸入資料都應使用相同的字元集。(例 utf-8)
V5.5 驗證輸入資料的功能應實作在Server端。
V5.6 不同類型的資料應使用同樣的驗證控制。
V5.7 輸入資料的驗證失敗應紀錄( Logging )。
本階段的要求細項又稱為人工滲透測試要求。你必須建立動態測試以驗證應用程式符合適當的設計、適當的實作和適當的使用安全控制措施。以下是 2A 的安全架構要求:
- L2A.1 根據 Level 2A 的驗證要求細項(Detail Verification Requirements),人工執行應用程式的安全測試。
Code Review 指的是對應用程式的原始碼以人工搜尋和分析,來驗證應用程式符合適當的設計、適當的實作和適當的使用安全控制措施。以下是 2B 的安全架構要求:
- L2B.1 根據 Level 2B 的驗證要求細項(Detail Verification Requirements),人工執行應用程式的原始碼檢查。
詳細的的驗證要求有哪些?
ASVS 驗證要求細項共分為14大項。
V1. 建立安全架構的文件(Security Architecture)
為了滿足基礎安全,你應該了解應用程式架構並制定相關文件。如此檢測分析的結果才能追蹤到高階安全架構。Level 2A 應滿足,Level 2B應滿足:
V1.1 能正確識別應用程式中所有的原始檔、函式庫、執行檔。
V2. 身分鑑別(Authentication)
本項目將要求你安全的建立和控管使用者的認證資訊。Level 2A 應滿足,Level 2B應滿足:
V2.1 除了公開資源以外,所有頁面和資源都須經過身分鑑別,才能存取。
V2.2 所有密碼不能以任何方式顯示在網頁上。
V2.3 當身分鑑別的失敗次數過多,應用程式需自動將該帳號鎖定,而鎖定時間至少要能抵抗暴力破解法(Brute Force Attack)。
V2.5 身分鑑別的控制措施即使失效,也應安全的失效( Fail Securely )。
V2.13 所有密碼都應加入獨一無二的鹽,再進行雜湊。( Hash and Salt )
V2.14 應用程式用以存取外部服務的身分憑證,應加密後妥善保存,不能 Hard Code 在程式碼中。
V3. Session 管理機制(Session Management)
本項目包含以下要求: 安全的使用:Http request、response、session、cookies、headers,並適當的紀錄session狀況到log。Level 2A 應滿足,Level 2B應滿足:
V3.1 應用程式已經採用framework 預設的控制項。
V3.2 當使用者登出時,session 應當失效。
V3.3 當使用者停止活動一段時間時,session 應當失效。
V3.4 需身分鑑別後才能使用的所有頁面,都存在登出功能。
V3.5 Session id 不能包含在URL、錯誤訊息、Log,且重送URL不能取得合法的Session、Cookies。
V3. Session 管理機制(Session Management)
本項目包含以下要求: 安全的使用:Http request、response、session、cookies、headers,並適當的紀錄session狀況到log。Level 2A 應滿足,Level 2B應滿足:
V3.1 應用程式已經採用framework 預設的控制項。
V3.2 當使用者登出時,session 應當失效。
V3.3 當使用者停止活動一段時間時,session 應當失效。
V3.4 需身分鑑別後才能使用的所有頁面,都存在登出功能。
V3.5 Session id 不能包含在URL、錯誤訊息、Log,且重送URL不能取得合法的Session、Cookies。
V3.9 只有應用程式的 Framework 產生的 Session id 才視為有效。
V4. 存取控制(Access Control)
大部分的應用程式都會根據不同類別的使用者提供不同的服務。本項目包含各種資源的存取控制:URL、商業功能、資料、服務和檔案。Level 2A 應滿足,Level 2B應滿足:
V4.1 使用者須經過授權才能存取受保護的功能。
V4.2 使用者須經過授權才能存取受保護的URL。
V4.3 使用者須經過授權才能存取受保護的檔案。
V4.4 物件或檔案的直接連結只有經過授權的使用者才能存取。
V4.5 網站目錄不能被直接瀏覽,除非特別設計過。
V4.6 使用者存取特定服務時,需要經過特定授權。
V4. 存取控制(Access Control)
大部分的應用程式都會根據不同類別的使用者提供不同的服務。本項目包含各種資源的存取控制:URL、商業功能、資料、服務和檔案。Level 2A 應滿足,Level 2B應滿足:
V4.1 使用者須經過授權才能存取受保護的功能。
V4.2 使用者須經過授權才能存取受保護的URL。
V4.3 使用者須經過授權才能存取受保護的檔案。
V4.4 物件或檔案的直接連結只有經過授權的使用者才能存取。
V4.5 網站目錄不能被直接瀏覽,除非特別設計過。
V4.6 使用者存取特定服務時,需要經過特定授權。
V5. 輸入資料驗證(Input Validation)
當所有輸入資料都是通過合法驗證的,才能保證安全的使用應用程式。Level 2A 應滿足,Level 2B應滿足:
V5.1 應用程式的執行環境不能有緩衝區溢位問題,即使有也能避免影響到應用程式。
V5.2 所有輸入資料都使用正向驗證規則(Positive Validation、又稱白名單規則)。
V5.3 當輸入資料驗證失敗後,應該退回、或消毒(過濾特殊字元)此筆資料。
V5.4 任何來源的輸入資料都應使用相同的字元集。(例 utf-8)
V5.5 驗證輸入資料的功能應實作在Server端。
V5.6 不同類型的資料應使用同樣的驗證控制。
V5.7 輸入資料的驗證失敗應紀錄( Logging )。
V6.輸出內容編碼(Output Encoding/Escaping)
本項目要求,所有輸出資料應該適當的編碼再輸出到瀏覽器。Level 2A 應滿足,Level 2B應滿足:
V6.1 所有不受信任的資料(包含HTML元素、HTML屬性、Javascript、CSS和 URI 屬性)輸出到HTML網頁前,必須轉譯敏感字元(例如<> 轉換成<>)。
V6.2 輸出資料的編碼(Encode)和跳脫(Escape)應實作在Server端。
V6.3 不確定是否安全的字元都應經過編碼或跳脫,再傳給直譯器。(例 javascript Interpreter)
V6.4 不受信任的資料輸出到 SQL 直譯器之前,應使用參數化界面(Parameterized Interface)、預查詢(Prepare Statement)。
V6.5 不受信任的資料輸出到 XML 直譯器之前,應使用參數化界面(Parameterized Interface)。
V6.6 不受信任的資料輸出到 LDAP 查詢句之前,應適當的跳脫特殊字元。
V6.7 不受信任的資料被引用到作業系統命令的參數之前,應適當的跳脫特殊字元。
V6.8 不受信任的資料輸出到其他直譯器之前,應適當的跳脫特殊字元。
V7.密碼學(Cryptography)
本項目要求包含:應用程式的加密方法、金鑰管理、亂數、雜湊運算。你可以參考 FIPS 140-2 標準,採取符合美國國家標準的密碼模組。Level 2A 應滿足,Level 2B應滿足:
V7.1 用以保護秘密的加密功能應實作在 Server 端。
V7.2 加密的模組即使失效,也應安全的失效。
V7.3 任何主密鑰都應保護,避免未經授權的存取。(Master Secret用以產生次密鑰的依據)
V7.4 產生密碼的雜湊值都應加鹽 ( Hash and Salt ) 。
V7.5 加密模組的失敗也應記錄。
V7.6 使用政府認可的亂數產生器。
V8. 錯誤訊息管理和紀錄(Error Handling and Logging)
本項目包含,追蹤相關資安事件和攻擊行為的特徵。Level 2A 應滿足,Level 2B應滿足:
V8.1 所有錯誤訊息不能包含敏感資料,例如:Session ID 或 使用者個人資訊。
V8.2 Server端的錯誤應由Server端處理。
V8.3 記錄( Logging )的控制應實作在Server 端。
V8.4 安全控制措施中的錯誤訊息處理邏輯應預設為拒絕存取。
V8.5 記錄控制措施應能記錄關於安全的所有成功和失敗的事件。
V8.6 記錄檔的格式應包含,可靠的時間紀錄、事件嚴重性、是否跟安全有關、引起事件的使用者id、來源ip、成功或失敗的事件、事件描述。
V8.7 所有事件紀錄包含不受信任的資料,都不會被記錄檢視的軟體當作程式碼執行。
V8.8 安全事件紀錄未經授權不得存取和修改。
V8.9 應用程式的事件紀錄功能應實作在單一元件上。
V8.10 事件紀錄不能包含敏感資料,例如:Session ID 或 使用者個人資訊。
V8.11 應使用事件紀錄的分析工具,能以複合條件分析、查詢紀錄。
V9. 資料保護(Date Protection)
保護機敏資料保括信用卡號、護照號碼、個人ID,是本項目的主要要求。Level 2A 應滿足,Level 2B應滿足:
V9.1 機敏資料不得存放在客戶端的快取,也不能啟用自動完成功能。
V9.2 敏感資料應建檔管理,並建立明確政策,規定存取限制。
V9.3 敏感資料應存放在 HTTP 訊息的 Body,而非URL。
V9.4 送至 Client 端的敏感資料的複本,不論快取或暫存,不能被無權的他人存取,且合法使用者存取之後應該刪除。
V9.5 存放在 Server 端的敏感資料的複本,不論快取或暫存,不能被無權的他人存取,且合法使用者存取之後應該刪除。
V10. 通訊安全(Communication Security)
本項目包含,確保應用程式的通訊過程是安全的。Level 2A 應滿足,Level 2B應滿足:
V10.1 確保可信任憑證中心(Trusted CA)和 TLS 憑證之間的路徑暢通,且憑證是有效的。
V10.2 失敗的TLS連線,不能還原成未加密的連線。
V10.3 身分驗證或存取敏感資料的功能都應使用 TLS 。
V10.4 TLS 連線失敗應記錄。
V10.5 確認憑證路徑的正確性、確認所有客戶端的憑證都包含可信任的根中心(Trusted Anchor)和到期資訊。
V10.6 與外部系統的連線若包含敏感資料和功能,應先經過驗證。
V10.7 與外部系統的連線若包含敏感資料和功能,應使用最小權限的帳號。
V11. HTTP 安全(HTTP Security)
本項目包含,所有HTTP相關的安全要求,包括request、response、session、cookies、headers、logging。Level 2A 應滿足,Level 2B應滿足:
V11.1 網頁重新轉向(Redirect)不應包含未驗證的資料。
V11.2 應用程式的POST、GET應制訂規則,定義使用的方法。
V11.3 HTTP response 的 header 應包含一種安全字元集,例如UTF-8。
V11.4 不需要被客戶端以 Javascript 存取的 Cookies 應加上 HTTPOnly 的屬性。
V11.5 包含敏感資訊的 Cookies 應加上 Secure Flag 。
V11.6 Request 和 Response 的 HTTP Header 應只包含 可顯示的 ASII 字元。
V12. 環境設定(Security Configeration)
本項目包含:應用程式環境中的所有和安全有關的設定檔應存放在安全的位置。保護設定檔資訊對於應用程式的安全是很重要的。Level 2A 應滿足,Level 2B應滿足:
V12.1 與安全相關的設定檔,未經授權不能存取。
V12.2 當應用程式無法讀取本身的安全設定檔,應拒絕所有連線。
V13. 惡意程式碼的搜尋(Malicious Code Search)
本項目對象是通過 Level 3的應用程式,確保應用程式中完全不包含惡意程式碼(被掛馬)。Level 2 在此項目並不用滿足任何要求。
V14. 內部安全(Internal Security)
本項目對象是通過 Level 2的應用程式,確保應用程式中擁有自我驗證保護,避免內部開發人員的實作缺失或是邏輯炸彈。Level 2 在此項目並不用滿足任何要求。
下次我們將介紹 Level 3 系統設計驗證的要求。
參考資料
本項目要求,所有輸出資料應該適當的編碼再輸出到瀏覽器。Level 2A 應滿足,Level 2B應滿足:
V6.1 所有不受信任的資料(包含HTML元素、HTML屬性、Javascript、CSS和 URI 屬性)輸出到HTML網頁前,必須轉譯敏感字元(例如<> 轉換成<>)。
V6.2 輸出資料的編碼(Encode)和跳脫(Escape)應實作在Server端。
V6.3 不確定是否安全的字元都應經過編碼或跳脫,再傳給直譯器。(例 javascript Interpreter)
V6.4 不受信任的資料輸出到 SQL 直譯器之前,應使用參數化界面(Parameterized Interface)、預查詢(Prepare Statement)。
V6.5 不受信任的資料輸出到 XML 直譯器之前,應使用參數化界面(Parameterized Interface)。
V6.6 不受信任的資料輸出到 LDAP 查詢句之前,應適當的跳脫特殊字元。
V6.7 不受信任的資料被引用到作業系統命令的參數之前,應適當的跳脫特殊字元。
V6.8 不受信任的資料輸出到其他直譯器之前,應適當的跳脫特殊字元。
V7.密碼學(Cryptography)
本項目要求包含:應用程式的加密方法、金鑰管理、亂數、雜湊運算。你可以參考 FIPS 140-2 標準,採取符合美國國家標準的密碼模組。Level 2A 應滿足,Level 2B應滿足:
V7.1 用以保護秘密的加密功能應實作在 Server 端。
V7.2 加密的模組即使失效,也應安全的失效。
V7.3 任何主密鑰都應保護,避免未經授權的存取。(Master Secret用以產生次密鑰的依據)
V7.4 產生密碼的雜湊值都應加鹽 ( Hash and Salt ) 。
V7.5 加密模組的失敗也應記錄。
V7.6 使用政府認可的亂數產生器。
V8. 錯誤訊息管理和紀錄(Error Handling and Logging)
本項目包含,追蹤相關資安事件和攻擊行為的特徵。Level 2A 應滿足,Level 2B應滿足:
V8.1 所有錯誤訊息不能包含敏感資料,例如:Session ID 或 使用者個人資訊。
V8.2 Server端的錯誤應由Server端處理。
V8.3 記錄( Logging )的控制應實作在Server 端。
V8.4 安全控制措施中的錯誤訊息處理邏輯應預設為拒絕存取。
V8.5 記錄控制措施應能記錄關於安全的所有成功和失敗的事件。
V8.6 記錄檔的格式應包含,可靠的時間紀錄、事件嚴重性、是否跟安全有關、引起事件的使用者id、來源ip、成功或失敗的事件、事件描述。
V8.7 所有事件紀錄包含不受信任的資料,都不會被記錄檢視的軟體當作程式碼執行。
V8.8 安全事件紀錄未經授權不得存取和修改。
V8.9 應用程式的事件紀錄功能應實作在單一元件上。
V8.10 事件紀錄不能包含敏感資料,例如:Session ID 或 使用者個人資訊。
V8.11 應使用事件紀錄的分析工具,能以複合條件分析、查詢紀錄。
V9. 資料保護(Date Protection)
保護機敏資料保括信用卡號、護照號碼、個人ID,是本項目的主要要求。Level 2A 應滿足,Level 2B應滿足:
V9.1 機敏資料不得存放在客戶端的快取,也不能啟用自動完成功能。
V9.2 敏感資料應建檔管理,並建立明確政策,規定存取限制。
V9.3 敏感資料應存放在 HTTP 訊息的 Body,而非URL。
V9.4 送至 Client 端的敏感資料的複本,不論快取或暫存,不能被無權的他人存取,且合法使用者存取之後應該刪除。
V9.5 存放在 Server 端的敏感資料的複本,不論快取或暫存,不能被無權的他人存取,且合法使用者存取之後應該刪除。
V10. 通訊安全(Communication Security)
本項目包含,確保應用程式的通訊過程是安全的。Level 2A 應滿足,Level 2B應滿足:
V10.1 確保可信任憑證中心(Trusted CA)和 TLS 憑證之間的路徑暢通,且憑證是有效的。
V10.2 失敗的TLS連線,不能還原成未加密的連線。
V10.3 身分驗證或存取敏感資料的功能都應使用 TLS 。
V10.4 TLS 連線失敗應記錄。
V10.5 確認憑證路徑的正確性、確認所有客戶端的憑證都包含可信任的根中心(Trusted Anchor)和到期資訊。
V10.6 與外部系統的連線若包含敏感資料和功能,應先經過驗證。
V10.7 與外部系統的連線若包含敏感資料和功能,應使用最小權限的帳號。
V11. HTTP 安全(HTTP Security)
本項目包含,所有HTTP相關的安全要求,包括request、response、session、cookies、headers、logging。Level 2A 應滿足,Level 2B應滿足:
V11.1 網頁重新轉向(Redirect)不應包含未驗證的資料。
V11.2 應用程式的POST、GET應制訂規則,定義使用的方法。
V11.3 HTTP response 的 header 應包含一種安全字元集,例如UTF-8。
V11.4 不需要被客戶端以 Javascript 存取的 Cookies 應加上 HTTPOnly 的屬性。
V11.5 包含敏感資訊的 Cookies 應加上 Secure Flag 。
V11.6 Request 和 Response 的 HTTP Header 應只包含 可顯示的 ASII 字元。
V12. 環境設定(Security Configeration)
本項目包含:應用程式環境中的所有和安全有關的設定檔應存放在安全的位置。保護設定檔資訊對於應用程式的安全是很重要的。Level 2A 應滿足,Level 2B應滿足:
V12.1 與安全相關的設定檔,未經授權不能存取。
V12.2 當應用程式無法讀取本身的安全設定檔,應拒絕所有連線。
V13. 惡意程式碼的搜尋(Malicious Code Search)
本項目對象是通過 Level 3的應用程式,確保應用程式中完全不包含惡意程式碼(被掛馬)。Level 2 在此項目並不用滿足任何要求。
V14. 內部安全(Internal Security)
本項目對象是通過 Level 2的應用程式,確保應用程式中擁有自我驗證保護,避免內部開發人員的實作缺失或是邏輯炸彈。Level 2 在此項目並不用滿足任何要求。
下次我們將介紹 Level 3 系統設計驗證的要求。
參考資料
----
http://zh.wikipedia.org/zh-tw/%E7%BB%9F%E4%B8%80%E5%BB%BA%E6%A8%A1%E8%AF%AD%E8%A8%80
http://wiki.mbalib.com/zh-tw/%E4%BC%81%E4%B8%9A%E6%B5%81%E7%A8%8B%E5%9B%BE
https://www.owasp.org/index.php/Fail_securely
http://www.cnblogs.com/ryowu/archive/2010/12/29/1920687.html
http://php.net/manual/en/pdo.prepared-statements.php
http://likewaylai.blogspot.com/2012/02/javasession-cookie-httponly-flag.html
http://likewaylai.blogspot.com/2012/02/javasession-cookie-secure-flag.html
http://amath.colorado.edu/computing/unix/ascii.html
http://wiki.mbalib.com/zh-tw/%E4%BC%81%E4%B8%9A%E6%B5%81%E7%A8%8B%E5%9B%BE
https://www.owasp.org/index.php/Fail_securely
http://www.cnblogs.com/ryowu/archive/2010/12/29/1920687.html
http://php.net/manual/en/pdo.prepared-statements.php
http://likewaylai.blogspot.com/2012/02/javasession-cookie-httponly-flag.html
http://likewaylai.blogspot.com/2012/02/javasession-cookie-secure-flag.html
http://amath.colorado.edu/computing/unix/ascii.html
留言
張貼留言