Phân tích sự kiện tấn công tái nhập của OrionProtocol
Vào chiều ngày 2 tháng 2 năm 2023, dự án OrionProtocol trên Ethereum và Binance Smart Chain đã bị tấn công tái nhập do lỗ hổng hợp đồng. Kẻ tấn công đã thu lợi khoảng 2,9 triệu USD, trong đó bao gồm 2.844.766 USDT trên chuỗi Ethereum và 191.606 BUSD trên chuỗi Binance Smart.
Phân tích quá trình tấn công
Kẻ tấn công đầu tiên triển khai một hợp đồng Token tùy chỉnh và thực hiện một loạt các thao tác chuyển nhượng và ủy quyền để chuẩn bị cho cuộc tấn công tiếp theo. Sau đó, kẻ tấn công vay tiền thông qua chức năng hoán đổi của một DEX và gọi phương thức ExchangeWithAtomic.swapThroughOrionPool của OrionProtocol để thực hiện hoán đổi token. Đường hoán đổi được thiết lập là [USDC, Token của kẻ tấn công, USDT].
Khi thực hiện phương thức swapThroughOrionPool, do hợp đồng Token của kẻ tấn công có chức năng gọi lại, đã dẫn đến việc kích hoạt tấn công tái nhập trong quá trình chuyển tiền. Kẻ tấn công đã lợi dụng phương thức Token.Transfer để gọi lại hàm ExchangeWithAtomic.depositAsset một cách liên tục, khiến số tiền gửi không ngừng gia tăng. Cuối cùng, kẻ tấn công đã hoàn thành việc thu lợi thông qua thao tác rút tiền.
Dòng tiền
Theo dữ liệu trên chuỗi, số vốn ban đầu của kẻ tấn công đến từ ví nóng của một nền tảng giao dịch. Trong số 1,651 ETH đã kiếm được, 657.5 ETH vẫn còn trong địa chỉ ví của kẻ tấn công, phần còn lại đã được chuyển qua dịch vụ trộn coin.
Phân tích lỗ hổng
Lỗ hổng nằm ở hàm doSwapThroughOrionPool trong hợp đồng ExchangeWithAtomic. Hàm này có một thiếu sót logic khi thực hiện thao tác _doSwapTokens. Cụ thể, mã chỉ cập nhật biến curBalance sau khi thực hiện chuyển khoản, điều này tạo ra điều kiện cho cuộc tấn công tái nhập.
Kẻ tấn công đã thêm logic gọi lại vào hàm transfer của Token tùy chỉnh, lặp đi lặp lại gọi hàm depositAsset, dẫn đến việc cập nhật curBalance không chính xác. Cuối cùng, sau khi hoàn trả khoản vay chớp nhoáng, kẻ tấn công đã gọi hàm withdraw để rút số tiền thừa.
Đề xuất phòng ngừa
Để tránh các cuộc tấn công tương tự, nhóm dự án nên lưu ý những điểm sau:
Khi triển khai chức năng đổi token, cần xem xét toàn diện các loại token khác nhau và các con đường đổi có thể mang lại rủi ro an ninh.
Tuân thủ nghiêm ngặt mô hình mã hóa "Kiểm tra - Hiệu lực - Tương tác" (Checks-Effects-Interactions), tức là đầu tiên thực hiện kiểm tra điều kiện, sau đó cập nhật biến trạng thái, cuối cùng mới thực hiện gọi bên ngoài.
Tăng cường kiểm soát an ninh đối với các cuộc gọi bên ngoài, đặc biệt là khi xử lý Token do người dùng tùy chỉnh.
Thực hiện kiểm toán mã định kỳ và kiểm tra an ninh, phát hiện và sửa chữa kịp thời các lỗ hổng tiềm ẩn.
Sử dụng thư viện bảo mật trưởng thành và các thực tiễn tốt nhất, chẳng hạn như SafeERC20 của OpenZeppelin.
Bằng cách thực hiện các biện pháp này, có thể giảm thiểu đáng kể rủi ro bị tấn công vào hợp đồng thông minh, nâng cao tính an toàn tổng thể của dự án.
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
OrionProtocol bị tấn công tái nhập, thiệt hại khoảng 2,9 triệu đô la.
Phân tích sự kiện tấn công tái nhập của OrionProtocol
Vào chiều ngày 2 tháng 2 năm 2023, dự án OrionProtocol trên Ethereum và Binance Smart Chain đã bị tấn công tái nhập do lỗ hổng hợp đồng. Kẻ tấn công đã thu lợi khoảng 2,9 triệu USD, trong đó bao gồm 2.844.766 USDT trên chuỗi Ethereum và 191.606 BUSD trên chuỗi Binance Smart.
Phân tích quá trình tấn công
Kẻ tấn công đầu tiên triển khai một hợp đồng Token tùy chỉnh và thực hiện một loạt các thao tác chuyển nhượng và ủy quyền để chuẩn bị cho cuộc tấn công tiếp theo. Sau đó, kẻ tấn công vay tiền thông qua chức năng hoán đổi của một DEX và gọi phương thức ExchangeWithAtomic.swapThroughOrionPool của OrionProtocol để thực hiện hoán đổi token. Đường hoán đổi được thiết lập là [USDC, Token của kẻ tấn công, USDT].
Khi thực hiện phương thức swapThroughOrionPool, do hợp đồng Token của kẻ tấn công có chức năng gọi lại, đã dẫn đến việc kích hoạt tấn công tái nhập trong quá trình chuyển tiền. Kẻ tấn công đã lợi dụng phương thức Token.Transfer để gọi lại hàm ExchangeWithAtomic.depositAsset một cách liên tục, khiến số tiền gửi không ngừng gia tăng. Cuối cùng, kẻ tấn công đã hoàn thành việc thu lợi thông qua thao tác rút tiền.
Dòng tiền
Theo dữ liệu trên chuỗi, số vốn ban đầu của kẻ tấn công đến từ ví nóng của một nền tảng giao dịch. Trong số 1,651 ETH đã kiếm được, 657.5 ETH vẫn còn trong địa chỉ ví của kẻ tấn công, phần còn lại đã được chuyển qua dịch vụ trộn coin.
Phân tích lỗ hổng
Lỗ hổng nằm ở hàm doSwapThroughOrionPool trong hợp đồng ExchangeWithAtomic. Hàm này có một thiếu sót logic khi thực hiện thao tác _doSwapTokens. Cụ thể, mã chỉ cập nhật biến curBalance sau khi thực hiện chuyển khoản, điều này tạo ra điều kiện cho cuộc tấn công tái nhập.
Kẻ tấn công đã thêm logic gọi lại vào hàm transfer của Token tùy chỉnh, lặp đi lặp lại gọi hàm depositAsset, dẫn đến việc cập nhật curBalance không chính xác. Cuối cùng, sau khi hoàn trả khoản vay chớp nhoáng, kẻ tấn công đã gọi hàm withdraw để rút số tiền thừa.
Đề xuất phòng ngừa
Để tránh các cuộc tấn công tương tự, nhóm dự án nên lưu ý những điểm sau:
Khi triển khai chức năng đổi token, cần xem xét toàn diện các loại token khác nhau và các con đường đổi có thể mang lại rủi ro an ninh.
Tuân thủ nghiêm ngặt mô hình mã hóa "Kiểm tra - Hiệu lực - Tương tác" (Checks-Effects-Interactions), tức là đầu tiên thực hiện kiểm tra điều kiện, sau đó cập nhật biến trạng thái, cuối cùng mới thực hiện gọi bên ngoài.
Tăng cường kiểm soát an ninh đối với các cuộc gọi bên ngoài, đặc biệt là khi xử lý Token do người dùng tùy chỉnh.
Thực hiện kiểm toán mã định kỳ và kiểm tra an ninh, phát hiện và sửa chữa kịp thời các lỗ hổng tiềm ẩn.
Sử dụng thư viện bảo mật trưởng thành và các thực tiễn tốt nhất, chẳng hạn như SafeERC20 của OpenZeppelin.
Bằng cách thực hiện các biện pháp này, có thể giảm thiểu đáng kể rủi ro bị tấn công vào hợp đồng thông minh, nâng cao tính an toàn tổng thể của dự án.