Vào ngày 28 tháng 3 năm 2024, Prisma Finance đã hứng chịu một cuộc tấn công cho vay nhanh và dự án bị thiệt hại khoảng 12,21 triệu USD.
![20240402162014331image.png](https://img.jinse.cn/7174979_image3.png)
SharkTeam đã tiến hành phân tích kỹ thuật về sự cố này và tóm tắt các biện pháp phòng ngừa bảo mật. Chúng tôi hy vọng rằng các dự án tiếp theo có thể học hỏi từ điều này và cùng nhau xây dựng tuyến phòng thủ an ninh cho ngành công nghiệp blockchain.
1. Phân tích giao dịch tấn công
Kẻ tấn công 1: 0x7e39e3b3ff7adef2613d5cc49558eab74b9a4202 (viết tắt là 0x7e39) p>
Hợp đồng tấn công 1: 0xd996073019c74b2fb94ead236e32032405bc027c (viết tắt là 0xd996)
Kẻ tấn công 2: 0x7fe83f45e0f53651b3ed9650d2a2c6 7d885 5e385
Hợp đồng tấn công 2: 0x4148310fe4544e82f176570c6c7b649290a90e17
Hợp đồng mục tiêu đang bị tấn công: 0x1cc79f3f47bfc060b6f761fcd1afc6d399a968b6
Cuộc tấn công bao gồm 16 giao dịch, lấy giao dịch tấn công đầu tiên làm ví dụ:
0x00c503b595946bccaea3d58025b5f9b3726177bbdc9674e634244135282116c7
Quá trình tấn công như sau:
1. Đọc địa chỉ 0x56a201b872b50bbdee0021ed4d1bb36359d291ed (viết tắt là 0x56a2) trong hợp đồng đích tất cả tài sản thế chấp và các khoản nợ.
![20240402162028308image.png](https://img.jinse.cn/7203507_image3.png)
Kết quả trả về như sau:
![20240402162035243image.png](https://img.jinse.cn/7203508_image3. png)
Địa chỉ 0x56a2 có tổng cộng 1.745 wstETH làm tài sản thế chấp trong hợp đồng mục tiêu và tổng số nợ là 1.442.100 mkUSD.
2. Kẻ tấn công 0x7e39 gọi hàm flashLoan trong hợp đồng nợ mkUSD bằng cách tấn công hợp đồng 0xd996.
![20240402162047257image.png](https://img.jinse.cn/7203509_image3.png)
Bộ nhận tham số được đặt thành MigrateTroveZap và số tiền là tất cả khoản nợ được truy vấn ở trên.
![20240402162059315image.png](https://img.jinse.cn/7203510_image3.png)
Sau đó, hàm onFlashLoan trong bộ thu (ở đây là MigrateTroveZap) sẽ được gọi trong hàm flashLoan.
![20240402162108042image.png](https://img.jinse.cn/7203511_image3.png)
Hàm onFlashLoan trước tiên sẽ hoàn trả tất cả các khoản nợ ban đầu thông qua các khoản vay nhanh, rút tài sản thế chấp cho người nhận, sau đó người nhận thế chấp lại một số tiền thế chấp nhất định và vay một số nợ nhất định. Có hai chức năng chính được gọi là:
(1) chức năng closeTrove, trả nợ và trích xuất tất cả tài sản thế chấp (1745.08 swtETH) từ troverManager đến người nhận (đây là Hợp đồng MigrateTroveZap);
p >
(2) hàm openTrove, người nhận thế chấp lại 463,18 wstETH vào troverManager và gánh khoản nợ 1.443.598 mkUSD.
![20240402162124982image.png](https://img.jinse.cn/7203513_image3.png)
Như có thể thấy từ dữ liệu trên, sau khi hoàn thành việc thực thi chức năng flashLoan, tài sản thế chấp được trích xuất từ troverManager và thuộc địa chỉ 0x56a2 vẫn được giữ lại trong bộ thu và số tiền là khoảng 1745,08 – 463,18 = 1281,90 wstETH.
3. Kẻ tấn công 0x7e39 đã mượn 1 wstETH từ Balancer thông qua khoản vay nhanh bằng cách tấn công hợp đồng 0xd996.
![20240402162133813image.png](https://img.jinse.cn/7203514_image3.png)
Sau đó, thế chấp 1 wstETH và vay khoản nợ 2000 mkUSD, cộng với phí, tổng số nợ là 2200 mkUSD.
![20240402162141046image.png](https://img.jinse.cn/7203515_image3.png)
4. Tương tự như bước 2, gọi hàm flashLoan trong hợp đồng nợ mkUSD. Bộ nhận tham số ở đây vẫn được đặt thành MigrateTroveZap và số tiền là toàn bộ khoản nợ sau khi cầm cố 1 wstETH, tức là là 2000 triệu USD. . Trong hàm FlashLoan, hàm onFlashLoan trong bộ thu được gọi, sau đó các hàm closeTrove và openTrove được gọi.
![20240402162149855image.png](https://img.jinse.cn/7203516_image3.png)
![20240402162152773image.png](https://img.jinse.cn/7203517_image3.png)
Chỉ là tài khoản tham số trong hàm closeTrove và openTrove ở đây không còn là địa chỉ 0x56a2 ở trên mà là hợp đồng tấn công 0xd996 cam kết 1 wstETH.
(1) chức năng closeTrove, trả nợ và rút toàn bộ tài sản thế chấp (1 swtETH) từ troverManager về người nhận (đây vẫn là hợp đồng MigrateTroveZap). Tại thời điểm này, có 1281,90 +1=1282,90 wstETH trong bộ thu.
![20240402162206373image.png](https://img.jinse.cn/7203518_image3.png )
(2) hàm openTrove, người nhận tái thế chấp 1282,80 wstETH (gần như tất cả) vào troverManager và phát sinh một khoản nợ của năm 2001,8 triệu USD.
![20240402162215268image.png](https://img.jinse.cn/7203519_image3.png)
Trên thực tế, 1281.80 wstETH trong tài sản thế chấp ở đây không thuộc về hợp đồng tấn công 0xd996 mà thuộc về địa chỉ trên 0x56a2.
5. Cuối cùng, kẻ tấn công 0x7e39 đã gọi riêng hàm closeTrove thông qua hợp đồng tấn công 0xd996 và trích xuất 1282,80 wstETH đã thế chấp vào hợp đồng tấn công 0xd996.
![20240402162224877image.png](https://img.jinse.cn/7203520_image3.png)
![20240402162230775image.png](https://img.jinse.cn/7203521_image3.png)
Sau khi hoàn trả khoản vay nhanh, kẻ tấn công vẫn kiếm được lợi nhuận 1281,80 wstETH, tương đương khoảng 2,30 triệu USD.
![20240402162241932image.png](https://img.jinse.cn/7203522_image3.png)
2. Phân tích lỗ hổng
Nguyên nhân sâu xa của sự cố này là do hợp đồng dự án có xác minh logic và quyền, điều này khiến cho kẻ tấn công Lỗ hổng này có thể bị khai thác để lấy tài sản cầm cố từ các địa chỉ tài khoản khác.
WstETH mà kẻ tấn công cuối cùng lấy được là tài sản thế chấp của địa chỉ ban đầu 0x56a2 trong hợp đồng troverManager. Thông qua chức năng flashLoan của hợp đồng mkUSD, chức năng onFlashLoan trong hợp đồng MigrateTroveZap được tùy chỉnh Các thông số, sử dụng MigrateTroveZap để biến chúng thành tài sản thế chấp cho hợp đồng tấn công, sau đó rút chúng ra.
Kẻ tấn công thao túng việc thế chấp và rút các địa chỉ tài khoản khác thông qua hàm flashLoan trong hợp đồng mkUSD và hàm onFlashLoan trong hợp đồng MigrateTroveZap.
![20240402162254209image.png](https://img.jinse.cn/7203523_image3.png)
![20240402162304089image.png](https://img.jinse.cn/7203524_image3.png)
(1) Hàm flashLoan thiếu xác minh địa chỉ người nhận tham số, vì người nhận trong hàm onFlashLoan sẽ nhận tất cả tài sản thế chấp của tài khoản nên người nhận cần được xác minh là đáng tin cậy;
(2) Hàm onFlashLoan thiếu xác minh địa chỉ tài khoản, vì hàm closeTrove và openTrove đều là tài sản của tài khoản đang được vận hành nên cần thêm xác minh quyền vào tài khoản;< /p >
Ngoài việc xác minh hai tham số địa chỉ này, cũng có thể cần phải xác minh các tham số số lượng và logic triển khai trong hàm flashLoan.
3. Khuyến nghị bảo mật
Để đối phó với cuộc tấn công này, chúng ta nên Thực hiện theo các biện pháp phòng ngừa sau :
(1) Trong quá trình thiết kế và phát triển dự án, tính toàn vẹn và chặt chẽ của logic phải được duy trì, đặc biệt khi nói đến việc chuyển giao Trong quá trình này, cần tăng cường xác minh quyền nghiên cứu chức năng để đảm bảo rằng người gọi, chức năng gọi, tham số chức năng, logic truyền, v.v. được an toàn và đáng tin cậy.
(2) Trước khi dự án lên mạng, bạn cần tìm một nhóm kiểm toán bên thứ ba chuyên nghiệp để tiến hành kiểm toán hợp đồng.
Giới thiệu về chúng tôi
Tầm nhìn của SharkTeam là bảo vệ an ninh của thế giới Web3. Nhóm bao gồm các chuyên gia bảo mật giàu kinh nghiệm và các nhà nghiên cứu cấp cao từ khắp nơi trên thế giới, những người thành thạo lý thuyết cơ bản về blockchain và hợp đồng thông minh. Nó cung cấp các dịch vụ bao gồm nhận dạng và ngăn chặn rủi ro, kiểm toán hợp đồng thông minh, KYT/AML, phân tích trên chuỗi, v.v. và đã tạo ra nền tảng chặn và nhận dạng rủi ro thông minh trên chuỗi ChainAegis, có thể chống lại Mối đe dọa liên tục nâng cao một cách hiệu quả (Nâng cao). Persistent Threat) trong thế giới Web3. , APT). Nó đã thiết lập mối quan hệ hợp tác lâu dài với những người chơi chủ chốt trong các lĩnh vực khác nhau của hệ sinh thái Web3, như Polkadot, Moonbeam, Polygon, Sui, OKX, imToken, Collab.Land, v.v.
Trang web chính thức: https://www.sharkteam.org
Twitter: https: / /twitter.com/sharkteamorg
Telegram: https://t.me/sharkteamorg
Bất hòa: https://discord.gg/jGH9xXCjDZ