
Phân tích sự cố tấn công Yearn Finance
Tuyển chọn TechFlowTuyển chọn TechFlow

Phân tích sự cố tấn công Yearn Finance
Bài viết này sẽ phân tích quá trình tấn công và nguyên nhân gây ra lỗ hổng trong sự cố tấn công Yearn Finance.
Tổng quan
Vào ngày 13 tháng 4 năm 2023, Yearn Finance đã bị tin tặc tấn công, dẫn đến thiệt hại khoảng 10 triệu USD. Bài viết này sẽ phân tích quá trình tấn công và nguyên nhân gây ra lỗ hổng.
Phân tích cuộc tấn công
Đây là một giao dịch tấn công:
https://etherscan.io/tx/0xd55e43c1602b28d4fd4667ee445d570c8f298f5401cf04e62ec329759ecda95d
Kẻ tấn công đã khởi tạo khoản vay chớp nhoáng từ Balancer, mượn 5 triệu DAI, 5 triệu USDC và 2 triệu USDT:

Sau đó, trên Curve, kẻ tấn công đã đổi 5 triệu DAI sang 695.000 USDT và 3,5 triệu USDC sang 151 USDT:

Kẻ tấn công gọi hàm recommend của IEarnAPRWithPool để kiểm tra APR hiện tại. Lúc này, chỉ có APR của Aave khác 0:

Tiếp theo, kẻ tấn công chuyển 800.000 USDT đến hợp đồng tấn công 0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f. Trong hợp đồng này, kẻ tấn công gọi nhiều lần hàm repay của Aave: Lending Pool V1 để trả nợ giúp người khác, nhằm làm cho APR của Aave bằng 0:

Kẻ tấn công gọi hàm deposit của yUSDT, thế chấp 900.000 USDT và nhận được 820.000 yUSDT:

Tiếp theo, kẻ tấn công gọi hàm mint của bZx iUSDC, dùng 156.000 USDC đúc 152.000 bZx iUSDC và chuyển chúng tới Yearn yUSDT:

Kẻ tấn công gọi hàm withdraw của Yearn: yUSDT, đổi 820.000 yUSDT lấy 1.030.000 USDT. Lúc này, trong hợp đồng chỉ còn lại bZx iUSDC mà kẻ tấn công đã chuyển vào:

Tiếp theo, kẻ tấn công gọi hàm rebalance của Yearn: yUSDT để huỷ (burn) bZx iUSDC:

Sau đó, kẻ tấn công chuyển 1/e6 USDT vào hợp đồng yUSDT và gọi hàm deposit, thế chấp 10.000 USDT và nhận được 1.252.660.242.850.000 yUSDT:

Sau đó, trên Curve, kẻ tấn công đổi 70.000 yUSDT sang 5.990.000 yDAI, 400 triệu yUSDT sang 4.490.000 yUSDC, và 1.240.133.244.352.200 yUSDT sang 1.360.000 yTUSD:

Sau đó, lần lượt gọi withdraw trên yearn: yDAI và yearn: yUSDC để rút 6,78 triệu DAI và 5,62 triệu USDC, rồi hoàn trả khoản vay chớp nhoáng:

Phân tích lỗ hổng
Điểm then chốt nhất trong cuộc tấn công này là việc kẻ tấn công đã dùng 100.000 USDT để đúc ra 1.252.660.242.850.000 yUSDT. Xem xét triển khai hàm deposit:

Có thể thấy số lượng share phụ thuộc vào biến pool, khi pool càng nhỏ thì share càng lớn, và giá trị pool được lấy từ hàm _calcPoolValueInToken:

Sau khi gọi hàm rebalance, trong hợp đồng chỉ còn USDC, nhưng _balance() lại lấy số dư USDT, do đó số dư USDC không được tính vào, khiến giá trị pool lúc này chỉ là 1 (số tiền mà kẻ tấn công đã gửi vào):



Đây rõ ràng là lỗi cấu hình từ phía dự án: Hợp đồng yUSDT lẽ ra phải chứa các token loại USDT, nhưng biến fulcrum của nó lại liên quan đến token bZx iUSDC (thuộc USDC), do đó USDC trong yUSDT không được tính vào balance:


Tại sao kẻ tấn công có thể gọi hàm rebalance để huỷ (burn) token bZx iUSDC? Xem xét cách triển khai hàm rebalance:



Có thể thấy trong _withdrawFulcrum() có các thao tác redeem và burn, do đó ta cần đảm bảo điều kiện "newProvider != provider" được thỏa mãn, trong đó triển khai của recommend():

Kẻ tấn công điều khiển giá trị trả về của IIEarnManager(apr).recommend(token) để tất cả đều bằng 0, nhằm kiểm soát newProvider:

Làm thế nào để giá trị trả về bằng 0? Giá trị này phụ thuộc vào APR tính toán được từ các nền tảng DeFi khác nhau. Vì Compound, bZx, dydx không có bể thanh khoản, nên chỉ cần kiểm soát Aave (Aave: Lending Pool Core V1):

Để giá trị trả về bằng 0, cần làm cho giá trị trả về đầu tiên của hàm apr.calculateInterestRates bằng 0:

Tức là currentLiquidityRate phải bằng 0, giá trị này phụ thuộc vào _totalBorrowsStable và _totalBorrowsVariable. Khi cả hai giá trị này đều bằng 0 thì currentLiquidityRate cũng bằng 0:


_totalBorrowsVariable bằng 0 tức là tại thời điểm đó không ai đang nợ trên Aave: Lending Pool Core V1. Để đạt được điều kiện này, kẻ tấn công đã thực hiện trả nợ (repay) cho tất cả mọi người trong bể:

Cuối cùng, kẻ tấn công đã làm cho _totalBorrowsVariable bằng 0, nhờ đó có thể gọi hàm rebalance để huỷ (burn) token bZx iUSDC:

Tổng kết
Nguyên nhân gốc rễ của sự cố tấn công Yearn Finance lần này là lỗi cấu hình hợp đồng từ phía dự án. Kẻ tấn công đã lợi dụng lỗ hổng này bằng một loạt thao tác tinh vi, cuối cùng thu lợi khoảng 10 triệu USD.
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News














