50M USDT ay napalitan para sa 35K AAVE sa Aave CoW Protocol Incident

iconOdaily
I-share
Share IconShare IconShare IconShare IconShare IconShare IconCopy
AI summary iconSummary

expand icon
Isang pag-update sa protokolo ng Aave CoW ay inilahad pagkatapos ng isang user na magpalit ng 50.4 milyong USDT para sa lamang 35,900 AAVE noong Marso 12, 2026. Ang trade ay nagbawas sa isang SushiSwap pool na may mababang likwididad dahil sa isang may kakaibang routing path. Ipinakita ng on-chain na balita na ang routing logic ng CoW protocol at ang frontend ng Aave ay hindi nakapag-block sa trade. Walang mga pagsusuri sa ekonomikong katwiran ang nagpigil sa transaksyon.

Nakuha mula sa: @Ehsan1579

Pinagsama|Odaily Star Daily (@OdailyChina); Tagasalin| Ethan (@ethanzhang_web3

Sa pagtingin lamang sa pamagat ng pangyayari, malaki ang posibilidad na mali ang pag-unawa nito bilang isang pagpapalabas ng butas.

Ang puso ng pangyayari ay: may tao na nagpalit ng USDT na may halagang $50.4 milyon, ngunit natanggap lamang ang AAVE na may halagang $35,900.

Noong unang marinig ko ang balitang ito, napalito ako. Kaya, sinuri ko nang buo ang buong insidente: pagtata跟踪 ng transaksyon, path ng solver, pagtawag sa contract, kasaysayan ng reserve, data ng settlement, proseso ng adapter, code ng interface ng Aave, CoW flash loan SDK, at ang code ng routing na nagtataya kung ang quote ay “mabisa”.

Hindi ito isang pag-atake ng hacker. Walang mali sa core protocol ng Aave. Walang mali sa CoW settlement. Walang mali sa Uniswap. Walang mali sa SushiSwap. Ang mga transaksyon ay epektibo, ang mga signature ay epektibo, at ang lahat ng mga contract ay sumunod nang tumpak sa code. Gayunpaman, ang halos lahat ng ekonomikong halaga ay nasira, dahil pinahintulutan na sundan ng transaksyon ang isang ruta na sobrang kakaibang.

Hindi nagkaroon ng problema ang public chain, ang problema ay ang routing.

Sa palagay ko, ang pagpapaliwanag ng insidente bilang simpleng “mali ng user” ay hindi isang obhetibong at seriyosong pagtugon. Oo, ang user ay nag-sign ng order, ngunit ang buong software system ay nagbigay-daan sa isang operasyon na naglalayong palitan ang halos $50 milyon na collateral, mula sa pagkuha ng quote, pag-sign, pagplano ng routing, hanggang sa pagsasagawa—at lahat ng proseso ay nagtatapos sa isang maliit na pool na mayroon lamang 331 AAVE. Dapat ay imposible itong mangyari, at dapat ay agad itong blockin ng system bago pa man magkaroon ng settlement.

Pagsusuri sa mga pangunahing impormasyon ng pagtinda

Ang anomalous transaction hash ay: 0x9fa9feab3c1989a33424728c23e6de07a40a26a98ff7ff5139f3492ce430801f, na kinumpirma sa Ethereum mainnet block height 24643151 noong Marso 12, 2026, transaction index 1, na nag消耗 ng 3780570 units ng Gas, at matagumpay na na-execute. Ang wallet address na may-ari ng order ay nagsisimula sa 0x98b9, habang ang solver (sender ng transaction) na nag-execute ng transaction ay nagsisimula sa 0x3980, at nakalabel bilang tsolver sa CoW Competition data.

Una sa lahat, dapat maintindihan na hindi ito simpleng palitan ng USDT patungo sa AAVE sa antas ng wallet. Ang ipinagbili ay ang aEthUSDT, na isang proof-of-deposit ng USDT na nagdadala ng interes sa platform ng Aave. Ang binili naman ay ang aEthAAVE, na isang proof-of-deposit ng AAVE na nagdadala ng interes sa platform ng Aave. Kaya, ito ay talagang isang pagpapalit ng collateral sa Aave gamit ang sistema ng pagkakasundo at ang adapter ng flash loan nito sa CoW Protocol.

Bago ang transaksyon, mayroon ang wallet ng humigit-kumulang 50,432,693.075254 na aEthUSDT at 0 na aEthAAVE. Pagkatapos ng transaksyon, natira na lang 4.980399 na aEthUSDT at natanggap nito ang 327.241335505966487788 na aEthAAVE. Sa katotohanan, ibinenta ng wallet ang halos buong posisyon.

Mas malinaw ang metadata na ipinapakita na ang route ay “toxic” na bago ito isagawa. Ang order ay galing sa proseso ng aave-v3-interface-collateral-swap. Ipinapakita ng CoW API ito bilang isang nagsign na sell order, habang ang application metadata ay nagmarka nito bilang isang market-style collateral swap na gumagamit ng 121 basis points ng smart slippage. Ang nagsign na sell amount ay 50,432,688.41618 na aEthUSDT. Ang minimum na buy amount na nagsign ay 324.949260918413591035 na aEthAAVE. Ang tunay na settlement ay nagbayad ng 327.241335505966487788 na aEthAAVE.

Ito ay isang napakahalagang detalye. Hindi inaasahan na makakuha ng libo-libong AAVE ang order na ito, at biglang nawala sa gitna. Ito ay isinulong mula sa simula na may layunin na makamit ang mga resultang halos tatlumpu't tatlong AAVE.

Buong chain ng crash sa routing

Kapag ikaw ay sumunod sa pagtatakdang transaksyon, ang buong proseso ay maging malinaw at direkta.

Ang pangunahang paglipat ng pondo ay batay sa CoW Protocol at sa GPv2Settlement smart contract na nagsisimula sa 0x9008. Una, ang HooksTrampoline smart contract na nagsisimula sa 0x60bf ay nagkakaroon ng pagpapahintulot para sa aEthUSDT, na nagpapahintulot sa CoW treasury relayer na tarantuhin ang mga ari-arian ng user nang walang kailangang magkakahiwalay na pagpapahintulot; pagkatapos, ang GPv2VaultRelayer smart contract na nagsisimula sa 0xc92e ay tarantuhin ang 50432688.41618 na aEthUSDT mula sa user wallet para sa proseso ng pagkakasundo, at hanggang sa bahaging ito, lahat ng mga aksyon ay sumusunod sa normal na lohika.

Ang settlement contract ay nagbigay ng pagsasagawa ng aEthUSDT sa hindi bukas na auxiliary contract na nagsisimula sa 0xd524 at nagtrigga ng pagtawag gamit ang function selector 0x494b3137; ang auxiliary contract ay ipinasa ang pagsasagawa sa hindi bukas na executor contract na nagsisimula sa 0x699c, at sa puntong ito, ang buong larawan ng anomalous trade routing ay lubos na ipinakita.

Ang unang epektibong pagtawag ay direktang naglalayon sa Aave pool contract na nagsisimula sa 0x87870, na gumagamit ng withdraw function (selector 0x69328dec) upang i-burn ang aEthUSDT at mag-withdraw ng native USDT sa ilalim nito; pagkatapos, ang rute ay naglilipat patungo sa Uniswap V3 depth USDT/WETH trading pool na nagsisimula sa 0x4e68, kung saan ang lahat ng 50432688.41618 na USDT ay napalitan sa 17957.810805702142342238 na WETH.

Ang transaksyon sa phase na ito ay ganap na normal: ang palitan na rate ay humigit-kumulang 2808.4 USDT para sa 1 WETH, na nagsasalamin sa market conditions sa panahong iyon, walang kakulangan sa liquidity, walang pagkakamali sa kalkulasyon, at walang anomaliya sa unang hop ng transaksyon chain.

Ang problema ay nasa ikalawang hop; agad mong makikita ang liquidity reserve, at ang natitirang kuwento ay hindi maiiwasan.

Pagkatapos makakuha ng 17957.810805702142342238 na WETH, isinusulit ng executor ang lahat ng pondo sa SushiSwap V2 AAVE/WETH trading pool sa adres na 0xd75ea151a61d06868e31f8988d28dfe5e9df57b4.

Ipinag-verify ko ang kasaysayan ng liquidity reserve ng trading pool sa sandaling bago ang anomalous na transaksyon (block height 24643150), at ang pool ay nagtataglay lamang ng:

331.631982538108027323 na mga AAVE, 17.653276196397688066 na mga WETH

Hindi ito error sa pag-input ng data, kundi isang katotohanang di makakalimot.

Ang ruta ng transaksyong ito ay nagpapadala ng halos 17,958 WETH sa isang maliit na pool na may 17.65 WETH lamang sa reserve, at ang kabuuang imbentaryo ng AAVE ay 331.63 WETH lamang; ang dami ng WETH na ipinapasok ay halos 1,017 beses ang dami ng WETH sa pool.

Hindi ito karaniwang problema ng “mataas na slippage” o “maliit na liquidity”, kundi isang extremong absurd na pagpapatupad ng market order, katulad ng pagsusugal sa isang napakaliit na constant product AMM pool upang tanggapin ang isang malaking transaksyon na libu-libong beses ang laki nito.

Ang AMM trading pool ay nagpapatupad ng operasyon ayon sa itinakdang algoritmo at halos nalulugod ang buong AAVE reserve sa pool.

Sinagot ng SushiSwap ang core Swap event: Isinapag ang 17957.810805702142342238 na WETH, at natanggap lamang ang 331.305315608938235428 na AAVE. Pagkatapos ng transaksyon, ang natitirang liquidity sa pool ay halos:

0.326666929169791895 na mga AAVE, 17975.464081898540030304 na mga WETH

Sa madaling salita, ang 99.9% ng AAVE na nasa pool ay nalikom sa isang hop.

Batay sa mga imbakan bago ang transaksyon, ang nakapag-implikasyon na presyo ng AAVE ay humigit-kumulang $149.50. Ang tunay na presyong isinagawa ng user ay humigit-kumulang 154,114.66 USDT para sa 1 AAVE. Ito ay higit sa 1,000 beses ang pagkakaiba sa presyo ng spot bago ang transaksyon.

Pagkatapos, ang mga AAVE na ito ay inilalabas muli sa Aave pool gamit ang selector 0x617ba037, na supply(address,uint256,address,uint16). Bilang resulta, ang mga bagong mina-铸造 na aEthAAVE ay ipinadala muli sa settlement contract. Ang settlement contract ay nagpadala ng 327.241335505966487788 aEthAAVE sa user. Naiwan sa settlement contract ang halagang 4.06398010297174764 aEthAAVE bilang sobra sa pagbabayad ng user.

Kaya, ang settlement ay hindi nagpapabago ng isang magandang resulta sa isang masamang resulta. Ito ay nagpapatibay lamang sa resulta na ginawa ng routing mula pa noong una.

Ito ang pangunahing punto na dapat ipahiwatig nang malinaw: Ang malubhang resulta ay “naka-iskedyul” na sa loob bago ang pagpapatupad ng ruta.

Sa mga data ng pagtawag sa auxiliary contract na nakapaloob sa route, ang target na halaga sa panig ng pagbili ay humigit-kumulang 331.272185078031026739, ang minimum na halaga ng pagbili na nakasaad sa user signature ay 324.949260918413591035, at ang tunay na halaga na isinagawa ay 327.241335505966487788, at lahat ng pangunahing halaga ay nakalock na sa antas ng maraming daan na AAVE bago ang pagkakasagawa.

Ang ruta na ito ay masama nang mula sa pagkakalikha.

Saan ang vulnerability?

Ang sagot ay: Ang bawat layer ng mekanismo ng pag-verify ng sistema ay nag-e-verify sa dimensyon ng pagkakamali.

Ang lahat ng mga antas ay nagpapatotoo lamang kung ang transaksyon ay maaaring maisagawa, kung ang signature ay may katotohanan, at kung ang halaga ay hindi sero, ngunit halos walang pangunahing pagpapatotoo kung ang pagrute ng transaksyon ay may katwirang pang-ekonomiya—ito ang pangunahing sanhi ng pagkabigo ng mekanismo.

Kakulangan sa code ng Aave interface adapter path

Ang unang malinaw na punto ng code anomaly ay nangyari sa proseso ng quote ng CoW adapter sa interface ng Aave: ang function na ginagamit upang magdagdag ng adapter-specific application data habang hiniling ang quote ay direkta at pinauupahan.

Pinagmulan: rates.helpers.ts:93 at adapters.helpers.ts:194

Ibig sabihin nito na ang Aave interface ay hindi kasama ang mga metadata ng flash loan at hook na karaniwang idinadagdag kapag ipinapalabas ang order habang humihingi ng quote mula sa CoW. Sa ibang salita, ang binibigyan ng quote ay hindi lubos na katumbas ng gagawin. Kahit ang code comment ay nagsasabi na ang layunin ng helper function na ito ay upang gawing mas tumpak ang quote ng adapter, ngunit ang function na ito ay pinatigil nang pilit.

Ang pagtataya sa katwiran ng logika ng pagkakaloob ng CoW ay sobrang mahina (pangunahing butas)

Ang pangalawang problema at ang pinakamalubhang problema ay ang lohika ng kompetisyon ng presyo sa CoW Protocol: sa kanilang public service code, anumang presyo na may positibong Gas fee at hindi sero ang output amount ay itinuturing na “mabuting presyo”.

Pinagmulan: quote.rs:31

Isang nakakagulat na mahinang kahulugan ng “kabutihan” para sa isang sistema ng pagrute na nagtratrabaho sa mga order na may walong digit.

Hindi konektado ang sistema sa oracle para sa pag-verify ng integridad ng presyo, walang mekanismo na tumutigil sa mga quote na 500 beses o higit pa ang kalayuan sa spot price, walang pagtataya ng panganib na “ang routing ay magpapawalang-bisa ng buong liquidity pool”, at walang babala para sa “huling hop na liquidity na hindi tugma nang malala sa laki ng order”; kung ang solver ay babalik ng isang makakagawa at hindi sero na routing solution, tatanggapin ito ng sistema — ito ang pangunahing butas sa pangyayaring ito.

Kakulangan sa lohika ng pagmumodelo ng likuididad ng Uniswap V2

Ang ikatlong tanong ay tungkol sa paraan ng pagmomodelo ng liquidity pool na Uniswap V2: ang code ay gumagamit lamang ng standard constant product algorithm, at nagtatanggol lamang sa mga mathematical impossibility tulad ng zero reserves, numerical underflow, at reserve overflow, ngunit hindi nagpapatakbo ng pag-verify sa ekonomikong kakayahan.

Pinagmulan: pool_fetching.rs:118 at pool_fetching.rs:153

Hindi nagtataya ang code na ito kung sapat ang dami ng liquidity pool upang matugunan ang tinukoy na ruta ng transaksyon, kundi tanging nagtataya kung ang pagpalit ay matematikal na epektibo. Kaya, kahit isang maliit na pool na may 331 AAVE lamang, ito ay itinuturing na epektibong lugar upang matugunan ang 17,957 WETH na panhingi, dahil ang constant product algorithm ay makakapagbibigay ng non-zero result, ngunit buong-buo itong nag-iisip sa pagkawala ng asset na dulot ng resultang ito.

Pagkabigo sa ikalawang pagkakataon sa SDK ng flash loan at mekanismo ng pag-verify ng order

Pagkatapos, direktang isinama ng闪电贷 SDK ang nasabing hindi na aktibong presyo sa payload ng pagpapatupad ng order at hook, nang walang anumang pangalawang pag-iingat sa panganib.

Susunod:

Pinagmulan: index.js:484 at index.js:591

Ito ang dahilan kung bakit palagi kong sinasabi na ang routing na ito ay “mali sa pagkakalikha.” Ang adapter layer ay hindi “nagmamarka” ng isang bagong masamang halaga sa oras ng pagpapatupad. Ito ay sinerialisado ang naka-quote na masamang halaga sa hook data at sa tiyak na address ng instance. Kapag umiiral na ang masamang quote, ang mga natitirang mekanismo ay titigil na ito nang buong tapat.

Kahit ang logika ng pag-verify ng order ng CoW ay hindi talaga nagpaprotekta sa mga user dito, dahil ito ay nagpapasiya lamang kung ang order ay lumagpas sa market price sa oras ng quote, at hindi nag-e-evaluate kung ang quote mismo ay kawalang-kwenta kumpara sa tunay na liquidity.

Pinagmulan: order_validation.rs:694

Ito ay isang pag-check ng pagkakatugma. Kung ang quote mismo ay isang kalokohan, maaari pa ring matupad ang order.

Ang UI frontend alert mechanism ay parang walang kwenta

Ang Aave interface ay may babala sa mataas na epekto ng presyo, ngunit hindi ito isang pambansang circuit breaker. Kapag bumaba ang halaga ng higit sa 20%, naging isang checkbox ng pagkumpirma ito.

Kapag napili ng user ang checkbox, natanggal na ang hadlang:

Pinagmulan: helpers.ts:24 at HighPriceImpactWarning.tsx:35

Kaya, bagaman ang transaksyon na ito ay magkakaroon ng malapit sa pagbawas ng buong halaga ng ari-arian, ang sistema ay nagtataglay lamang ito bilang isang operasyon na nangangailangan ng pagpapatotoo ng user, hindi bilang isang mataas na panganib na transaksyon na kailangang tanggihan ng sistema nang walang kompromiso, at ang mekanismo ng babala ay lubos na nawawala ang kanyang papel sa pag-iwas sa panganib.

Batay sa lahat ng mekanismo na nabigo, hindi ko binibigyan ng pagsang-ayon ang "ito ay simpleng pagkakamali ng user" na pang-ekspedienteng konklusyon. Totoo na ang user ay nagawa ang pag-sign, ngunit mayroong maraming pagkakataon ang buong software system na makapagpigil sa trahedya na ito, ngunit bawat antas ay nagawa lamang ang pangunahing pag-verify, at sinabi lamang na "hindi zero, maaaring i-execute, na-signed" bago ito ipahintulot, na nagresulta sa masamang kahihinatnan.

Hindi na binago ang route

Mahalaga ang bahaging ito, na direktang nagtatanggal ng maraming maling palaisipan: ang Aave official interface process na tumutugon sa aave-v3-interface-collateral-swap ay nagsasagawa ng pagkalkula ng binili na halaga na binago ng slippage sa ika-139 na linya ng useSwapOrderAmounts.ts file, na naglalaman ng quote, network fees, partner fees, at flash loan fees; sa ika-331 na linya, ito ay binabago sa buyAmountBigInt na halaga; at pagkatapos, sa ika-191 na linya ng CollateralSwapActionsViaCoWAdapters.tsx file, ang halagang ito ay pinapirma nang tumpak.

Ang susunod na adapter contract ay magpapatotoo sa field ng signed order at ang nakapag-imbak na halaga sa ika-141 na linya ng AaveV3BaseAdapter.sol; ang CoW settlement contract ay magpapatupad ng mga patakaran sa limitasyon ayon sa signed order sa ika-337 na linya ng GPv2Settlement.sol. Kaya, ang resulta ng on-chain execution ay hindi lumampas sa pinahihintulutang saklaw ng signed order, at ang tunay na natanggap na ari-arian ng user ay kahit pa'y mas mataas kaysa sa minimum na limitasyon na nakasaad sa signed order.

Sapat ito upang patunayan: ang kalamidad ay nangyari bago ang settlement, hindi habang nagpapatakbo ang settlement; ang malubhang kakulangan sa routing ay nakakatakda na ng kapalaran.

Nasaan ang nawalang halaga?

Ang susunod na transaksyon sa parehong bloke (nagsisimula sa hash 0x45388b0f) ay nagtapos ng arbitrage na nagpapabalik sa nasiraang SushiSwap AAVE/WETH pool. Pagkatapos ng anomalous na transaksyon na nagpuno ng malaking dami ng WETH sa pool at nagbawas ng karamihan sa AAVE, agad na ibinebenta ng arbitrageur ang AAVE pabalik sa pool upang makakuha ng sobrang halaga mula sa hindi balanseng likuididad.

Ang kabuuang halaga ng WETH na natanggap sa arbitrage na ito ay humigit-kumulang 17929.770158685933 WETH, kasunod ay binayad ang humigit-kumulang 13087.73 ETH sa tagapagbuo ng bloke at humigit-kumulang 4824.31 ETH sa address ng nagpapatupad ng arbitrage.

Ang buong ekonomikong halaga ng pagkawala ng user ay agad na nagiging MEV arbitrage at kita ng block builder sa parehong bloke.

Ang pagsusuri sa sequence ng oras sa antas ng block ay nagpapatotoo na: bago ang transaksyon, walang masamang intensyon na pinaglalabasan ang SushiSwap pool upang manloko sa mga user; ang unang pagkakataong naabot ang AAVE/WETH trading pair ay ang anomalous na transaksyon (transaction index 1); ang susunod na transaksyon (transaction index 2) ay agad na nag-restore sa presyong distorsyon na dulot ng transaksyon na ito; at ang transaction index 3 ay naabot din ang trading pair sa proseso ng pagkakabawas ng market. Malinaw na ipinapatotoo ng timeline: ang anomalous na transaksyon ay gumawa ng extremong distorsyon sa presyo, at ang mga susunod na transaksyon ay agad na kinuha ang kita mula sa distorsyong ito.

Sino ang kasalanan?

Kung itatanong mo kung nasira ang core protocol ng Aave V3, ang sagot ay hindi. Ang mga pool ng Aave ay gumana nang ayon sa mga utos at natapos nang maayos ang proseso ng pag-redeem ng USDT at pag-deposito ng AAVE.

Kung itatanong mo kung nasira ang CoW GPv2Settlement contract, ang sagot ay hindi. Pinatupad ng settlement ang isang may epektibong sinagutan na order at binayad ang mas mataas na halaga kaysa sa minimum na nakasaad sa signatura.

Kung itatanong mo kung nasira ang contract ng trading pair sa Uniswap V3 o SushiSwap, ang sagot ay hindi. Ang parehong uri ng trading pool ay nagawa ang pricing ng trade ayon sa kanilang sariling algorithm.

Totoo ring sistemikong pagkabigo, nangyari sa mas mataas na antas ng routing at risk control:

Ang pangunahing responsibilidad ay nasa mga module ng ruta, quote, at solver ng CoW Protocol: ang buong sistema ay may sobrang mahinang pamantayan para sa pagtataya ng “mabuting ruta,” at tinatanggap ang mga order na may halagang milyon-milyon dolyar na dadaan sa mga maliliit na pool na may mababang likuididad, kahit na ang ruta ay maaaring maisagawa at hindi zero, na nag-iisip lamang sa ekonomikong kahalintulad na hindi makatwiran.

Ang pangalawang responsable ay ang Aave frontend: nang humingi ng quote mula sa request adapter, hindi isinama ang application data na kaugnay ng hook, direkta ang isinumite ang maling resulta sa proseso ng pag-sign, at nag-iisa lamang sa mga alerto bilang paalala, walang mekanismo ng pagtanggi na pilit, kaya ang mga pagsasagawa ng pagsusuri sa panganib na ito ay lubos na hindi sapat para sa mga ekstremong malaking transaksyon.

Ito ay isang ekstremong pagkabigo sa kalidad ng routing ng transaksyon at sa mga safety net ng risk management, na direkta nang nagpalit sa isang legal at kompliyante na operasyon ng pagpapalit ng collateral sa isang mapanganib na pagkawala ng asset.

Disclaimer: Ang information sa page na ito ay maaaring nakuha mula sa mga third party at hindi necessary na nagre-reflect sa mga pananaw o opinyon ng KuCoin. Ibinigay ang content na ito para sa mga pangkalahatang informational purpose lang, nang walang anumang representation o warranty ng anumang uri, at hindi rin ito dapat ipakahulugan bilang financial o investment advice. Hindi mananagot ang KuCoin para sa anumang error o omission, o para sa anumang outcome na magreresulta mula sa paggamit ng information na ito. Maaaring maging risky ang mga investment sa mga digital asset. Pakisuri nang maigi ang mga risk ng isang produkto at ang risk tolerance mo batay sa iyong sariling kalagayang pinansyal. Para sa higit pang information, mag-refer sa aming Terms ng Paggamit at Disclosure ng Risk.