淺談硬編碼密碼及其掃描工具
密碼是對服務、系統和數據的訪問權限進行授權的數字身份憑證,常見的密碼有API密鑰、非對稱私鑰、訪問Token等。硬編碼密碼(Hardcoded Secret),或稱嵌入式密碼(Embedded Secret),是指將密碼以明文方式直接寫入代碼中。這種處理方式極大地提高了攻擊者命中密碼的概率,使服務或系統暴露在風險中,容易造成嚴重損失。針對此問題,本文詳細討論了硬編碼密碼的成因、危害及治理方法;另外,本文從安全人員角度出發,對現有的硬編碼密碼檢測工具的算法進行了深入調研,并提出了我們的自動化檢測工具。
01硬編碼密碼的成因及類型
隨著互聯網組織轉向云架構、SaaS 平臺和微服務,密碼等數字身份驗證憑證的數量和多樣性正在快速增長。與此同時,企業也不斷推動更短的發布周期,開發人員面臨巨大時間壓力的同時,需要處理的密碼量比以往任何時候都多。許多開發人員采取捷徑,選擇使用硬編碼的方式處理密碼。
在企業的代碼倉庫中普遍存在大量的硬編碼密碼問題。據GitGuardian統計,在公共Git存儲庫上每天會泄露數以千計的密碼,其中僅2020年就有超過200萬個密碼被上傳至Git存儲庫中[1],而2021年該組織發現的密碼數量超過600萬,同比增長近2倍[2],而私人存儲庫的密碼泄露事件存在可能性比公共庫高4倍。
根據統計[1][2][6],硬編碼密碼包括API密鑰、訪問Token、非對稱私鑰、認證ID、安全證書、口令、特權用戶賬戶等類型。硬編碼密碼所涉及的平臺十分廣泛,包括如下領域:開發工具,如Django、Rapid API;數據存儲,如MySQL、Mongo;金融服務,如PayPal、Amazon MWS;消息通訊系統,如Gmail、Telegram;云提供商,如AWS、Azure、Google;私鑰;社交媒體,如Twitter、Facebook;版本控制平臺,如Github、Gitlab;等等。
除了程序代碼中,這些硬編碼還容易出現在基礎設施配置文件、監控日志、運行日志、堆棧調試track記錄、git歷史中。所有類別的硬編碼密碼都使企業暴露在攻擊之下。
02硬編碼密碼的危害
硬編碼密碼主要對安全和研發兩方面具有危害:
1. 削弱系統安全性
攻擊者常通過公共代碼庫或反編譯分析獲得硬編碼密碼字符串,利用密碼訪問敏感數據或獲取敏感操作權限。攻擊者還可以進一步擴大攻擊范圍,進行數據勒索、帳戶操縱、帳戶創建、通過用戶數據進行利用等,使得企業和用戶都遭受嚴重損失。在以下案例中,攻擊均是從密碼的泄露開始的:2014年,Uber數據庫被未經授權訪問,導致數千名Uber司機私人信息的數據被泄露[7];2016年,Uber又因外部的未授權訪問導致5700萬用戶的個人信息被泄露;2018年,Github和Twitter[10]在內部日志系統中以明文方式存儲密碼,分別涉及2700萬和3.3億用戶數據泄露;2020年,用戶在Github倉庫中發現了星巴克的API密鑰,涉及重大信息泄露[8];2021年,黑客組織 Sakura Samurai 在一次重大數據泄露事件中獲得了訪問聯合國 (UN) 員工私人數據和系統的權限[9]……由硬編碼密碼導致的安全事故層出不窮,也不斷有相關CVE和CWE被披露。
硬編碼密碼對特定設備、固件、服務、應用程序本身,對其連接的IT生態系統其他部分,甚至使用服務的第三方都存在風險,使其同樣暴露在風險中。
2. 不易于程序維護
硬編碼密碼的修復較為困難,密碼一旦被利用無法輕易被修正。對于正在線上運行的服務或系統,修復硬編碼密碼問題需要停服重新發布。大型企業的服務流量較大,服務間還存在依賴,則需要灰度發布,修復流程更長,其間可能持續受到攻擊者威脅。
密碼的蔓延也使維護變得困難。與傳統憑證不同,密碼旨在分發給開發人員、應用程序和基礎設施系統,這將不可避免地使開發中使用的密碼數量增加,一個密碼可能出現在代碼中多處位置,這進一步增加了修復的難度。
此外,開源的代碼造成密碼泄露,即使在源碼中刪除硬編碼密碼,也會殘留在git歷史里。
03如何治理硬編碼密碼
企業代碼中的硬編碼密碼問題日益嚴重,只有通過安全人員和研發人員的共同協作才能解決。源代碼中的密碼泄露很難徹底避免,但與其他漏洞一樣,它完全由內生因素決定:開發人員需要訪問更多的資源,以更快的速度構建和部署。這意味著只要有足夠的紀律和教育,再加上正確的工具,就有可能大幅改善這種情況。
從開發人員角度,需要注意盡量避免將密碼以明文形式寫入代碼中。代碼中需要對密碼進行校驗時,對入站身份驗證可使用強單向散列函數進行密碼模糊化,并將這些散列結果存儲在具有適當訪問控制的配置文件或數據庫中;對出站身份驗證,可將密碼存儲在代碼之外的一個經過嚴格保護的、加密的配置文件或數據庫中,該配置文件或數據庫不會被所有外部人員訪問,包括同一系統上的其他本地用戶[13];大型企業可以使用KMS服務進行一站式密碼管理。
從安全人員角度,應盡量做到風險左移,盡早發現密碼泄露,幫助開發人員降低修復成本。可通過代碼檢測掃描,將硬編碼密碼檢測集成到開發工作流程中,提前發現硬編碼密碼問題。
04硬編碼密碼檢測算法
由于硬編碼密碼有如此的危險性,學術界和工業界都有許多組織針對此問題研發了代碼掃描工具。我們對開源工具和學術文章進行了一系列調研,總結了目前的硬編碼密碼掃描工具常用的檢測算法,并對其優缺點進行了討論。
4.1 正則表達式匹配
正則表達式通常被用來檢索符合某種模式的字符串。對于檢測具有固定結構或特征的密碼,正則表達式可能很有效。常用于密碼檢測的正則表達式可分為(1)針對各種特定平臺密碼的表達式和(2)不針對任何平臺的通用表達式。
(1)針對各種特定平臺密碼的表達式
許多平臺的API密鑰、訪問Token、認證ID等具有平臺獨有的特征,例如亞馬遜AWS密鑰均以“AKIA”字符串開頭;常用于非對稱加密的私鑰如RSA、EC、PGP及通用私鑰等,常由ssh-keygen、openssl等工具生成,多數情況下私鑰以單獨的PEM等文件格式存儲,其內容也具有一定特征,例如RSA私鑰文件由"-----BEGIN RSA PRIVATE KEY-----"字符串作為開頭。對于這類密碼,可以通過匹配具有其特征的正則表達式進行檢測。
下表列舉了部分常用平臺密碼的類型以及正則表達式。本文僅以此表舉例,實際上特定平臺的密碼種類十分豐富,此處不便一一列舉。
平臺