和黑客鬥爭的 6 天

事件發生在3年前

互聯網公司工作,很難避免不和黑客們打交道,我呆過的兩家互聯網公司,幾乎每月每天每分鐘都有黑客在公司網站上掃描。

有的是尋找Sql注入的缺口,有的是尋找線上服務器可能存在的漏洞,大部分都是各個黑客檢測工具來掃描,當然更高級一點的入侵需要很多人工協助。

一般情況下,網站被黑客入侵都是因為開發人員平時沒有安全意識導致的,厲害的黑客往往會對平台的業務和內部流程非常熟悉,很多漏洞是從邏輯上分析出來的

當然了,所有的黑客攻擊行為都是有目的,99%都是因為其中隱藏着暴利

比如2015-2017年,很多互聯網金融公司遭遇黑客敲詐,最後都是打錢了事。

和黑客在線上鬥爭過很多年,積累了一些案例,互聯網金融公司工作期間,分享過一系列黑客攻擊的案例。黑客攻擊案例

今天給大家分享的是,去年一家公司發生的事情。

1.一個客戶反饋操作很慢引發的事件

第 1 天

2018年的某一天,客服接到個別用戶反饋,公司某款 App 操作時某個界面響應很慢,客服將此問題反饋給了公司的相關技術人員。

技術人員接到這個反饋之後,在生產環境多次測試並沒有復現這個問題,於是給客戶反饋有可能是網絡的問題,可以換個網絡再試試。

第 2 天

客服接到更多用戶反饋,手機操作某個功能時很慢,最長時間要等待超過1分鐘。客服又將相關信息反饋到技術,並且將問題級別提高了一級

技術這邊將問題上升到技術經理,開始排查問題原因,技術經理通過大量測試發現,這個緩慢現象在測試10次會復現1次

看來又是一個偶現的問題,偶現的Bug是最難處理的,技術經理帶着研發人員在服務器調了一下前端業務日誌,分析之後也沒有找到具體的原因。

第 3 天

公司有一個核心代理商將此問題反饋到技術老總,老總安排技術總監來關注此問題。技術總監要求把訪問路徑的關鍵節點都打上日誌,看看具體是哪部分操作慢了。

經過技術經理的排查,是在 App 操作某一個功能的時候出現偶發性的慢,但是這塊的操作也有緩存作為支撐,緩存的使用率並不是很高。

既然問題是偶發並且後面的緩存使用率並不高,那麼應該不是程序哪塊出現Bug了,應該是其它方面的問題,遂要求排查是否是服務器問題。

先給大家畫一下一張圖,方便大家了解一下技術背景。

前端用戶使用手機操作某一個功能時,請求經過防火牆路由器分發到最前端的Nginx,Nginx 又通過均衡負載分發到後面的五台業務服務器

業務操作的時候需要調用一組數據,這些數據會根據業務規則緩存到背後的緩存服務器集群中,用來緩解後端數據庫的壓力。

第 4 天

經過和運維人員配合調查發現,在分發的這5台業務服務器中,其中有1台服務器的壓力比較大,凡是請求分發到這台服務器的時候就會出現慢的情況。

因為線上的服務器已經用了很多年,懷疑是不是服務器配置老化導致的問題,隨後將壓力比較大的服務器進行下線,無縫切換到新的服務器上。

過了半個小時後繼續觀察,又發現另外的一台服務器也出現負載壓力大的問題。後面變了很多方案,比如減少到3台服務器來支撐,或者增加到9台服務器來支撐。

總是切換半個小時到兩個小時的時候,其中的1-2台服務器的壓力會突然上來,一直保持比較高的訪問量,經過這些測試排除是服務器的問題

緊接着排除Nginx是不是分發的策略有問題,導致某個服務器分發的請求過多,試着變了幾次Nginx的分發策略後,還是會復現出問題,排除Ngingx分發異常

第 5 天

技術人員繼續跟蹤,負載壓力比較高的服務器線程Down出來和正常的服務器對比,發現在負載壓力比較大的服務器上某個線程的調用數量異常的高

再繼續跟蹤這個線程,原來是某一個忘記密碼的功能被頻繁的調用,忘記密碼應該是一個普通的接口,為什麼會被這樣高頻率的調用呢?

然後再繼續跟蹤是哪些IP在頻繁的調用這些接口,不跟蹤不知道,一跟蹤嚇一跳,把調用最頻繁的 Top100 IP列出來查了一下,發現都是國外的IP。

什麼 巴黎、孟買、菲律賓、泰國,幾乎所有的外國的IP都有,但是作為一家國內的第三方支付公司,怎麼可能會出現國外的IP呢?

大家都知道在手機上填忘記密碼的時候,絕大部分平台都是使用手機號作為其中的一個條件,如果你沒有在這家平台註冊,那麼就會反饋手機號不存在。

這是一個非常常見的功能,但是對於黑客來講,這個功能夠暴利了

很多同行業的競爭者需要挖角其它公司客戶,但是怎麼知道這些平台的客戶有哪些?

直接通過這個接口,暴力破解就可以了。

是不是很黃很暴力!

因為公司處理的業務都是國內業務,所以只要直接在 Nginx 寫腳本,把所有來自國外的IP都給屏蔽,可以暫時解決被國外 IP 攻擊的問題。

上線後果然消停了,服務器也不過載了,App 訪問也正常了。

第 6 天

可能黑客過了一晚上也反應過來了,又開始使用國內的服務器代理IP高頻調用此接口,既然黑客使用了國內的IP地址,肯定不能把國內IP都封了吧。

不過在 Nginx 之後還有一個前置服務器,在前置服務器中加一個非常簡單的過濾器:設置一個IP地址在某個時間段內(可配置)只能訪問此接口5次,即可解決此問題。

然後再以用戶為維度加限制,一個用戶在某個時間段內(可配置)只能訪問此接口5次。

上面這些手段都上完之後,一切都安靜了,再也沒有出現過服務過載或者用戶反饋操作反應慢的問題了。

但是如果黑客有足夠多的國內 IP 呢,為了防止出現這樣的問題,我們再接着對產品進行升級,來防止黑客的這種可能性。

我們都知道現在很多 APP 頁面,為了方便用戶操作在忘記密碼的時候沒有圖形驗證碼,或者有圖形驗證碼卻比較簡單可以機器破解。

所以需要升級新一代的智能驗證措施,現在很多創業公司都可以提供這種服務,這樣就從各個維度防止了黑客通過暴力手段獲取客戶信息。

2.總結

其實據我所知,很多互聯網公司到現在仍然存在這種漏洞,很容易讓黑客通過暴力破解就拿到用戶註冊的手機號,只要拿到了用戶的手機號後面就可以採用各種營銷策略。

這是目前很多公司,採用的一種競爭手段。

有的時候,產品的易用性和安全性其實是有衝突的,產品在設計的時候,其實就應該和技術多考慮風控的相關設計,不然在產品運營的後期容易出現問題。

一個大型互聯網公司中風險點非常多,服務器風險點、業務風險點都需要做提前考慮,同時公司必須配備相應的安全人員,對公司網站做常規安全巡檢。

監控公司所有的訪問接口頻次,定期把公司裏面所有的IP訪問情況做成圖表進行分析,看哪些是正常的請求,哪些是異常的訪問。

定期排查統計分析訪問的所有請求,可以提前發現很多問題。

開發人員和黑客鬥爭其實是一個長期的工作,任何一個訪問量比較大的公司都會遇到類似的問題,遇到問題不要驚慌,仔細排查每一個細節,最終肯定會找到問題的答案。

在我的職場經歷中,和黑客有過非常多交手的經歷,現在回過頭來看,這些經歷才是我提升最快的最好養分

解決問題是程序員成長的第一動力,解決大問題是成為大牛的關鍵。程序員的一生,也就是不斷解決問題的一生。

這樣看來,我們要感謝職場上遇到的那些困難!

所有能爬過去的問題都成為了經歷和談資,只有那些越不過的 BUG 才能稱之為問題