<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    關停“外掛”網站30余個!警方連破3起涉黑客攻擊犯罪案;7行代碼讓B站崩潰3小時,竟因“一個詭計多端的0”;

    VSole2022-08-01 17:31:01

    7月20日,甘肅省公安廳發布了3起該省公安機關近期破獲的涉黑客攻擊破壞違法犯罪案件,抓獲犯罪嫌疑人9名,關停非法游戲“外掛”網站30余個。

    2022年3月,甘肅省公安廳網安總隊在組織開展的黑客攻擊破壞違法犯罪集中攻堅工作中,發現有一非法網站大肆售賣游戲“外掛”程序,遂將該線索交天水市公安機關網安部門查辦。根據省公安廳下發線索,天水市清水縣公安局網安大隊經工作發現,犯罪嫌疑人王某自2021年起雇傭張某瑯等人非法搭建30余個游戲“外掛”銷售網站,并售賣給福建籍人員陳某國、陳某鵬等人用于銷售游戲“外掛”。

    2022年5月,天水市公安機關組織市縣兩級精干警力,赴江蘇、福建統一展開收網行動,累計抓獲犯罪嫌疑人6名,扣押涉案設備34臺,關停非法游戲“外掛”網站30余個。

    2022年1月,甘肅省公安廳網安總隊民警工作發現,該省有網民在境外網站發布入侵控制某單位計算機系統相關信息,在查明涉案人員真實身份后,指令蘭州新區公安局網安大隊成功將其抓獲。犯罪嫌疑人到案后,如實供述了其通過自學網絡技術,非法侵入某單位信息系統,并竊取5.8萬余條數據的犯罪事實,目前該犯罪嫌疑人已被依法采取刑事強制措施。

    2022年3月,山丹縣公安局網安大隊根據甘肅省公安廳網安總隊交辦的線索,成功打掉一開發銷售國內某知名互聯網公司手機游戲“外掛”的犯罪團伙,在新疆、湖南兩地抓獲犯罪嫌疑人2名,并順線深挖出位于境外的游戲“外掛”作者,實現了對該黑客犯罪團伙的全鏈條打擊,目前案件正在進一步偵辦中。

    警方提示,網絡運營者要切實履行網絡安全主體責任,有效做好自身信息系統和數據安全防護工作。廣大網民要樹立正確網絡安全觀,提高網絡安全防范意識,依法依規上網用網。

    7行代碼讓B站崩潰3小時,

    竟因“一個詭計多端的0”

    一個小小字符“0”,竟引得B站全面崩潰。不知你是否還記得那一夜,B站“大樓停電”、“服務器爆炸”、“程序員刪庫跑路”的徹夜狂歡。(手動狗頭)時隔一年, 背后“真兇”現在終于被阿B披露出來——

    沒想到吧,就是這么簡單幾行代碼,直接干趴B站兩三個小時,搞得B站程序員徹夜無眠 頭發狂掉。

    你可能會問,這不就是個普普通通用來求最大公約數的函數嗎,怎么就有如此大的威力?

    背后一樁樁一件件,歸根結底其實就一句話:0,它真的不興除啊。

    具體詳情,咱們還是一起來看看“事故報告”。

    字符串“0”引發的“血案”

    先來說道說道引發慘案的根本原因,也就是開頭貼出的這個 gcd函數

    學過一點編程知識的小伙伴應該都知道,這是一種用 輾轉相除法來計算最大公約數的 遞歸函數

    跟我們手算最大公約數的方法不同,這個算法是醬嬸的:

    舉個簡單的例子,a=24,b=18,求a和b的最大公約數;

    a除以b,得到的余數是6,那么就讓a=18,b=6,然后接著往下算;

    18除以6,這回余數是0,那么6也就是24和18的最大公約數了。

    也就是說,a和b反復相除取余數,直到b=0,函數中:

    if b==0 then return a end
    if b==0 then return a end
    

    這個判斷語句生效,結果就算出來了。

    基于這樣的數學原理,我們再來看這段代碼,似乎沒什么問題:

    但如果輸入的b是個字符串“0”呢?

    B站的技術解析文章中提到,這段出事的代碼是用Lua寫的。Lua具有這么幾個特點:

    • 這是一種動態類型語言,常用習慣里變量不需要定義類型,直接給變量賦值就行。
    • Lua在對一個數字字符串進行算術操作時,會嘗試將這個數字字符串轉成一個數字。
    • 在Lua語言中,數學運算n%0的結果是nan (Not A Number) 。

    我們來模擬一下這個過程:

    1、當b是一個字符串“0”時,由于這個gcd函數沒有對其進行類型校驗,因此在碰上判定語句時,“0”不等于0,代碼中“return _gcd(b, a%b)”觸發,返回_gcd(“0”, nan)。

    2、_gcd(“0”, nan)再次被執行,于是返回值變成了_gcd(nan, nan)。

    這下就完犢子了,判定語句中b=0的條件永遠沒法達到,于是, 死循環出現了。

    也就是說,這個程序開始瘋狂地原地轉圈,并且為了一個永遠得不到的結果,把CPU占了個100%,別的用戶請求自然就處理不了了。

    那么問題來了,這個“0”它到底是怎么進去的呢?

    官方說法是:

    在某種發布模式中,應用的實例權重會短暫地調整為0,此時注冊中心返回給SLB (負載均衡) 的權重是字符串類型的“0”。此發布環境只有生產環境會用到,同時使用的頻率極低,在SLB前期灰度過程中未觸發此問題。
    SLB在balance_by_lua階段,會將共享內存中保存的服務IP、Port、Weight作為參數傳給lua-resty-balancer模塊用于選擇upstream server,在節點weight=“0”時,balancer模塊中的_gcd函數收到的入參b可能為“0”。

    在某種發布模式中,應用的實例權重會短暫地調整為0,此時注冊中心返回給SLB (負載均衡) 的權重是字符串類型的“0”。此發布環境只有生產環境會用到,同時使用的頻率極低,在SLB前期灰度過程中未觸發此問題。

    SLB在balance_by_lua階段,會將共享內存中保存的服務IP、Port、Weight作為參數傳給lua-resty-balancer模塊用于選擇upstream server,在節點weight=“0”時,balancer模塊中的_gcd函數收到的入參b可能為“0”。

    以“事后諸葛亮”的視角來看,這個引發B站全面崩潰的根本原因多少有點讓人直呼“就這”。

    但從當事程序員的視角來看,事情確實沒有辣么簡單。

    當天晚上22:52分——大部分程序員才剛下班或者還沒下班的節骨眼 (doge),B站運維收到服務不可用的報警,第一時間懷疑機房、網絡、四層LB、七層SLB等基礎設施出現問題。

    然后立馬和相關技術人員拉了個緊急語音會議開始處理。

    5分鐘后,運維發現承載全部在線業務的主機房七層SLB的 CPU占用率達到了100%,無法處理用戶請求,排除其他設施后,鎖定故障為該層。

    (七層SLB是指基于URL等應用層信息的負載均衡。負載均衡通過算法把客戶請求分配到服務器集群,從而減少服務器壓力。)

    萬般緊急之時,小插曲還現了:遠程在家的程序員登上VPN卻沒法進入內網,只好又去call了一遍內網負責人,走了個綠色通道才全部上線 (因為其中一個域名是由故障的SLB代理的) 

    此時已經過去了 25分鐘,搶修正式開始。

    首先,運維先熱重啟了一遍SLB,未恢復;然后嘗試拒絕用戶流量冷重啟SLB,CPU依然100%,還是未恢復。

    接著,運維發現多活機房SLB請求大量超時,但CPU未過載,正準備重啟多活機房SLB時,內部群反應主站服務已恢復,視頻播放、推薦、評論、動態等功能已基本正常。

    此時是23點23分,距離事故發生 31分鐘

    值得一提的是,這些功能恢復其實是事發之時被網友們吐槽的“高可用容災架構”發揮了作用。

    至于這道防線為啥一開始沒發揮作用,里頭可能還有你我一點鍋。

    簡單來說,就是大家伙點不開B站就開始瘋狂刷新,CDN流量回源重試 + 用戶重試,直接讓B站流量突增4倍以上,連接數突增100倍到千萬級別,多活SLB就給整過載了。

    不過,并不是所有服務都搞了多活架構,至此事情并沒完全解決。

    接下來的半個小時里,大家做了很多操作,回滾了最近兩周左右上線的Lua代碼,都沒把剩余的服務恢復。

    時間來到了12點,沒有辦法了,“先不管bug是怎么出來的,把服務全恢復了再說”。

    簡單+粗暴:運維直接耗時一小時 重建了一組全新的SLB集群

    凌晨1點,新集群終于建好:

    一邊,有人負責陸續將直播、電商、漫畫、支付等核心業務流量切換到新集群,恢復全部服務 (凌晨1點50分全部搞定,暫時結束了崩了逼近3個小時的事故);

    另一邊,繼續分析bug原因。

    在他們用分析工具跑出一份詳細的火焰圖數據后,那個搞事的“0”才終于露出了一點端倪:

    CPU熱點明顯集中在一個對lua-resty-balancer模塊的調用中。而該模塊的_gcd函數在某次執行后返回了一個預期外的值:NaN。

    同時,他們也發現了觸發誘因的條件:某個容器IP的weight=0。

    他們懷疑是該函數觸發了jit編譯器的某個bug,運行出錯 陷入死循環導致SLB CPU 100%。

    于是就全局關閉了jit編譯,暫時規避了風險。一切都解決完后,已經快4點,大家終于暫時睡了個好覺。

    第二天大家也沒閑著,馬不停蹄地在線下環境復現了bug后,發現并不是jit編譯器的問題,而是服務的 某種特殊發布模式會出現容器實例權重為0的情況,而這個0是個字符串形式。

    正如前面所說,這個字符串“0”在動態語言Lua中的算術操作中,被轉成了數字,走到了不該走的分支,造成了死循環,引發了b站此次前所未見的大崩潰事件。

    遞歸的鍋還是弱類型語言的鍋?

    不少網友都還對這次事故記憶猶新,有回想起自己就是以為手機不行換電腦也不行的,也有人還記得當時5分鐘后此事就上了熱搜。

    大家都很詫異,就這么一個簡單的死循環就能造成如此大的網站崩服。

    不過,有人指出,死循環不罕見,罕見的是在SLB層、在分發過程出問題,它還不像在后臺出問題很快能重啟解決。

    為了避免這種情況發生, 有人認為要慎用遞歸,硬要用還是設置一個計數器,達到一個業務不太可能達到的值后直接return掉。

    還有人認為這不怪遞歸,主要還是弱類型語言的鍋。

    以此還導致了“詭計多端的‘0’”這一打趣的說法。

    另外,由于事故實在是耽誤了太久、太多事兒,當時B站給所有用戶補了一天大會員。

    有人就在此算了一筆賬,稱就是這7行代碼,讓b站老板一下虧了大約1,5750,0000元。(手動狗頭)

    對于這個bug,你有什么想吐槽的?

    違法犯罪
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    2023年7月6日,公安部召開“公安心向黨 護航新征程”系列主題新聞發布會。其中,公安部牽頭建立的網絡安全等級保護制度,已經成為網絡安全領域的基本制度。公安部積極參與制定數據分類分級保護、數據安全風險評估、監測預警和應急處置、數據安全審查等工作制度,健全完善數據安全制度體系。
    此類案件以公民個人信息為核心,覆蓋醫療、教育、電商等多個行業,滋生出電信詐騙、騷擾電話、搶號搶票、網絡水軍等一系列人民群眾深惡痛絕的黑灰產業。
    8月10日,四川公安機關集中收網,抓獲犯罪嫌疑人189名,查獲各類非法獲取公民個人信息軟件工具104款,查獲公民個人信息數據1200萬余條。“百日行動”期間,福建公安機關組織收網抓捕,抓獲犯罪嫌疑人5名,查封“山寨”網站4000余個。
    個人信息安全案件多發頻發表明,重點行業、領域內部個人信息管理存在漏洞,監管機制缺位。更重要的是,需持續完善行業規章制度,堵住漏洞,切斷行業“內鬼”牟利源頭,鏟除滋生犯罪的土壤,斬斷黑灰產業鏈。
    4月11日,全國打擊治理電信網絡新型違法犯罪工作電視電話會議在京召開,國務委員、公安部部長、國務院打擊治理電信網絡新型違法犯罪工作部際聯席會議總召集人趙克志出席并講話。 全國打擊治理電信網絡新型違法犯罪工作電視電話會議4月11日在京召開,國務委員、公安部部長、國務院打擊治理電信網絡新型違法犯罪工作部際聯席會議總召集人趙克志出席并講話。
    打擊治理電信網絡詐騙違法犯罪工作取得明顯成效,去年4月以來共破案39.4萬起,抓獲犯罪嫌疑人63.4萬名,電信網絡詐騙案件上升勢頭得到有效遏制
    4月11日,全國打擊治理電信網絡新型違法犯罪工作電視電話會議在京召開,國務委員、公安部部長、國務院打擊治理電信網絡新型違法犯罪工作部際聯席會議總召集人趙克志出席并講話。
    2021年,共抓獲行業“內鬼”6000余名,打掉關停接碼、打碼、解封、養號、非法交易網絡平臺80余個,收繳“貓池”、卡池設備1萬余臺,查獲關停涉案網絡賬號1000余萬個。
    買賣銀行卡,都是違法犯罪行為
    11月30日,公安部在京召開“公安心向黨 護航新征程”主題新聞發布會,通報全國公安機關持續開展“凈網”系列專項行動,全力打擊黑客類違法犯罪舉措及總體成效情況,公布十大典型案例。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类