本週論文分享是一篇2009年的論文《Botgraph: Large scale spamming botnet detection》。這篇文章雖然年代比較久遠,但是仔細剖析依然有很多值得借鑑的地方。另外,文章詳細介紹了一個反欺詐演算法從演算法設計、工程實現到業務應用的整個鏈路,對於剛接觸反欺詐演算法的同學是一個很好的入門資料。
這篇文章的作者有DataVisor的創始人謝映蓮和俞舫女士,這是她們在微軟研究院時期發表的論文。關於DataVisor的無監督演算法在以後的文章中會進行解析,在這裡先挖一個坑。下面言歸正傳,我們來逐步解讀這篇文章。
背景
論文是為了解決一種名為“殭屍網路”(botnet)的攻擊,這種攻擊一般是透過殭屍程式控制很多臺“肉雞”,透過這些“肉雞”註冊大量的郵箱賬號(bot-users/bot-accounts)併傳送垃圾郵件。我們希望透過演算法找到這些bot-users。
演算法設計
由於“肉雞”是在統一的spammer指揮下進行郵件傳送等動作的,因此bot-users之間會存在一些行為的同步性或者資源上的公用。論文提出的演算法是基於botuser的註冊、登入、傳送郵件等操作時共享的IP地址,建立botuser之間的關係。
第一步:構建User-User圖
以每一個bot-user為圖上的頂點,以兩個bot-user共享的IP數量作為邊的權重。
第二步:層次聚類(自上而下)
上述演算法的意思是:設定邊權重(共享的IP地址數量)和閾值T,抽取G的子圖(邊權重w>=T)。對G作連通子圖聚類,得到k個連通圖。若連通圖的成員數大於M,那麼對該連通圖進一步作取子圖操作,但邊權重閾值從T變成了T+1。不斷迭代上述整個過程。
該核心演算法是一個自上而下的層次聚類,隨著層數的加深聚類條件越來越嚴格,第一層為原始圖無約束條件,而第二層的團體必須滿足w>=T,以此類推。
第三步:剪枝(pruning)
根據第二步得到團體後,需要對團體的置信度進行評價,即該團體的嫌疑度到底有多大。論文中採用的規則是團體中80%的成員日均傳送郵件數>3,若團體滿足該條件則認為是一個候選的botuser團體。
需要注意的是這裡的刪除操作可以認為是獨立針對每一個節點的。父節點刪除其子節點不一定會刪除;同理子節點刪除,父節點也不一定會刪除。關於這一點,在最後的討論中會再談。
第四步:成團(Grouping)
第三步得到的候選嫌疑團體之後,還要做一次樹的遍歷。該步是為了解決如果父節點和子節點都是嫌疑團體,那麼應該取哪一個的問題。遍歷的方法是:
1)若父節點(成員數為N)至少存在一個子節點團體包含的成員數量為o(N),則向下遍歷;
2)若父節點(成員數為N)所有子節點團體包含的成員數量都不超過o(log N),那麼停止遍歷。
前四步的演算法實施過程可以用下圖來形象化表示:
第一層是最原始的user-user圖R;
第二層是由R分解的A和B兩個大規模團體(子圖)和其他小規模團體(或者孤立點),子圖A和B中的邊都滿足w>=T並且成員數>M;
第三層則是由A和B進一步分解的大規模團體C、D、E,這些團體的邊都滿足w>=T+1並且成員數>M;
第四層則是由C、D、E分解的若干小規模團體(或者孤立點),這時已經沒有團體滿足w>=T+2並且成員數>M。
下面則是成團操作:
A滿足向下遍歷條件到C,C滿足停止遍歷條件則停止,A由一個giant group(C)和其他一些小規模團體(或者孤立點)組成,因此A是一個bot-user團體(C屬於團體A)。
B滿足向下遍歷條件到D和E,D和E滿足停止遍歷條件則停止,B由兩個giant group(C)和其他一些小規模團體(或者孤立點)組成,因此B不是一個bot-user團體(D和E是)。
第五步:驗證
這一步是從更多的角度去驗證團體是否正確,如團體中的賬戶暱稱是否有相同的模式等。
第一種簡單的資料並行化方法:Map階段,根據IP進行分割槽,對於每個分割槽維護一個以(Ui,Uj)為key的HashTable,生成(Ui,Uj,1);Reduce階段,以(Ui,Uj)為key作hash partition,聚合weight。
第二種則是採用了過濾的方法:Map階段,根據UserID進行分割槽;對於分割槽p,生成該分割槽中出現IP的一個List,將這個IP List分發到其他各分割槽,對於其他分割槽中的User若使用IP List中的IP數量小於w那麼在圖中肯定形成不了邊,於是將其過濾掉,將剩下的(U,IP)傳輸到原分割槽p中。
問題和討論
對於一個演算法工程師,僅僅達到讀懂論文的程度是遠遠不夠的。為了能將經典論文在實際業務中借鑑和應用,一些背後蘊藏的問題需要認真思考。下面我列舉一下讀完這篇論文中後發現的問題:
1. 在剪枝步驟中,為什麼團體節點的處理是獨立的、與層級結構無關?
2. 兩種並行化建圖方法各有什麼優劣,我們如何根據自己的實際情況進行選擇?
3. 在演算法第四步中確定團體(grouping)的時候,為什麼A是一個圖體、但是B不是?這樣處理會不會造成一些遺漏?
4. 可以建立User-IP的異構圖進行連通圖聚類嗎?與這樣做與建立User-User圖的區別在哪裡?
5. 團體的層級結構應該採用什麼樣的資料結構儲存比較好?
6. 對若干規模不等的子圖做連通圖聚類時如何設計並行演算法效率最高?
大家可以積極參與思考和討論,共同成長哦~
資源地址
論文連結:https://www.usenix.org/legacy/events/nsdi09/tech/full_papers/zhao/zhao.pdf