盡管 Facebook 近期被不重視用戶隱私保護等話題纏身,特別是其原本可以避免很多不必要的錯誤。但是,就其數十億用戶和支持其用戶的龐大數據平臺來說,想要在一億行巨量代碼庫中發現每一個缺陷并不容易。
為了在巨量代碼庫中準確定位問題,Facebook 的工程師四年前開始構建定制評估工具。這個工具不僅可以檢查已知類型的錯誤,還可以在 30 分鐘內掃描完整個代碼庫,幫助工程師在變更、修改或增加主要功能之前發現缺陷,將缺陷扼殺在搖籃中。
該工具名為 Zoncolan,是一個“靜態分析”工具,可以映射代碼庫的行為和功能,并通過不同路徑中相互作用查找隱藏在各個分支中的潛在問題。在如此大規模代碼庫中使用人工手動審查無窮無盡的代碼變更,并做代碼審核是不切實際的。靜態級別分析非常合適,因為它對不良架構和缺陷代碼行為設定了“規則”,并自動掃描系統中這些類別的錯誤。一旦出現,馬上抓住。理想情況下,該系統不僅可以標注潛在問題,還可以為工程師提供實時反饋幫助他們學會如何避免踏入陷阱。
“每當工程師要對我們的代碼庫進行改動時,Zoncolan 就會開始在后臺運行,(對疑似缺陷)標記之后,并同時直接報告給軟件工程師本人,也同時報告給當值的安全工程師,”Facebook 安全工程經理 Pieter Hooimeijer 說道, “因此,它每天運行數千次,在 2018 年中就發現了 1,500 個問題。”
靜態分析工具本身并不會發現新的漏洞,只是根據被設定的規則來捕捉事物。 但是,這些工具不僅可以不厭其煩的一次又一次捕獲相同的錯誤,還可以根據這些缺陷深入挖掘出一個新的規則。
靜態代碼分析工具對于 Facebook 來說是獨一無二的,這個工具被廣泛應用于安全組以及應用開發中。但是 Hooimeijer 指出,因為它是為了全面映射 Facebook 的特定代碼庫而量身定制的,因此 Zoncolan 特別有效。Hooimeijer 表示之前 Facebook 在 3 月份被披露以明文形式存儲數億用戶密碼后,公司就對該漏洞設置了規則,讓 Zoncolan 根據規則掃描潛在問題。
Hooimeijer 表示:“四年前,我們不得不爭搶一群安全工程師,并開始手動梳理代碼尋找問題。現在,我們使用 Zoncolan 來確保代碼庫中沒有其他類似性質的問題。在這種情況下,我們創建了新的規則,在實踐中發現了類似問題。”擴展 Zoncolan 檢測能力的新規則的靈感來自 Facebook 內部代碼庫,也包括該公司的 Bug 賞金計劃。
Zoncolan 采用了一種特別定制的方法來尋找安全漏洞,而不是更常用的尋找各種設計和性能缺陷的靜態分析方法,關注可識別的數據流及設計模式,作為減少靜態分析誤報的一種方法。不過,Facebook 并不是唯一一家有自己定制開發的代碼檢查工具的公司,谷歌也有自己的定制靜態分析工具,評估該公司龐大的 20 億行代碼庫。
“任何擁有良好軟件開發生命周期的公司都有源代碼分析器,以確保他們的產品在投入前掃清一切缺陷”企業危機響應咨詢服務公司 TrustedSec 的首席執行官 David Kennedy 說, “大多數成熟的組織都使用靜態代碼分析器,因為它最有價值的地方就是可以識別缺陷,當然它并不涵蓋所有內容。”
Kennedy 指出,像 Zoncolan 這樣的工具不會發現權限泄露,這導致 Facebook 在 9 月份遭遇 3000 萬賬戶數據泄露問題 ,源代碼分析器不會發現這一點。Facebook 過去幾年中最嚴重的問題是包括與意外代碼錯誤無關的基于用戶隱私權的問題。
Hooimeijer 回應 Zoncolan 不是完美的解決方案。但他表示,鑒于 Facebook 在該工具上所做的投資,他希望該工具的某個版本有朝一日可以開源,供其他組織使用。不過,Zoncolan 在 Facebook 代碼中如此有效地捕獲 bug 是基于 Facebook 內部開發的,如果要在 Facebook 之外的環境中運行,還需要增強靈活性,適配更多環境。
實現這一目標的第一步是 Facebook 在 2018 年發布了一個名為 Pyre 的代碼檢查器,是為編程語言 Python 發布的開源代碼檢查工具。該工具沒有 Zoncolan 的范圍廣、功能強,但是 Facebook 準備開源的一個類型范例。
“我們已經投入了大量精力來構建這個,這個工具就是 Python 的 Zoncolan。”Hooimeijer 表示, “我們也希望在 Facebook 以外分享精彩的好工具。”安全社區將永遠歡迎高質量的開源工具。但是,Facebook 需要不斷磨練每一個防守,以便在安全問題滾雪球之前抓住,進而保障用戶安全。
原文鏈接:《HOW FACEBOOK CATCHES BUGS IN ITS 100 MILLION LINES OF CODE》