天天看點

5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南

簡介: 随着業務演進和團隊擴張,軟體規模和調用鍊路越來越複雜。如若沒有良好的代碼檢測機制,隻依靠功能性驗證,團隊技術債會越累越高,開發團隊往往要花費大量的時間和精力發現并修改代碼缺陷,最終拖垮疊代進度、協作效率,甚至引發嚴重的安全問題。

本文作者: 喻陽,阿裡雲雲效算法專家

文章出處:阿裡巴巴DevOps實踐指南(指南下載下傳:https://developer.aliyun.com/topic/devops)

在日常研發過程中,我們通常面臨的代碼資産問題主要分為兩大類:代碼品質問題和代碼安全漏洞。

代碼品質問題

代碼品質其實是一個老生常談的話題,但問題是大家都知道它很重要,卻又不知道如何去提升和維護這一團隊的共同财産。一方面開發人員可能為了功能及時上線,疏忽了對品質的把控,另一方面開發人員編碼習慣和程式了解風格各異。長期下來代碼品質下降通常會自成因果,因為業務壓力大而趨于下降,又是以開發效率下降,進一步加大業務壓力,導緻惡性循環。

代碼安全問題

安全類問題往往隐藏在缺乏安全意識的編碼邏輯和未經檢測或維護的開源依賴元件中,難以在日常開發和代碼評審中被及時察覺。

代碼安全問題也可以分兩個方面進行分析:

  1. 編碼安全問題,即:安全規範類問題,通過避免不符合規範的代碼進入企業代碼庫,減少隐私資料洩露、注入類風險、安全政策漏洞的出現。
  2. 依賴安全問題,即:開源依賴三方元件引入的安全漏洞。根據 Synopsys 2020 開源安全報告顯示,99%以上的組織使用了開源技術。使用開源元件本身帶來的技術交流和站在巨人肩膀上協作、降低開發成本、加快疊代周期、提高軟體品質等優勢已經不必贅述,但是,開源軟體帶來一系列便利的同時,也暗藏大量安全風險,據審計,75%的代碼庫存在安全漏洞,其中 49%包含高危問題,另外 82%的代碼庫仍在使用超過 4 年的 outdated 元件。

是以,代碼安全類問題,一方面也需要進行準入性檢查,根據業務場景和規範配置安全編碼規範檢測和卡點。另一方面需要定期維護,對于新爆發出的安全漏洞進行及時察覺并修複。

解決方案

代碼品質檢測

工具1:Java 代碼規約檢測

阿裡巴巴在實踐過程中,各個組織由于曆史隔閡和業務風格差異,工程結構差别很大,代碼風格迥異,規範不一,溝通成本大,合作效率低,維護成本高。集團發展到現在的規模,需要專業化的技術集團軍疊代式、集約式發展,而不是動辄重複造輪,而真正專業化的團隊一定會有統一的開發規約,這代表效率、共鳴、情懷、可持續。

基于上述背景,阿裡制定了《阿裡巴巴 Java 開發手冊》,作為阿裡内部 Java 工程師所遵循的開發規範,涵蓋程式設計規約、單元測試規約、異常日志規約、MySQL 規約、工程規約、安全規約等。這是近萬名阿裡 Java 技術精英的經驗總結,并經曆了多次大規模一線實戰檢驗及完善。

制訂交通法規表面上是要限制行車權,實際上是保障公衆的人身安全。試想如果沒有限速,沒有紅綠燈,沒有靠右行駛條款,誰還敢上路。同理,對軟體來說,開發規約絕不是消滅代碼内容的創造性、優雅性,而是限制過度個性化,推行相對标準化,以一種普遍認可的方式一起做事。

是以,代碼規約的目标是:

  1. 碼出高效:标準統一,提升溝通效率和研發效能。
  2. 碼出品質:防患未然,提升品質意識和系統可維護性,降低故障率。
  3. 碼出情懷:工匠精神,追求極緻的卓越精神,打磨精品代碼。

代碼規約通過 IDE 檢測插件、流水線內建測試、代碼評審內建等工具手段,深度融入了阿裡巴巴的各種開發活動中。與此同時,在雲效代碼托管平台 Codeup 中,也内置內建了 Java 代碼規約檢測能力,為開發人員在代碼送出和代碼評審階段提供更為友善的快速檢查。

工具2:代碼智能更新檔推薦

缺陷檢測和更新檔推薦幾十年來一直是軟體工程領域的難題,又是研究者和一線開發者最為關心的問題之一,這裡講的缺陷不是網絡漏洞、系統缺陷,而是隐藏在代碼中的缺陷。幫助開發者識别這些缺陷,并進行修複,能夠大幅提升軟體品質。

基于業界和學術界較為流行的缺陷檢測手段,并分析和規避其局限性,阿裡巴巴 Codeup 的算法工程師們提出了一種新的算法,實作更加精準和高效的分析代碼缺陷并推薦優化方案,該算法已被國際軟體工程大會(ICSE)收錄。

5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南
  1. 根據 commit message 中的關鍵詞找出修複型的 commit,隻取涉及檔案小于 5 個的 commit(涉及檔案過多的 commit可能會稀釋修複行為)。這個步驟十分依賴開發者良好的 commit習慣,希望開發者能用好 commit,寫好message。
  2. 從這些修複型 commit 中以檔案級别提取删除内容和新增内容,即 Defect and Patch pairs(DP Pair),這一步難免會有很大的噪聲。
  3. 利用改進的 DBSCAN 方法對 buggy 和 patch 對同時聚類,将相似的缺陷和更新檔代碼聚在一起。(也可以做片段級的聚類)通過将相似的缺陷和修複做聚類,減少了上一步留下的大量噪聲,同時曆史代碼送出中大家共同犯過的錯具有很強的借鑒意義。
  4. 利用自研的模闆提取方法總結缺陷代碼和更新檔代碼,并根據不同的變量來适配上下文。

代碼更新檔推薦服務目前應用于合并請求的代碼自動掃描場景,在代碼評審過程中檢測可優化代碼片段并給出優化建議,将曆史評審中的人工經驗沉澱下來持續提升企業代碼品質。

代碼安全檢測

工具3:敏感資訊檢測

近年來,業内發生多起敏感資訊(API Key、Database credential、OAuth token 等)通過某些站點被無意識地洩露出去的事件,給企業帶來了安全風險,甚至直接的經濟損失。

在我們的實踐過程中,我們也面臨了類似的問題,寫死問題出現非常高頻,而又缺乏有效的識别機制。是以開發者和企業管理者亟需一款穩定健全的敏感資訊檢測方法和系統。通過調研我們了解到,目前已有的敏感資訊檢測工具大多單純使用規則比對或資訊熵技術,導緻其召回率或準确率難以滿足預期。是以我們在規則比對和資訊熵技術的基礎上,結合上下文語義,提出了一款采用多層檢測模型的敏感資訊檢測工具——SecretRadar。

5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南

SecretRadar 的技術實作思路主要分為三層,第一層采用規則比對這種傳統敏感資訊識别技術,規則比對具有良好的準确度和擴充性,但是非常依賴比較固化的長度、字首、變量名,難以應對不同開發者的不同編碼風格,容易造成漏報。針對難以固定規則捕捉的場景,在第二層我們采用了資訊熵算法。資訊熵算法用于衡量代碼行混亂程度,對随機生成型密鑰和随機身份資訊識别效果良好。但資訊熵算法也有其局限性,召回率提升的同時誤報也增多了。是以在第三層我們采用了模闆聚類和上下文語義分析等方法進行過濾優化,針對資訊熵結果聚合提取常見關鍵字,結合上下文語義和目前文法結構提升模型準确率。

敏感資訊檢測工具不止服務我們内部開發同學,在雲效平台上也支援了超過 2 萬代碼庫、3 千家企業,幫助開發者解決了超過 9 萬寫死問題。

工具4:源碼漏洞檢測

阿裡巴巴采用 Sourcebrella Pinpoint 源傘檢測引擎,進行源碼漏洞檢測,主要涉及到注入類風險和安全政策類風險檢測。

源傘檢測引擎是香港科技大學 Prism 研究組在過去十年的時間内的技術研究成果。該引擎吸收了國際上近十年的軟體驗證技術研究成果,并且加以改進和創新,獨立設計和實作了一套技術領先的軟體驗證系統。其主要驗證方式是将程式設計語言翻譯成一階邏輯和線性代數等數學表達,通過形式化驗證技術推理缺陷成因。迄今為止,一共發表了四篇核心技術相關的論文,一篇 PLDI 和三篇 ICSE,研究型的同學可以點選下方連結閱讀:

  • Pinpoint: Fast and Precise Sparse Value Flow Analysis for Million Lines of Code [1]
    • http://t.tb.cn/0qxIpFV5sRD5uxOcgED7o
  • SMOKE: Scalable Path-Sensitive Memory Leak Detection for Millions of Lines of Code [2]
    • http://t.tb.cn/2l96Jh2yqOGowsfs4oVk2m
  • Pipelining Bottom-up Data Flow Analysis [3]
    • https://qingkaishi.github.io/public_pdfs/ICSE2020a.pdf
  • Conquering the Extensional Scalability Problem for Value-Flow Analysis Frameworks [4]
    • https://qingkaishi.github.io/public_pdfs/ICSE2020b.pdf

源傘檢測引擎能夠在活躍度比較高的大型開源項目中發現隐藏超過 10 年的缺陷,以 MySQL 檢測 [5] 為例,這些缺陷都是市面上其他檢查工具無法掃描出來的,并且能夠在 1.5 小時完成 200 萬行大型開源項目的檢測。在保持掃描的高效率同時,還能夠将誤報率控制在 15%左右。對于複雜且體量龐大的分析項目來說,源傘檢測引擎所表現的掃描效率和誤報率在業内也處于領先水準。

「源碼漏洞檢測」內建了源傘檢測引擎的安全分析能力,能夠在分析精度、速度、深度等方面均衡得到較好的分析結果,具備的核心優勢:

  1. 支援分析位元組碼,二三方包的代碼邏輯都不會遺漏;
  2. 擅長跨函數長調用鍊路的邏輯分析;
  3. 可以處理引用、指針等帶來的間接資料修改;
  4. 精度高,相比于同類工具,如 Clang、Infer,在精度和有效問題識别上表現更佳;
  5. 性能好,目前單應用平均 5 分鐘左右分析完畢;
5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南

源傘檢測引擎可以精确的追蹤代碼中的資料流向,擁有高深度高精度的函數調用鍊分析能力,可以找到跨越多層函數的深度問題。在發現缺陷的同時還能給出問題觸發的過程,完整展示相關的控制流以及資料流,這樣可以輔助開發者快速了解和修複問題,在軟體開發早期更低成本地提高軟體品質,大幅減少生産成本,提高研發效能。

工具5:依賴包漏洞檢測

我們期望對于開源元件的安全可信程度,為開發者建立一種有效的檢測和管理機制,是以我們實作了依賴包漏洞檢測服務和依賴包安全問題報表。在實踐過程中,開發者普遍反映依賴包漏洞修複成本大多高于修複自身編碼漏洞,進而不願意或難于處理此類問題。究其原因,一方面是大部分漏洞并非直接引入,而是依賴的第三方元件又間接依賴了其它元件,另一方面是不确定具體哪個版本是幹淨可用且相容的。

5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南

為了降低開發者的修複難度,我們對依賴項的引用關系進行了進一步識别分析,清晰的标注出直接依賴和間接依賴,并定位到具體的依賴包引入檔案,友善開發者快速找到關鍵問題位置。同時,通過對漏洞資料的聚合,智能推薦修複漏洞的版本更新建議,因為一個依賴可能對應多個漏洞問題,開發者可以針對建議評估是否接受采用。通過分析不同版本間的 API 變更和代碼調用鍊路,衡量版本更新成本,為開發人員自動建立修複評審,最大程度的幫助開發人員更高效地維護代碼安全。

無論是代碼品質檢測還是代碼安全檢測,以上5款阿裡代碼自動檢測工具,開發者都可以在雲效Codeup内免費體驗。體驗路徑:建立/導入代碼庫--進入代碼庫--點選設定--點選內建服務-開啟代碼檢測。

5種阿裡常用代碼檢測推薦 | 阿裡巴巴DevOps實踐指南

【關于雲效】

雲效,雲原生時代一站式BizDevOps平台,支援公共雲、專有雲和混合雲多種部署形态,通過雲原生新技術和研發新模式,助力創新創業和數字化轉型企業快速實作研發靈活群組織靈活,打造“雙敏”組織,實作 10 倍效能提升。

立即體驗

繼續閱讀