這個周末,可能是我最戲劇性的周末了。
周五發完Claude Fable 5的文章之后,看的人還是蠻多的,大家反饋也都不錯。
但是呢,我也不知道觸動了誰,也有可能是某些大佬,可能想讓我長長教訓,或者想讓我知道,Vibe Coding的網站就是狗屎,是有無數的安全隱患的。
然后,對我的這么個破逼看AI資訊的網站AIHOT,進行了長達兩天的攻擊。。。
我被迫拿起AI,用極為蹩腳的知識,與他們展開了攻防。
后來我還發了個感慨,果然是干中學,這兩天的時間,可能是我對于網絡安全的學習速度提升的最快的兩天了。。。
![]()
故事是這樣的。
上周六,因為前一天周五的時候,搬家搬了一整天,有點累,加上AIHOT服務器也沒啥異動,我就睡得比較早,大概凌晨2點就去睡了(我正常一般都是4點左右)。
然后,噩夢就開始了。
后來我是復盤我們服務器的日志,才看到這一切的。
周六凌晨4點48分20秒,在我熟睡的時候。
一個來自德國機房的IP,來到了我的AIHOT網站,請求了一張圖片。
因為我的網站上,為了大家的用戶體驗,所以很多的圖片,我都提前緩存下來了,大概就像這樣。
![]()
我的服務器認認真真接待了它,把這張壓縮過的86k的圖片給它返回了過去。
事后看,這其實就是個踩點,后來我復盤才看清它的打法。
這個德國的IP,做了一個腳本,手里拿著一份提前爬好的清單,上面全是我們頁面里真實存在的圖片鏈接,它照著清單,一條一條地試,確認哪些鏈接能讓我的服務器真的跟他進行交互給它返回數據。
這個德國IP的請求的身份標識欄里,沒有偽裝成服務器,沒有偽裝成爬蟲,只有一行字:
#TeamAntiAI
這個翻譯過來就是,反AI小隊。
我之前以為是某個組織,但是周末查了一下以后發現,全網都沒有這個反AI小隊的任何信息,大概率,就是某一個大佬自己標的。
目的特別單純,就是打垮我這種vibe coding做的網頁,讓我這種外行吃吃教訓,讓我們知道,不是誰都可以做網站對外提供服務的。
你敢對外,我就打死你。
凌晨5點半,攻擊正式開始了。
對我服務器的請求量開始陡峭地往上爬。
5點58分的時候,一分鐘直接請求了13萬次。
6點整,我服務器的報錯日志開始出現了第一個報錯,翻譯成人話就是,他請求的太猛了,我的AIHOT,完全接待不過來了。
然后是早上6點04分到6點07分。
這4分鐘,它往我的圖片接口灌了236萬個請求。
峰值出現在6點05分,那一分鐘,直接灌了87萬次。
我的站按過去一個月的數據算,平時一天的請求量是三百多萬,平均到每分鐘,也就兩千多次。
而這一分鐘,直接打了我平時的340倍。
整個上午它沒停過手,一波一波的,到中午我起床為止,總共砸了大概1100萬個請求。
而這一切發生的時候,我正在睡覺。
等我睡醒,看到鋪天蓋地的用戶反饋,同時看到飛書群的告警、反應過來的時候,網站已經炸了,用戶打開時不時就會報錯,Skill和API啥的動不動就是失敗。
我翻著日志里那些密密麻麻的攻擊記錄,每一行都頂著同一個簽名,#TeamAntiAI。
![]()
這里簡單的提一下,這個所謂的簽名,其實就是署名,放在HTTP的一個User-Agent里,這個User-Agent本來是瀏覽器和爬蟲告訴服務器我是誰的地方,比如Chrome、GPTBot、Googlebot等等,所以呢,攻擊者留下這個署名,用意也很簡單。
就是純粹的挑釁,以及傳達態度,然后教育我。
我也是挺崩的。
也不知道招誰惹誰了。
我醒了以后,看到這些,沒辦法,第一時間在AIHOT的飛書訂閱群里發了通知,跟大家說明了一下情況。
![]()
還有一個最根本的問題,我不是開發,更不是安全工程師,作為一個設計師出身的純粹的外行,你讓我去排查線上的攻擊,我說實話,那跟讓我去修飛機也沒啥區別。
所以呢,為了解決這個問題,讓我的網站還能正常提供服務,我只能祭出AI了,你不是反AI小隊嗎,那就跟Claude Fable 5打一打吧。。。
于是,我就跟我的Claude Fable 5說:
我們被攻擊了,目標只有一個,在不誤傷真實用戶的前提下,把攻擊擋住。然后進行全方位的修復。
![]()
作為一個純粹的外行,我只能這么干了。
但坦誠的講,接下來的48小時,可能是我學習速度最快的48小時,因為我不可能當個傻子,真的全部讓渡給AI,所以,它一邊分析,我一邊學習,所有的思考過程,有任何我不懂的專業名詞和做法,我就立刻截圖扔給Codex,讓它根據我的AIHOT這個項目,給我用大白話進行解釋。
相信我,當你的服務器持續的崩,你的域名賬單持續的燒錢的時候,你的學習欲望,一定是最強烈的時候。。。
Claude Fable 5在扒了半天以后,給了我一個讓我非常意外的結論。
它說,我的站,其實沒被打穿,我的服務器防護做的非常的好。
那將近240萬個打向AIHOT圖片接口的請求,被我們之前配好的限流器結結實實擋住了,日志里的數據非常漂亮,239萬次拒絕,放進來的只有最開始踩點那一千來個,攔截率做到了百分之九十九點九五。
那我懵逼了,那我的服務器是怎么崩掉的???
然后Fable 5說,真正出事的,是我們服務器另一個地方。
這里得先交代一下我們這臺服務器的特殊性,不然大家可能會看不懂這個坑是怎么冒出來的。
我在火山上買的這臺服務器,其實現在是我們公司的共享服務器,上面跑著三十多個項目。
因為之前為了讓公司同事都能享受Vibe Coding的快樂,所以,我把這臺服務器的整套部署流程,包裝成了一個Skill,效果特別好。
同事不需要懂任何開發知識或者運維,只需要跟AI說一句“幫我把這個項目部署上去”,AI自己連服務器、做隔離、建服務、自建域名,幾分鐘,項目就能正式上線了。
但現在回頭看,幾個月前,我給大家封裝那個Skill的時候,腦子里只有一個詞,方便。
那個時候,安全這個維度,壓根不在我的需求清單里。
那個時候還是Opus 4.6的時代,我沒提,AI就沒做。
于是呢,每個項目就像一扇扇的門,每一扇新開的門,都開得飛快,但沒有一扇門配了鎖。
我自己的AIHOT自己的限流,是我之前單獨做安全硬化的時候加的,等于三十多個項目里,就我自己這個項目,做了防護。
攻擊者把整臺服務器試了一圈,就發現了這個事。
我的圖片接口,從aihot的域名進來,有限流,發現攻擊不了。
但是,它硬生生找到了另一個當時沒有設防的別的項目的域名。
于是,直接往那個域名中,爆破了868萬個請求。
這868萬個請求瞬間把整臺服務器的并發連接占滿了,我的nginx當時的并發上限,一共就768個。
你可以理解成整臺服務器同時只能張開768只手,現在全被攻擊者握住了,真實用戶伸過來的手,就完全沒人理他了。
于是,握手不成功,于是就是在用戶視角里,全站癱瘓,當時看了一下,周六的早上,間歇性報錯了1萬多次。
說實話,看到這個分析,我都懵逼了,因為我其實一直自認為是一個非常謹慎的人,AIHOT現在流量也還挺大的,所以我對著AIHOT,加了非常非常多的防護,但是如果不是Claude Fable 5幫我分析,我是真的不知道,我那個服務器上其他人的項目上,還有那么多的坑。
然后就是正常的封禁IP、加限流,往服務器上做安全中臺,對所有項目進行全域防護。
![]()
同時在這個過程中,Claude Fable 5也在全面審查以后,自主的發現了我們服務器還有AIHOT上的一些安全漏洞和可以優化的小點,這全都是以前Opus 4.8還有GPT-5.5在審查的時候,沒有查出來的。
周六下午提交了很多的防護以后,看了一眼日志,又讓AI掃了一遍,基本上流量和穩定性都回到了正常,我本來覺得這事就翻篇了。
結果,我想多了。
周六深夜12點多的時候,我洗完澡回來,發現我們飛書反饋群,忽然炸了。
![]()
我們AIHOT網站上有個用戶反饋功能,用戶提交的反饋會自動推送到我的飛書群里,方便我去看大家的反饋,以及判斷是不是要優化。
那天晚上開始,群里的推送莫名奇妙的冒出了上萬條,我看了一眼,人都傻了,點開全是純數字亂碼,落款是一堆偽造的QQ郵箱。
這個攻擊者老哥,盯上了反饋接口。
一個北京聯通的IP,以每秒5.5次的頻率,往我們的反饋接口灌垃圾數據。
而且這個頻率,是精心挑選過的,正正好踩在限流的下沿一點點。
直接給我的數據庫里灌了3萬多條垃圾數據,我的飛書直接爆炸了。
真的就是純粹的惡意。。。
而這還只是開胃菜。
凌晨12點半,主力正式到場。
一批新IP加入進來,有云服務器,有居民寬帶,跟第一波單槍匹馬的莽夫畫風完全不同,這一次是多IP協同,而且每個IP的請求頻率都精準的壓在限流紅線之下,單看誰都不違規,但是合起來,就是一支軍隊。
而且這次,大部分都不打#TeamAntiAI的旗號了,全部偽裝成各種普通的用戶,開始批量攻擊。
打法也升級了,他們專挑最貴的頁面,就是那種沒法用緩存、每次都要服務器現場渲染的頁面,而且每個請求都帶一個隨機參數,這個隨機參數是用來騙緩存的,緩存一看參數不一樣,以為是新頁面,就放請求進去讓服務器重新算。
于是,我服務器后臺的渲染隊列很快就堵死了。
我當時甚至看到日志里有一條真實用戶的請求,加載一個列表頁,等了60.024秒。
60秒。。。
真的,平時這個頁面,40毫秒就出來了,連1秒都用不到,直接慢了一千五百倍。
沒辦法,只能在飛書群里又給大家磕頭。
![]()
然后Claude Fable 5開始同步的防御。
那天晚上的git提交記錄,我現在回看,還是會覺得感慨。
凌晨0點56分,AI封掉往反饋接口灌水的IP,給反饋接口加上獨立的防灌水規則,飛書群安靜了。
1點17分,給埋點接口加上限流,堵住另一個同樣能被灌的口子。
1點36分,7個證據確鑿的攻擊IP拉黑。
那幾個攻擊的IP拉黑的那一刻,列表的響應時間終于從60秒跌回了40毫秒。
1點51分,開始治本,一整套緩存加固上線,這一條是當晚真正的勝負手。
它先改了緩存的識別規則,讓緩存徹底無視那個隨機參數,從此參數再怎么隨機,命中的都是同一份緩存,堵上了之前的漏洞。
然后把緩存時間從60秒拉長到3分鐘,因為我們是個資訊站,大部分時間其實都是靜態的,列表頁3分鐘前的樣子和現在的樣子,幾乎沒區別,但對服務器來說,同一個頁面被真正重新渲染的次數,直接除以3,進一步優化性能。
然后做了合單,同一時刻涌進來一百個人要同一個頁面,以前是后廚炒一百遍,現在只放第一個請求進去炒,剩下九十九個在窗口等著,炒好了一起分,繼續做性能優化。。。
2點15分,它把系統里所有的報警消息全部重寫了一遍,從工程師黑話,改成產品經理能看懂的人話。
因為它知道,半夜看報警的人,是我,之前我提了一下我有點看不懂文案。
然后,它還把封禁審批的流程改了,之前的Claude Opus 4.8開發的規矩是每個封禁因為怕誤封,都要我拍板,但它同樣的,發現我根本看不懂那些證據,IP歸屬、請求指紋、行為特征,我盯著看半天也只能憑感覺。
所以它直接拉了最近兩個月以來的惡意IP的特征,列出了6條,做了自動化封禁策略,保證不傷真人用戶的同事,自動化的Ban掉所有的惡意IP。
2點40分,把訪問日志的留存拉長到一年,理由是,為了可能取證需要。
最后,順道手還挖出了一些長期潛伏的盜采爬蟲,無時無刻的不在爬我們的數據做了鏡像站,Claude Fable 5在核實完特征以后全封了。。。
一切搞定,大概凌晨3點了,我害怕又出現凌晨5點多的大規模攻擊導致我服務器崩了,然后又賬單爆炸,于是我跟Claude Fable 5說,我要去睡覺了,你幫我盯著。。。
![]()
所幸,一夜平安無事,所有的攻擊,全都防住了。
昨天晚上,看到用戶給我評論。
![]()
還是挺感慨的。
哪有啥團隊,就我一個人+一個AI。
我還是個純外行,純小白,能做的,就是告訴Claude Fable 5,發生了啥,用戶反饋了啥,快去幫我處理。
我以前打過一個比方,說不同檔次的模型,用起來完全是三種東西。
差一點的模型,像一個非常初級的執行者。你得把方案想得明明白白,prompt寫得事無巨細,它只負責純粹地干活,你漏想一步,它就錯一步。
好一點的模型,比如GPT 4.8、GPT 5.5這一檔,像一個組長,或者初級總監,你給它一個大概的任務,它能自己拆解,做出來的東西有的時候會比你自己想的全面一些。
而這兩天一直在用的Fable 5,我覺得,是另一個物種。
它像一個高級總監,甚至合伙人。
你不需要給它方案,甚至不需要給它任務,你只需要給它目標。
我這兩天給它的目標就一句話:在不誤傷真實用戶的前提下,把攻擊擋住。
最后交回來的東西,比我自己能想象出來的上限,還要高,至少在我這個外行的眼里,一切都做的井井有條,多想一步,全力的解決所有的問題。
給執行者,你要寫一頁紙的說明書。
給組長,你要交代一段話。
給合伙人,你只需要說清楚你要什么,和什么不能碰。
我越來越感受到,模型越強,prompt越短。
你需要定死的,就是目標與紅線,這其實,對應在Agent里面的,就是Goal和Harness。
這兩天,真的讓我成長很多,學到了太多了,一邊被攻擊,一邊惡補網絡安全知識,一邊防守。
這兩天我搞明白了限流、封禁IP、緩存擊穿、應用層攻擊和帶寬攻擊的區別、為什么防守要一層一層設。
沒有一個是看教程學的。
這種學習效率,我說實話,我過去從來沒體驗過。
以前自學一個新領域,最大的成本其實就是不知道該學什么,教程會把一百個知識點平鋪在你面前,個個都顯得挺重要。
但實戰里,每個知識點登場的時候,他其實,都帶著一個正在流血的傷口,你想不記住都難。
這可能就是最大的進化了。
網站現在還在跑著。
我也不知道,下一波攻擊什么時候會再來。
我只能說,謝謝大佬們,給我學習的機會。
以上,既然看到這里了,如果覺得不錯,隨手點個贊、在看、轉發三連吧,如果想第一時間收到推送,也可以給我個星標?~謝謝你看我的文章,我們,下次再見。
>/ 作者:卡茲克
>/ 投稿或爆料,請聯系郵箱:wzglyay@virxact.com
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.