本文由美團安全研究員喬丹分享,作者碩士畢業于復旦大學,目前在美團致力于云原生安全建設。原題“淺談硬編碼密碼及其掃描工具”,下文進行了排版和內容優化。
1、引言
密碼是對服務、系統和數據的訪問權限進行授權的數字身份憑證,常見的密碼有API密鑰、非對稱私鑰、訪問Token等。硬編碼密碼(Hardcoded Secret),或稱嵌入式密碼(Embedded Secret),是指將密碼以明文方式直接寫入代碼中。這種處理方式極大地提高了攻擊者命中密碼的概率,使服務或系統暴露在風險中,容易造成嚴重損失。
針對此問題,本文詳細討論了硬編碼密碼的成因、危害及治理方法,同時本文從安全人員的角度出發,對現有的硬編碼密碼檢測工具的算法進行了深入調研,并提出了我們的自動化檢測工具。
2、系列文章
本文是IM通訊安全知識系列文章中的第15篇,此系列總目錄如下:
3、為什么會用硬編碼密碼
隨著互聯網組織轉向云架構、SaaS 平臺和微服務,密碼等數字身份驗證憑證的數量和多樣性正在快速增長。與此同時,企業也不斷推動更短的發布周期,開發人員面臨巨大時間壓力的同時,需要處理的密碼量比以往任何時候都多。許多開發人員采取捷徑,選擇使用硬編碼的方式處理密碼。
在企業的代碼倉庫中普遍存在大量的硬編碼密碼問題。據GitGuardian統計,在公共Git存儲庫上每天會泄露數以千計的密碼,其中僅2020年就有超過200萬個密碼被上傳至Git存儲庫中,而2021年該組織發現的密碼數量超過600萬,同比增長近2倍,而私人存儲庫的密碼泄露事件存在可能性比公共庫高4倍。
根據統計,硬編碼密碼包括API密鑰、訪問Token、非對稱私鑰、認證ID、安全證書、口令、特權用戶賬戶等類型。
硬編碼密碼所涉及的平臺十分廣泛,包括如下領域:
- 1)開發工具,如Django、Rapid API;
- 2)數據存儲,如MySQL、Mongo;
- 3)金融服務,如PayPal、Amazon MWS;
- 4)消息通訊系統,如Gmail、Telegram;
- 5)云提供商,如AWS、Azure、Google;私鑰;
- 6)社交媒體,如Twitter、Facebook;
- 7)版本控制平臺,如Github、Gitlab 等等。
除了程序代碼中,這些硬編碼還容易出現在基礎設施配置文件、監控日志、運行日志、堆棧調試track記錄、git歷史中。所有類別的硬編碼密碼都使企業暴露在攻擊之下。
4、硬編碼密碼的典型危害
硬編碼密碼主要對安全和研發兩方面具有危害。
1) 削弱系統安全性:
攻擊者常通過公共代碼庫或反編譯分析獲得硬編碼密碼字符串,利用密碼訪問敏感數據或獲取敏感操作權限。攻擊者還可以進一步擴大攻擊范圍,進行數據勒索、帳戶操縱、帳戶創建、通過用戶數據進行利用等,使得企業和用戶都遭受嚴重損失。在以下案例中,攻擊均是從密碼的泄露開始的:2014年,Uber數據庫被未經授權訪問,導致數千名Uber司機私人信息的數據被泄露;2016年,Uber又因外部的未授權訪問導致5700萬用戶的個人信息被泄露;2018年,Github和Twitter在內部日志系統中以明文方式存儲密碼,分別涉及2700萬和3.3億用戶數據泄露;2020年,用戶在Github倉庫中發現了星巴克的API密鑰,涉及重大信息泄露;2021年,黑客組織 Sakura Samurai 在一次重大數據泄露事件中獲得了訪問聯合國 (UN) 員工私人數據和系統的權限……由硬編碼密碼導致的安全事故層出不窮,也不斷有相關CVE和CWE被披露。
硬編碼密碼對特定設備、固件、服務、應用程序本身,對其連接的IT生態系統其他部分,甚至使用服務的第三方都存在風險,使其同樣暴露在風險中。
2)不易于程序維護:
硬編碼密碼的修復較為困難,密碼一旦被利用無法輕易被修正。對于正在線上運行的服務或系統,修復硬編碼密碼問題需要停服重新發布。大型企業的服務流量較大,服務間還存在依賴,則需要灰度發布,修復流程更長,其間可能持續受到攻擊者威脅。
密碼的蔓延也使維護變得困難。與傳統憑證不同,密碼旨在分發給開發人員、應用程序和基礎設施系統,這將不可避免地使開發中使用的密碼數量增加,一個密碼可能出現在代碼中多處位置,這進一步增加了修復的難度。
此外,開源的代碼造成密碼泄露,即使在源碼中刪除硬編碼密碼,也會殘留在git歷史里。
5、怎樣避免硬編碼密碼
企業代碼中的硬編碼密碼問題日益嚴重,只有通過安全人員和研發人員的共同協作才能解決。源代碼中的密碼泄露很難徹底避免,但與其他漏洞一樣,它完全由內生因素決定:開發人員需要訪問更多的資源,以更快的速度構建和部署。這意味著只要有足夠的紀律和教育,再加上正確的工具,就有可能大幅改善這種情況。
從開發人員角度:需要注意盡量避免將密碼以明文形式寫入代碼中。代碼中需要對密碼進行校驗時,對入站身份驗證可使用強單向散列函數進行密碼模糊化,并將這些散列結果存儲在具有適當訪問控制的配置文件或數據庫中;對出站身份驗證,可將密碼存儲在代碼之外的一個經過嚴格保護的、加密的配置文件或數據庫中,該配置文件或數據庫不會被所有外部人員訪問,包括同一系統上的其他本地用戶;大型企業可以使用KMS服務進行一站式密碼管理。
從安全人員角度:應盡量做到風險左移,盡早發現密碼泄露,幫助開發人員降低修復成本。可通過代碼檢測掃描,將硬編碼密碼檢測集成到開發工作流程中,提前發現硬編碼密碼問題。
6、硬編碼密碼的典型檢測方法
由于硬編碼密碼有如此的危險性,學術界和工業界都有許多組織針對此問題研發了代碼掃描工具。我們對開源工具和學術文章進行了一系列調研,總結了目前的硬編碼密碼掃描工具常用的檢測算法,并對其優缺點進行了討論。
6.1 正則表達式匹配
正則表達式通常被用來檢索符合某種模式的字符串。對于檢測具有固定結構或特征的密碼,正則表達式可能很有效。
常用于密碼檢測的正則表達式可分為:
- 1)針對各種特定平臺密碼的表達式;
- 2)不針對任何平臺的通用表達式。
1)針對各種特定平臺密碼的表達式:
許多平臺的API密鑰、訪問Token、認證ID等具有平臺獨有的特征,例如亞馬遜AWS密鑰均以“AKIA”字符串開頭;常用于非對稱加密的私鑰如RSA、EC、PGP及通用私鑰等,常由ssh-keygen、openssl等工具生成,多數情況下私鑰以單獨的PEM等文件格式存儲,其內容也具有一定特征,例如RSA私鑰文件由"-----BEGIN RSA PRIVATE KEY-----"字符串作為開頭。對于這類密碼,可以通過匹配具有其特征的正則表達式進行檢測。
下表列舉了部分常用平臺密碼的類型以及正則表達式。本文僅以此表舉例,實際上特定平臺的密碼種類十分豐富,此處不便一一列舉。
2)不針對特定平臺的通用的表達式:
由于特定平臺表達式和平臺的一一對應性質,其覆蓋范圍有限,此時需要用覆蓋范圍較廣的通用表達式來補充。許多平臺的密碼具有一些通用的特征,例如密碼字符串以api_key、access_token等關鍵字為開頭。
此外,根據開發人員的編程命名習慣規范,也可以根據變量名中的關鍵字進行匹配,例如變量名中含有Secret、Token等關鍵字的字符串很可能是密碼。
優點:
缺點:
- 1)正則表達式覆蓋范圍不夠廣則容易漏報;
- 2)使用一組不準確的正則表達式容易出現大量誤報;
- 3)即使是正確的正則表達式也有一定程度的誤報,例如“AKIAXXXEXAMPLEKEYXXX”雖然符合亞馬遜AWS的正則表達式,但并不是有效的密碼;
- 4)通用表達式中使用變量名關鍵字匹配的檢測方法容易被對抗。
6.2 熵字符串編碼檢測
在信息論概念中,熵是對不確定性的量度,越隨機的數據的熵越高。大多數API密鑰、訪問Token等密碼字符串具有高度熵的特性,因此可以通過搜索高熵字符串來檢測密碼。這種算法被以TruffleHog為代表的工具所采用。現有的工具一般采用香農熵算法來計算字符串熵值,對字符串A的香農熵值計算公式如下圖所示,其中pi表示第i個字符出現的頻率。
1)優點:
- 1)能夠檢測出無明顯特征的密碼,對于正則表達式未覆蓋到的范圍有補充效果;
- 2)可用于對正則表達式檢測結果的驗證,如上文提到的正則表達式誤報字符串“AKIAXXXEXAMPLEKEYXXX”,其熵值較低,可通過驗證篩除。
2)缺點:
- 1)字符串被判定為密碼的熵閾值難以確定,閾值過高容易漏報,閾值過低又容易誤報。即使是學術論文中的閾值也全憑實驗經驗確定,缺乏堅實的理論支撐;
- 2)一些高熵值的SHA、MD5等字符串容易被誤報為密碼。對于這一問題,可通過過濾SHA、MD5值出現較密集的文件擴展名來降低誤報,例如.lock, .inc文件;
- 3)容易將具有明顯升降序的字符串誤報為密碼。香農熵只對出現頻率進行計算,不考慮字符順序,具有明顯升降序的字符串同樣會表現出較高熵值,例如Hex編碼的“123456789abcdef”和“d9b41a72f683ce5”兩字符串香農熵相等,但前者一般不會是一個有效的密碼。對于這一問題,需要通過一些啟發式處理方式降低升降序字符串的熵值,或通過后期過濾篩除。
7、美團的硬編碼密碼檢測工具研發實踐
為了保障美團整體研發環境安全,同時節約安全人員的審計成本,我們研發了針對硬編碼密碼的代碼掃描工具。我們認為在眾多字符串中尋找密碼如同在沙里淘金,因此將工具命名為Gold-digger。
7.1 工具設計
為服務于全公司研發環境,Gold-digger工具有如下需求:
- 1)編程語言無關:公司各業務使用的編程語言不同,Gold-digger需要無障礙地應用于所有編程語言代碼中;
- 2)模塊化,方便擴展迭代:為了根據測試反饋結果不斷提高效果,Gold-digger需要長期不斷迭代;
- 3)能夠集成到軟件開發生命周期中:Gold-digger側重預防,需要工具集成在CI/CD管道中,從源頭遏制密碼泄露風險;
- 4)高精確率召回率:Gold-digger的設計初衷之一是節約人力成本,為降低審計、維護和運營壓力,必需盡可能準確、全面地檢測密碼。
基于上述需求,Gold-digger的架構主要分為四個模塊:核心引擎、轉換器、檢測器、過濾器。
Gold-digger工作流程如下圖,箭頭表示數據流向。核心引擎依次讀取代碼倉庫中文件,經過預驗證和輸入處理后將代碼以行為單位傳輸給檢測器,其中部分特殊格式由轉換器處理后再傳輸給檢測器;檢測器在代碼中檢測密碼候選值;過濾器對密碼候選值進行后過濾,將過濾后的密碼傳回核心引擎;最后核心引擎將代碼倉庫中所有密碼進行收集后,將密碼相關信息輸出為可讀性較強的JSON文件報告。
1)核心引擎:
該模塊為Gold-digger賦能,負責調度其他模塊,也是負責輸入輸出處理、數據收集存儲等。輸入處理部分負責讀取代碼文件,先調用過濾器對文件后綴進行全局預驗證,再通過引號標識匹配或調用轉換器識別代碼中的字符串及其賦值變量;然后核心引擎調用調用檢測器和過濾器進行密碼收集,將檢測到的密碼數據以文件為單位存入不同集合,能夠方便地對集合進行合并、刪減等操作;輸出處理部分將倉庫中所有密碼關鍵信息,如密碼值、文件位置、檢測算法等,輸出為JSON格式。
2)轉換器:
該模塊是專為部分特殊格式文件進行格式轉換的處理器。盡管核心引擎能處理大部分代碼格式,但無法處理.yaml、.ini、.properties等不使用引號作為字符串特征標識的格式。為保證語言無關性,我們使用轉換器處理上述特殊格式,將其轉換為用引號標識字符串的代碼。這種解析方式無需為不同語言分析抽象語法樹,能夠有效節省算力。
3)檢測器:
該模塊是Gold-digger的密碼檢測算法模塊。我們在綜合調研同類型檢測工具后,汲取了各方優點,采用了正則表達式匹配和熵字符串檢測兩類算法。Gold-digger的檢測器包含數十種特定平臺正則表達式、通用正則表達式以及Hex編碼、Base64編碼的熵字符串檢測算法。檢測器中每種算法以插件方式各自獨立,方便擴展、啟用或禁用,同時Gold-digger也允許用戶自定義檢測算法插件。代碼將遍歷所有檢測算法,任一算法命中便記錄為密碼候選值。
4)過濾器:
該模塊為Gold-digger的驗證、過濾模塊。預驗證部分在檢測器運行前對文件格式進行驗證,篩除壓縮文件、多媒體文件等非文本類型;后過濾部分在檢測器運行后對所有密碼候選值進行啟發式過濾,并將過濾后的密碼傳回核心引擎。后過濾過程中每項密碼候選值將遍歷所有過濾規則,所有規則都未能篩除的候選值會被記錄在密碼集合中(檢測器和過濾器的主要處理流程如下圖所示)。過濾規則主要為開發測試人員憑經驗總結的啟發式規則,例如:過濾升降序字符串、過濾高度重復字符串、過濾uuid、過濾間接引用賦值等。
5)CI/CD集成:
Gold-digger的最終目標是消除代碼中的密碼泄露問題,因此檢測到密碼并不是最后一步,修復才是最后一步。我們把Gold-digger集成到公司研發環境CI/CD管道中,方便開發人員根據密碼報告及時修復漏洞,從源頭遏制風險。當開發人員向公共存儲庫提交代碼后,Gold-digger會進行on-push掃描,對包含密碼的提交進行攔截和告警。此外,我們還允許開發人員在本地使用Gold-digger,進行pre-commit或pre-push檢查,整體風險左移。
7.2 數據對比
我們使用Gold-digger與最先進的開源工具進行了對比。
我們對內部服務代碼進行了分析,將人工安全審計發現的密碼作為測試基準,使用工具對代碼進行測試并統計結果。下表結果顯示,我們的工具準確率和召回率高于其他所有開源工具,誤報率和漏報率低于其他所有開源工具。

分析顯示,Gold-digger檢測的密碼中大部分是通過通用正則表達式和熵字符串檢測獲得的。這是由于內部代碼中包含的密碼大多無明顯前綴后綴特征,特定平臺表達式檢測不到。正因如此,大部分工具盡管定義了大量的特定平臺的正則表達式但漏報率仍很高,例如trufflehog定義了700多種特定平臺正則表達式,但通用正則表達式種類較少,故對特定平臺表達式未覆蓋到部分的檢測能力較弱。Gold-digger可以利用通用正則表達式和熵字符串檢測進行彌補,有效降低漏報。
密碼檢測的一大難點是避免來自非密碼字符串的誤報。Gold-digger通過多種啟發式規則的過濾得到了較低的誤報率。其他工具大量誤報的主要原因則是正則表達式的匹配范圍太寬泛又缺乏有效過濾手段,例如Gitleaks通過通用正則表達式識別到大量密碼候選值,但其中既有真正的密碼,又有appkey name、間接引用等,但未進行篩除。
8、本文小結
隨著互聯網組織架構的高速發展和軟件發布周期的不斷縮短,硬編碼密碼問題在企業代碼倉庫中日益嚴重,其危害已通過多起嚴重安全事故顯示出來。硬編碼密碼的大規模治理必需由安全人員和研發人員共同合作。
美團為保障研發安全,設計了具有編程語言無關、模塊化架構、集成在CI/CD管道等特點的硬編碼密碼的掃描工具Gold-digger。該工具的效果優于目前所有開源工具,能夠有效幫助開發人員盡早發現并修復密碼泄露,從源頭保障研發安全。
9、相關資料
[1] Over two million corporate secrets detected on public GitHub in 2020
[2] 傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示
[3] 理論聯系實際:一套典型的IM通信協議設計詳解(含安全層設計)
[4] 微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解
[5] 來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享
[6] 簡述實時音視頻聊天中端到端加密(E2EE)的工作原理
[7] 移動端安全通信的利器——端到端加密(E2EE)技術詳解
[8] Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)
[9] 通俗易懂:一篇掌握即時通訊的消息傳輸安全原理
[10] IM開發基礎知識補課(四):正確理解HTTP短連接中的Cookie、Session和Token
[11] 快速讀懂量子通信、量子加密技術
[12] 一分鐘理解 HTTPS 到底解決了什么問題
[13] 一篇讀懂HTTPS:加密原理、安全邏輯、數字證書等
[14] 基于Netty的IM聊天加密技術學習:一文理清常見的加密概念、術語等
[15] 手把手教你為基于Netty的IM生成自簽名SSL/TLS證書
[16] 微信技術分享:揭秘微信后臺安全特征數據倉庫的架構設計
(本文已同步發布于:http://www.52im.net/thread-4781-1-1.html)