CTO 太水!犯了低级错误,还删除代码隐藏证据!
轉(zhuǎn)自:InfoQ ??劉志勇、Tina
從大公司聘請來的 CTO 太水,犯了個低級錯誤,事后還故意刪除代碼隱藏證據(jù)。
上周末,黑客組織 DDoSecrets 利用 SQL 注入漏洞,入侵了極右翼社交媒體網(wǎng)站 Gab,并下載了 70 GB 的數(shù)據(jù)。在 Gab 的開源代碼中快速瀏覽一下就會發(fā)現(xiàn),這個關鍵漏洞是由公司的首席技術(shù)官引入的。
1、CTO 犯的低級錯誤,CEO 來買單
黑客利用 SQL 注入漏洞從 Gab 的后臺數(shù)據(jù)庫中竊取了大約 70GB 的平臺用戶數(shù)據(jù),包含該網(wǎng)站的 4000 多萬條帖子,之后將所盜走的 70GB 數(shù)據(jù)交給了爆料網(wǎng)站 Distributed Denial of Secrets(DDoSecrets)。泄露的數(shù)據(jù)包含公開 / 私人貼文、哈希密碼與用戶私有訊息,涉及 1.5 萬名用戶,其中還包括前美國總統(tǒng)特朗普。DDoSecrets 已經(jīng)將這些數(shù)據(jù)匯編成了一個名為 GabLeaks 的東西,打算將其提供給特定的記者、社會科學家和研究人員進行進一步分析。
作為一家初創(chuàng)公司,泄露 70G 數(shù)據(jù)無疑嚴重影響了用戶權(quán)益,這個亂攤子讓 Gab 的 CEO 疲于應付。2 月 26 日,最初,CEO 安德魯·托爾巴(Andrew Torba)在 Gab 網(wǎng)站聲明中否認了這一入侵行為,但數(shù)據(jù)泄露之后他又不得不承認已經(jīng)發(fā)生了入侵行為,并且還稱攻擊者為“惡魔黑客”。Torba 說,該公司已意識到“該領域存在漏洞,并于上周對其進行了修補。” 并且還將著手進行全面的安全審核,在 2 月 28 日的一份聲明中,他表示:“整個公司將全力調(diào)查發(fā)生的事情,并努力追蹤和修補問題?!?/p>
黑客發(fā) Twitter 嘲笑 Gab CEO 被嚇壞了。
通過查看公司的 git commit 發(fā)現(xiàn),導致關鍵漏洞的代碼變更,是在 2 月份的某個時候從 Fosco Marotto 的賬戶上進行的,他是一名前 Facebook 軟件工程師,11 月成為 Gab 的 CTO。周一,Gab 將此 git commit 從網(wǎng)站上刪除,但網(wǎng)絡上已有圖片保存了關鍵代碼。
這張圖片顯示的是 2 月份的軟件變更情況,圖片來自一家保存提交的快照的網(wǎng)站。提交的內(nèi)容顯示,一名軟件開發(fā)人員使用 Fosco Marotto 的賬戶提交了代碼,代碼中明顯存在新手錯誤,這種錯誤可能會導致報道中的泄密事件。具體來說,第 23 行刪除了“reject”和“filter”的代碼,這兩個 API 函數(shù)實現(xiàn)了防止 SQL 注入攻擊的編程習慣。
這一習慣允許程序員以安全的方式編寫 SQL 查詢,以“清理”網(wǎng)站訪問者在搜索框和其他 Web 字段中輸入的內(nèi)容,確保所有惡意命令在文本傳遞到后端服務器之前被清除。取而代之的是,開發(fā)人員向包含 find_by_sql 方法的 Rails 函數(shù)添加一個調(diào)用,該方法直接接受查詢字符串中未經(jīng)清理的輸入。Rails 是一套廣泛使用的網(wǎng)站開發(fā)工具包。
“如果你知道在 Web 應用中使用 SQL 數(shù)據(jù)庫,那么你將聽說過 SQL 注入,而且不難發(fā)現(xiàn) find_by_sql 方法不安全警告。Facebook 的前產(chǎn)品工程師 Dmitry Borodaenko 在一封電子郵件中提醒了我這個問題?!艾F(xiàn)在還不能 100% 肯定這就是 Gab 數(shù)據(jù)泄露事件中所使用的漏洞,但是絕對有可能是這樣的漏洞,在最近提交的 GitLab 倉庫中出現(xiàn)的代碼更改被恢復,然后他們就讓代碼離線了。”具有諷刺意味的是,早在 2012 年,Fosco 就曾警告程序員同行們,要使用參數(shù)化查詢來防止 SQL 注入漏洞。
2、刪除不安全的代碼,隱藏證據(jù)
Gab 開發(fā)的安全代碼流程遭到質(zhì)疑,同時,這家社交媒體網(wǎng)站因從其網(wǎng)站中刪除提交而受到批評。批評者稱,此舉違反了 Affero 通用公共許可證的條款,該許可證控制 Gab 對 Mastodon 的重用(用于托管社交網(wǎng)絡平臺的開源軟件包)。
譯注:Affero 通用公共許可證(Affero General Public License,Affero GPL 或 AGPL),是一個廣泛被使用的自由軟件特許條款,最初由 Affero, Inc 撰寫。此特許條款最新版本為第 3 版(v3),2007 年 11 月發(fā)布。Affero 通用公眾特許條款是改自 GNU 通用公眾特許條款,并加入額外條款,其目的是為了 Copyleft 條款應用于在網(wǎng)絡上運行的應用程序(如 Web 應用),從而避免有人以應用服務提供商方式逃避 GNU 通用公眾特許條款。
上述批評者稱,這一刪除行為違反了一條規(guī)定,即要求復刻(fork)的源代碼直接從網(wǎng)站上鏈接。該要求的目的是提供透明度,讓其他開源開發(fā)者也能從 Gab 同行的工作中受益。
Gab 長期以來一直在 https://code.gab.com/ 提供提交內(nèi)容。然后,在周一,該網(wǎng)站突然刪除了所有的提交:包括那些創(chuàng)建并修復了關鍵 SQL 注入漏洞的提交。取而代之的是,Gab 提供了 Zip 存檔文件形式的源代碼,該文件由密碼“JesusChristIsKingTrumpWonTheElection”(不含雙引號)保護。
Mastodon 項目的代表沒有立即回復詢問他們是否同意批評者的擔憂的電子郵件。
此外,Gab 的 Git 提交還顯示出,除了關于安全編碼和許可合規(guī)的問題外,公司開發(fā)者也在努力修復他們脆弱的代碼。下圖顯示了有人使用用戶名“developer”嘗試完全修復包含 SQL 注入漏洞的代碼,但沒有成功。
線程參與者對此的反應是諷刺地指出開發(fā)者似乎遇到的困難。
在 Gab 的安全漏洞事件,前后的代碼處理為開發(fā)者提供了一個案例研究,說明如何維護站點的安全性和代碼透明度。考慮到提交的文件使用了 Gab 的 CTO 的賬號,這個教訓就顯得更有分量了,因為在所有的人當中,他知道的東西應該更多。
3、原因是 CTO 太水?
這件事情也引起了開發(fā)者的廣泛關注,一位從事多年 Rails 開發(fā)的網(wǎng)友說:“這是不好的代碼,讓我感到驚訝的是這是由一位前 Facebook 工程師寫的(后來他成了 CTO)。粗略檢查就能看出一些錯誤,比如大型原始 SQL 查詢完全可以使用 AREL 或 ActiveRecord 這種更慣用的方式,沒有清理用戶輸入等等。”
2020 年 11 月,Gab 宣布聘請 Fosco Marotto 作為他們的新 CTO。Marotto 曾在 Facebook 工作七年,擔任軟件工程師,負責后端工具包 Parse 的開發(fā),是 Parse 團隊的關鍵成員,目前該工具包已經(jīng)開源。同時他還利用業(yè)余時間幫助 Gab 開發(fā)了免費語音網(wǎng)絡瀏覽器 Dissenter。加入 Gab 后,公司在他們網(wǎng)站的聲明中說:“Marotto 有 23 年的行業(yè)經(jīng)驗,在后端基礎架構(gòu)上有深厚的知識和見解。這有助于 Gab 迅速發(fā)展為新的媒體巨頭?!?/p>
防止 SQL 注入,在 Rails 文檔中有明確的示例說明(https://guides.rubyonrails.org/security.html#sql-injection),甚至示例與該提交中所討論的代碼完全一樣,所以這個技術(shù)在 Rails 里并不是什么新鮮玩意兒。在 2021 年還能讓黑客利用到 SQL 注入漏洞,這很讓人不可置信,一位網(wǎng)友在 Reddit 上評論道,“代碼將要部署到生產(chǎn)環(huán)境中,在合并代碼之前難道沒有讓同行審查嗎?如果首席技術(shù)官審查了開發(fā)人員的代碼后還犯這種錯誤,那么要么 CTO 和工程師都是白癡,要么工程師們在故意欺騙這位白癡。”
而且除了這是一種糟糕的實踐之外,現(xiàn)有的每一個代碼靜態(tài)分析工具都會告訴你,這樣編寫 SQL 是一個非常糟糕的做法。CI 管道甚至會直接拒絕代碼,拒絕合并代碼。也就是說,即使我們的某個開發(fā)人員試圖忽略了這個明顯的安全漏洞,系統(tǒng)本身也能阻止它。因此,Gab 要么根本沒有任何 SAST 工具,要么故意選擇忽略他們的反饋。
也有人認為 CTO 不會關注這種細節(jié),CTO 應該專注于戰(zhàn)略思維,同時讓公司中的一到兩位開發(fā)人員負責日常工作,針對此類基本問題進行代碼審查。大部分企業(yè)中,CTO 的確屬于高級管理人員,善用高層次、有遠見的思維制定戰(zhàn)略,并擔任企業(yè)中非常有影響力的溝通者角色。但這種情況不適合 Gab,因為 Gab 總共才只有 26 名員工,那么 CTO 就應該是該領域內(nèi)對技術(shù)最熟練的人,同時也應該為項目的交付流程負責。
這件事情發(fā)生后,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
推薦閱讀
誤執(zhí)行了rm -fr /*之后,除了跑路還能怎么辦?!
程序員必備58個網(wǎng)站匯總
大幅提高生產(chǎn)力:你需要了解的十大Jupyter Lab插件
總結(jié)
以上是生活随笔為你收集整理的CTO 太水!犯了低级错误,还删除代码隐藏证据!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你能体会那种写 Python 时不用 i
- 下一篇: 一个超级牛X的Python可视化库,隔壁