50 triệu USDT đổi được 35.000 USD AAVE: Thảm họa xảy ra như thế nào? Chúng ta nên đổ lỗi cho ai?
Do một lỗ hổng nghiêm trọng trong đường dẫn giao dịch, một hoạt động DeFi trị giá 50 triệu đô la đã được thực hiện với mức độ bảo vệ gần như bằng 0, dẫn đến gần như toàn bộ số tiền bốc hơi trong một nhóm thanh khoản nhỏ.

Bài viết này đến từ: @Ehsan1579
Đã biên soạn | Odaily Planet Daily (@OdailyChina); Người phiên dịch | Ethan (@ethanzhang_web 3)

Chỉ cần nhìn vào tiêu đề sự kiện, khả năng cao đây là một cuộc tấn công khai thác lỗ hổng.
Cốt lõi của vụ việc là:Ai đó đã chuyển đổi USDT trị giá 50,4 triệu USD thành AAVE chỉ trị giá 35.900 USD.
Lần đầu tiên tôi nghe chuyện này, tôi thực sự bị sốc. Vì vậy, tôi đã xem xét toàn bộ nội dung từ trên xuống dưới: theo dõi giao dịch, đường dẫn người giải quyết, lệnh gọi hợp đồng, dự trữ lịch sử, dữ liệu thanh toán, quy trình bộ điều hợp, mã giao diện Aave, SDK cho vay nhanh CoW và mã định tuyến để xác định xem một đề nghị có "hợp lý" hay không.
Đây không phải là hack. Không có gì sai với giao thức lõi Aave. Việc giải quyết CoW không hề sai lầm. Không có gì sai sót với Uniswap. SushiSwap không mắc sai lầm. Giao dịch hợp lệ, chữ ký hợp lệ và tất cả các hợp đồng được thực hiện theo đúng mã. Tuy nhiên, gần như toàn bộ giá trị kinh tế của nó đã bị phá hủy chỉ vì sự vô lý của con đường mà nó được phép đi.
Không có vấn đề gì với chuỗi công khai, vấn đề là ở việc định tuyến.
Theo tôi, việc coi nhẹ vấn đề này như một "lỗi của người dùng" đơn giản không phải là một thái độ khách quan và khắt khe. Đúng là người dùng đã hoàn thành việc ký lệnh, nhưng toàn bộ hệ thống phần mềm thực sự đã cho phép một hoạt động liên quan đến việc xoay vòng gần 50 triệu đô la Mỹ tài sản thế chấp để hoàn thành báo giá, chữ ký, lập kế hoạch định tuyến và thực hiện cuối cùng, và toàn bộ quá trình chỉ ra một nhóm có tính thanh khoản thấp chỉ chứa khoảng 331 AAVE. Điều này lẽ ra hoàn toàn không thể xảy ra, ít nhất nó phải bị hệ thống ngăn chặn và từ chối một cách mạnh mẽ trước khi quá trình giải quyết bắt đầu.
Khả năng truy xuất nguồn gốc thông tin cốt lõi của giao dịch
Mã băm của giao dịch bất thường này là: 0x9fa9feab3c1989a33424728c23e6de07a40a26a98ff7ff5139f3492ce430801f, ở mức cao nhất khối mạng chính Ethereum vào ngày 12 tháng 3 năm 2026 Được xác nhận tại 24643151, chỉ số giao dịch là 1, mức tiêu thụ gas là 3780570 đơn vị và giao dịch được thực hiện thành công. Địa chỉ ví được quy cho đơn đặt hàng bắt đầu bằng 0x98b9 và địa chỉ của người giải quyết (người gửi giao dịch) thực sự thực hiện giao dịch bắt đầu bằng 0x3980, được đánh dấu là tsolver trong dữ liệu cạnh tranh CoW.
Trước hết, bạn phải hiểu rằng đây không phải là một cuộc trao đổi USDT sang AAVE đơn giản ở cấp độ ví. Token được bán là aEthUSDT, chứng chỉ tiền gửi USDT chịu lãi trên nền tảng Aave. Token đã mua là aEthAAVE, chứng chỉ tiền gửi AAVE chịu lãi trên nền tảng Aave. Vì vậy, về cơ bản, đây là sự luân chuyển tài sản thế chấp của Aave thông qua hệ thống thanh toán của giao thức CoW và quy trình điều hợp khoản vay nhanh của nó.
Trước khi giao dịch, ví có khoảng 50.432.693,075254 aEthUSDT và 0 aEthAAVE. Sau giao dịch, nó chỉ còn lại 4,980399 aEthUSDT và nhận được 327,241335505966487788 aEthAAVE. Trên thực tế, chiếc ví đã bán gần như toàn bộ vị thế của nó.
Siêu dữ liệu hiển thị rõ ràng hơn rằng tuyến đường đã "độc hại" trước khi thực thi. Đơn đặt hàng xuất phát từ quy trình trao đổi tài sản thế chấp aave-v3-interface. API của CoW hiển thị đây là một lệnh bán đã ký, trong khi siêu dữ liệu của ứng dụng đánh dấu nó là một giao dịch hoán đổi tài sản thế chấp theo thị trường bằng cách sử dụng độ trượt thông minh 121 điểm cơ bản. Số tiền bán đã ký là 50.432.688,41618 aEthUSDT. Số tiền mua vào tối thiểu cho chữ ký là 324.949260918413591035 aEthAAVE. Khoản thanh toán thực tế đã trả là 327,241335505966487788 aEthAAVE.
Đây là một chi tiết cực kỳ quan trọng. Đơn hàng này không được mong đợi sẽ nhận được hàng chục nghìn AAVE, và sau đó bằng cách nào đó đã bị phá hủy giữa chừng. Nó được xây dựng dựa trên hơn ba trăm kết quả AAVE như thế này.
Liên kết đầy đủ đến sự cố định tuyến
Sau khi bạn theo dõi dấu vết giao dịch, toàn bộ quá trình sẽ cực kỳ đơn giản.
Cốt lõi lưu thông vốn cấp cao nhất dựa trên hợp đồng thanh toán GPv2Settlement bắt đầu bằng giao thức CoW 0x9008. Đầu tiên, hợp đồng HooksTrampoline bắt đầu bằng 0x60bf sẽ hoàn thành hoạt động ủy quyền aEthUSDT, cho phép chuyển tiếp kho tiền CoW rút tài sản của người dùng mà không cần ủy quyền giao dịch riêng; sau đó, hợp đồng GPv2VaultRelayer bắt đầu bằng 0xc92e sẽ rút 50432688.41618 aEthUSDT từ ví người dùng và tham gia quy trình thanh toán. Tính đến thời điểm này, mọi thao tác đều tuân theo logic thông thường.
Sau đó, hợp đồng thanh toán sẽ cấp quyền hoạt động aEthUSDT cho hợp đồng phụ trợ không nguồn mở bắt đầu bằng 0xd524 và bắt đầu cuộc gọi thông qua bộ chọn chức năng 0x494b3137; sau đó, hợp đồng phụ trợ sẽ chuyển quyền thực thi sang hợp đồng người thực thi không phải nguồn mở bắt đầu bằng 0x699c. Tại thời điểm này, bức tranh đầy đủ về định tuyến giao dịch bất thường đã được phơi bày hoàn toàn.
Lệnh gọi hợp lệ đầu tiên trỏ đến hợp đồng nhóm quỹ Aave bắt đầu từ 0x87870, hủy bỏ aEthUSDT thông qua chức năng rút tiền (bộ chọn 0x69328dec) và đổi lại USDT gốc cơ bản; sau đó tuyến đường sẽ chuyển sang nhóm giao dịch USDT/WETH sâu của Uniswap V3 bắt đầu từ 0x4e68 và tất cả 50432688,41618 USDT được đổi thành 17957,810805702142342238 WETH.
Giao dịch ở giai đoạn này là hoàn toàn bình thường: tỷ giá hối đoái xấp xỉ 2808,4 USDT cho 1 WETH, phù hợp với điều kiện thị trường vào thời điểm đó. Không thiếu tính thanh khoản, không có sai lệch tính toán và không có bất thường trong liên kết giao dịch bước nhảy đầu tiên.
Vấn đề nằm ở bước nhảy thứ hai, một khi bạn thấy dự trữ thanh khoản thì phần còn lại của câu chuyện là không thể tránh khỏi.
Sau khi người thực thi nhận được 17957.810805702142342238 WETH, tất cả số tiền đã được chuyển vào nhóm giao dịch SushiSwap V2 AAVE/WETH tại địa chỉ 0xd75ea151a61d06868e31f8988d28dfe5e9df57b4.
Tôi đã kiểm tra dữ liệu dự trữ thanh khoản lịch sử của nhóm giao dịch tại thời điểm trước khi giao dịch bất thường xảy ra (chiều cao khối 24643150). Nhóm chỉ giữ:
331.631982538108027323 AAVE, 17.653276196397688066 WETH
Đây không phải là lỗi nhập dữ liệu mà là sự thật.
Tuyến giao dịch này đã bơm gần 17.958 WETH vào nhóm giao dịch vi mô chỉ dự trữ 17,65 WETH, tương ứng với tổng lượng hàng tồn kho AAVE chỉ là 331,63. Khối lượng WETH đầu vào thực tế gấp khoảng 1.017 lần khối lượng WETH dự trữ trong nhóm.
Đây hoàn toàn không phải là vấn đề phổ biến về "độ trượt cao" hay "thanh khoản hơi mỏng", mà là một lộ trình thực hiện lệnh thị trường cực kỳ vô lý, tương đương với việc buộc một nhóm AMM sản phẩm không đổi rất nhỏ phải thực hiện một giao dịch khổng lồ lớn hơn chính nó hàng nghìn lần.
Nhóm giao dịch AMM thực hiện các hoạt động theo thuật toán đã thiết lập và gần như cạn kiệt toàn bộ dự trữ AAVE trong nhóm.
Cặp giao dịch SushiSwap đã kích hoạt sự kiện trao đổi Swap cốt lõi: người thực thi đã chuyển 17957.810805702142342238 WETH và chỉ trao đổi 331.305315608938235428 AAVE. Sau khi giao dịch hoàn tất, tính thanh khoản còn lại của nhóm là khoảng:
0,326666929169791895 AAVE, 17975.464081898540030304 WETH
Nói một cách thẳng thắn, khoảng 99,9% hàng tồn kho AAVE trong nhóm đã bị rút hết chỉ trong một bước nhảy.
Dựa trên dự trữ trước giao dịch, giá AAVE ngụ ý của nhóm là khoảng $149,50. Giá khớp lệnh thực tế của người dùng là khoảng 154.114,66 USDT đến 1 AAVE. Mức giá này tệ hơn 1.000 lần so với giá giao ngay trước khi giao dịch.
Những AAVE này sau đó được cung cấp trở lại nhóm Aave bằng bộ chọn 0x617ba037, tức là cung cấp (địa chỉ, uint256, địa chỉ, uint16). Kết quả là aEthAAVE mới được đúc sẽ được gửi trở lại hợp đồng thanh toán. Hợp đồng thanh toán cuối cùng đã chuyển 327.241335505966487788 aEthAAVE cho người dùng. Khoảng 4,06398010297174764 aEthAAVE vẫn còn trong hợp đồng thanh toán dưới dạng thặng dư so với khoản thanh toán của người dùng.
Vì vậy, việc giải quyết không đột nhiên biến đổi một kết quả thực hiện tốt thành một kết quả xấu. Nó chỉ đơn giản là hoàn thiện những gì định tuyến đã tạo ra.
Đây là một điểm quan trọng và cần phải nói rõ: Những kết quả tai hại đã được “đặt trước” trong lộ trình trước khi nó được thực thi.
Trong dữ liệu cuộc gọi hợp đồng phụ trợ được nhúng trong tuyến đường, số lượng mục tiêu của người mua là khoảng 331,272185078031026739 miếng, số tiền mua tối thiểu được chữ ký của người dùng đồng ý là 324,949260918413591035 miếng và số tiền thanh toán thực tế là 327,241335505966487788 AAVE, tất cả các giá trị cốt lõi đều bị khóa ở mức hơn 300 AAVE trước khi giải quyết.
Tuyến đường này vốn đã xấu.
Lỗ hổng ở đâu?
Câu trả lời là: Mỗi lớp trong cơ chế xác minh của hệ thống đang kiểm tra sai kích thước.
Tất cả các cấp chỉ xác minh xem giao dịch có được thực thi hay không, chữ ký có hợp lệ hay không và số tiền có khác 0 hay không. Hầu như không có cấp độ cốt lõi nào để xác minh xem việc định tuyến giao dịch có hợp lý ở cấp độ kinh tế hay không. Đây là nguyên nhân cốt lõi dẫn đến sự thất bại của cơ chế.
Lỗi mã trong đường dẫn báo giá bộ điều hợp giao diện Aave
Sự bất thường về mã rõ ràng đầu tiên xuất hiện trong quy trình báo giá bộ điều hợp CoW của giao diện Aave: chức năng ban đầu được sử dụng để đính kèm dữ liệu ứng dụng dành riêng cho bộ điều hợp khi yêu cầu báo giá bị vô hiệu hóa trực tiếp và bắt buộc. và adapters.helpers.ts:194
Điều này có nghĩa là khi giao diện Aave yêu cầu báo giá từ CoW, nó không đính kèm siêu dữ liệu flash và hook vốn sẽ được đính kèm khi đơn hàng thực sự được phát hành. Nói cách khác, những gì được trích dẫn không chính xác là những gì sẽ được thực thi. Các nhận xét về mã thậm chí còn nói rằng mục đích của chức năng trợ giúp này là làm cho trích dẫn của bộ điều hợp chính xác hơn, nhưng sau đó chức năng này sẽ bị vô hiệu hóa hoàn toàn.
Xác định tính hợp lý của logic cạnh tranh báo giá CoW quá yếu (lỗ hổng cốt lõi)
Vấn đề thứ hai và nghiêm trọng nhất nằm ở logic cạnh tranh báo giá của giao thức CoW: trong mã dịch vụ công cộng của nó, miễn là chi phí gas báo giá dương và số lượng đầu ra khác 0, thì nó sẽ được đánh giá là "báo giá hợp lý".

Nguồn: quote.rs:31
Đối với hệ thống định tuyến xử lý các đơn hàng tám chữ số, đây là một định nghĩa cực kỳ yếuvề "sự hợp lý."
Hệ thống không được kết nối với máy oracle để xác minh tính toàn vẹn của giá, không có cơ chế chặn "báo giá lệch so với giá giao ngay hơn 500 lần", không có xác định rủi ro rằng "định tuyến sẽ làm cạn kiệt hoàn toàn nhóm thanh khoản", không có cảnh báo sớm về "thanh khoản ở bước cuối cùng không khớp nghiêm trọng với quy mô lệnh"; miễn là trình phân giải trả về một kế hoạch định tuyến có thể thực thi được khác 0, thì nó sẽ được hệ thống chấp nhận. Đây là lỗ hổng cốt lõi của sự cố này.
Các lỗ hổng trong logic mô hình hóa thanh khoản giống Uniswap V2
Vấn đề thứ ba nằm ở phương pháp mô hình hóa nhóm thanh khoản kiểu Uniswap V2: mã chỉ sử dụng thuật toán sản phẩm không đổi tiêu chuẩn, chỉ loại bỏ các tình huống không thể xảy ra ở cấp độ toán học như dự trữ bằng 0, tràn số lượng và tràn dự trữ và không thực hiện xác minh tính khả thi ở cấp độ kinh tế. và pool_fetching.rs:153
Mã này không xác định liệu nhóm thanh khoản có đủ lớn để thực hiện giao dịch định tuyến tương ứng hay không mà chỉ xác định liệu hoạt động trao đổi có hợp lệ về mặt toán học hay không. Do đó, ngay cả một micro-pool chỉ dự trữ 331 AAVE cũng sẽ được đánh giá là nơi hiệu quả để chấp nhận yêu cầu mua 17.957 WETH, chỉ vì thuật toán sản phẩm không đổi có thể tính ra kết quả khác 0, nhưng hoàn toàn bỏ qua rằng kết quả này sẽ mang lại tổn thất tài sản nghiêm trọng.
Lỗi thứ hai của Flash Loan SDK và cơ chế xác minh đơn hàng
Sau đó, Flash Loan SDK trực tiếp củng cố báo giá không hợp lệ vào tải thực thi của đơn hàng và hook mà không có bất kỳ sự ngăn chặn rủi ro thứ cấp nào.

Tiếp tục:

Nguồn: index.js:484 và index.js:591
Đây là lý do tại sao tôi cứ nói tuyến đường này "vốn là xấu". Lớp bộ điều hợpthực hiện "phát hiện" số lượng lỗi mới tại thời điểm thực thi. Nósê-ri hóa số tiền xấu được trích dẫn vào dữ liệu hook và địa chỉ phiên bản đã xác định. Khi một lời đề nghị tồi tồn tại, những người thợ còn lại sẽ trung thực chuyển nó đi.
Ngay cả logic xác thực đơn hàng của CoW không thực sự bảo vệ người dùng ở đây, vì nó chỉ kiểm tra xem đơn hàng có vượt quá giá thị trường tại thời điểm báo giá hay không, chứ không phải liệu bản thân báo giá có lố bịch so với tính thanh khoản thực tế hay không.

Nguồn: order_validation.rs:694
Đây là kiểm tra tính nhất quán. Nếu bản thân trích dẫn là vô nghĩa thì đơn đặt hàng vẫn có thể được thực hiện.
Cơ chế cảnh báo giao diện người dùng là vô dụng
Giao diện Aave có cảnh báo tác động giá cao, nhưng không phải là công tắc cầu chì cứng. Khi mức giảm giá trị vượt quá 20%, nó sẽ chuyển thành hộp kiểm xác nhận.

Sau khi người dùng chọn hộp kiểm, rào cản sẽ được xóa:

Nguồn: helpers.ts:24 và HighPriceImpactWarning.tsx:35
Do đó, ngay cả khi giao dịch này sẽ xóa sạch gần như toàn bộ giá trị tài sản, hệ thống sẽ chỉ đánh giá đây là một hoạt động cần có sự xác nhận của người dùng chứ không phải là giao dịch có rủi ro cao mà hệ thống phải cưỡng bức từ chối. Cơ chế cảnh báo sớm đã mất hoàn toàn vai trò ngăn chặn rủi ro.
Dựa trên sự thất bại của tất cả các cơ chế trên, tôi hoàn toàn không đồng ý với kết luận chiếu lệ “đây chỉ là do người dùng ngu ngốc mà thôi”. Người dùng đã hoàn thành chữ ký, nhưng toàn bộ hệ thống phần mềm có vô số cơ hội để ngăn chặn thảm họa này. Tuy nhiên, mỗi lớp chỉ thực hiện xác minh cơ bản và trực tiếp phát hành nó sau khi xác định "khác 0, có thể thực thi và đã ký", điều này cuối cùng dẫn đến hậu quả tiêu cực.
Tuyến đường chưa bị giả mạo
Liên kết này rất quan trọng và nó trực tiếp loại bỏ rất nhiều dự đoán sai: quy trình giao diện chính thức của Aave tương ứng với aave-v3-interface-collatrial-swap sẽ nằm trên dòng 139 của tệp useSwapOrderAmounts.ts, kết hợp báo giá, phí mạng, phí đối tác và phí flash loan để tính số tiền mua sau khi điều chỉnh trượt giá; dòng 331 sẽ chuyển đổi nó thành giá trị số buyAmountBigInt; sau đó hoàn tất chữ ký chính xác về số tiền ở dòng 191 của file CollonymousSwapActionsViaCoWadapters.tsx.
Hợp đồng bộ điều hợp tiếp theo sẽ xác minh rằng trường thứ tự chữ ký khớp chính xác với giá trị được lưu trữ trên dòng 141 của tệp AaveV3BaseAdapter.sol; hợp đồng giải quyết CoW sẽ thực thi các quy tắc giới hạn của thỏa thuận chữ ký trên dòng 337 của tệp GPv2Settlement.sol. Do đó, kết quả thực thi trên chuỗi không vượt quá phạm vi cho phép của lệnh chữ ký và tài sản mà người dùng thực sự nhận được thậm chí còn cao hơn giới hạn tối thiểu mà chữ ký đã thỏa thuận.
Điều này đủ để chứng minh thảm họa xảy ra trước quá trình giải quyết chứ không phải trong quá trình giải quyết. Lỗ hổng nghiêm trọng trong việc định tuyến đã khiến kết quả bị hủy hoại.
Giá trị bị mất đi đâu?
Giao dịch tiếp theo trong cùng một khối (bắt đầu bằng hàm băm 0x45388b0f), hoạt động chênh lệch giá ngược đã được hoàn thành đối với nhóm SushiSwap AAVE/WETH bị xâm phạm. Sau khi các giao dịch bất thường lấp đầy nhóm với số lượng lớn WETH và tiêu hao phần lớn AAVE, các nhà kinh doanh chênh lệch giá ngay lập tức bán lại AAVE vào nhóm để thu về giá trị vượt mức do mất cân bằng thanh khoản gây ra.
Tổng cộng khoảng 17929,770158685933 WETH đã được trích cho hoạt động chênh lệch giá ngược này và khoảng 13087,73 ETH sau đó đã được trả cho người xây dựng khối và khoảng 4824,31 ETH đã được trả cho địa chỉ thực hiện chênh lệch giá.
Toàn bộ giá trị kinh tế mà người dùng bị mất cuối cùng sẽ được chuyển thành thu nhập chênh lệch giá MEV và thu nhập của người xây dựng khối trong cùng một khối gần như ngay lập tức.
Ngoài ra, việc kiểm tra trình tự thời gian ở cấp khối có thể xác nhận: không ai cố ý thao túng nhóm giao dịch SushiSwap để đánh lừa người dùng trước khi giao dịch. Lần đầu tiên cặp giao dịch AAVE/WETH được chạm tới là giao dịch bất thường này (chỉ số giao dịch 1); giao dịch tiếp theo (chỉ số giao dịch 2) đã hoàn thành lần đảo chiều đầu tiên để phản ứng lại sự biến dạng giá do giao dịch này gây ra; chỉ số giao dịch 3 cũng chạm vào cặp giao dịch trong quá trình sửa chữa thị trường. Dòng thời gian chứng minh rõ ràng: giao dịch bất thường này đã tạo ra mức giá cực kỳ méo mó, và các giao dịch tiếp theo trực tiếp thu về khoản thu nhập bị bóp méo này.
Vậy lỗi tại ai?
Nếu bạn hỏi liệu giao thức lõi Aave V3 có bị hỏng hay không thì câu trả lời là không. Nhóm quỹ Aave hoạt động đầy đủ theo hướng dẫn và hoàn tất quy trình rút USDT và gửi AAVE một cách bình thường.
Nếu bạn hỏi CoW liệu hợp đồng GPv2Settlement có bị vi phạm hay không thì câu trả lời là Không. Thỏa thuận dàn xếp đã thực thi lệnh có chữ ký hợp lệ và trả số tiền cao hơn mức tối thiểu cho chữ ký.
Nếu bạn hỏi liệu hợp đồng cặp giao dịch của Uniswap V3 hay SushiSwap có bị lỗi hay không thì câu trả lời cũng là không. Cả hai loại nhóm giao dịch đều hoàn thành việc định giá giao dịch theo các quy tắc thuật toán riêng của chúng.
Lỗi hệ thống thực sự xảy ra ở cấp độ định tuyến và kiểm soát rủi ro cao hơn:
Bên chịu trách nhiệm chính là mô-đun định tuyến, báo giá và giải quyết của giao thức CoW: Tiêu chí đánh giá của toàn bộ hệ thống về "định tuyến hợp lý" quá yếu, cho phép các đơn đặt hàng khổng lồ trị giá hàng chục triệu đô la, cuối cùng sẽ chảy vào các nhóm có tính thanh khoản cực thấp. Miễn là định tuyến có thể thực thi được và khác 0, nó sẽ được chấp nhận, hoàn toàn bỏ qua sự bất hợp lý cực độ ở cấp độ kinh tế.
Bên chịu trách nhiệm phụ là giao diện người dùng Aave: Khi yêu cầu báo giá bộ điều hợp, không có dữ liệu ứng dụng nào liên kết với hook và kết quả lỗi được chuyển trực tiếp vào quy trình chữ ký và chỉ dựa vào lời nhắc cảnh báo sớm và không có cơ chế từ chối cứng. Đối với những giao dịch cực lớn như vậy, các biện pháp kiểm soát rủi ro như vậy hoàn toàn không đủ để ngăn chặn rủi ro.
Đây là một thất bại nghiêm trọng về chất lượng định tuyến giao dịch và các rào cản kiểm soát rủi ro, trực tiếp biến hoạt động luân chuyển tài sản thế chấp hợp pháp và tuân thủ thành một sự kiện mất mát tài sản nghiêm trọng.
