安全保衛戰——家樂福618安全與性能之戰

  • 2019 年 10 月 7 日
  • 筆記

引子

從2010年第一次被DDOS了一下後從此把安全以及性能這2樣東西放到了我設計工作中幾乎佔據了一半的時間與修練。

安全與性能是密不可分的。尤其是IT中的安全,安全等於技術技術不等於安全,因為安全説開了可以是另一個領域但是技術又離不開安全。因為一旦事關「安全」要麼不出事,一出事就是致命的。

那麼安全與性能為什麼又會聯合的這麼緊密呢?

這事需要從2017年我進入家樂福後開始説起,雖然在2014年以及2016年和「黑產」有過幾次交手,但是真的從來沒有像在家樂福的2019年5月到6月28號這段時間和「黑產」打的這麼苦過。

這麼説吧,完全可以拿一戰與二戰中最慘烈的「凡爾登絞肉機」以及「硫磺島」這樣的場戰役來作比擬。

虎虎虎-被黑產打到差點全軍覆滅

618保衛戰全局戰役圖

整個戰役分成2塊高地,1#高地和黑產對打,2#高地為「性能保衛戰」。大家可以看到安全戰高地與性能戰高地間其實是有「交通壕」相連接的,這就是為什麼我説這2個高地都是有相關的牽連的。

一旦某個高地失守那麼整個「戰役」將會全盤輸掉。

這場戰役打得那叫一個驚心動魄,各個戰地死傷慘重,多少次的宕機,多少人員「鮮血(近幾個月的>007工作時間)」的付出,有進有退,你佔了我10塊地盤我用原子彈炸掉你的後方。一時間,硝煙瀰漫,喊殺聲四起。

你聽,那是運維狗們的慘叫:「宕機啦 」!

你聽,那是開發們痛苦的呻吟:「100多條慢SQL啊」!

你聽,那是PM們的哭嚎:「怎麼搞的,又卡了」!

你再聽,那是電商業務部門的咆哮:「你們到底懂不懂電商啊」

用一些數據可以說明我們當時是如何被人吊打的:

通過幾個例子來看一下我們受到了哪些攻擊

我們自己總結過,差不多市面上的所有類型的攻擊都跑到我們家樂福來了。

  • 簡訊介面泛濫-危險程度(5星)

只是一條小小的簡訊,它就能造成巨大的危害。往往這種危險在發生時損失同時也已經產生了,這就是我前面提到的「安全要麼不出事,一出事都是大事」。

而我經歷的幾個企業,真正意識到這種問題的基本都是在事後,這再次為我們敲響了警鐘。很多東西是在一開始設計時就需要明確和敲定下來的。

大家都知道目前的APP架構走的是API調用,那麼很多人説APP做成原生的不就好了?我明確告訴你,只需要5分鐘就可以明確你手機里有多少個和後台間通訊的API。

第1種手段,我裝 一個Fiddler然後我的手機裝載一下某個APP通過這個Fiddler暴露出來的代理埠上網,那麼你手機里的API會被一覽無遺。

第2種手段,對於高價值的一些APP,黑產們是可以完全反編譯你的手機程式碼的,一旦反編譯後那麼你就算在「前端」加入一堆的所謂的前端加密或者是把一些資訊都變成token化,那也是沒有任何用的。

5分鐘,只要5分鐘就可以獲取你和後台間傳了什麼值。

因此,我們都需要在服務端做「邏輯控制」,我在前一篇「雙12使用騰訊雲WAF反羊毛黨、黃牛黨戰紀全記錄」中提到過,你可以用WAF去殺,但是WAF是「一刀切」它對業務的傷害很大,因此我們需要的是「溫柔的殺戮」,這就需要我們使用邏輯去防。

  • 爬蟲攻擊-危險程度(5星)
  • 仁道爬蟲

這種算好的,其實每個網站上都有N多個「仁道爬蟲」,為什麼叫仁道呢?因為它不會影響你系統的性能、不會造成太多危險,它以悠閑自得的速度以「友好協商」的態度,只做爬你的圖片啦、商品價格啦之類的資訊,對你的系統不會有任何影響,比如説:收集網站PV UV的也是一種仁道爬蟲。

  • Low智商快爬蟲

為什麼Low智商呢?因為它很容易發覺,比如説一個廣告爬蟲或者是你的網站登錄沒有設「登錄失敗次數限制」,那麼這種爬蟲會以每秒鐘200、300、400多次的這種頻率來登錄你的網站,如果你有WAF,把WAF打開用最最基本的規則一搜就能輕易搜出一大堆這樣的明顯爬蟲,因為它太容易被網站管理員發覺了,因此我們把它稱之為「Low智商」就是這個道理。

  • 惡意快爬蟲

這種爬蟲和Low智商很像,但是它不僅僅是爬資訊這麼簡單,因為它會帶有一定的目的性,比如説利用你網站一些抽獎頁面不設限或者沒有相關業務邏輯防護的場景,在1-2秒內完成數千次的如:點擊大轉盤、點擊翻牌、點擊用戶抽獎一類的按鈕或者是相應的API調用,這種爬蟲其實還是屬於容易被發覺的。

  • 高級爬蟲(AI)類

這種爬蟲利害了,它不是不易發覺而是不易封乾淨;比如説某一個爬蟲,它先開始以每秒300次來訪問,你去封它了,它幾乎是在下一秒就變換一個IP然後對著同樣的URL以每秒290次來訪問,你再封,它再變換一個頻率,你不可能無限把訪問頻率下壓,因為這對真實訪問就會造成傷害。更甚有爬蟲它不僅換IP、換頻率,它還能夠換著UA,Reference甚至換著URL來搞你,對於這一類爬蟲你的WAF以及防火牆其實是失效的。

  • 無限糾纏爬蟲

碰到這個真不容易,我們碰到了。如果你説某個行為糾纏你個1周2周那不叫糾纏,糾纏你個把月而且每秒鐘都在根據你的策略它也在變化攻擊的策略的糾纏那才叫真正的糾纏,你可能真的想像不到當你封掉了1萬個IP後還能有來自於同一地域的同樣的而且一定是同樣的就是不換它要攻擊的那個url以這樣的方式來搞你,它似乎就在向你炫耀:看,我的IP池有多少多!呵呵!

  • 羊毛黨/黑產

這個就是危害最大了。我們和黑產打到現在還在打,黑產對網站的危害可以做到既不影響你的網站性能又不讓你有所查覺就把你當天發的券、或者是可以秒殺的物品做到秒光,不過它用的也是基本的「爬蟲」手段,只不過黑產使用的爬蟲是一種混合體、可以自我進化、自我適應、甚至變種,類似異形,基本無敵。

綜合上述來説,爬蟲除了給你的網站造成經濟損失外也足以讓一家中大型網站在傾刻間癱瘓。

比如説,有一些網站喜歡做成「邏輯刪」以及「記日誌」,那麼爬蟲調集1000萬個IP給你來一個一秒內一齊註冊,啊呀。。。你再看看你的網站,不是前端流量被堵死就是後台資料庫或者nosql存儲區域被擠爆,這就叫外爆、內爆。

  • 反彈弧式攻擊-危險程度(5星)

這個反彈弧式攻擊很好玩,前面説過,有一種AI類的BOT或者是很高級的BOT,它會不斷的來試你的水,什麼叫試水呢?就是這種黑產手握大量IP,然後先以易發覺的高頻率來訪問你某個URL一下。而當你發覺後,它馬上就變換IP再來搞一下同樣的那個URL,那麼很多網管或者是運維團隊在前期業務壓力大、網站迫切需要「釋壓」的情況下會被不斷被迫降低這個用戶的訪問頻率。那麼降到有多低呢?

你表面看其實也不低,比如説一分鐘300次註冊,你説這個頻率低嗎?不低,你説這個頻率高嗎?也不高。既不高也高,既不低也低,這話聽了怎麼這麼彆扭!

比如説,在零售場景中有一種活動叫註冊送小禮品。你看商場門口經常會有「靚女」讓你掃一下二維碼同時你註冊成會員後給你一個「奧特曼」,或者是「基斯拉」一類的小公仔。而這種活動做的好的時候會造成一種這樣的假像:即平時同一個IP每分鐘註冊絕對超不過50次,而某一段時間來自同一個IP的註冊行為卻超過了300次。很多人誤以為這是一次異常行為,其實它是一個正常行為。好,認為是異常行為了,封!這一封,其實封的是很多真實訪問用戶的IP。

這,就叫反彈弧式攻擊!

打響保衛戰

要練武前先要學會挨打、先要學會扎馬步、沖拳。被人打了個鼻青臉腫、體無完膚後家樂福決定反擊。

「專家」不靠譜、外部供應商只想要money money而往往有時給了money money不一定收穫得了全部期望,「白白付出」也是時有發生。那一陣我經常一個人在家反思,內部問題外部問題,歸根到底還是沒有類似於「原子彈」這麼一個打出去可以殺敵、放在家可以震懾敵人的東西。

時間上也是巧,當晚正好央視播放了一套新中國兩彈一星的紀錄片。片中説到這麼一個場景:

天空下著雨,蘇聯專家於59年6月撤資、撤人。在中國呆了2年多的蘇聯專家領導與中國科學家鄧稼先站在一起時天空下起了細雨,蘇聯專家撐起了傘順便把鄧稼先也擋在了傘下,此時他對著鄧稼先説了一句話:你知道嗎,這個世界永遠是個子高的人才能「撐傘」。 當時鄧稼先站出了雨傘的遮罩範圍,情願全身淋濕也不需要那麼一小塊面積來「保護」自己。 59年6月份黨中央發出號召,啟動原子彈計劃,代號就為596以紀念59年6月前蘇聯當局撤走所有原子彈科學家這一件事。當時陳毅説了一句話:老子當家、當鍋、當了褲子都要造出原子彈。毛主席更是拍桌子決定:原子彈,一萬年也要造出來。

在紀錄片中,當時的中國人正逢三年自然災害呀,沒吃的,那是真沒什麼吃的。也落後,電腦都沒有,只有上海有那麼幾台老式手搖電腦。

我們自己的科學家在羅布泊無人區忍受著物質匱乏、環境惡劣,硬是用「手算」算出了中國的第一顆原子彈。片中有一段講述的是科學家團隊們在基地糧食供應不上時忍受著飢餓感,以唱歌來提升科研團隊的鬥志,尤其是鄧稼先那一句:人啊,有時還是需要講點精神的給到了我極大的鼓舞。

於是,我決定主動發起這場保衛戰。

不打無準備的仗

上面對於一些典型黑產的攻擊,有些讀者或許已經能夠感受到了我們面臨的攻擊是職業攻擊,這不是「玩家」或者是「散客閑人」一類的攻擊,它是有組織、有計劃甚至有規模的針對家樂福的攻擊。

對於這樣的「仗」從將要發生的時間、規模、投入上決定了它勢必是一場「戰役」而不僅僅只是那麼一兩場局部戰爭。要打戰役那麼就必須做好充足的調研、前期的物質準備、戰場情報收集以及「精神動員」。

當然,必要的物質還是需要提前準備的,對於這種有規模的攻擊,我們做了一系列的調研。發覺如果僅僅是在WAF層、防火牆層面它根本是起不到效果的,對付這樣的「黑產」攻擊,我們必須先通過「黑產」手機號下手,要能對手機號的行為做出判斷同時配合著WAF才能做到相應的攻防,那麼要分析手機號行為它肯定是一個智慧的基於大數據架構的分析引擎,因此我們選用了和我們的WAF同一家廠商-騰訊,我們使用了騰訊的天御系統,它的好處在於擁有中國最大的手機庫,光微信就超過6億手機信用的積累了,更不要説鵝廠在其它各渠道的積累了。這就好比現在的支付寶的芝麻分成了互金領域用於給客戶打金融信用分的重要依據之一,那麼鵝廠的用戶手機信用也一定是最值得信賴的依據之一一個道理。

同時這種戰役級別的大仗不是上手就開打的,光戰場情報收集、分析就要花不少時間。收集和分析什麼呢?就是把我們受到的攻擊給分類,並且把每種類別的特徵提煉出來。

那麼我們是怎麼提煉的呢?下面給出一個我們家樂福分析和提練的攻擊類型,這個類型我在2019年CSS安全峰會上展示過,被業界稱為「全渠道攻擊中台」模型。

好么。。。我們分析出來的攻擊類型都夠的上一個「中台」了,大家就知道我們當時遭了多少罪了,呵呵,是不是夠得上一個攻擊大中台呢?我們下面來看。

確實看了是要流鼻血了,確實我們也受到了這麼齊種類的攻擊。

有幾種攻擊前面已經提到過了,我們這邊著重提一下這麼幾個攻擊,因為這種攻擊太高級了。

  • CC流氓

這種CC明顯就是繞開了手機端用來和後端作一些數據驗證時用的Token機制,甚至它能模擬你產生的Token。不要問我這麼長的Token黑產如何繞開、如何模擬產生出來的,如果你碰到了這樣有規模的黑產利益集團決定攻擊你那麼分分鐘破解你的Token不在話下。

  • CC IP

這一塊比較好理解,對於一些第三方對接如:支付、物流它們都屬於B2B間的對接,那麼都會有固定IP,那麼把這樣的API調用指定、綁定、固化它的訪問地址即可,即IP相關綁定式訪問。

那麼不是在雙方事先的IP範圍內一切訪問全部無效,但是這種防護的前提一定是對接雙方的IP或者是外部的IP必須為「永久固定IP」。

還有一種,就是現在的網站很多使用的都是企業級微服務,那麼微服務做多了,API過去API過來,很多人忘了一點。一些內部模組間的調用要走內網,再説白了拿一個例子來舉例說明:同一個應用的Tomcat和MongoDb間是不是一定走的是內網調用?如果把Tomcat和MongoDb間的調用都跑到外網繞一圈。。。你不要笑我還真看過這樣的設計。。。源於「圖項目快,圖方便」這個惡習。

  • 違反正常點擊順序與不經頁面訪問介面

當然,這種BOT還可以識別,因為它是違反正常的介面點擊順序的。如果是一個人,它的點擊一定是帶有正常頁面/介面訪問路徑進入的,而有一些點擊通過在API層攔截分析後,我們馬上可以發覺他們是直奔主題直接不經過一系列的頁面直接訪問你後台的API介面這麼進入的。

對於這種攻擊,僅僅有前台的Token是不夠用的,因為Token可以被破解的、Token可以被模擬的。此時要在後台設以入庫(DB)前的再校驗往往可以攔掉50%這樣的攻擊,或者在一開始設計時前端應用就應該輔以「混淆程式碼」裝置。如果你的網站是以贏利為目的,千萬不要捨不得那每年那點該花的用於加固APP的錢。商業版的混淆器在一開始就納入使用是很有必要的,好比我舉個例子來説:你是願意穿著凱芙拉防彈衣被54式手槍打一槍呢還是拿三夾板擋在胸口去被打一槍?

必要的投入還是需要的!

Token是我們用來做前後端動作校驗這個行為是否一定是先經過一條什麼路徑再到什麼路徑的必要手段,那麼這個Token肯定不能輕意可以被人模擬和識破,大家要知道現在的安桌應用如果不加專業的混淆器被人反編譯是在分分鐘的事,不要驚訝,我們就碰到了。

同時,對於每一個頁面點擊做好相應的業務邏輯梳理,在後台接受到API請求時再做雙重邏輯校驗,是可以有效避免這一類攻擊的。

  • 脈衝式Bot

什麼叫脈衝式Bot呢?這個Bot很好玩,它屬於可自調節頻率Bot的一種。比如説,你有一條Bot防護規則為每分鐘超過120次連續1小時就會被觸發,那麼這個Bot被攔了第一次以後它就會變頻率,變成每分鐘119次,但也是連續1小時。亦或者每分鐘120次但是它的訪問周期只有5分鐘-10分鐘,由於這兩種攻擊都沒有觸及你的防護規則,因此它不會被攔截甚至被偵測到,而且它會長時間「吊」在你的網站上,時有時無但再怎麼樣它也是有它規律的「周期」的,因此我們把它稱為脈衝式Bot。

  • 含有業務邏輯的Bot

這也是很智慧的一種Bot,它通過一定時間的「自適應」,知道你們在後台用相應的邏輯來封它,那麼好吧,這個Bot它進化了,它就會「順著你的邏輯」來訪問你。

這就很難發現了,但是通過一段時間的偵測我們還是可以發覺Bot必竟是Bot,它不是個人。它再怎麼模擬這個業務邏輯它總會有「重複頻率」,而一般這種高級Bot它總是帶有明顯的「偷盜目的」的,它們和一般的廣告類或者DDOS類的目的不一樣,它們盯著的是可以長期薅你的羊毛。

因此我們經常通過「訪問重複指數」來計算一個IP對於一些特定的URL如:訂貨,拿積分。或者是:加車->下單->退單會有周期性的重複,當這個重複到達一定的頻次之合時,它就不可能是一個人了。

  • 進擊的Bot

這種Bot我在上述篇幅中已經提及過了,這種Bot糾纏不止,手上又握有大量的IP,不斷變化著攻擊你相同的一個地址,比如説我們有一個在登錄時用來初始化頁面的介面被人糾纏了15天,最後統計了一下,竟然累計有6位數IP來搞這一個Url且都來自於江蘇。

  • AI類Bot

這種Bot是真要了命了的,它還會擬人化,還會變。。。

什麼意思呢,比如説我前面提到的「帶有合理業務邏輯」訪問的Bot,那麼好這種AI類Bot呢它把一堆的各種業務邏輯事先組合在一起。舉例來説:

路徑1:先看首頁->看到宣轉輪播里新註冊拿50積分的頁->點擊註冊->領取積分

路徑2:先看首頁->看到宣轉輪播里可以領春節禮券->點擊領券

路徑3:先看首頁->看到宣轉輪播里下單即領50積分->跑到分類頁->點選幾個分類頁面->點選單品->加車->提交->還沒得到支付成功消息立刻退貨->獲得積分->完蛋嘍,你的網站積分被人刷走了

把這些個路徑組合著和你來玩,而且還不重複,每天搞那麼15、20下就收手,你還發現不了。這個超級噁心因此我們稱這種擬人化基礎上進化出來不斷變化多種業務邏輯組合的Bot又叫作「孫悟空Bot」也正是這個道理。

  • 黑產

這個説起來可都是血淚,我這邊先説一下我們遭遇的黑產狠到什麼程度吧,因為我後面會講解防護,針對這種有規模有組織的攻擊防護不是單個Case、單個戰場的防護,那已經沒有意義了,我們需要的是體系化的防護。

  • 破解Token直攻介面

手機端被人反編譯,然後知道你要帶著一個32位的Token來訪問介面,好!黑產使用工具Fiddler先把手機訪問攔截一下然後用模擬器工具截獲這個介面、破解這個Token然後用「機」帶著Token直接訪問你的介面

  • 數以千萬計真手機號

這樣的東西大家看到過沒?

這叫「手機牆」,其實它也是一個機櫃,只是上面插著幾十甚至上百部手機,然後有一個「中控端」統一來控制這些手機一起來訪問你的網站而己。

要知道現在一個手機號那是相當的好搞的,不信?你去淘寶,15塊錢買個號可以匿名接收簡訊驗證碼。。。有號這不就成了么!

1000個號*15塊錢不過1萬5,每天搞你1000塊券連著搞你一個月不就全回來了,更不要説有這樣的「手機牆」的「客戶」何止只搞你一家,人家同時一天搞上百個網站。。。吼吼!這個投入產出比。。。真值了哈!

  • 變換地理位置

這種還好分辯一些,這個手機註冊在A城,登錄在B城。。。或者是註冊登錄在A城,下單也在A城,拿券時跑到了B城。對於這種手機號呢你可以先知先覺,先知先覺容易誤傷。那麼後知後覺,後知後覺你要有大數據實施計算能力結合設置業務閥值,一旦觸發了就「殺」。當然這也是一種博弈,因為你想「零」損耗,那是不可能地,只能指望著「盡量減損」這才是正確思路。

  • AI智慧過防偽碼/滑塊

這個也是用「手機牆」去實施的,這一招很利害。

大家都知道一些網站為了故意放緩搶無門檻券的速度,在領券點擊動作時會先出一個圖形滑塊

在手機牆面前這種滑塊完全無效,黑產由於使用的是中央「中控」端控制著這上百、上千台手機,因此它可以在搶券活動前1毫秒先喚起滑塊,然後在搶券活動開始時統一用「劃屏機」把上千個手機上已經顯示的滑塊統一的去滑一下即可完成上千次領券。

很多公司放券放出來1秒內幾千張空,你不要為此而感到開心,因為你不是淘寶,你不是蘇寧易購,你只是一個nobody,不可能你的券有這火,那麼領你券的一定是黑產,它們領了你的券只是為了去閑魚賣而無法在後期再被激活鳥!

  • 聯網模擬器狼群攻擊

我們也碰到了,因為你再牛逼的手機牆不可能牛逼到上百萬個手機吧?那麼這批黑產。。。很有默契的在他們內部其實是有一個類似於迅雷、電驢一類的通訊協議,使得幾十幾百個黑產之間可以互通訊息、互相聯網組成「群狼」式的薅羊毛。。。大家一起來搶娘,搶了娘賣了去換糧嘍!

  • 混合邏輯炸彈攻擊

邏輯炸彈不是把你給「爆」了,爆你沒有任何意義!黑產圖這種樂子。。。何必呢?那怎麼個邏輯炸彈呢?它會混合著擬人化Bot、孫悟空Bot不斷的來探你,探啊探,探到了你的邏輯上的Bug,什麼樣的Bug呢?我來舉一例 :

你要搞跨一個競爭對手,讓它在某一天的大促活動時「丟人現眼」,於是你去探到了它網站有一個這樣的漏洞,那就是加購物車鎖庫存。

好,我調動10萬個手機排著隊每個手機來下你某些商品的「單」,把它們加到購物車。。。加一個鎖一個庫存,加一個鎖一個庫存,一鎖有些還鎖半天,然後正當此時,當真實用戶看到你網站的推廣廣告後上來買東西,發覺都是「缺貨」。。。

要知道,現今中國社會用戶都已經很寶貴了,線上獲取用戶成本很高,有哪些APP真正可以讓一個用戶「留足超過30分鐘」呢?很少有吧。現在,有用戶上你的APP看一眼結果是「缺貨」,你再想形成這個用戶的「回頭率」那幾乎已經是不可能了。

這種邏輯炸彈很可惡吧?嘿嘿!

對各種攻擊作一個總結

現在的攻擊已經不是5年前,10年前的那種簡單的攻擊了。這些攻擊都是基於大數據、人工智慧甚至有深度自學習、自建模然後自適應的能力,且規模龐大、數量眾多並形成了一條產業鏈。

做TO C的朋友們注意了,千萬不要不重視IT安全(我指的是IT安全技術領域不是停留在嘴上只會BBB的那種)要不出了事,你連哭的機會都找不著。

這種黑產的產業鏈極其強大,我拿幾個環節來和你們説你們就知道黑產的人為什麼比你企業還有資金、比你公司首席架構師的技術都要高的原因了。

黑產擁有大量手機與號碼,它們會「應邀」做水軍,給網站灌水,這個應邀一定是收費的;

黑產會和一些網紅談好,幾點幾分你播出?好,我來,給你灌水軍、灌流量同時收取你所在平台的「勞務費」;

甚至「捧紅」一個網紅

爬券。。。薅羊毛,真的只是黑產的「副業」,人家的主業是這種「大目標」,呵呵!

家樂福反擊戰

WAF整體攻防策略

先從WAF這一陣防禦説吧,這個屬於硬殺傷,對於一些非常明確的攻擊以及減少網站惡意流量來説還是很有效的。

科學合理的封禁

從上圖我們可以看到,按照非正常頻率我們假設線下零售場景中的「線下推廣」做了特別的好,那麼這個好翻譯成互聯網語言就是並發用戶高,我們就設一個最高閥值吧,這個最高閥值怎麼設呢?這是有講究的:

  • 你不能設太高,太高等於失去防護;
  • 你不能設太低,太低殺的都是真實客戶;
  • 根據取樣、分析、預測,這都要用到數據報表大數據分析等技術來定;
  • 懲罰措施不能太嚴、時間不能太長,因為目前我們手機里獲得的IP都為非固定IP,有時一個區域一個基地台的IP一共只有5位數,而你的網站太「惹人嫌」了,那麼黑產會在短時間內如:10分鐘內發起5位數攻擊,你封也封對了,但是封的時間太長,那麼黑產很聰明發覺自己用的IP一旦被封,它就會把這些IP還出去,當這些IP漂移到了真實用戶手中後由於你的封禁時間太長那麼就會導致當這些被封的IP漂到真實用戶手裡時它的狀態還是「被封禁」,這就會把真實用戶損害到;

用99%的時間去做分析和觀察用1%的時間去做實施

多放探測器、探針一類的東西去捕捉數據,比如説我們使用的是騰訊雲,平時大部分時間或者可以説絕大部分時間我們開啟的是「monitor」模式,當monitor取樣到足夠的樣本並且提練出了通用模式、規則後,真的要去寫一條封禁規則也只需要1分鐘時間。

故意拋一些無價值低價值的「餌」

有時我們會欲擒故縱,放任一段時間或者故意拋一些假的「餌」,只是為了在觀察和分析的基礎上進一步去做「確定」,一旦黑產上鉤,這時這條規則會變得極其精準而帶來的「反攻」會是持續的、洶湧不斷的,我們把這種反攻模式稱為「遠程火炮群」。

建立米格空中走廊

對於第三方、外部以及模組間的接入一定做到「合理」介面,能走內網的走內網介面,能綁白名單的要綁白名單。這樣的點對點信任通道內的數據交換我們就把它稱為「米格空中走廊」,因為在抗美援朝時志願軍用「蘇聯老大哥」支援的米格戰鬥機打到美國的空軍不敢進入三八線一帶的空域,這塊空域就叫「米格空中走廊」,那是一條絕對可控制的空中通道。

圍點打援

什麼是圍點打援呢?就是我上文提過的,一定一定要多使用合理的業務邏輯、後台的雙重校驗去對抗黑產的行為,那麼配置精良的WAF上一般是可以去做組合業務邏輯的編織工作的,使用這種業務邏輯編織出來的「網」其實是具有很強殺傷力的。基本上是來一個「有違邏輯」的請求就殺一個。

舉2個典型的攻防例子

  • WAF攻防案例- CC + BOT防脈衝式攻擊

同樣還是使用相關的案例,這個Bot在被第二層Bot攔截後它會「變種」。

  • WAF攻防案例- CC+BOT被反彈

在這個被反彈的案例中,我們就不能使用Bot再作基於頻次的「殺」了,而是要使用Bot的特性對於Ref頭或者是UA(User Agent)來進行封。

我舉一例來説,我們有一個URL,它的頻次閥值為每分鐘允許值在3,000次。有些人會問,你怎麼會設這麼高的值?我反問這個人,為什麼不能允許這個值?

首先,我們來考慮這個值會對業務造成什麼影響嗎?不會,因為真的如果線下推廣做的好,的確是會在短時內帶來如此大的流量。

其次,作為一個網站,對於某一些個URL你連一分鐘3,000次這樣的訪問都撐不住,你還做什麼網站呢?

使用性能+業務邏輯組織你的「第三道防線」

這就是前文曾提到過一個叫「博弈」的詞,與黑產間的攻防很多時候是一種博弈,它追求的不是在於「除凈」而在於讓對手不斷付出「高昂的代價」即提升對方攻擊的成本以達到「減損」,你做不到「止損」,那是不可能的,如果你一味追求止損那麼最後損失的其實是真實用戶。

因此,對於一些無損害只是頻次高的訪問,你需要使用「第三道防線」,這個第三道防線就是你的系統性能和完善的業務邏輯,比如説有用戶頻繁的調用註冊介面,你不可能不去控制當然也不可能控制的太緊,我舉一例來説,同一個用戶手機號它註冊連續超過15次你覺得這是一件正常的事嗎?如果你放任他可以無限「失敗」下去,它連續泛濫你的註冊介面100萬次你的網站也吃不消。一個就能泛濫你100萬次,調動10萬個IP並發的來調用你你試試看呢?

這種情況就需要使用「溫柔的殺戮」,比如説,你至少可以挺並發10萬的量每個訪問允許他們一天最多使用15次註冊介面,這就是你的系統性能+業務邏輯組合的「第三道防線」。

打啊。。。殺啊。。。這個打的那叫一個熱鬧。

來個快頻次的Low逼Bot,我Ban…

來個Ref不對頭的偽裝Bot,我Ban…

來個User Agent看著不順眼的Bot,我Ban…

我Ban…我Ban! Ban! Ban!

下面我們講一下如何去防薅羊毛,這一塊內容我相信絕對是乾貨,可能在業界還沒有公開講了這麼透的,因為我完全是結合著我們碰到的案例的實戰來講這個反羊毛黨的設計方案的。

遇到擁有千萬個手機號的黑產

一開始我們以為這只是一場「局部戰爭」,結果一交手,好傢夥,給打成了一場世界大戰了。

家樂福碰到的黑產牛逼啊。。。就是搞拼多多的那批人,千萬個手機號,一天註冊你個上百萬次,歷年來養的小號,殭屍號,什麼擬人化Bot、孫悟空Bot而且還是基於大數據自建模具有AI能力的攻擊這麼組合著搞我們哈!

券,被秒光,真的是秒光,連1秒都不到,把發的那些個無門檻券搶光光!

而且這些領券動作都是慢Bot,慢Bot是最最頭疼的事,它一點不快,也沒有任何的異常高頻次,也沒有規律可言。因為它手上有千萬個手機號,隨便調動幾萬個,一秒內每一個手機只需要訪問一次,你的券就沒了。

所以事前封不了,事後更加很難判斷。

因此這不是一場「局部戰爭」而是一場曠日持久的「世界大戰」,我們一開始就是因為把它也當作一場「局部戰爭」去對待所以在一開始就吃了虧。

不能夠拿WAF、防BOT這種思路或者是來一個Case想一個策略的思路和設計去對待這種攻擊了。正如現在我們一直在説的:小國間的戰爭那叫互毆,而大國間的戰爭那是「體系化的對抗」。

什麼叫體系化的對抗呢?我這邊舉幾個例子來說明:

1、當你覺得可以使用活動還未開始點擊無效來防機器人領券時,你會發覺封掉一個手機號它會變出10個手機號直到你活動開始黑產它情願損失掉上萬個手機號但他還有1千萬個手機號,只要把你的券搶了就得了,你怎麼和他斗?

2、當你覺得你可以和第三方數據平台進行聯合甄別手機號是否「有效」而不是那種15塊、20塊就可以買到一個號的那種手機時,黑產會調用它在各個微信群、微博、其它各大網站一直養著的具有良好行為的小號來攻擊你,你怎麼和他斗?

3、你剛在早上10:00的一場活動防掉一批黑產,在緊接著12:00的那場活動中你昨晚剛剛一通宵上線的防護邏輯又被攻破了;

這場戰鬥我們足足打了有1個月時間,在這1個月時間互有攻防。

516-610黑產壓著我們打。

610-618我們連勝了9天。

戰鬥直到現在還在繼續,正如上文中所説,516-610這段時間我們以為這是一場「局部戰爭」,採用的是兵來將擋、水來土掩的方針。因此很被動,每天都在上線、每天都在被攻破、每天都在「流血」。

但這也正如我們中國的兩彈一星建設過程一樣,我們沒有死那麼我就能總結出不少經驗來,於是我們把我們的經驗整理成了一個「圓盤」。

這個「圓盤」它其實是一個「閉環」,即我説的「體系化對抗」的一個完整「閉環」,這個閉環就是做的好的BAT那幾家大廠在用的「風控」模型,只是它的實現細節各有千秋,但是這個過程一定一定都是一樣的。

但是,因為中國並不透明的技術氛圍以及不太喜歡往opensource做contribution的精神,這個體系幾乎無人去做真正意義上的講解和公開那麼在這邊我首次把它完整展現在了各位面前,因為這個風控體系是經過了論證的,大家可以放心的去使用。

好,現在我們把這個「圓盤」給它「拉直」了來看,它其實就是這麼一個業務流。

下面直接給出乾貨一類的解釋:

  • 只是單單的WAF,CC防禦根本無法對抗薅羊毛,必須我們把焦點關注在用戶的手機號上;
  • 手機號它其實是有「信用」的,和人的消費金融行為一樣,它也有類似「螞蟻徵信」那種信用分。對於絕對的黑戶手機那是肯定不讓通過的,比如説一個黑戶手機來領券直接你系統可以提示「親,活動已經做好」,「親,優惠券已經被領空」,「親,我騙你你又準備咋地,誰讓你是個黑戶」,對於「白戶」手機,那肯定是沒有問題的。難的是對待那些個「灰80%」,「灰70%」,「50度灰」這種中間狀態的手機,此時就需要業務邏輯的配合,比如説發覺一個「80度灰」手機本來我應該給他100元券的我現在給他5塊錢的券,如果是一個「50度灰」那麼我可以考慮折中點給他一個30塊的券,這就是我們説的「減損」,這實際上是一種「對抗手段」;
  • 前文提過,我們碰到的是一個頂級黑產,它把「白戶」手機放在機器裡面然後用模擬器的速度來超過你真實用戶搶券的速度,照樣可以讓你的網站里發的券被秒光,這就很難對付了,要知道當你碰到這種來訪問你網站的手機號都是「白戶」的時候那才是一場真正的戰鬥,於是我們會有一種手段,這種手段叫人機識別SDK。這種SDK它會埋入你的APP應用內,當用戶打開這個APP時,它會自動識別,裝有它的容器是一個真實的用戶手機還是一個模擬器,它的原理如下:

大家可以看看JD、永輝、蘇寧的一些APP,現在的做法是在用戶註冊之前即用戶還沒有到達註冊頁面開始填手機號拿驗證碼之前先會給你彈一個「滑塊」或者是一個「點選文字」的「人機對抗」過程,為什麼會彈這個東東出來呢?就是因為APP已經發覺你打開該APP的行為有疑似人機,那麼為了判斷你是人還是機,它會讓你來一次「圖形對抗」。

這一步一般的中大型網站我看了一下,還真沒有。所以很多黑產的「白戶」其實這些白戶都是黑產養在我們網站里的小號,大量的小號就是這麼被養成的。要知道,防範黑產一定先從「源頭」防起,那就是登錄註冊。當然,前面還提到一點就是你的手機APP端一定要做混淆,要打足系統修補程式,以增加黑產攻擊的成本。

1、對抗過了才到登錄註冊步驟。登錄註冊時此時再對手機號的「信用」進行判定,有兩種做法,一種為對於信用不好的讓其登錄註冊但是在後台資料庫層會對該會員進行一個企業自有信用分的打分。另一種為乾脆不讓第三分信用分低的用戶手機進行登錄或者註冊,那麼它的做法就是不斷的去彈圖形驗證碼讓用戶去試以此來做到「溫柔的殺戮」。

2、在搶券、下單、秒殺這些場景依據之前登錄註冊用戶的情況來進行減損,比如説:讓信用分低的會員「過」,那麼對於這些信用分低的會員會進行判定給予其小面額券或者柔性的提示「忽悠」他。或者對於信用分低過一定層次的用戶直接就不讓其領券了。

3、數據清洗,這一步其實也是很有必要的。因為它是構成整個閉環至關重要的一步,它的作用在於把一些非正常行為的用戶給事後洗出來,比如説:登錄註冊和下單不在同一個城市的會員是哪些?或者登錄註冊和領券不在同一個城市的會員又有哪些,要知道我們前面的步驟勢必會有「漏網之魚」,到了數據清洗這一步那麼我們就開始洗這些漏網之魚了。洗出來這些「魚」後反過來把這些會員做「標記」就是:要麼拉低它們的企業自有信用分值,要麼就標上「黑戶」的標記,於是在這些「魚」下一次再進行登錄註冊時就會被「扔」到他們本應該被「對抗掉」的那些步驟中了。因此,數據清洗是一個「承上啟下」、「接漏補全」的過程,它就像一個齒輪一樣,不斷的驅動著這根數據流程「皮帶」永遠的轉下去,把個企業的會員來來回回、回回來來的洗來洗去的這麼一個作用。

這一套體系,它勢必是建立在大數據的基礎上的。大家想一下,黑產都已經大數據化、AI化了,你還不大數據這不是等死嗎?因此我在這個閉環的流程上特彆強調這個企業的大數據能力。

大數據,它不是報表功能很多企業和團隊把它做成了一個"Reporting」,那麼你根本沒有發覺起大數據本來有的屬命,你想,幾千萬的會員的購買歷史、登錄、註冊過程,結合起來要在分鐘級或者是小時級清洗,傳統的資料庫怎麼可能做得到?一定要大數據去洗,洗洗么更健康,對吧!呵呵!

過程、方法論講完了戰鬥並未完

體系講完了,戰鬥並未完,戰鬥還在持續!

我們到現在還在戰鬥,因為還有很多細節需要處理還有許多分析正在精細、甚至也在往AI和建模上靠攏。

戰鬥從宏觀上説這不僅是IT的戰鬥,業務、領導層更要高度重視;

戰鬥從微觀層面上説催生每個團隊甚至每個個人的技能,我們需要更精準的分析、更多的數據、更快速度、更高效、更敏捷的應用群;

戰鬥的忠旨在於提高黑產的攻擊成本,戰鬥的原則一定是「不能建立在零損耗上,而是要建立在減損上」,千萬要拋棄「蚊子再小也有幾毫克肉」的思想,一定記得不要做「撿了芝麻毛西瓜」的蠢事。

因為這是一場持續的、永遠不會消失的戰鬥,它需要我們鬥智斗勇同時把安全上升到和贏利一樣重要的層面上來。

下一篇我們將詳細講述「性能高地保衛戰」。僅以此系列用來感謝在618那段時間一起奮戰的devops、開發、PM們,他們分別是:俊龍、Neil吳、郝穎、虎哥、Lester、Raymond、Jun、歡哥、海濤、秋明、郭鑫、Lina

感謝他們給到我的支援、感謝他們給到我的配合、更感謝他們甚至在零晨4:30還給我打電話説:「我覺得我還有一個更好的注意」、「我發覺這段邏輯似乎還有一個bug」,他們是「英雄」、是真正的Dev & Ops、是具有工匠精神的一個團隊!