Nguồn: Beosin
Giờ Bắc Kinh vào ngày 30 tháng 1 năm 2024, theo màn hình giám sát rủi ro bảo mật EagleEye, cảnh báo sớm và giám sát nền tảng chặn của Beosin, Giao thức DeFi MIM_Spell bị tin tặc tấn công để thực hiện các khoản vay flash, dẫn đến thiệt hại hơn 6 triệu đô la Mỹ. Hiện tại, kẻ tấn công đã chuyển số tiền bị đánh cắp thành ETH và chuyển chúng đến hai địa chỉ của kẻ tấn công. Beosin KYT sẽ tiếp tục theo dõi số tiền trong khi chúng tôi phân tích lỗ hổng này.
Phân tích lỗ hổng
Nguyên nhân chính của sự cố là Kẻ tấn công lợi dụng hợp đồng dự án để sử dụng thuật toán làm tròn số, đồng thời khống chế tham số về 1 nhằm tối đa hóa lỗi làm tròn số, khiến sổ cái bị mất cân bằng.
Hợp đồng có hai chức năng là vay và trả nợ. Một là vay tiền trong hợp đồng, hai là hoàn trả tiền cho hợp đồng.
Hàm Borrow sẽ chỉ định số tiền vay, tính giá trị khoản nợ thông qua chuyển đổi tỷ lệ và cập nhật nó thành tổng giá trị khoản nợ của người gọi. Như được hiển thị trong hình bên dưới, thuật toán thêm của hợp đồng ở đây sử dụng làm tròn số.
Hàm Vay sẽ xác định giá trị khoản nợ trả nợ, tính toán số tiền trả nợ thông qua quy đổi tỷ lệ và chuyển số tiền trả nợ vào hợp đồng này. Như thể hiện trong hình bên dưới, thuật toán phụ của hợp đồng ở đây vẫn sử dụng làm tròn lên.
Hiểu rõ quy trình vay và trả nợ, Hãy cùng nhau tìm hiểu hãy xem cách tin tặc khai thác lỗ hổng này.
Đầu tiên hacker kiểm soát số tiền vay và giá trị nợ của hợp đồng về 0 và 97 (cách kiểm soát sẽ được giới thiệu ở phần tiếp theo) .
Tiếp theo, hàm vay và trả nợ được gọi liên tục, giá trị vay và trả nợ đều bằng 1. Cuối cùng là số tiền vay và giá trị khoản nợ được kiểm soát về 0 và 120080183810681886665215049728. dẫn đến sự mất cân bằng nghiêm trọng về tỷ lệ.
Theo quy tắc mã trên (elastic=0, base=97), khi kẻ tấn công gọi mượn một lần và chuyển vào 1, hai sổ cái sẽ trở nên đàn hồi =1, base=98 (khi elastic bằng 0 sẽ tăng đồng bộ theo giá trị), khi mượn lại và truyền 1 vào sẽ trở thành elastic=2, base=196 (khi elastic khác 0, nó sẽ được đồng bộ hóa theo tỷ lệ) Tăng).
Tiếp theo, kẻ tấn công gọi hàm trả nợ và chuyển vào 1, hàm này sẽ gọi hàm phụ. Lúc này, độ co giãn được tính toán phải bằng nhau thành 1*1/196= >0, nhưng thuật toán làm tròn lên, dẫn đến phép tính co giãn=1 và kết quả sẽ trở thành co giãn=1, cơ số=195. Có thể thấy lúc này độ đàn hồi không thay đổi nhưng phần đế đã tăng gấp đôi.
Kẻ tấn công đã sử dụng phương pháp trên nhiều lần để đặt elastic=0 và base=120080183810681886665215049728. Cuối cùng, hơn 5 triệu MIM trong hợp đồng đã được cho vay thông qua hình thức vay mượn.
Quá trình tấn công
Bây giờ chúng ta đã hiểu được vấn đề với hàm này, hãy bắt đầu hãy xem cuộc tấn công Cách kẻ tấn công thực hiện cuộc tấn công (một trong các giao dịch là một ví dụ).
1. Kẻ tấn công đầu tiên vay 300.000 MIM.
2. Sau đó, kẻ tấn công truy vấn số tiền vay và giá trị khoản nợ trong lệnh gọi lại function , bạn có thể thấy lúc này là 240.000 và 230.000.
3. Tiếp theo, kẻ tấn công gọi hàm returnForAll, trả về 240.000 mã thông báo MIM và điều khiển đàn hồi ở kích thước rất nhỏ.
4. Tiếp theo, kẻ tấn công trả lại khoản nợ của những người dùng khác thông qua chức năng trả nợ, cuối cùng kiểm soát số tiền cho vay và giá trị khoản nợ về 0 và 97.
5. Kẻ tấn công tạo một hợp đồng mới và kiểm soát số tiền vay cũng như giá trị khoản nợ về 0 và bằng cách kêu gọi vay và trả nợ. 120080183810681886665215049728 .
6. Cuối cùng, 5 triệu MIM đã được cho vay thông qua khoản vay và khoản vay nhanh đã được trả lại.
Theo dõi quỹTính đến thời điểm viết bài, số tiền hơn 6 triệu đô la Mỹ bị đánh cắp đều đã được những kẻ tấn công chuyển đổi thành ETH và được phân tán tại địa chỉ của hacker và chưa được di chuyển.Beosin KYT đã đảo ngược Nền tảng rửa tiền sẽ liên tục giám sát các khoản tiền.