「지금 구독하세요」 A급 투명성 프로젝트 2주간 보고서로 상위 1% 프로젝트를 발견하세요
API RootData 앱 다운로드

5000만 USDT가 3.5만 달러 AAVE로 교환되다: 재앙은 어떻게 발생했는가? 우리는 또 누구를 탓해야 하는가?

3월 14, 2026 16:39:37

공유하십시오

이 문서는:@Ehsan1579에서 가져왔습니다.

편집:Ethan, Odaily 별자리 일보

사건 제목만 보면, 이는 취약점 악용 공격으로 오해할 가능성이 높습니다.

사건의 핵심은:누군가 5040만 달러의 USDT를 최종적으로 3.59만 달러의 AAVE로만 교환했습니다.

이 사실을 처음 들었을 때, 정말 충격을 받았습니다. 그래서 저는 사건 전체를 철저히 정리했습니다: 거래 추적, 솔버 경로, 계약 호출, 역사적 준비금, 결제 데이터, 어댑터 프로세스, Aave 인터페이스 코드, CoW 플래시 론 SDK, 그리고 견적이 "합리적"인지 판단하는 라우팅 코드.

이번 사건은 해킹 공격이 아닙니다. Aave 핵심 프로토콜은 오류가 없었습니다. CoW 결제도 오류가 없었습니다. Uniswap도 오류가 없었습니다. SushiSwap도 오류가 없었습니다. 거래는 유효했고, 서명도 유효했으며, 모든 계약은 코드에 따라 엄격하게 실행되었습니다. 그러나 거의 모든 경제적 가치는 파괴되었습니다. 단지 그것이 허용된 라우팅이 극도로 터무니없었기 때문입니다.

퍼블릭 체인은 문제가 없었고, 문제는 라우팅에 있었습니다.

제 생각에는, 이 사건을 단순히 "사용자 조작 실수"로 경시하는 것은 객관적이고 엄밀한 태도가 아닙니다. 확실히 사용자는 주문 서명을 완료했지만, 전체 소프트웨어 시스템이 5000만 달러에 달하는 담보 교환을 포함하는 작업을 완료하도록 허용했으며, 견적, 서명, 라우팅 계획에서 최종 실행까지 모든 과정이 약 331개의 AAVE만 보유한 저유동성 풀을 가리켰습니다. 이는 완전히 발생할 수 없는 일이며, 적어도 결제 단계가 시작되기 전에 시스템이 강제로 차단하고 거부했어야 했습니다.

거래 핵심 정보 추적

이번 비정상 거래 해시는:0x9fa9feab3c1989a33424728c23e6de07a40a26a98ff7ff5139f3492ce430801f로, 2026년 3월 12일 이더리움 메인넷 블록 높이 24643151에서 확인되었으며, 거래 인덱스는 1, 소모된 가스 양은 3780570 단위로, 거래는 성공적으로 실행되었습니다. 주문 소속 지갑 주소는 0x98b9로 시작하며, 실제 거래를 실행한 솔버(거래 발신자) 주소는 0x3980으로 시작하며, CoW 경쟁 데이터에서 tsolver로 표시됩니다.

먼저 이해해야 할 것은, 이것이 단순한 지갑 수준의 USDT에서 AAVE로의 교환이 아니라는 것입니다. 판매된 토큰은 aEthUSDT로, Aave 플랫폼에서 이자를 발생시키는 USDT 예치 증명서입니다. 구매된 토큰은 aEthAAVE로, Aave 플랫폼에서 이자를 발생시키는 AAVE 예치 증명서입니다. 따라서 이는 실제로 CoW 프로토콜의 결제 시스템과 그 플래시 론 어댑터 프로세스를 통해 이루어진 Aave 담보 교환입니다.

거래 전, 해당 지갑은 약 50,432,693.075254개의 aEthUSDT와 0개의 aEthAAVE를 보유하고 있었습니다. 거래 후, 그것은 단지 4.980399개의 aEthUSDT만 남기고, 327.241335505966487788개의 aEthAAVE를 받았습니다. 실제로 해당 지갑은 거의 모든 포지션을 매도했습니다.

메타데이터는 라우팅이 실행되기 전에 이미 "유독"했음을 더 명확하게 보여줍니다. 주문은 aave-v3-interface-collateral-swap 프로세스에서 발생했습니다. CoW의 API는 이를 서명된 매도 주문으로 표시하며, 애플리케이션 메타데이터는 이를 121개 기준점의 스마트 슬리피지로 표시된 시장가 담보 교환으로 표시합니다. 서명된 매도 금액은 50,432,688.41618개의 aEthUSDT입니다. 서명된 최소 구매 금액은 324.949260918413591035개의 aEthAAVE입니다. 실제 결제는 327.241335505966487788개의 aEthAAVE를 지급했습니다.

이는 매우 중요한 세부사항입니다. 이 주문은 수천 개의 AAVE를 얻을 것으로 기대하지 않았으며, 중간에 어떤 이유로 파괴된 것도 아닙니다. 그것은 처음부터 300개 이상의 AAVE와 같은 결과를 중심으로 구성되었습니다.

라우팅 붕괴의 전체 경로

거래 추적을 따라가면, 전체 과정은 잔인하게도 직설적입니다.

최상위 자금 흐름의 핵심은 CoW 프로토콜의 0x9008로 시작하는 GPv2Settlement 결제 계약에 의존합니다. 먼저, 0x60bf로 시작하는 HooksTrampoline 계약이 aEthUSDT 권한 부여 작업을 완료하여 CoW 금고 중계기가 별도의 거래 권한 없이 사용자 자산을 인출할 수 있도록 합니다. 그 후, 0xc92e로 시작하는 GPv2VaultRelayer 계약이 사용자 지갑에서 50432688.41618개의 aEthUSDT를 인출하여 결제 프로세스로 이동합니다. 이 단계까지 모든 작업은 정상적인 논리에 부합합니다.

결제 계약은 이후 aEthUSDT 작업 권한을 0xd524로 시작하는 비공식 보조 계약에 부여하고, 함수 선택기 0x494b3137을 통해 호출을 시작합니다. 이 보조 계약은 실행 권한을 0x699c로 시작하는 비공식 실행 계약으로 넘깁니다. 이로써 비정상 거래 라우팅의 전모가 완전히 드러납니다.

첫 번째 유효 호출은 0x87870로 시작하는 Aave 자금 풀 계약을 가리키며, withdraw 함수(선택기 0x69328dec)를 통해 aEthUSDT를 파괴하고 기본 원주율 USDT를 상환합니다. 그 후 라우팅은 0x4e68로 시작하는 Uniswap V3 깊이 USDT/WETH 거래 풀로 점프하여, 모든 50432688.41618개의 USDT를 17957.810805702142342238개의 WETH로 교환합니다.

이 단계의 거래는 완전히 정상적입니다: 교환 비율은 약 2808.4 USDT당 1 WETH로, 당시 시장 상황에 부합하며, 유동성 부족 문제도 없고, 계산 편차도 없으며, 첫 번째 점 거래 경로에는 어떤 이상도 없습니다.

문제는 두 번째 점에서 발생합니다. 유동성 준비금을 보면, 나머지 이야기는 불가피합니다.

실행기는 17957.810805702142342238개의 WETH를 확보한 후, 모든 자금을 0xd75ea151a61d06868e31f8988d28dfe5e9df57b4 주소의 SushiSwap V2 AAVE/WETH 거래 풀로 전송합니다.

저는 비정상 거래가 발생하기 직전(블록 높이 24643150)의 해당 거래 풀의 역사적 유동성 준비금 데이터를 확인했습니다. 풀에는 단지:

331.631982538108027323개의 AAVE, 17.653276196397688066개의 WETH만 보유하고 있었습니다.

이는 데이터 입력 오류가 아니라 철저한 사실입니다.

이 거래 라우팅은 거의 17958개의 WETH를 17.65개의 WETH만 보유한 미세 거래 풀에 모두 주입했으며, 입력된 WETH의 양은 풀 내 WETH 준비금의 약 1017배에 달했습니다.

이는 "슬리피지가 너무 높다"거나 "유동성이 약간 부족하다"는 일반적인 문제가 아니라, 극도로 터무니없는 시장가 주문 실행 경로로, 극소형의 고정 곱 AMM 풀에 수천 배를 초과하는 대규모 거래를 강제로 수용하게 만든 것입니다.

AMM 거래 풀은 정해진 알고리즘에 따라 작업을 수행하여 풀 내 모든 AAVE 준비금을 거의 소진했습니다.

SushiSwap 거래 쌍은 핵심 Swap 교환 이벤트를 촉발했습니다: 실행기는 17957.810805702142342238개의 WETH를 전송하고, 단지 331.305315608938235428개의 AAVE만 교환받았습니다. 거래 완료 후, 해당 풀의 남은 유동성은 약:

0.326666929169791895개의 AAVE, 17975.464081898540030304개의 WETH가 되었습니다.

간단히 말해, 풀 내 약 99.9%의 AAVE 재고가 한 번의 점프에서 소진되었습니다.

거래 전 준비금에 따르면, 풀의 암묵적인 AAVE 가격은 약 149.50 달러였습니다. 사용자의 실제 실행 가격은 약 154,114.66 USDT당 1 AAVE입니다. 이는 거래 전의 현물 가격과 1000배 이상 차이가 납니다.

그 후, 이 AAVE는 Aave 자금 풀로 공급되어 선택기 0x617ba037을 사용하여, supply(address,uint256,address,uint16)로 전송됩니다. 결과적으로 새로 발행된 aEthAAVE는 결제 계약으로 돌아갑니다. 결제 계약은 최종적으로 327.241335505966487788개의 aEthAAVE를 사용자에게 전송했습니다. 약 4.06398010297174764개의 aEthAAVE는 사용자가 지불한 잉여로 결제 계약에 남았습니다.

따라서 결제는 갑자기 좋은 실행 결과를 나쁜 결과로 왜곡하지 않았습니다. 그것은 단지 이미 발생한 라우팅 결과를 최종적으로 확정지었을 뿐입니다.

이것은 핵심 포인트이며, 명확히 말할 가치가 있습니다: 재앙적인 결과는 라우팅 실행 전에 이미 "예정"되어 있었습니다.

라우팅에 내장된 보조 계약 호출 데이터에서, 구매 측 목표 금액은 약 331.272185078031026739개이며, 사용자가 서명한 최소 구매 금액은 324.949260918413591035개, 실제 결제 금액은 327.241335505966487788개로, 모든 핵심 수치는 결제 전에 이미 300개 이상의 AAVE의 양으로 고정되어 있었습니다.

이 라우팅은 태생적으로 나쁜 것입니다.

결함은 어디에 있나요?

답은: 시스템의 모든 검증 메커니즘이 잘못된 차원을 확인하고 있습니다.

모든 계층은 거래가 실행 가능한지, 서명이 유효한지, 금액이 0이 아닌지 만을 확인하며, 경제적 측면에서 거래 라우팅이 합리적인지에 대한 핵심 계층 검증은 거의 없습니다. 이는 메커니즘의 실패의 핵심 원인입니다.

Aave 인터페이스 어댑터 견적 경로의 코드 결함

첫 번째 명백한 코드 이상점은 Aave 인터페이스의 CoW 어댑터 견적 프로세스에서 발생합니다: 원래 견적 요청 시 어댑터 전용 애플리케이션 데이터를 첨부하는 함수가 강제로 비활성화되었습니다.

출처: rates.helpers.ts:93adapters.helpers.ts:194

이는 Aave 인터페이스가 CoW에 견적을 요청할 때, 실제로 주문을 발행할 때 첨부될 플래시 론 및 훅 메타데이터를 포함하지 않았음을 의미합니다. 다시 말해, 견적된 것은 실행될 것이 아닌 것입니다. 코드 주석은 이 보조 함수의 목적이 어댑터 견적을 더 정확하게 만들기 위한 것이라고 말하지만, 이 함수는 강제로 비활성화되었습니다.

CoW 견적 경쟁 논리의 합리성 판단이 너무 약함 (핵심 결함)

두 번째이자 가장 심각한 문제는 CoW 프로토콜의 견적 경쟁 논리입니다: 그 공공 서비스 코드에서는, 견적 가스 비용이 양수이고 출력 금액이 0이 아니기만 하면 "합리적인 견적"으로 판단됩니다.

출처: quote.rs:31

8자리 수 주문을 처리하는 라우팅 시스템에 대해, 이는 충격적으로 약한 "합리성" 정의입니다.

시스템은 가격 건전성 검증을 위한 오라클을 통합하지 않았으며, "견적이 현물 가격에서 500배 이상 벗어나는" 차단 메커니즘이 없고, "라우팅이 유동성 풀을 완전히 소진할 것"에 대한 위험 판단이 없으며, "마지막 점의 유동성과 주문 규모가 심각하게 불일치하는" 경고도 없습니다. 단지 솔버가 실행 가능하고 0이 아닌 라우팅 계획을 반환하기만 하면 시스템이 이를 수용합니다. 이는 이번 사건의 핵심 결함입니다.

Uniswap V2 유사 유동성 모델링 논리의 결함

세 번째 문제는 Uniswap V2 스타일의 유동성 풀 모델링 방식입니다: 코드는 표준 고정 곱 알고리즘만을 사용하며, 0 준비금, 수치 하한 초과, 준비금 초과와 같은 수학적 불가능한 상황만 거부하고, 경제적 측면에서의 실행 가능성 검증은 하지 않습니다.

출처: pool_fetching.rs:118pool_fetching.rs:153

이 코드 조각은 유동성 풀의 규모가 해당 라우팅 거래를 수용할 수 있는지 판단하지 않고, 단지 교환 작업이 수학적으로 유효한지만 판단합니다. 따라서 331개의 AAVE만 보유한 미세 풀도 17957개의 WETH 구매 요청을 수용할 수 있는 유효한 장소로 판단됩니다. 이는 고정 곱 알고리즘이 0이 아닌 결과를 계산할 수 있기 때문이며, 이 결과가 파괴적인 자산 손실을 초래할 것이라는 사실은 완전히 무시됩니다.

플래시 론 SDK와 주문 검증 메커니즘의 이차 실패

그 후, 플래시 론 SDK는 이 무효 견적을 주문 및 훅의 실행 페이로드에 고정시켰으며, 어떤 이차 위험 차단도 하지 않았습니다.

그 후:

출처: index.js:484index.js:591

이것이 제가 항상 이 라우팅이 "태생적으로 나쁘다"고 말하는 이유입니다. 어댑터 계층은 실행 시 "새로운 나쁜 금액을 발견"하지 않았습니다. 그것은 이미 견적된 나쁜 금액을 훅 데이터와 확정된 인스턴스 주소에 직렬화했습니다. 일단 나쁜 견적이 존재하면, 나머지 메커니즘은 충실히 이를 전달합니다.

심지어 CoW의 주문 검증 논리도 여기서 사용자를 진정으로 보호하지 않았습니다, 왜냐하면 그것은 주문이 견적 시의 시장 가격을 초과하는지 여부만 확인하고, 견적 자체가 실제 유동성에 비해 터무니없는지를 확인하지 않기 때문입니다.

출처: order_validation.rs:694

이는 일관성 검사입니다. 만약 견적 자체가 이미 터무니없다면, 주문은 여전히 통과할 수 있습니다.

UI 프론트엔드 경고 메커니즘은 형식적입니다

Aave 인터페이스에는 실제로 높은 가격 충격 경고가 있지만, 이는 강제적인 서킷 브레이커가 아닙니다. 가치 손실이 20%를 초과하면 확인 체크박스로 변합니다.

사용자가 체크박스를 선택하면, 장애가 제거됩니다:

출처: helpers.ts:24HighPriceImpactWarning.tsx:35

따라서 이 거래가 거의 모든 자산 가치를 청산할 수 있더라도, 시스템은 이를 사용자 확인이 필요한 작업으로만 판단하며, 시스템이 강제로 거부해야 할 고위험 거래로 판단하지 않습니다. 경고 메커니즘은 완전히 위험 차단 기능을 상실했습니다.

이 모든 메커니즘의 실패를 바탕으로, 저는 "이것은 단지 사용자가 바보였다"는 피상적인 결론에 동의하지 않습니다. 사용자는 확실히 서명을 완료했지만, 전체 소프트웨어 시스템은 이 재앙을 차단할 수 있는 수많은 기회를 가졌으며, 각 계층은 단지 기본 검증만 수행하고 "0이 아닌, 실행 가능, 서명됨"으로 판단한 후 직접 통과시켜 최종적으로 악화된 결과를 초래했습니다.

라우팅은 변조되지 않았습니다

이 단계는 매우 중요하며, 많은 잘못된 추측을 직접 배제합니다: aave-v3-interface-collateral-swap에 해당하는 Aave 공식 인터페이스 프로세스는 useSwapOrderAmounts.ts 파일의 139행에서 견적, 네트워크 수수료, 파트너 수수료, 플래시 론 수수료를 결합하여 슬리피지 조정된 구매 금액을 계산합니다; 331행에서 이를 buyAmountBigInt 수치로 변환합니다; 이후 CollateralSwapActionsViaCoWAdapters.tsx 파일의 191행에서 해당 금액에 대한 정확한 서명을 완료합니다.

후속 어댑터 계약은 AaveV3BaseAdapter.sol 파일의 141행에서 서명된 주문 필드와 저장된 수치가 완전히 일치하는지 검증합니다; CoW 결제 계약은 GPv2Settlement.sol 파일의 337행에서 서명된 약정의 한도 규칙을 강제로 실행합니다. 따라서 체인 상의 실행 결과는 서명된 주문이 허용하는 범위를 초과하지 않았으며, 사용자가 실제로 받은 자산은 서명된 약정의 최소 한도를 초과했습니다.

이는 재앙이 결제 단계 이전에 발생했음을 증명하며, 결제 과정이 아니라 라우팅의 치명적인 결함이 이미 결말을 정해놓았음을 보여줍니다.

사라진 가치는 어디로 갔나요?

동일 블록 내의 다음 거래(해시 0x45388b0f 시작)는 파괴된 SushiSwap AAVE/WETH 풀에 대해 리바운드 차익 거래를 완료했습니다. 비정상 거래가 대량의 WETH로 풀을 채우고 대부분의 AAVE를 소진한 후, 차익 거래자는 즉시 AAVE를 풀에 다시 판매하여 유동성 불균형에서 발생한 초과 가치를 수확했습니다.

이번 리바운드 차익 거래는 약 17929.770158685933개의 WETH를 추출했으며, 이후 해당 블록 생성자에게 약 13087.73개의 ETH를 지불하고, 차익 거래 실행 주소에 약 4824.31개의 ETH를 지불했습니다.

사용자가 잃은 모든 경제적 가치는 결국 거의 즉시 동일 블록 내의 MEV 차익 거래 수익과 블록 생성자 수익으로 전환되었습니다.

또한 블록 수준의 시간 순서를 확인하면, 거래 전 아무도 악의적으로 SushiSwap 거래 풀을 조작하여 사용자를 유인하지 않았음을 확인할 수 있습니다. 해당 AAVE/WETH 거래 쌍이 처음으로 접촉한 것은 이번 비정상 거래(거래 인덱스 1)였으며, 바로 다음 거래(거래 인덱스 2)는 이번 거래로 인한 가격 왜곡을 리바운드하는 최초의 거래였습니다. 거래 인덱스 3도 시장 복구 과정에서 해당 거래 쌍에 접촉했습니다. 시간선은 명확하게 이번 비정상 거래가 극단적인 가격 왜곡을 초래했음을 증명하며, 후속 거래가 이 왜곡된 수익을 직접 수확했습니다.

그렇다면, 누가 잘못했나요?

Aave V3 핵심 프로토콜이 붕괴되었는지 묻는다면, 답은 아닙니다. Aave 자금 풀은 지시에 따라 완전히 작업을 수행하며, 정상적으로 USDT 상환과 AAVE 예치 프로세스를 완료했습니다.

CoW의 GPv2Settlement 계약이 붕괴되었는지 묻는다면, 답은 아닙니다. 결제는 유효한 서명 주문을 강제로 실행했으며, 서명된 최소 한도를 초과하는 금액을 지급했습니다.

Uniswap V3 또는 SushiSwap의 거래 쌍 계약이 붕괴되었는지 묻는다면, 답은 역시 아닙니다. 두 종류의 거래 풀은 각각의 알고리즘 규칙에 따라 거래 가격을 완료했습니다.

진정한 시스템적 실패는 더 상위의 라우팅 및 리스크 관리 측면에서 발생했습니다:

주요 책임자는 CoW 프로토콜의 라우팅, 견적 및 솔버 모듈입니다: 전체 시스템이 "합리적인 라우팅"에 대한 판단 기준이 너무 약하여, 수백만 달러 규모의 대규모 주문이 최종적으로 미세 저유동성 풀로 흐르도록 허용했습니다. 단지 라우팅이 실행 가능하고 0이 아니면 수용되며, 경제적 측면에서의 극단적인 비합리성은 완전히 무시되었습니다.

부차적 책임자는 Aave 프론트엔드 인터페이스입니다: 어댑터 견적 요청 시 훅 관련 애플리케이션 데이터를 첨부하지 않아 잘못된 결과를 서명 프로세스에 직접 전달했으며, 단지 경고 알림에 의존하고 강제 거부 메커니즘이 없었습니다. 이러한 극단적인 대규모 거래에 대해, 이러한 리스크 관리 조치는 완전히 부족했습니다.

이는 거래 라우팅 품질과 리스크 관리 장치의 극단적인 실패로, 합법적이고 규정에 맞는 담보 교환 작업이 파괴적인 자산 손실 사건으로 변모하게 만들었습니다.

관련 프로젝트

펀딩 정보

더보기
$24M Mar 14
$13M Mar 13

최근 출시 토큰

더보기
Mar 11
Mar 8
Mar 4

𝕏 최신 관심

더보기