
關(guān)注 霍格沃茲軟件測試開發(fā) 公眾號回復(fù)「資料」, 領(lǐng)取人工智能測試開發(fā)技術(shù)合集大家好我是老K一個在電商安全圈兒摸爬滾打七八年的老兵。前兩天跟一個在拼多多做安全的老友擼串三杯啤酒下肚他跟我吐了個槽他們現(xiàn)在搞大促安全測試已經(jīng)不怎么靠人肉堆了而是讓AI先把“最可能被薅禿嚕皮”的路徑自動篩出來測試照著打就行效率直接翻了10倍。我聽完差點一口毛肚嗆進嗓子眼兒。你知道干我們這行的大促前最怕什么不是黑客DDoS而是那群拿著計算器、比產(chǎn)品經(jīng)理還懂規(guī)則的羊毛黨。傳統(tǒng)安全測試全靠幾個專家閉關(guān)腦暴畫各種攻擊路徑圖費勁巴拉也就覆蓋百來種組合。拼多多這倒好直接讓AI把活兒干了。厚著臉皮連哄帶騙我把這套思路套了出來又結(jié)合自己在公司復(fù)現(xiàn)的demo今天給大伙兒掰開揉碎整成一期硬核技術(shù)教程。放心我們不聊虛的就聊怎么動手把這事兒落地。一、那些年被薅羊毛支配的恐懼先說說為啥這個事兒讓我這么激動。一個典型的拼多多式活動什么“百億補貼”、“砍一刀”、“紅包雨”疊加的營銷規(guī)則能把你繞暈滿100減20的店鋪券能不能和全場滿300減50疊加新人10元無門檻券在退貨后退回還能不能參與“0.01元搶購”如果用支付寶優(yōu)惠再加多多支付立減風控策略是認設(shè)備還是認身份證傳統(tǒng)安全測試要怎么做一般是安全專家拉著產(chǎn)品和運營把活動規(guī)則文檔啃一遍然后靠經(jīng)驗在腦子里模擬攻擊鏈“先養(yǎng)一批小號領(lǐng)新人券湊單到門檻再用某些虛擬商品把滿減金額拆出來……”一個人一天能畫出三四十條有效路徑就頂天了而且極度依賴那個專家的腦容量。萬一他那天跟媳婦吵架狀態(tài)不好就可能漏掉一條“致命路徑”。結(jié)果就是大促上線后某個被忽略的組合被羊毛黨腳本自動化薅走幾百萬安全團隊集體背鍋。這種恐懼做過電商安全的都懂。拼多多這個“狠活”本質(zhì)上就是把這套人肉腦暴的過程變成了一套AI驅(qū)動的自動化路徑挖掘系統(tǒng)而且上來就給你按風險從高到低排好Top 100安全測試團隊只管“點菜”就行。二、核心思路把羊毛地圖畫出來讓AI去尋寶他們解決這個問題的思路在我看其實就三步把所有的活動規(guī)則、用戶動作、資金流動抽象成一張有向圖我管它叫“羊毛地圖”。訓練一個AI智能體在這張圖上玩一個“最大化收益且最小化被風控風險”的尋路游戲。讓AI每天自動跑吐出當前最可能被利用的Top 100高風險路徑并直接生成測試用例。類比一下就像AlphaGo下圍棋。棋盤就是業(yè)務(wù)規(guī)則圖譜落子就是用戶的每一步操作領(lǐng)券、加購、拆分訂單、退款贏了就是成功把平臺的錢薅進自己口袋而對手的風控系統(tǒng)就是另一個AI。咱們要做的就是訓練出一個能贏過風控的“最強羊毛選手”然后把這個選手想出來的妙招拿來做防守測試。你可能會問這玩意兒真能比人強事實證明人腦對復(fù)雜狀態(tài)空間的搜索深度和廣度都極其有限而AI在圖上做蒙特卡洛樹搜索一晚上能模擬出上億條攻擊路徑還能從中學習哪些動作組合更容易繞過風控。這根本不在一個量級。三、手把手拆解怎么自動生成Top 100高危羊毛路徑好重點來了。我花了兩個周末用開源工具搭了一個極簡版這就把核心步驟拆成可以落地的教程。各位安全同仁可以直接參考這個框架去折騰。第1步把活動規(guī)則塞進圖數(shù)據(jù)庫建一張“羊毛地圖”這是地基。咱們不玩虛的直接用Neo4j或者NebulaGraph這類圖數(shù)據(jù)庫來干。你需要把一次活動的所有要素抽象成節(jié)點和邊。比如節(jié)點類型用戶狀態(tài)新注冊、老用戶、已實名、優(yōu)惠券店鋪券、平臺券、新人券、資金賬戶錢包余額、多多支付、商品實物、虛擬、高補貼品、訂單狀態(tài)待支付、已支付、已退款等。邊的類型代表一個具體動作。例如(:User)-[:CLAIM]-(:Coupon)(領(lǐng)券)(:Order)-[:APPLY_REFUND]-(:RefundFlow)(:Coupon)-[:COMBINE_WITH]-(:Coupon)(疊加規(guī)則) 等等。關(guān)鍵是要把疊加規(guī)則和互斥邏輯刻在邊上。比如一張店鋪券“滿100減20”和一張平臺券“滿300減50”可以疊加你就拉一條帶有{type:superimpose}屬性的邊。如果規(guī)則寫“新人券不可與活動商品同時使用”那就得設(shè)一條FORBID_COMBINE的邊或者在圖譜上構(gòu)建約束條件。舉個實際的圖譜構(gòu)建小片段我用Python操作Neo4jfrom neo4j import GraphDatabase driver GraphDatabase.driver(bolt://localhost:7687, auth(neo4j, password)) def build_activity_graph(tx): # 創(chuàng)建商品節(jié)點標記是否高補貼 tx.run(MERGE (p:Product {id:sku123, price:149, is_subsidized:1})) # 創(chuàng)建優(yōu)惠券節(jié)點標記門檻和面額 tx.run(MERGE (c:Coupon {id:coupon_a, type:shop, threshold:100, discount:20})) # 創(chuàng)建一條“可應(yīng)用于”關(guān)系并標記誰可以領(lǐng) tx.run(MATCH (c:Coupon {id:coupon_a}), (p:Product {id:sku123}) MERGE (c)-[:APPLICABLE_TO {restriction:new_user_only}]-(p))當所有營銷規(guī)則、商品列表、支付方式、退款流程都這么入庫你就得到了一張立體的“業(yè)務(wù)游戲沙盤”。一個完整的攻擊路徑就是從User節(jié)點出發(fā)經(jīng)過一系列領(lǐng)券、加購、組合支付、拆單、退款等動作最終到達Profit節(jié)點提現(xiàn)或獲得低價商品的路徑。第2步讓AI學會“薅羊毛”——一個圖上的強化學習游戲有了圖接下來就是訓練一個智能體在上面“尋路”。我用的方法是深度Q學習 圖神經(jīng)網(wǎng)絡(luò)GNN的變體拼多多內(nèi)部大概率也是類似的強化學習框架只是特征工程和狀態(tài)空間更精細。狀態(tài)State當前用戶所處的圖譜環(huán)境向量。比如“手里有一張未使用的20元券購物車有A和B用戶為新注冊設(shè)備指紋正?!?。我們可以用GraphSAGE這樣的GNN對當前子圖做嵌入生成一個狀態(tài)向量。動作Action當前可選的圖譜邊。比如CLAIM_ANOTHER_COUPONADD_ITEM_CUSE_COUPON_ASPLIT_ORDERREFUND_ITEM_B等。每一個動作都會在圖上游走一步。獎勵Reward這是整個玩法的靈魂。獎勵函數(shù)直接決定了AI會篩選出什么樣的“最優(yōu)路徑”。我設(shè)計的獎勵 預(yù)期凈利潤 - 風控風險懲罰 - 操作復(fù)雜度成本。預(yù)期凈利潤 商品實際獲得價值 套現(xiàn)收益 - 實際支付金額。風控風險懲罰用一個預(yù)訓練的XGBoost分類器預(yù)測當前狀態(tài)序列被風控攔截的概率攔截概率越高懲罰越大。操作復(fù)雜度成本比如“需要拉10個新用戶砍一刀”的路徑我們就給一個較高的動作成本這樣AI會傾向于找短平快的路徑。訓練的時候讓智能體在圖里隨機游走每一步根據(jù)Q網(wǎng)絡(luò)選擇動作最后到達“訂單完成”或“提現(xiàn)成功”這類終態(tài)時計算累計獎勵回傳更新網(wǎng)絡(luò)。跑個幾十萬局之后這個智能體就成了精——它自動發(fā)現(xiàn)組合虛擬商品退款不退券、利用支付立減的時序差、用小號裂變繞過新人限制等等騷操作。更進階一點可以直接上蒙特卡洛樹搜索在每次推演時用價值網(wǎng)絡(luò)評估葉子節(jié)點這能更穩(wěn)定地找出高價值長鏈路。第3步篩選Top 100高危路徑并自動生成測試腳本訓練收斂后我們不需要線上跑而是在“羊毛地圖”上做一次大規(guī)模的路徑采樣。讓訓練好的AI智能體在當前活動規(guī)則下從不同的初始狀態(tài)不同用戶畫像開始執(zhí)行10000次推演記錄所有成功獲取正收益的完整動作序列。然后對采集到的一大堆路徑進行排序。排序評分公式可以定為RiskScore 預(yù)期收益 × (1 - 風控攔截概率) × 場景普適性場景普適性可以看這個路徑需要滿足的初始條件有多苛刻比如“必須是注冊滿一年且累計消費過萬的金牌用戶”就會降低普適性得分。排序后直接取前100條這就是標題里說的“最可能被薅羊毛的100條路徑”。每一條路徑都是一串結(jié)構(gòu)化的動作列表例如路徑#1: 1. 新用戶注冊領(lǐng)取新人10元無門檻券 2. 搜索補貼商品X售價11元用券后支付1元 3. 立即申請退款平臺退回10元現(xiàn)金到多多錢包不退券因券已使用 4. 用退回的10元現(xiàn)金手動充值1分錢購買另一件虛擬商品Y 5. 使用好友助力獲得的“免單”特權(quán)將Y商品價格降為0.01元 6. 完成低價購并提現(xiàn)余額最后把這100條路徑直接喂給自動化測試框架。你可以用Selenium或者直接調(diào)API接口把每一條路徑轉(zhuǎn)化為一系列可執(zhí)行的測試用例腳本并發(fā)執(zhí)行。安全測試人員第二天上班看到的不是需求文檔而是一份報告“昨晚AI自動挖掘了100條高危路徑已自動執(zhí)行85條其中23條未被現(xiàn)有風控規(guī)則攔截請人工驗證。”這效率比人肉腦暴畫圖不知道高到哪里去了。四、效率翻10倍到底是怎么算出來的我算一筆賬你們就明白了。過去測一個大型活動我們團隊3個高級安全工程師需要花2天去梳理規(guī)則、討論攻擊路徑、畫狀態(tài)圖最終能產(chǎn)出的結(jié)構(gòu)化測試場景大概在100~150條而且遺漏率不低。上線后往往還發(fā)現(xiàn)三五個被利用的意外漏洞?,F(xiàn)在把規(guī)則錄入圖譜需要半天AI自動搜索和篩選路徑需要2-3小時生成測試腳本是實時的。一次可以產(chǎn)出上千條候選精篩后Top 100交給一位安全工程師花半天時間驗證完。整體耗時從“3人×2天6人天”變成了“1人錄入半天 機器2小時 1人驗證半天≈1.5人天”吞吐量還翻了幾倍說效率翻10倍真不算吹牛。而且AI能發(fā)現(xiàn)那些人根本想不到的“騷路徑”比如利用跨境支付匯率時間差、疊加退貨包運費權(quán)益這些非常規(guī)操作。五、我們能怎么借鑒給你的落地小建議聽完是不是手癢別急給你一個最小可行起步方案今晚就能搭著玩圖譜層Neo4j Community版 Python驅(qū)動先把你們最近一次活動的優(yōu)惠券和商品規(guī)則手工錄進去節(jié)點不超過100個邊200條完全夠跑demo。搜索層別一上來就整強化學習先用NetworkX庫寫個帶剪枝的深度優(yōu)先搜索結(jié)合一個簡單的規(guī)則引擎剔除掉明顯被風控阻斷的邊。這樣你就能跑出一些基礎(chǔ)路徑。智能進化積累了一定真實攻擊案例后用LightGBM訓練一個二分類模型輸入路徑特征向量輸出“是否為真實羊毛路徑”。把這個模型輸出的概率作為路徑評分權(quán)重立刻就能實現(xiàn)自動篩選Top N。自動化調(diào)度所有腳本扔到 Airflow 上定時跑活動規(guī)則一更新就觸發(fā)一次圖譜重構(gòu)和路徑挖掘把結(jié)果推送到企業(yè)微信機器人。完美閉環(huán)。這個方案的精髓在于用AI把安全測試從“經(jīng)驗依賴”變成“數(shù)據(jù)驅(qū)動”。當你的圖譜和反饋數(shù)據(jù)持續(xù)積累整個系統(tǒng)的聰明程度會滾雪球一樣增長。聊了這么多其實最讓我感慨的不是技術(shù)本身而是拼多多這幫人敢把AI用在這么“接地氣”的業(yè)務(wù)安全坑里而且確實啃下了硬骨頭。這給咱們所有做安全的同行提了個醒未來可能真的不是拼誰的手速快、誰的經(jīng)驗老而是拼誰先把業(yè)務(wù)規(guī)則變成數(shù)據(jù)先把攻擊者的思路讓AI學會。好了今天就侃到這兒。我是老K一個喜歡把狠活拆成教程的網(wǎng)安老兵。如果這篇東西讓你覺得有點啟發(fā)不妨點個“在看”或轉(zhuǎn)給同樣頭禿的安全兄弟。有啥想交流的評論區(qū)隨時懟我咱們下期見。關(guān)于我們霍格沃茲測試開發(fā)學社隸屬于測吧北京科技有限公司是一個面向軟件測試愛好者的技術(shù)交流社區(qū)。學社圍繞現(xiàn)代軟件測試工程體系展開內(nèi)容涵蓋軟件測試入門、自動化測試、性能測試、接口測試、測試開發(fā)、全棧測試以及人工智能測試與 AI 在測試工程中的應(yīng)用實踐。我們關(guān)注測試工程能力的系統(tǒng)化建設(shè)包括 Python 自動化測試、Java 自動化測試、Web 與 App 自動化、持續(xù)集成與質(zhì)量體系建設(shè)同時探索 AI 驅(qū)動的測試設(shè)計、用例生成、自動化執(zhí)行與質(zhì)量分析方法沉淀可復(fù)用、可落地的測試開發(fā)工程經(jīng)驗。在技術(shù)社區(qū)與工程實踐之外學社還參與測試工程人才培養(yǎng)體系建設(shè)面向高校提供測試實訓平臺與實踐支持組織開展“火焰杯” 軟件測試相關(guān)技術(shù)賽事并探索以能力為導向的人才培養(yǎng)模式包括高校學員先學習、就業(yè)后付款的實踐路徑。同時學社結(jié)合真實行業(yè)需求為在職測試工程師與高潛學員提供名企大廠 1v1 私教服務(wù)用于個性化能力提升與工程實踐指導。