張小梅,蘇俐竹(中國聯(lián)通研究院,北京 100048)
在數(shù)字化轉型背景下,作為云原生技術不可或缺的持續(xù)交付、DevOps、微服務和容器技術正在被廣泛使用,面對軟件交付周期所帶來的壓力,DevSecOps 理念被提出,DevSecOps 是一種融合了開發(fā)、安全及運營理念的全新的安全管理模式,其核心理念是:業(yè)務應用生命周期的每個環(huán)節(jié)都需要為安全負責,安全是整個IT 團隊(包括開發(fā)、測試、運維及安全團隊)所有成員的責任,并且需要貫穿到從研發(fā)至運營的全過程。
傳統(tǒng)研發(fā)運營安全側重于在測試及運營階段,進行安全威脅排除,漏洞修復,更多的是被動式安全防御。面對云原生時代業(yè)務需要頻繁調(diào)整、上線,亟需進行安全左移,在需求、研發(fā)階段便進行安全介入,從源頭處降低安全風險,實現(xiàn)主動式安全防御,從而構建覆蓋軟件應用服務全生命周期的安全體系。本文基于DevSecOps 理念,在明確業(yè)務系統(tǒng)安全需求的前提下,制定貫穿軟件系統(tǒng)全生命周期的實踐方案,通過在軟件開發(fā)的不同階段將安全工具或安全活動進行整合,將各個信息安全孤島進行串聯(lián),協(xié)同作戰(zhàn),實現(xiàn)安全設計、安全編碼、安全測試和安全運營的統(tǒng)一融合,在提升軟件系統(tǒng)研發(fā)過程標準化與自動化的同時,降低對效率的影響,也降低安全的成本。
依托DevSecOps 理念,通過構建安全工具鏈、整合安全流程、嵌入安全自動化檢查等方式,將安全貫穿設計、開發(fā)、測試、運營生命周期的每個環(huán)節(jié),推動研發(fā)運營安全體系向敏捷化、自動化演進,應對新的云服務開發(fā)運維模型,提高業(yè)務系統(tǒng)安全問題修復效率、降低安全運營成本。圖1 所示為軟件供應鏈安全治理體系。
圖1 軟件供應鏈安全治理體系
應用軟件安全設計是保證軟件安全的最根本前提,需要根據(jù)業(yè)務安全策略、合規(guī)需求、應用系統(tǒng)的特性等進行快速的分類分級,并根據(jù)系統(tǒng)分類分級情況分別定義不同的安全策略,進而選取合適的安全活動(見圖2)。在計劃階段通常涉及的安全活動主要包含安全培訓、威脅建模、安全開發(fā)衡量指標制定。
圖2 安全設計活動
a)安全培訓。DevSecOps 流程方面需要讓項目組成員清楚了解各個階段需要承擔的責任與義務,并進一步對DevSecOps 體系整體過程進行學習。DevSec-Ops 工具使用方面需要對項目組成員進行培訓,如對開發(fā)人員、安全人員進行安全工具的使用培訓,對運維管理人員進行安全基線工具、資產(chǎn)安全管理等工具的使用培訓。
b)威脅建模。為滿足DevOps 快速敏捷要求,可采用輕量級威脅建模方式,主要包括如下幾個步驟:首先,通過動態(tài)調(diào)查問卷快速收集有關業(yè)務系統(tǒng)、部署環(huán)境和合規(guī)性要求等方面的重要且詳細的信息,根據(jù)收集到的信息自動識別風險、威脅和潛在弱點;其次,根據(jù)預定義的安全和合規(guī)性策略對整體風險進行分類管理;最后,輸出安全設計方案,并對安全問題進行跟蹤。
c)衡量指標。根據(jù)業(yè)務應用系統(tǒng)的不同安全級別,制定對應的安全開發(fā)衡量指標,用于評估實施效果。
應用軟件編碼階段是業(yè)務安全問題修復成本最低的時期,依靠安全編碼規(guī)范、安全基礎庫SDK 的調(diào)用以及開源組件安全檢測,最大程度地保證在編碼階段消除安全風險,保證軟件的原生安全(見圖3)。
圖3 安全編碼方案
首先,針對OWASP TOP10 2021 和OWASP TOP10 2017 涉及的漏洞類型制定安全編碼規(guī)范,為應用系統(tǒng)的代碼編寫提供安全編碼方法、安全編碼用例、缺陷代碼示例和安全接口函數(shù)等,保證應用系統(tǒng)的編碼安全。下面給出幾個SQL注入漏洞安全編碼規(guī)范示例。
a)采用預編譯方式,使用占位符接收數(shù)據(jù)替換為SQL語句(見圖4)。
圖4 使用占位符接收數(shù)據(jù)替換為SQL語句示意
b)采用轉義用戶輸入方式,將可能惡意執(zhí)行的字符轉義為無法執(zhí)行的字符串(見圖5)。
圖5 將可能惡意執(zhí)行的字符轉義為無法執(zhí)行的字符串示意
其次,開發(fā)安全基礎庫接口函數(shù),打造安全基礎庫SDK 即安全軟件開發(fā)工具包,安全SDK 集成了為軟件工程師在開發(fā)過程中防御安全漏洞的一系列安全API,供軟件項目直接引用。基于安全編碼的SDK 庫,方便研發(fā)人員安全編碼,提高開發(fā)效率,同時通過為代碼漏洞修復提供安全接口,避免漏洞的二次引入。下面以防范SQL 注入漏洞為例,介紹SDK 包調(diào)研過程。
a)在項目中導入安全基礎庫SDK包(見圖6)。
圖6 項目中導入安全基礎庫SDK包示意
b)輸入與輸出結果對比,可以看到安全SDK的方法將用戶輸入的有害字符都做了相應的轉義,可以防止SQL注入(見圖7)。
圖7 輸入與輸出結果對比示意
最后,對編譯后的二進制包和源碼包進行分析,識別出項目包中引用的開源組件,檢測軟件系統(tǒng)的開源軟件組成成分、開源組件安全漏洞、開源組件許可證風險等,提高軟件開源組件風險整改效率。
應用軟件測試階段利用智能動態(tài)污點跟蹤技術,實現(xiàn)安全測試工作左移,將安全賦能至開發(fā)測試階段,在軟件的功能測試階段同步開展安全測試,提高安全漏洞的發(fā)現(xiàn)效率和準確性,使交付更安全的產(chǎn)品成為可能(見圖8)。
圖8 交互式應用安全檢測方案
首先,智能動態(tài)污點跟蹤技術依賴于字節(jié)碼插樁技術,將安全檢測Agent 融入到應用程序中,代理程序Agent 通過ASM 框架等方式可以對Class 字節(jié)碼加載至JVM 中時進行修改,從而插入跟蹤的邏輯內(nèi)容,達到污點跟蹤的目的。圖9 為插樁后的StringBuilder.append()方法,插樁程序植入了Void.dance 的代碼作為埋點程序,后續(xù)對此方法的調(diào)用都會經(jīng)由插樁程序接管。
圖9 插樁后的StringBuilder.append()方法示意
其次,當Agent完成Class插樁后,在被測應用運行時,會由埋點代碼進行智能動態(tài)污點跟蹤。一次污點跟蹤過程是在一個HTTP 請求中進行的,污點跟蹤隨著HTTP 請求一起開始,HTTP 請求的結束也標志著一次污點跟蹤的結束(見圖10)。智能動態(tài)污點跟蹤的漏洞檢測架構分為3 個部分:污點源(Source)、傳播過程(Propagator)和規(guī)則觸發(fā)(Sink)。污點源是獲取外部輸入數(shù)據(jù)的地方,傳播過程是污點數(shù)據(jù)進行傳播的地方,規(guī)則觸發(fā)是風險方法所在處。在應用程序運行過程中,Agent 將會跟蹤污點數(shù)據(jù)在應用程序中執(zhí)行的程序上下文,并分析外部進入的數(shù)據(jù)在程序內(nèi)部的傳播過程,判斷其是否經(jīng)過了安全過濾或者安全驗證機制,由此進行漏洞分析檢測。
圖10 污點跟蹤過程時序圖
應用發(fā)布運營階段利用JavaAgent 技術,在應用程序運行時動態(tài)編輯類字節(jié)碼,將自身防御邏輯注入到Java 底層API 和Web 應用程序當中,獲取代碼執(zhí)行流程,監(jiān)控敏感函數(shù)的調(diào)用,從而與應用程序融為一體,能實時分析和檢測Web 攻擊,使應用程序具備自我保護能力。該技術能夠利用請求的行為來判斷是否為攻擊請求,彌補WAF不能利用行為而僅用規(guī)則來判斷請求及無法獲取Web 應用運行時環(huán)境的缺陷,并且不會受加密影響,可直接定位到漏洞代碼文件和代碼行號,補充了東西向防護能力,與邊界防護能力聯(lián)動,實現(xiàn)縱深安全防御,可實時監(jiān)測Web 攻擊行為,增強0day漏洞應對能力。圖11為SQL注入漏洞防御示例。
圖11 com.mysql.jdbc.ConnectionImpl 類繼承關系圖
在Java 中,所有的數(shù)據(jù)庫讀寫操作都需要使用JDBC 驅動來實現(xiàn),JDBC 規(guī)范中定義了數(shù)據(jù)庫查詢的接口,例如Mysql 驅動包實現(xiàn)數(shù)據(jù)庫連接的實現(xiàn)類是:com.mysql.jdbc.ConnectionImpl,該類實現(xiàn)了com.mysql.jdbc.MySQLConnection 接口,而com.mysql.jdbc.MySQLConnection 類是java.sql.Connection 的子類,也就是說com.mysql.jdbc.ConnectionImpl 接口必須實現(xiàn)java.sql.Connection 定義的數(shù)據(jù)庫連接和查詢方法。當com.mysql.jdbc.ConnectionImpl 類被JVM 加載后會因為配置了應用自保護的Agent,該類的字節(jié)碼會傳遞到應用自保護的Agent 處理,應用自保護經(jīng)過分析后得出ConnectionImpl 類符合應用自保護內(nèi)置的Connection-PrepareStatementHook 類設置的Hook 條件(父類名/方法名/方法參數(shù)完全匹配),那么應用自保護就會使用ASM動態(tài)生成防御代碼并插入到被Hook的方法中。
圖12給出了未修改的ConnectionImpl 類代碼片段示意,圖13 給出了經(jīng)過應用自保護Agent 修改后的代碼片段示意。
圖12 未修改的ConnectionImpl類代碼片段示意
圖13 經(jīng)過應用自保護Agent 修改后的代碼片段示意
通過應用自保護Agent 增強后的ConnectionImpl類執(zhí)行任何SQL 語句都會被應用自保護Agent 捕獲,并檢測其合法性,從而實現(xiàn)了徹底的SQL 注入攻擊防御。應用自保護Agent 除了會在開發(fā)語言底層重要的API(如文件讀寫、命令執(zhí)行、SQL 注入等API)中設置防御點(API Hook 方式)以外,還能關聯(lián)應用上下文及請求的行為,對正常請求進行放行或不觸發(fā)Hook直接正常通過,對惡意請求(包含但不限于OWASP TOP10涉及的攻擊類型、后門攻擊、反序列化攻擊、內(nèi)存馬攻擊等)進行清洗,同時會對有風險的請求進行記錄并輸出相關特定加密日志,以便安全監(jiān)控平臺進行分析、溯源,快速定位攻擊信息及相關漏洞點。
本文基于DevSecOps 理念,構建了覆蓋軟件應用設計、編碼、測試、運營全過程的防御方案,能夠精準定位漏洞風險點,檢測、防御和監(jiān)控分析粒度深入代碼級,不受業(yè)務加密與鏈路加密的影響。該方案主要有以下4個方面的價值。
a)主動防御:進行安全左移,研發(fā)階段便進行安全介入,運營階段植入原生安全能力,進行貼身防護,不受業(yè)務加密與鏈路加密的影響,與邊界防護聯(lián)動,實現(xiàn)主動式安全防御。
b)測試高效:覆蓋加密應用場景,在軟件的功能測試階段同步開展安全測試,提升安全測試的覆蓋率及準確性,動態(tài)發(fā)現(xiàn)應用軟件組件漏洞,減少安全人員投入。
c)深度識別:不依賴于對攻擊請求單一的規(guī)則判斷,防御和監(jiān)控分析粒度深入代碼執(zhí)行邏輯及觸及的周邊對象。
d)精準攔截:可對攻擊進行精準捕獲,輸出建議處置方案,有效防護應用程序或其底層平臺上的0Day漏洞,防止未知威脅爆發(fā)。
為夯實網(wǎng)絡與信息安全技術,提高軟件應用系統(tǒng)和網(wǎng)絡環(huán)境的安全水平,抵御開源和云原生時代所帶來的新型風險,本文基于DevSecOps 理念,運用安全編碼、開源組件安全分析、智能動態(tài)污點跟蹤、應用運行時自保護等新技術,構建覆蓋應用軟件設計、編碼、測試、運營全生命周期的安全防護體系,精準定位漏洞風險點,檢測、防御和監(jiān)控分析粒度深入代碼級,且不依賴于單一規(guī)則,不受業(yè)務加密與鏈路加密的影響,能有效降低漏洞檢測誤報率,彌補網(wǎng)絡云化后“邊界安全防護”技術體系的不足,降低業(yè)務應用被攻陷的風險,推進安全能力原生化、服務化。
未來DevSecOps 應用發(fā)展將呈現(xiàn)出自動化、智能化的趨勢,DevSecOps 的目標是在不影響效率的前提下提升軟件系統(tǒng)安全性。隨著人工智能在多個領域的應用,人工替代效能逐漸突出,這與DevSecOps 在軟件供應鏈安全治理領域的目標高度一致,人工智能在未來將是DevSecOps必不可缺少的基礎能力。