Lại nhập lại lỗ hổng? Phân tích cuộc tấn công vào Stars Arena

nền

Theo cảnh báo bảo mật của hệ thống Slow MistEye, vào ngày 7/10/2023, Stars Arena, giao thức xã hội on-chain Avalanche, đã bị tấn công, dẫn đến thiệt hại khoảng 2,9 triệu USD. Nhóm bảo mật Slow Mist đã phân tích ngắn gọn cuộc tấn công và chia sẻ kết quả bên dưới.

Thông tin liên quan

Địa chỉ kẻ tấn công:

Hợp đồng tấn công:

Giao dịch tấn công:

Lõi tấn công

Kẻ tấn công khai thác lỗ hổng reentrancy để giả mạo giá tương ứng với cổ phần tiền gửi của mình. Sau đó, khi bán, thao túng giá tương tự là do sự phụ thuộc vào thao tác độc hại của tính toán giá. Bằng cách tính toán chính xác giá cổ phiếu được cập nhật trên reentrant, kẻ tấn công đã đánh cắp tiền trong hợp đồng.

Phân tích giao dịch

Chúng ta có thể thấy rằng có một cuộc gọi reentrancy trong giao dịch tấn công và chúng ta phân tích phương thức gọi từng bước bằng cách dịch ngược mã.

! [Lại nhập cảnh lần nữa?] Phân tích cuộc tấn công vào Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-98a298d9bb-dd1a6f-69ad2a.webp)

Kẻ tấn công đầu tiên tạo ra một hợp đồng tấn công (0x7f283 và 0xdd9af), gọi phương thức 0xe9ccf3a3 của Stars Arena: Hợp đồng cổ phiếu thông qua hợp đồng tấn công, sau đó gửi 1 mã thông báo AVAX.

! [Lại nhập cảnh lần nữa?] Phân tích tấn công Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-fccaa140dd-dd1a6f-69ad2a.webp)

Theo dấu vết từng bước của mã được dịch ngược, phương thức 0xe9ccf3a3 được kẻ tấn công sử dụng đầu tiên là một hàm giống như tiền gửi gọi các phương thức 0x326c và 0x2058. Phương thức 0x326c là một cuộc gọi chỉ được trả về dưới dạng tham số, trong khi phương thức 0x2058 tương tự như một hàm xử lý việc mua hoặc trao đổi một số loại mã thông báo và phương thức sử dụng số lượng và địa chỉ của mã thông báo AVAX được 0xe9ccf3a3 chuyển đến để tính toán hoạt động tiếp theo và tính toán cổ phiếu và phí.

! [Lại nhập cảnh lần nữa?] Phân tích tấn công Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-9279aef172-dd1a6f-69ad2a.webp)

Theo logic gọi của dòng 92 của phương pháp 0x2058, có thể thấy rằng phương pháp 0x1a9b là một hàm tính toán và kết quả tính toán là một giá trị tương tự như giá và giá trị trả về của nó là v24 / 0xde0b6b3a7640000 hoặc _initialPrice mới được tính toán.

Các dòng 109, 110 và 116 tiếp theo của các phương thức 0x307c và 0x30ef có lệnh gọi đến cuộc gọi cấp thấp và cuộc gọi 0x30ef vẫn là cuộc gọi bên ngoài đến g1, nghĩa là địa chỉ hợp đồng tấn công 0xdd9af đến. Hàm không có ràng buộc reentrant-lock và sau khi lệnh gọi ngoài được thực thi, phương thức này sẽ chỉ thực thi nếu phán đoán tiếp theo để cập nhật các tham số field0.length và field0. Không có nghi ngờ rằng sự tái phạm đang xảy ra ở đây.

! [Lại nhập cảnh lần nữa?] Phân tích tấn công Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-3c9611d0bb-dd1a6f-69ad2a.webp)

Hãy xem dữ liệu mà kẻ tấn công xây dựng trong cuộc gọi reentrancy.

! [Lại nhập cảnh lần nữa?] Phân tích cuộc tấn công vào Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-ce911c42e9-dd1a6f-69ad2a.webp)

Reentrancy bên ngoài gọi phương thức 0x5632b2e4 và truyền vào bốn tham số được xây dựng bởi kẻ tấn công, chuyển đổi 153005ce00 thành 9100000000000 bằng số thập phân.

Như đã đề cập ở trên, lệnh gọi bên ngoài đến phương thức 0x5632b2e4 được thực thi trước phán quyết if(g0 == _getMyShares[address(g1)][msg.sender]). Tại thời điểm này, giá trị field0.lengt là 0 và không được cập nhật. Bằng cách này, kẻ tấn công bỏ qua phán đoán trong phương thức 0x5632b2e4 và sửa đổi trạng thái của bốn tham số sau của msg.sender, nghĩa là hợp đồng tấn công 0xdd9af, được xây dựng khi cuộc gọi bên ngoài được thực hiện.

! [Lại nhập cảnh lần nữa?] Phân tích tấn công Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-53695512db-dd1a6f-69ad2a.webp)

Sau khi làm điều này, kẻ tấn công đã gọi sellShares để bán cổ phần của mình, thu được 266.102,97278 AVAX.

! [Lại nhập cảnh lần nữa?] Phân tích cuộc tấn công vào Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-54e5a2f231-dd1a6f-69ad2a.webp)

Đi sâu hơn vào hàm sellShares, hàm ban đầu gọi phương thức 0x1a9b, được gọi trong phương thức 0x2058 trước đó, là một hàm xử lý việc mua hoặc trao đổi một số loại mã thông báo. Chúng ta có thể thấy rằng phương thức 0x2329 trong phương thức 0x1a9b cập nhật owner_9f[g0] , và tham số này đã được sửa đổi thành 9100000000000 được xây dựng bởi kẻ tấn công khi reentrancy.

! [Lại nhập cảnh lần nữa?] Phân tích tấn công Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-60823d09ab-dd1a6f-69ad2a.webp)

Quay trở lại phương pháp 0x1a9b, tính toán lại dựa trên giá trị được xây dựng độc hại trước đó (xem ghi chú để biết số tiền được tính toán).

! [Lại nhập cảnh lần nữa?] Phân tích cuộc tấn công vào Stars Arena] (https://img-cdn.gateio.im/webp-social/moments-69a80767fe-764b869b64-dd1a6f-69ad2a.webp)

Sau khi tính toán ở trên, giá tương ứng với cổ phiếu mới được tính toán đã thay đổi và kết quả là 274,333.061476814e18. Sau khi một loạt các khoản phí được tính, kẻ tấn công sử dụng các cấu trúc độc hại để thao túng giá mà không sửa đổi cổ phần, bán cổ phần và kiếm lợi nhuận thành công.

Tóm tắt

Trọng tâm của cuộc tấn công này là cập nhật phụ thuộc tính toán giá gây ra bởi cuộc tấn công lại, dẫn đến thao túng giá độc hại tương tự. Nhóm bảo mật Slow Mist gợi ý rằng nhóm dự án nên cố gắng được kiểm toán bởi nhiều công ty bảo mật trước khi triển khai hợp đồng. Đồng thời, khi mã hóa, nó phải đáp ứng đặc tả mã hóa Kiểm tra-Hiệu ứng-Tương tác càng nhiều càng tốt và thêm khóa chống lại.

Xem bản gốc
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.
  • Phần thưởng
  • Bình luận
  • Chia sẻ
Bình luận
0/400
Không có bình luận
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)