上周末,黑客組織 DDoSecrets 利用 SQL 注入漏洞,入侵了極右翼社交媒體網站 Gab,并下載下傳了 70 GB 的資料。在 Gab 的開源代碼中快速浏覽一下就會發現,這個關鍵漏洞是由公司的首席技術官引入的。
CTO 犯的低級錯誤,CEO 來買單
黑客利用 SQL 注入漏洞從 Gab 的背景資料庫中竊取了大約 70GB 的平台使用者資料,包含該網站的 4000 多萬條文章,之後将所盜走的 70GB 資料交給了爆料網站 Distributed Denial of Secrets(DDoSecrets)。洩露的資料包含公開 / 私人貼文、哈希密碼與使用者私有訊息,涉及 1.5 萬名使用者,其中還包括前美國總統特朗普。DDoSecrets 已經将這些資料彙編成了一個名為 GabLeaks 的東西,打算将其提供給特定的記者、社會科學家和研究人員進行進一步分析。
作為一家初創公司,洩露 70G 資料無疑嚴重影響了使用者權益,這個亂攤子讓 Gab 的 CEO 疲于應付。2 月 26 日,最初,CEO 安德魯·托爾巴(Andrew Torba)在 Gab 網站聲明中否認了這一入侵行為,但資料洩露之後他又不得不承認已經發生了入侵行為,并且還稱攻擊者為“惡魔黑客”。Torba 說,該公司已意識到“該領域存在漏洞,并于上周對其進行了修補。” 并且還将着手進行全面的安全稽核,在 2 月 28 日的一份聲明中,他表示:“整個公司将全力調查發生的事情,并努力追蹤和修補問題。”

黑客發 Twitter 嘲笑 Gab CEO 被吓壞了。
通過檢視公司的 git commit 發現,導緻關鍵漏洞的代碼變更,是在 2 月份的某個時候從 Fosco Marotto 的賬戶上進行的,他是一名前 Facebook 軟體工程師,11 月成為 Gab 的 CTO。周一,Gab 将此 git commit 從網站上删除,但網絡上已有圖檔儲存了關鍵代碼。
這張圖檔顯示的是 2 月份的軟體變更情況,圖檔來自一家儲存送出的快照的網站。送出的内容顯示,一名軟體開發人員使用 Fosco Marotto 的賬戶送出了代碼,代碼中明顯存在新手錯誤,這種錯誤可能會導緻報道中的洩密事件。具體來說,第 23 行删除了“reject”和“filter”的代碼,這兩個 API 函數實作了防止 SQL 注入攻擊的程式設計實踐。
這一習慣允許程式員以安全的方式編寫 SQL 查詢,以“清理”網站通路者在搜尋框和其他 Web 字段中輸入的内容,確定所有惡意指令在文本傳遞到後端伺服器之前被清除。取而代之的是,開發人員向包含 find_by_sql 方法的 Rails 函數添加一個調用,該方法直接接受查詢字元串中未經清理的輸入。Rails 是一套廣泛使用的網站開發工具包。
“如果你知道在 Web 應用中使用 SQL 資料庫,那麼你将聽說過 SQL 注入,而且不難發現 find_by_sql 方法不安全警告。Facebook 的前産品工程師 Dmitry Borodaenko 在一封電子郵件中提醒了我這個問題。“現在還不能 100% 肯定這就是 Gab 資料洩露事件中所使用的漏洞,但是絕對有可能是這樣的漏洞,在最近送出的 GitLab 倉庫中出現的代碼更改被恢複,然後他們就讓代碼離線了。”具有諷刺意味的是,早在 2012 年,Fosco 就曾警告程式員同行們,要使用參數化查詢來防止 SQL 注入漏洞。
删除不安全的代碼,隐藏證據
Gab 開發的安全代碼流程遭到質疑,同時,這家社交媒體網站因從其網站中删除送出而受到批評。批評者稱,此舉違反了 Affero 通用公共許可證的條款,該許可證控制 Gab 對 Mastodon 的重用(用于托管社交網絡平台的開源軟體包)。
譯注:Affero 通用公共許可證(Affero General Public License,Affero GPL 或 AGPL),是一個廣泛被使用的自由軟體特許條款,最初由 Affero, Inc 撰寫。此特許條款最新版本為第 3 版(v3),2007 年 11 月釋出。Affero 通用公衆特許條款是改自 GNU 通用公衆特許條款,并加入額外條款,其目的是為了 Copyleft 條款應用于在網絡上運作的應用程式(如 Web 應用),進而避免有人以應用服務提供商方式逃避 GNU 通用公衆特許條款。
上述批評者稱,這一删除行為違反了一條規定,即要求複刻(fork)的源代碼直接從網站上連結。該要求的目的是提供透明度,讓其他開源開發者也能從 Gab 同行的工作中受益。
Gab 長期以來一直在
https://code.gab.com/提供送出内容。然後,在周一,該網站突然删除了所有的送出:包括那些建立并修複了關鍵 SQL 注入漏洞的送出。取而代之的是,Gab 提供了 Zip 存檔檔案形式的源代碼,該檔案由密碼“JesusChristIsKingTrumpWonTheElection”(不含雙引号)保護。
Mastodon 項目的代表沒有立即回複詢問他們是否同意批評者的擔憂的電子郵件。
此外,Gab 的 Git 送出還顯示出,除了關于安全編碼和許可合規的問題外,公司開發者也在努力修複他們脆弱的代碼。下圖顯示了有人使用使用者名“developer”嘗試完全修複包含 SQL 注入漏洞的代碼,但沒有成功。
線程參與者對此的反應是諷刺地指出開發者似乎遇到的困難。
在 Gab 的安全漏洞事件,前後的代碼處理為開發者提供了一個案例研究,說明如何維護站點的安全性和代碼透明度。考慮到送出的檔案使用了 Gab 的 CTO 的賬号,這個教訓就顯得更有分量了,因為在所有的人當中,他知道的東西應該更多。
原因是 CTO 太水?
這件事情也引起了開發者的廣泛關注,一位從事多年 Rails 開發的網友說:“這是不好的代碼,讓我感到驚訝的是這是由一位前 Facebook 工程師寫的(後來他成了 CTO)。粗略檢查就能看出一些錯誤,比如大型原始 SQL 查詢完全可以使用 AREL 或 ActiveRecord 這種更慣用的方式,沒有清理使用者輸入等等。”
去年 11 月,Gab 宣布聘請 Fosco Marotto 作為他們的新 CTO。Marotto 曾在 Facebook 工作七年,擔任軟體工程師,負責後端工具包 Parse 的開發,是 Parse 團隊的關鍵成員,目前該工具包已經開源。同時他還利用業餘時間幫助 Gab 開發了免費語音網絡浏覽器 Dissenter。加入 Gab 後,公司在他們網站的聲明中說:“Marotto 有 23 年的行業經驗,在後端基礎架構上有深厚的知識和見解。這有助于 Gab 迅速發展為新的媒體巨頭。”
防止 SQL 注入,在 Rails 文檔中有明确的示例說明(
https://guides.rubyonrails.org/security.html#sql-injection),甚至示例與該送出中所讨論的代碼完全一樣,是以這個技術在 Rails 裡并不是什麼新鮮玩意兒。在 2021 年還能讓黑客利用到 SQL 注入漏洞,這很讓人不可置信,一位網友在 Reddit 上評論道,“代碼将要部署到生産環境中,在合并代碼之前難道沒有讓同行審查嗎?如果首席技術官審查了開發人員的代碼後還犯這種錯誤,那麼要麼 CTO 和工程師都是白癡,要麼工程師們在故意欺騙這位白癡。”
而且除了這是一種糟糕的實踐之外,現有的每一個代碼靜态分析工具都會告訴你,這樣編寫 SQL 是一個非常糟糕的做法。CI 管道甚至會直接拒絕代碼,拒絕合并代碼。也就是說,即使我們的某個開發人員試圖忽略了這個明顯的安全漏洞,系統本身也能阻止它。是以,Gab 要麼根本沒有任何 SAST 工具,要麼故意選擇忽略他們的回報。
也有人認為 CTO 不會關注這種細節,CTO 應該專注于戰略思維,同時讓公司中的一到兩位開發人員負責日常工作,針對此類基本問題進行代碼審查。大部分企業中,CTO 的确屬于進階管理人員,善用高層次、有遠見的思維制定戰略,并擔任企業中非常有影響力的溝通者角色。但這種情況不适合 Gab,因為 Gab 總共才隻有 26 名員工,那麼 CTO 就應該是該領域内對技術最熟練的人,同時也應該為項目的傳遞流程負責。
這件事情發生後,Marotto 不僅删除了 Gab 的代碼庫,連帶删除了他之前在 Facebook 裡負責的 Parse 工具的安全代碼。這個 SQL 注入是個新手級别的錯誤,Gab 團隊原來的代碼是正确的,反而是被 CTO 搞砸了,很明顯,Gab 沒有聘請到正确的人。
延伸閱讀:
https://arstechnica.com/gadgets/2021/03/rookie-coding-mistake-prior-to-gab-hack-came-from-sites-cto/ https://news.ycombinator.com/item?id=26319649