Nguồn gốc: PeckShield
Vào ngày 5 tháng 8 năm 2020, giờ Bắc Kinh, nền tảng quyền chọn DeFi Các quyền chọn bán của Opyn (Opyn ETH Put ) hợp đồng thông minh đã bị hack, dẫn đến thiệt hại khoảng 370.000 USD.
Opyn là một giao thức tùy chọn chung được chuyển đổi thành nền tảng bảo hiểm vào tháng 2 năm nay. Nó cung cấp các tùy chọn đặt ETH có thể giao dịch cho nền tảng DeFi thông qua oTokens, từ đó giữ giá thị trường ETH và mang lại sự ổn định tương đối cho thị trường DeFi có tính biến động cao. .
Sau khi nhóm bảo mật PeckShield biết rằng nền tảng Opyn đang bị tấn công, họ đã nhanh chóng xác định được những điểm chính của vấn đề:
Kẻ tấn công phát hiện ra rằng Giao diện thực hiện hợp đồng thông minh Opyn có một số lỗi xử lý nhất định trong ETH nhận được và hợp đồng của nó thì không xử lý ETH nhận được. Khối lượng giao dịch theo thời gian thực của nhà giao dịch được kiểm tra, cho phép kẻ tấn công thực hiện một giao dịch thực sự với chính mình và sau đó chèn một giao dịch trá hình để lừa gạt người bán tài sản kỹ thuật số được thế chấp, từ đó đạt được một con sói trắng không có gì.
Nói một cách đơn giản, vì hàm practice() trong hợp đồng thông minh Opyn ETH Put không thực hiện xác minh ETH của nhà giao dịch theo thời gian thực. Theo logic kinh doanh của nền tảng Opyn, người mua quyền chọn bán sẽ chuyển giá trị ETH tương ứng cho người bán và có thể nhận được tài sản kỹ thuật số được người bán thế chấp. Kẻ tấn công xảo quyệt trước tiên thực hiện một giao dịch trá hình cho chính mình, sau đó sử dụng tính năng có thể tái sử dụng của ETH này để bắt đầu chuyển khoản lại cho người dùng người bán, từ đó lừa gạt người bán tài sản kỹ thuật số đã được thế chấp.
Sau đây là phân tích chi tiết về nguyên nhân gây ra lỗ hổng và quá trình tấn công.
Phân tích quy trình chi tiết về lỗ hổng
Trước tiên, hãy nói về logic kinh doanh của nền tảng Opyn: khi người dùng sử dụng hợp đồng Opyn để thực hiện, tức là mua và bán hợp đồng tương lai (bài tập), người mua cần chuyển số lượng ETH hoặc ERC20 tương ứng cho người bán Token, hợp đồng sau đó sẽ hủy oToken tương ứng của người mua và khi đó người mua sẽ nhận được tài sản mà người bán đã cầm cố.
Ví dụ: Xiao Wang tin rằng thị trường đã bước vào xu hướng giảm và thấy tùy chọn bán $330 trên ETH từ Xiao Li trên Opyn, vì vậy anh ấy tham gia vào hệ thống giao dịch, chuyển ETH cho Xiao Li và nhận được số tiền tương đương tài sản kỹ thuật số được cầm cố bởi Xiao Wang. Nếu giá thị trường giảm xuống còn 300 USD vào thời điểm này, Xiao Wang có thể nhận được chênh lệch giá.

Hình 1. Hàm practice() vòng lặp qua danh sách địa chỉ vaults đến span>
Như được hiển thị trong đoạn mã hợp đồng ở trên, phần bên trong của hàm exercise() là một vòng lặp, gọi hàm _exercise() logic bài tập thực theo trình tự theo số lượng địa chỉ trong vaultsToExerciseFrom được truyền trong tham số.

Hình 2. Tái sử dụng ETH được chuyển vào hợp đồng để lấy tài sản thế chấp
Khi hàm xử lý Mã thông báo ERC20, nó hoạt động với hầu hết Các dự án DeFi Cách tiếp cận giống nhau, sử dụng transferFrom(), như được hiển thị trong dòng 1882 của mã, để chuyển từ msg.sender sang address(this).
Nhưng khi tài sản được hàm xử lý là ETH thì phương thức xử lý sẽ hoàn toàn khác. Vì trong Solidity msg.value nghĩa là lượng ETH được người gọi hợp đồng chuyển vào hợp đồng khi gọi giao diện thanh toán, nó chỉ là giá trị định lượng nên ở dòng 1879 của mã hợp đồng kiểm tra msg.value == amtUnderlyingToPay có thể chỉ đảm bảo rằng hợp đồng thực sự đã nhận được số tiền ETH amtUnderlyingToPay và sẽ không có bất kỳ tác động nào đến giá trị của msg.value.
Nhưng như đã đề cập ở trên, hàm _exercise() được gọi theo chu kỳ trong bài tập(), dẫn đến mặc dù hợp đồng thực sự chỉ nhận ETH một lần nhưng nó có thể được sử dụng nhiều lần trong vòng lặp.
Điểm tấn công là ở đây. Vì hợp đồng thiếu một bước để kiểm tra số lượng ETH theo thời gian thực, nên trước tiên, kẻ tấn công có thể giả mạo một giao dịch trỏ đến chính mình, sau đó sử dụng lại số tiền gốc đã chi tiêu để hoàn tất giao dịch với những người dùng khác của hợp đồng. nền tảng.Một giao dịch bình thường.

Hình 3. Phân tích giao dịch tấn công
Trong Hình 3, chúng tôi hiển thị quy trình tấn công thông qua quy trình gọi được hiển thị bởi trình duyệt Bloxy. Vì kẻ tấn công đã ăn nhiều lệnh nên chúng tôi lấy một trong các giao dịch làm ví dụ để cho bạn thấy logic tấn công của nó:
1. Kẻ tấn công lần đầu tiên mua 75 oETH từ Uniswap để chuẩn bị cho hoạt động thực hiện chức năng gọi tiếp theo;
2 Kẻ tấn công đã tạo một địa chỉ Vault với tư cách là người bán quyền chọn bán khống và thế chấp 24.750 USDC để đúc 75 oETH, nhưng không bán các quyền chọn này, tương đương với việc mua chúng cùng lúc và bán chúng với giá 330. 75 ETH;
3. Kẻ tấn công đã gọi tập thể dục() trong hợp đồng Opyn. Trong khi nắm giữ quyền chọn bán 150 oETH, trước tiên hắn chuyển 75 ETH đến địa chỉ Vault của mình. Sau khi nhận được 24.750 USDC mà hắn đã cam kết trước, anh ta đã tái sử dụng 75 ETH và tiêu thụ thành công 24.750 USDC của người dùng khác, nhờ đó thu được lợi nhuận bất hợp pháp.
Đề xuất sửa chữa
Nhóm bảo mật PeckShield khuyến nghị rằng trong Solidity, hợp đồng có thể sử dụng biến cục bộ msgValue để lưu ETH nhận được (nghĩa là giá trị của msg.value). Bằng cách này, bằng cách vận hành msgValue trong các bước tiếp theo, bạn có thể đánh dấu chính xác số ETH đã được chi tiêu, từ đó tránh việc sử dụng lại tài sản. Ngoài ra, chúng ta cũng có thể sử dụng address(this).balance để kiểm tra số dư hợp đồng nhằm tránh nguy cơ msg.value bị sử dụng lại.
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia
