Tác giả: Victory & Lisa

Bối cảnh

Ngày 22 tháng 5, theo thông tin từ cộng đồng, nhà cung cấp thanh khoản Cetus trên hệ sinh thái SUI có dấu hiệu bị tấn công, độ sâu của pool thanh khoản giảm mạnh, nhiều cặp giao dịch token trên Cetus đã giảm, dự kiến thiệt hại vượt 230 triệu USD. Sau đó, Cetus phát hành thông báo cho biết: “Chúng tôi đã phát hiện một sự kiện trong giao thức của mình, để đảm bảo an toàn, hợp đồng thông minh đã tạm thời bị đình chỉ. Hiện tại, đội ngũ đang điều tra sự kiện này. Chúng tôi sẽ sớm phát hành tuyên bố điều tra thêm.”

Sau khi sự kiện xảy ra, đội ngũ bảo mật SlowMist đã can thiệp phân tích ngay lập tức và phát hành cảnh báo an toàn. Dưới đây là phân tích chi tiết về phương pháp tấn công và tình hình chuyển tiền.

(https://x.com/CetusProtocol/status/1925515662346404024)

Thông tin liên quan

Một giao dịch tấn công:

https://suiscan.xyz/mainnet/tx/DVMG3B2kocLEnVMDuQzTYRgjwuuFSfciawPvXXheB3x

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

0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06

Địa chỉ của pool bị tấn công:

0x871d8a227114f375170f149f7e9d45be822dd003eba225e83c05ac80828596bc

Token liên quan:

haSUI / SUI

Phân tích tấn công

Cốt lõi của sự kiện này là kẻ tấn công đã khéo léo cấu trúc các tham số để tạo ra tràn nhưng lại có thể vượt qua kiểm tra, cuối cùng chỉ cần một số lượng Token rất nhỏ có thể đổi lấy tài sản thanh khoản lớn, dưới đây là phân tích từng bước cụ thể:

1. Kẻ tấn công đầu tiên đã mượn 10,024,321.28 haSUI thông qua khoản vay chớp nhoáng, khiến giá của pool giảm từ 18,956,530,795,606,879,104 xuống 18,425,720,184762886, mức giảm giá đạt tới 99.90%.

2. Kẻ tấn công đã chọn một khoảng giá cực kỳ hẹp để mở vị trí thanh khoản:

  • Giới hạn Tick dưới: 300000 (giá: 60,257,519,765,924,248,467,716,150)

  • Giới hạn Tick trên: 300200 (giá: 60,863,087,478,126,617,965,993,239)

  • Độ rộng khoảng giá: chỉ 1.00496621%

3. Tiếp theo là cốt lõi của cuộc tấn công này, kẻ tấn công tuyên bố muốn thêm thanh khoản khổng lồ 10,365,647,984,364,446,732,462,244,378,333,008 đơn vị, nhưng do có lỗ hổng, hệ thống chỉ thu nhận được 1 token A.

Chúng ta hãy phân tích tại sao kẻ tấn công có thể đổi 1 Token thành thanh khoản khổng lồ. Nguyên nhân cốt lõi nằm ở việc hàm get_delta_a có lỗi vượt qua kiểm tra tràn trong checked_shlw. Kẻ tấn công đã tận dụng điều này, khiến hệ thống xảy ra sai lệch nghiêm trọng khi tính toán lượng haSUI thực tế cần thêm. Do tràn không được phát hiện, hệ thống đã đánh giá sai số lượng haSUI cần thiết, dẫn đến kẻ tấn công chỉ cần một số lượng rất ít Token đã có thể đổi lấy nhiều tài sản thanh khoản.

Khi hệ thống tính toán thêm lượng thanh khoản lớn như vậy cần bao nhiêu haSUI:

Điều quan trọng ở đây là việc triển khai hàm checked_shlw có một khuyết điểm nghiêm trọng. Thực tế, bất kỳ giá trị nào nhỏ hơn 0xffffffffffffffff << 192 đều sẽ vượt qua kiểm tra tràn. Tuy nhiên, khi những giá trị này được dịch trái 64 bit, kết quả sẽ vượt qua phạm vi biểu diễn của u256, lúc này dữ liệu cao bị cắt đứt, dẫn đến kết quả nhận được thấp hơn nhiều so với giá trị lý thuyết. Do đó, hệ thống sẽ đánh giá thấp số lượng haSUI cần thiết trong các phép tính tiếp theo.

  • Mã lỗi: 0xffffffffffffffff << 192= Giá trị rất lớn (khoảng 2^256-2^192)

  • Hầu như tất cả các đầu vào đều nhỏ hơn mã này, vượt qua kiểm tra tràn

  • Vấn đề thực sự: khi n >= 2^192, n << 64 sẽ vượt ra ngoài phạm vi u256 và bị cắt đứt

Giá trị trung gian do kẻ tấn công tạo ra liquidity * sqrt_price_diff = 6277101735386680763835789423207666908085499738337898853712:

  • Nhỏ hơn mã lỗi, vượt qua kiểm tra tràn

  • Nhưng sau khi dịch trái 64 bit sẽ vượt quá giá trị tối đa u256, dẫn đến phần vượt quá bị cắt đứt

  • Dẫn đến kết quả tính toán cuối cùng nhỏ hơn khoảng 1, nhưng do làm tròn lên, thương số tính ra bằng 1

4. Cuối cùng, kẻ tấn công rút thanh khoản, thu về lợi nhuận token khổng lồ:

  • Lần rút đầu tiên: nhận được 10,024,321.28 haSUI

  • Lần rút thứ hai: nhận được 1 haSUI

  • Lần rút thứ ba: nhận được 10,024,321.28 haSUI

5. Kẻ tấn công hoàn trả khoản vay chớp nhoáng, thu về khoảng 10,024,321.28 haSUI và 5,765,124.79 SUI, cuộc tấn công hoàn thành.

Tình hình sửa chữa của dự án

Sau khi xảy ra tấn công, Cetus đã phát hành bản vá sửa chữa. Mã sửa chữa cụ thể có thể tham khảo tại: https://github.com/CetusProtocol/integer-mate/pull/7/files#diff-c04eb6ebebbabb80342cd953bc63925e1c1cdc7ae1fb572f4aad240288a69409.

Hàm checked_shlw đã được sửa như sau:

Hướng dẫn sửa chữa:

  • Sửa mã lỗi 0xffffffffffffffff << 192 thành ngưỡng đúng 1 << 192

  • Sửa điều kiện từ n > mask thành n >= mask

  • Đảm bảo có thể phát hiện và trả về cờ tràn khi việc dịch trái 64 bit có thể gây ra tràn

Phân tích MistTrack

Theo phân tích, kẻ tấn công 0xe28b50cef1d633ea43d3296a3f6b67ff0312a5f1a99f0af753c85b8b5de8ff06 đã thu lợi khoảng 230 triệu USD, bao gồm nhiều tài sản như SUI, vSUI, USDC...

Chúng tôi phát hiện kẻ tấn công đã chuẩn bị Gas Fee từ hai ngày trước, sau đó thực hiện một lần thử nghiệm trước khi tấn công nhưng đã thất bại:

Sau khi thu lợi, kẻ tấn công đã chuyển một phần vốn như

USDC, SOL, suiETH qua cầu nối liên chuỗi như Sui Bridge, Circle, Wormhole, Mayan đến địa chỉ EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Trong đó, 5.2341 WBNB đã chuyển chuỗi đến địa chỉ BSC 0x89012a55cd6b88e407c9d4ae9b3425f55924919b:

Sau đó, kẻ tấn công đã chuyển giá trị

10 triệu USD tài sản được gửi vào Suilend:

Kẻ tấn công cũng đã chuyển 24,022,896 SUI vào địa chỉ mới 0xcd8962dad278d8b50fa0f9eb0186bfa4cbdecc6d59377214, hiện chưa chuyển ra:

May mắn thay, theo Cetus, dưới sự hợp tác của quỹ SUI và các thành viên hệ sinh thái khác, hiện đã thành công trong việc đóng băng 162 triệu USD số tiền bị đánh cắp trên SUI.

(https://x.com/CetusProtocol/status/1925567348586815622)

Tiếp theo, chúng tôi sử dụng công cụ phân tích chống rửa tiền và theo dõi trên chuỗi MistTrack để phân tích địa chỉ nhận tiền liên chuỗi trên EVM 0x89012a55cd6b88e407c9d4ae9b3425f55924919b.

Địa chỉ này đã nhận 5.2319 BNB trên BSC, chưa chuyển ra:

Địa chỉ này đã nhận 3,000 USDT, 40,880,000 USDC, 1,771 SOL và 8,130.4 ETH trên Ethereum.

Trong đó, USDT, USDC và SOL đã được đổi thành ETH thông qua CoW Swap, ParaSwap...

Sau đó, địa chỉ này đã chuyển 20,000 ETH vào địa chỉ 0x0251536bfcf144b88e1afa8fe60184ffdb4caf16, chưa chuyển ra:

Hiện tại số dư của địa chỉ này trên Ethereum là 3,244 ETH:

MistTrack đã thêm các địa chỉ liên quan trên vào danh sách địa chỉ độc hại, đồng thời chúng tôi sẽ tiếp tục theo dõi số dư địa chỉ.

Tóm tắt

Cuộc tấn công này cho thấy sức mạnh của lỗi tràn số học. Kẻ tấn công đã chọn các tham số cụ thể thông qua tính toán chính xác, khai thác lỗi trong hàm checked_shlw, thu được thanh khoản trị giá hàng tỷ chỉ với chi phí của 1 token. Đây là một cuộc tấn công toán học cực kỳ tinh vi, đội ngũ bảo mật SlowMist khuyến nghị các nhà phát triển kiểm tra nghiêm ngặt tất cả các điều kiện biên của các hàm toán học trong việc phát triển hợp đồng thông minh.