Phân tích cuộc tấn công tài chính Sonne

Trung cấpJun 11, 2024
Bản chất của cuộc tấn công này nằm ở việc tạo ra thị trường (soToken), nơi kẻ tấn công thực hiện hoạt động đang đúc tài sản thế chấp đầu tiên với một lượng nhỏ mã thông báo cơ bản, dẫn đến giá trị "totalSupply" rất nhỏ cho soToken.
Phân tích cuộc tấn công tài chính Sonne

Vào ngày 15/5/2024, Sonne Finance đã bị tấn công vào chuỗi Optimism, dẫn đến thiệt hại lên tới 20 triệu USD. Sau cuộc tấn công, người dùng Twitter @tonyke_bot đã tweet rằng họ đã bảo vệ 6,5 triệu đô la còn lại trong nhóm tài sản thế chấp của Sonne Finance (còn được gọi là thị trường, tương tự như cToken trong Compound) với khoảng 100 đô la.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Khi phát hiện ra cuộc tấn công, nhóm Sonne Finance đã nhanh chóng tạm dừng tất cả các thị trường trên Optimism và tuyên bố rằng các thị trường trên Base đã an toàn.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Mô tả ngắn gọn về cuộc tấn công

Sonne Finance là một giao thức cho vay phi tập trung phân nhánh Compound V2 về Optimism, cung cấp cho các cá nhân, tổ chức và giao thức quyền truy cập vào các dịch vụ tài chính. Sonne Finance giao thức tổng hợp tài sản mã thông báo của người dùng để tạo thành một nhóm thanh khoản cho vay, cung cấp cho người dùng một doanh nghiệp cho vay giống như ngân hàng. Giống như Compound, giao thức người tham gia có thể thế chấp token của họ vào nhóm thanh khoản cho vay của Sonne Finance và lấy chứng chỉ soToken (giống như cToken). SoToken là một chứng chỉ tài sản chịu lãi, sẽ tạo ra một khoản thu nhập nhất định khi khối tiến triển và cũng sẽ nhận được các ưu đãi mã thông báo ONE. Người tham gia cũng có thể mượn các token khác từ nhóm tài sản cho vay Sonne với soToken trong tay. Ví dụ: người tham gia có thể thế chấp một lượng USDC nhất định để có được chứng chỉ soUSDC, sau đó cho vay WETH để lưu thông thêm. Cho vay thế chấp trong giao thức Sonne Finance có thể là một mối quan hệ tài sản nhiều-nhiều. Trong quá trình cho vay thế chấp, giao thức sẽ tự động tính toán yếu tố sức khỏe (Health Factor) của địa chỉ người tham gia. Khi hệ số sức khỏe thấp hơn 1, việc thế chấp địa chỉ Sản phẩm sẽ hỗ trợ thanh lý và người thanh lý cũng có thể nhận được một số phần thưởng thanh lý nhất định.

Mối quan hệ giữa số lượng token cơ bản được gửi bởi người dùng và soTokens được đúc chủ yếu liên quan đến một biến gọi là exchangeRate. Biến này có thể được sử dụng đại khái để cho biết mỗi soToken có giá trị bao nhiêu token cơ bản. Công thức tính toán cho tỷ giá hối đoái như sau:

Trong công thức trên, totalCash đề cập đến số lượng token cơ bản do soToken nắm giữ, totalBorrows đề cập đến số lượng token cơ bản được cho vay trong một thị trường nhất định, totalReserve đề cập đến tổng số tiền dự trữ (bao gồm cả tiền lãi mà người vay phải trả), totalSupply Đề cập đến số lượng soToken được đúc.

Khi đổi, người dùng có thể chỉ định số lượng token cơ bản mà họ muốn đổi, redeemAmount, để tính toán số lượng soTokens cần hủy, redeemTokens. Phương pháp tính toán đại khái là "redeemTokens = redeemAmount / exchangeRat". Lưu ý rằng không có mất độ chính xác ở đây. đối phó.

Bản chất của cuộc tấn công này là khi thị trường (soToken) được tạo ra, kẻ tấn công đã thực hiện hoạt động đúc thế chấp đầu tiên và đúc rất ít soTokens với một lượng nhỏ token cơ bản, dẫn đến giá trị "totalSupply" của soToken quá nhỏ. Kẻ tấn công sau đó khai thác lỗ hổng mất chính xác của hợp đồng Solidity, và sau đó gửi mã thông báo cơ bản trực tiếp đến hợp đồng soToken (soToken sẽ không được đúc, có nghĩa là "totalSupply" vẫn không thay đổi và "totalCash" trở nên lớn hơn) thay vì phương pháp đặt cọc + đúc để nạp tiền mã thông báo cơ bản. Hoạt động như vậy làm cho biến "totalCash" trong hợp đồng trở nên lớn hơn, nhưng "totalSupply" vẫn không thay đổi, khiến tỷ giá hối đoái trở nên lớn hơn. Cuối cùng, khi kẻ tấn công đổi mã thông báo cơ bản, soToken cần bị hủy sẽ ít hơn soToken được đúc trong quá trình thế chấp. Kẻ tấn công sử dụng soToken kiếm được để cho vay mã thông báo cơ bản WETH và USDC cho các soTokens khác (chẳng hạn như soWETH, soUSDC) và cuối cùng thu được Lợi nhuận cao tới 20 triệu đô la Mỹ.

Các địa chỉ chính liên quan đến cuộc tấn công

Chuẩn

bị tấn công Giao dịch:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Tấn công các giao dịch có lợi nhuận:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Tấn công các địa chỉ liên quan đến EOA:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Địa chỉ liên quan đến Attacker (hợp đồng):

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

token cơ bản (VELO Token V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Hợp đồng lỗ hổng (soVELO, tương tự như cToken của Compound):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Giao dịch cứu người dùng trên X:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Phân tích quá trình tấn công<

h3 id = "h3-recap">Tóm tắt

Nhóm dự án Sonne Finance gần đây đã thông qua đề xuất thêm thị trường VELO vào Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) và sắp xếp năm giao dịch thông qua ví đa chữ ký sẽ được thực hiện hai ngày sau đó ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), năm giao dịch này được sử dụng để tạo ra thị trường VELO (hợp đồng soVELO) và thiết lập một số cấu hình chính của thị trường, chẳng hạn như thiết lập mô hình lãi suất, đặt giá và thiết lập các yếu tố thế chấp, v.v. Sau khi thị trường VELO được tạo, người dùng có thể nạp tiền VELO mã thông báo để đúc mã thông báo soVELO, lần lượt có thể được sử dụng để vay các soToken khác.

chuẩn bị tấn công

Giai đoạn chuẩn bị tấn công chủ yếu là để kẻ tấn công tạo ra một thị trường VELO (hợp đồng soVELO) dựa trên thông tin trong đề xuất dự án Sonne Finance sau khi thời gian khóa hai ngày của đề xuất đã hết hạn, thiết lập cấu hình khóa và đúc VELO mã thông báo vào hợp đồng soVELO bằng cách thế chấp chúng. mã thông báo soVELO và cũng gửi các mã thông báo VELO mà nó nắm giữ trực tiếp vào hợp đồng soVELO để tăng tỷ giá hối đoái và chuẩn bị để kiếm lợi nhuận từ các cuộc tấn công tiếp theo.

Các bước cụ thể như sau:

  1. Sau khi thời gian khóa hai ngày kết thúc, kẻ tấn công trước tiên đóng gói các hoạt động của bốn giao dịch đầu tiên được sắp xếp trong đề xuất thành một giao dịch (0x45c0cc giao dịch), được sử dụng để tạo thị trường VELO (hợp đồng soVELO) và đặt cấu hình khóa. Khi VELO trường được khởi tạo, tỷ giá hối đoái được đặt thành "200.000.000.000.000.000.000.000.000.000".

  2. Kẻ tấn công gọi chức năng "đúc" của hợp đồng soVELO để nạp tiền VELO mã thông báo và đúc mã thông báo soVELO. Kẻ tấn công chỉ định "mintAmount" là "400.000.001" (số lượng mã thông báo VELO). Như có thể thấy từ hàm "exchangeRateStoredInternal", vì "_totalSuppl" của mã thông báo soVELO là 0 tại thời điểm này, exchangeRate là giá trị được đặt ở bước 1. Theo công thức " mintTokens = actualMintAmount / exchangeRate ", số lượng mã thông báo soVELO được tính toán sẽ được đúc tại thời điểm này là 2. Trên short, trong bước này, kẻ tấn công gửi VELO mã thông báo có giá trị "400.000.001" vào hợp đồng soVELO và kẻ tấn công nhận được mã thông báo soVELO với giá trị là 2.

soVELO.đúc:

  1. Kẻ tấn công đã gửi VELO mã thông báo với giá trị "2.552.964.259.704.265.837.526" đến hợp đồng soVELO bằng cách gửi trực tiếp mã thông báo VELO đến hợp đồng soVELO. Tại thời điểm này, số lượng mã thông báo VELO được nắm giữ bởi hợp đồng soVELO tăng lên, nhưng vì không có mã thông báo soVELO mới nên coin được đúc, vì vậy totalSupply vẫn không thay đổi, có nghĩa là tỷ giá hối đoái được tính theo công thức tính tỷ giá hối đoái sẽ trở nên lớn hơn tại thời điểm này.

  2. Kẻ tấn công đã chuyển các mã thông báo soVELO được giữ nhiều lần và cuối cùng chuyển chúng sang một 0xae4a tấn công EOA khác.

Tấn công vì lợi nhuận

Giai đoạn lợi nhuận tấn công chủ yếu liên quan đến việc kẻ tấn công thực hiện giao dịch thứ năm của đề xuất và cho vay mã thông báo VELO trực tiếp vào hợp đồng soVELO thông qua các khoản vay flash để tăng thêm tỷ giá hối đoái. Sau đó, kẻ tấn công sử dụng mã thông báo soVELO với giá trị 2 trong tay để vay các mã thông báo cơ bản như WETH và USDC từ các hợp đồng soToken khác (như soWETH, soUSDC, v.v.) và các phần này trở thành lợi nhuận của kẻ tấn công. Sau đó, kẻ tấn công đã chuộc lại mã thông báo cơ bản của mình trong hợp đồng soVELO. Do sự gia tăng tỷ giá hối đoái và mất độ chính xác trong việc tính toán các mã thông báo soVELO cần phải hủy để đổi, kẻ tấn công cuối cùng chỉ sử dụng mã thông báo soVELO với giá trị là 1. Hầu như tất cả các mã thông báo VELO đã gửi trước đó đã được đổi, có thể hiểu là kẻ tấn công sử dụng mã thông báo soVELO bổ sung có giá trị là 1 để kiếm các mã thông báo cơ bản như WETH và USDC bằng cách vay từ các soToken khác. Kẻ tấn công đã sử dụng cùng một kỹ thuật để lặp lại cuộc tấn công nhiều lần và cuối cùng đã kiếm được lợi nhuận khổng lồ.

Các bước cụ thể như sau:

  1. Kẻ tấn công thực hiện giao dịch thứ năm trong đề xuất và đặt hệ số cho vay được chỉ định trong đề xuất.

  2. Kẻ tấn công cho vay flash VELO token với giá trị "35,469,150,965,253,049,864,450,449" từ nhóm VolatileV2 AMM - USDC/VELO, kích hoạt chức năng hook của kẻ tấn công. Trong chức năng hook, kẻ tấn công tiếp tục thực hiện thao tác tấn công.

  3. Kẻ tấn công gửi VELO mã thông báo mà anh ta nắm giữ vào hợp đồng soVELO để tăng thêm tỷ giá hối đoái. Hiện tại, có tổng cộng VELO mã thông báo với giá trị "35.471.703.929.512.754.530.287.976" trong hợp đồng soVELO (tổng VELO mã thông báo được chuyển trong ba lần bởi kẻ tấn công).

  4. Kẻ tấn công tạo ra một hợp đồng mới 0xa16388a6210545b27f669d5189648c1722300b8b. Trong nhà xây dựng, anh ta chuyển 2 mã thông báo soVELO mà anh ta nắm giữ cho 0xa163 hợp đồng mới được tạo (sau đây gọi là kẻ tấn công 0xa163).

  5. Kẻ tấn công 0xa163 sử dụng mã thông báo soVELO mà anh ta nắm giữ để vay WETH với giá trị "265,842,857,910,985,546,929" từ soWETH.

  6. Kẻ tấn công 0xa163 gọi chức năng "redeemUnderlying" của soVELO, chỉ định giá trị của các token VELO đã đổi là "35.471.603.929.512.754.530.287.976" (gần bằng số lượng VELO token mà kẻ tấn công đã chuyển hoặc thế chấp trước đó vào hợp đồng soVELO). Tại thời điểm này, cần phải Công thức "redeemTokens = redeemAmountIn / exchangeRate" được sử dụng để tính toán số lượng mã thông báo soVELO cần hủy để đổi.

Như có thể thấy từ hàm "exchangeRateStoredInternal", vì _totalSupply là 2 thay vì 0, giá trị của exchangeRate cần được tính toán. Theo công thức "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", tỷ giá hối đoái hiện tại là "17,735,851,964,756,377,265,143,988,000,0 00,000,000,000,000,000 ", giá trị này lớn hơn nhiều so với tỷ giá hối đoái ban đầu được đặt "200.000.000.000.000.000.000.000.000".

Giá trị của " redeemTokens " được tính toán dựa trên tỷ giá hối đoái mới là " 1.99 ". Do đặc điểm làm tròn đi xuống của Solidity, giá trị của " redeemTokens " kết thúc là 1. Điều này có nghĩa là kẻ tấn công 0xa163 sử dụng mã thông báo soVELO với giá trị 1 để đổi gần như tất cả các mã thông báo VELO đã gửi trước đó. Đồng thời, kẻ tấn công cũng 0xa163 kiếm được WETH với giá trị "265.842.857.910.985.546.929" vay mượn từ soWETH.

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredNội bộ:

  1. Kẻ tấn công 0xa163 chuyển tất cả WETH đã vay và đổi mã thông báo VELO cho kẻ tấn công cấp trên, sau đó tự hủy.

  2. Kẻ tấn công gọi chức năng "liquidateBorrow" của soWETH để thanh lý một số tài sản đã vay từ hợp đồng mới được tạo 0xa163 lệnh lấy lại mã thông báo soVELO bị khóa với giá trị là 1. Hiện tại, kẻ tấn công chỉ nắm giữ token soVELO với giá trị là 1.

  3. Kẻ tấn công gọi chức năng "đúc" của soVELO và một lần nữa thế chấp và đúc mã thông báo soVELO với mục đích thu thập đủ mã thông báo soVELO với giá trị 2, sau đó thực hiện các bước 3-8 ở trên một lần nữa để kiếm lợi nhuận từ các mã thông báo khác.

  4. Kẻ tấn công thực hiện thao tác ở bước 9 nhiều lần, hoàn trả khoản vay flash và rời khỏi thị trường với lợi nhuận.

Cách 100 đô la đòn bẩy 6,5 triệu

đô la Sau cuộc tấn công, người dùng @tonyke_bot trên X đã đúc 0,00000011 soVELO bằng cách đặt cọc 1144 mã thông báo VELO vào hợp đồng soVELO trong 0x0a284cd giao dịch. Lý do tại sao hoạt động này có thể ngăn chặn kẻ tấn công khỏi các cuộc tấn công tiếp theo là vì giao dịch này thay đổi quy mô của totalSupply trong soVELO và số lượng mã thông báo VELO totalCash được nắm giữ và tác động của sự tăng trưởng của totalSupply đối với việc tính toán tỷ giá hối đoái lớn hơn tác động của sự tăng trưởng của totalCash. Do đó, tỷ giá hối đoái trở nên nhỏ hơn, khiến kẻ tấn công không người theo lệnh long có thể sử dụng việc mất độ chính xác để kiếm soVELO khi tiến hành tấn công, khiến cuộc tấn công không người theo lệnh long khả thi.

Theo dõi tiền

Kẻ tấn công đã chuyển tiền ngay sau khi lấy số tiền thu được bất hợp pháp. Hầu hết các khoản tiền đã được chuyển đến bốn địa chỉ sau. Một số đã thay đổi địa chỉ để tiếp tục cuộc tấn công, và một số là rửa tiền:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Kẻ tấn công đã chuyển 198 WETH đến địa chỉ này và sau đó địa chỉ sử dụng cùng một phương thức tấn công để thu lợi bất hợp pháp trong các giao dịch sau:

Sau vụ tấn công, địa chỉ này đã chuyển số lợi bất hợp pháp nêu trên cho 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Kẻ tấn công đã chuyển 724277 USDC và 2353 VELO đến địa chỉ này và đổi USDC lấy Ether. Sau đó, một số tiền ngay lập tức được chuyển đến chuỗi cross cầu Stargate. Hầu hết các quỹ bất hợp pháp vẫn còn ở địa chỉ này:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Kẻ tấn công đã chuyển 33 WETH đến địa chỉ này và sử dụng dây chuyền vỏ để cố gắng rửa tiền. Liên kết rửa tiền như sau:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093C2B4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Kẻ tấn công đã chuyển 563 WETH đến địa chỉ này và sau đó đến 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, không có hành động nào khác cho đến nay.

Phương thức rửa tiền của kẻ tấn công lần này tương đối chuyên nghiệp, và các phương pháp cho thấy xu hướng đa dạng. Do đó, đối với những người tham gia Web3 chúng tôi, chúng tôi phải tiếp tục cải thiện khả năng chống rửa tiền về mặt bảo mật và cải thiện tính bảo mật của các dự án Defi thông qua KYT, AML và các sản phẩm bảo mật giao dịch blockchain liên quan khác.

tư vấn bảo mật

1 、 Luôn cập nhật kiểm toán và thử nghiệm hợp đồng. Tiến hành kiểm toán toàn diện trước khi triển khai hợp đồng thông minh, đặc biệt chú ý đến tất cả các phần liên quan đến tính toán tài chính. Đầu tiên, sử dụng kiểm tra tự động và tận dụng các bản cập nhật thời gian thực của các thư viện lỗ hổng để tiến hành quét bảo mật hợp đồng hiệu quả (ngành công nghiệp cũng đã dần dần mở nguồn một số công cụ kiểm toán bảo mật trưởng thành, bao gồm ZAN AI SCAN), đồng thời kết hợp kiểm tra thủ công để khắc phục sự cố đòi hỏi bí quyết chuyên sâu của ngành.

2 、 Việc mất độ chính xác cần phải được thực hiện nghiêm túc. Các vấn đề bảo mật do mất độ chính xác là vô tận, đặc biệt là trong các dự án Defi, nơi mất độ chính xác thường dẫn đến tổn thất tài chính nghiêm trọng. Các bên dự án và kiểm toán viên bảo mật nên xem xét cẩn thận các mã bị mất độ chính xác trong dự án và tiến hành kiểm tra để tránh lỗ hổng này càng nhiều càng tốt.

  1. Chúng tôi khuyến nghị rằng việc tạo ra một thị trường tương tự như cToken trong Compound và hoạt động đúc thế chấp đầu tiên nên được thực hiện bởi những người dùng đặc quyền để tránh bị thao túng bởi những kẻ tấn công và do đó thao túng tỷ lệ sàn giao dịch

    .
  2. Khi có các biến chính trong hợp đồng phụ thuộc vào giá trị của " this.balance " hoặc " token.balanceOf(), bạn cần xem xét cẩn thận các điều kiện để thay đổi biến khóa, chẳng hạn như liệu nó có được phép chuyển trực tiếp tiền tệ bản địa hoặc token vào hợp đồng hay không. phương thức để thay đổi giá trị của biến, hoặc giá trị của biến chỉ có thể được thay đổi bằng cách gọi một hàm cụ thể.

Tuyên bố từ chối trách nhiệm:

  1. Bài viết này được in lại từ [ZAN]. Tất cả bản quyền thuộc về tác giả gốc [ZAN]. Nếu có ý kiến phản đối bản in lại này, vui lòng liên hệ với nhóm Gate Learn và họ sẽ xử lý kịp thời.
  2. Tuyên bố từ chối trách nhiệm: Các quan điểm và ý kiến được trình bày trong bài viết này chỉ là của tác giả và không cấu thành bất kỳ lời khuyên đầu tư nào.
  3. Bản dịch bài viết sang các ngôn ngữ khác được thực hiện bởi nhóm Gate Learn. Trừ khi được đề cập, việc sao chép, phân phối hoặc đạo văn các bài báo đã dịch đều bị cấm.

Mô tả ngắn gọn về tấn công

Các địa chỉ chính liên quan đến vụ tấn công

Phân tích quá trình tấn công

100 đô la đòn bẩy 6,5 triệu đô la như thế nào

Theo dõi tiền

Tư vấn bảo mật

Phân tích cuộc tấn công tài chính Sonne

Trung cấpJun 11, 2024
Bản chất của cuộc tấn công này nằm ở việc tạo ra thị trường (soToken), nơi kẻ tấn công thực hiện hoạt động đang đúc tài sản thế chấp đầu tiên với một lượng nhỏ mã thông báo cơ bản, dẫn đến giá trị "totalSupply" rất nhỏ cho soToken.
Phân tích cuộc tấn công tài chính Sonne

Mô tả ngắn gọn về tấn công

Các địa chỉ chính liên quan đến vụ tấn công

Phân tích quá trình tấn công

100 đô la đòn bẩy 6,5 triệu đô la như thế nào

Theo dõi tiền

Tư vấn bảo mật

Vào ngày 15/5/2024, Sonne Finance đã bị tấn công vào chuỗi Optimism, dẫn đến thiệt hại lên tới 20 triệu USD. Sau cuộc tấn công, người dùng Twitter @tonyke_bot đã tweet rằng họ đã bảo vệ 6,5 triệu đô la còn lại trong nhóm tài sản thế chấp của Sonne Finance (còn được gọi là thị trường, tương tự như cToken trong Compound) với khoảng 100 đô la.


(https://twitter.com/tonyke_bot/status/1790547461611860182)

Khi phát hiện ra cuộc tấn công, nhóm Sonne Finance đã nhanh chóng tạm dừng tất cả các thị trường trên Optimism và tuyên bố rằng các thị trường trên Base đã an toàn.

(https://twitter.com/SonneFinance/status/1790535383005966554)

Mô tả ngắn gọn về cuộc tấn công

Sonne Finance là một giao thức cho vay phi tập trung phân nhánh Compound V2 về Optimism, cung cấp cho các cá nhân, tổ chức và giao thức quyền truy cập vào các dịch vụ tài chính. Sonne Finance giao thức tổng hợp tài sản mã thông báo của người dùng để tạo thành một nhóm thanh khoản cho vay, cung cấp cho người dùng một doanh nghiệp cho vay giống như ngân hàng. Giống như Compound, giao thức người tham gia có thể thế chấp token của họ vào nhóm thanh khoản cho vay của Sonne Finance và lấy chứng chỉ soToken (giống như cToken). SoToken là một chứng chỉ tài sản chịu lãi, sẽ tạo ra một khoản thu nhập nhất định khi khối tiến triển và cũng sẽ nhận được các ưu đãi mã thông báo ONE. Người tham gia cũng có thể mượn các token khác từ nhóm tài sản cho vay Sonne với soToken trong tay. Ví dụ: người tham gia có thể thế chấp một lượng USDC nhất định để có được chứng chỉ soUSDC, sau đó cho vay WETH để lưu thông thêm. Cho vay thế chấp trong giao thức Sonne Finance có thể là một mối quan hệ tài sản nhiều-nhiều. Trong quá trình cho vay thế chấp, giao thức sẽ tự động tính toán yếu tố sức khỏe (Health Factor) của địa chỉ người tham gia. Khi hệ số sức khỏe thấp hơn 1, việc thế chấp địa chỉ Sản phẩm sẽ hỗ trợ thanh lý và người thanh lý cũng có thể nhận được một số phần thưởng thanh lý nhất định.

Mối quan hệ giữa số lượng token cơ bản được gửi bởi người dùng và soTokens được đúc chủ yếu liên quan đến một biến gọi là exchangeRate. Biến này có thể được sử dụng đại khái để cho biết mỗi soToken có giá trị bao nhiêu token cơ bản. Công thức tính toán cho tỷ giá hối đoái như sau:

Trong công thức trên, totalCash đề cập đến số lượng token cơ bản do soToken nắm giữ, totalBorrows đề cập đến số lượng token cơ bản được cho vay trong một thị trường nhất định, totalReserve đề cập đến tổng số tiền dự trữ (bao gồm cả tiền lãi mà người vay phải trả), totalSupply Đề cập đến số lượng soToken được đúc.

Khi đổi, người dùng có thể chỉ định số lượng token cơ bản mà họ muốn đổi, redeemAmount, để tính toán số lượng soTokens cần hủy, redeemTokens. Phương pháp tính toán đại khái là "redeemTokens = redeemAmount / exchangeRat". Lưu ý rằng không có mất độ chính xác ở đây. đối phó.

Bản chất của cuộc tấn công này là khi thị trường (soToken) được tạo ra, kẻ tấn công đã thực hiện hoạt động đúc thế chấp đầu tiên và đúc rất ít soTokens với một lượng nhỏ token cơ bản, dẫn đến giá trị "totalSupply" của soToken quá nhỏ. Kẻ tấn công sau đó khai thác lỗ hổng mất chính xác của hợp đồng Solidity, và sau đó gửi mã thông báo cơ bản trực tiếp đến hợp đồng soToken (soToken sẽ không được đúc, có nghĩa là "totalSupply" vẫn không thay đổi và "totalCash" trở nên lớn hơn) thay vì phương pháp đặt cọc + đúc để nạp tiền mã thông báo cơ bản. Hoạt động như vậy làm cho biến "totalCash" trong hợp đồng trở nên lớn hơn, nhưng "totalSupply" vẫn không thay đổi, khiến tỷ giá hối đoái trở nên lớn hơn. Cuối cùng, khi kẻ tấn công đổi mã thông báo cơ bản, soToken cần bị hủy sẽ ít hơn soToken được đúc trong quá trình thế chấp. Kẻ tấn công sử dụng soToken kiếm được để cho vay mã thông báo cơ bản WETH và USDC cho các soTokens khác (chẳng hạn như soWETH, soUSDC) và cuối cùng thu được Lợi nhuận cao tới 20 triệu đô la Mỹ.

Các địa chỉ chính liên quan đến cuộc tấn công

Chuẩn

bị tấn công Giao dịch:

https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96

Tấn công các giao dịch có lợi nhuận:

https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0

Tấn công các địa chỉ liên quan đến EOA:

0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43

Địa chỉ liên quan đến Attacker (hợp đồng):

0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8

0x02fa2625825917e9b1f8346a465de1bbc150c5b9

token cơ bản (VELO Token V2):

0x9560e827af36c94d2ac33a39bce1fe78631088db

Hợp đồng lỗ hổng (soVELO, tương tự như cToken của Compound):

0xe3b81318b1b6776f0877c3770afddff97b9f5fe5

@tonyke_bot Giao dịch cứu người dùng trên X:

https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2

Phân tích quá trình tấn công<

h3 id = "h3-recap">Tóm tắt

Nhóm dự án Sonne Finance gần đây đã thông qua đề xuất thêm thị trường VELO vào Sonne Finance (https://twitter.com/SonneFinance/status/1786871066075206044) và sắp xếp năm giao dịch thông qua ví đa chữ ký sẽ được thực hiện hai ngày sau đó ( https://optimistic.etherscan.io/tx/0x18ebeb958b50579ce76528ed812025949dfcff8c2673eb0c8bc78b12ba6377b7), năm giao dịch này được sử dụng để tạo ra thị trường VELO (hợp đồng soVELO) và thiết lập một số cấu hình chính của thị trường, chẳng hạn như thiết lập mô hình lãi suất, đặt giá và thiết lập các yếu tố thế chấp, v.v. Sau khi thị trường VELO được tạo, người dùng có thể nạp tiền VELO mã thông báo để đúc mã thông báo soVELO, lần lượt có thể được sử dụng để vay các soToken khác.

chuẩn bị tấn công

Giai đoạn chuẩn bị tấn công chủ yếu là để kẻ tấn công tạo ra một thị trường VELO (hợp đồng soVELO) dựa trên thông tin trong đề xuất dự án Sonne Finance sau khi thời gian khóa hai ngày của đề xuất đã hết hạn, thiết lập cấu hình khóa và đúc VELO mã thông báo vào hợp đồng soVELO bằng cách thế chấp chúng. mã thông báo soVELO và cũng gửi các mã thông báo VELO mà nó nắm giữ trực tiếp vào hợp đồng soVELO để tăng tỷ giá hối đoái và chuẩn bị để kiếm lợi nhuận từ các cuộc tấn công tiếp theo.

Các bước cụ thể như sau:

  1. Sau khi thời gian khóa hai ngày kết thúc, kẻ tấn công trước tiên đóng gói các hoạt động của bốn giao dịch đầu tiên được sắp xếp trong đề xuất thành một giao dịch (0x45c0cc giao dịch), được sử dụng để tạo thị trường VELO (hợp đồng soVELO) và đặt cấu hình khóa. Khi VELO trường được khởi tạo, tỷ giá hối đoái được đặt thành "200.000.000.000.000.000.000.000.000.000".

  2. Kẻ tấn công gọi chức năng "đúc" của hợp đồng soVELO để nạp tiền VELO mã thông báo và đúc mã thông báo soVELO. Kẻ tấn công chỉ định "mintAmount" là "400.000.001" (số lượng mã thông báo VELO). Như có thể thấy từ hàm "exchangeRateStoredInternal", vì "_totalSuppl" của mã thông báo soVELO là 0 tại thời điểm này, exchangeRate là giá trị được đặt ở bước 1. Theo công thức " mintTokens = actualMintAmount / exchangeRate ", số lượng mã thông báo soVELO được tính toán sẽ được đúc tại thời điểm này là 2. Trên short, trong bước này, kẻ tấn công gửi VELO mã thông báo có giá trị "400.000.001" vào hợp đồng soVELO và kẻ tấn công nhận được mã thông báo soVELO với giá trị là 2.

soVELO.đúc:

  1. Kẻ tấn công đã gửi VELO mã thông báo với giá trị "2.552.964.259.704.265.837.526" đến hợp đồng soVELO bằng cách gửi trực tiếp mã thông báo VELO đến hợp đồng soVELO. Tại thời điểm này, số lượng mã thông báo VELO được nắm giữ bởi hợp đồng soVELO tăng lên, nhưng vì không có mã thông báo soVELO mới nên coin được đúc, vì vậy totalSupply vẫn không thay đổi, có nghĩa là tỷ giá hối đoái được tính theo công thức tính tỷ giá hối đoái sẽ trở nên lớn hơn tại thời điểm này.

  2. Kẻ tấn công đã chuyển các mã thông báo soVELO được giữ nhiều lần và cuối cùng chuyển chúng sang một 0xae4a tấn công EOA khác.

Tấn công vì lợi nhuận

Giai đoạn lợi nhuận tấn công chủ yếu liên quan đến việc kẻ tấn công thực hiện giao dịch thứ năm của đề xuất và cho vay mã thông báo VELO trực tiếp vào hợp đồng soVELO thông qua các khoản vay flash để tăng thêm tỷ giá hối đoái. Sau đó, kẻ tấn công sử dụng mã thông báo soVELO với giá trị 2 trong tay để vay các mã thông báo cơ bản như WETH và USDC từ các hợp đồng soToken khác (như soWETH, soUSDC, v.v.) và các phần này trở thành lợi nhuận của kẻ tấn công. Sau đó, kẻ tấn công đã chuộc lại mã thông báo cơ bản của mình trong hợp đồng soVELO. Do sự gia tăng tỷ giá hối đoái và mất độ chính xác trong việc tính toán các mã thông báo soVELO cần phải hủy để đổi, kẻ tấn công cuối cùng chỉ sử dụng mã thông báo soVELO với giá trị là 1. Hầu như tất cả các mã thông báo VELO đã gửi trước đó đã được đổi, có thể hiểu là kẻ tấn công sử dụng mã thông báo soVELO bổ sung có giá trị là 1 để kiếm các mã thông báo cơ bản như WETH và USDC bằng cách vay từ các soToken khác. Kẻ tấn công đã sử dụng cùng một kỹ thuật để lặp lại cuộc tấn công nhiều lần và cuối cùng đã kiếm được lợi nhuận khổng lồ.

Các bước cụ thể như sau:

  1. Kẻ tấn công thực hiện giao dịch thứ năm trong đề xuất và đặt hệ số cho vay được chỉ định trong đề xuất.

  2. Kẻ tấn công cho vay flash VELO token với giá trị "35,469,150,965,253,049,864,450,449" từ nhóm VolatileV2 AMM - USDC/VELO, kích hoạt chức năng hook của kẻ tấn công. Trong chức năng hook, kẻ tấn công tiếp tục thực hiện thao tác tấn công.

  3. Kẻ tấn công gửi VELO mã thông báo mà anh ta nắm giữ vào hợp đồng soVELO để tăng thêm tỷ giá hối đoái. Hiện tại, có tổng cộng VELO mã thông báo với giá trị "35.471.703.929.512.754.530.287.976" trong hợp đồng soVELO (tổng VELO mã thông báo được chuyển trong ba lần bởi kẻ tấn công).

  4. Kẻ tấn công tạo ra một hợp đồng mới 0xa16388a6210545b27f669d5189648c1722300b8b. Trong nhà xây dựng, anh ta chuyển 2 mã thông báo soVELO mà anh ta nắm giữ cho 0xa163 hợp đồng mới được tạo (sau đây gọi là kẻ tấn công 0xa163).

  5. Kẻ tấn công 0xa163 sử dụng mã thông báo soVELO mà anh ta nắm giữ để vay WETH với giá trị "265,842,857,910,985,546,929" từ soWETH.

  6. Kẻ tấn công 0xa163 gọi chức năng "redeemUnderlying" của soVELO, chỉ định giá trị của các token VELO đã đổi là "35.471.603.929.512.754.530.287.976" (gần bằng số lượng VELO token mà kẻ tấn công đã chuyển hoặc thế chấp trước đó vào hợp đồng soVELO). Tại thời điểm này, cần phải Công thức "redeemTokens = redeemAmountIn / exchangeRate" được sử dụng để tính toán số lượng mã thông báo soVELO cần hủy để đổi.

Như có thể thấy từ hàm "exchangeRateStoredInternal", vì _totalSupply là 2 thay vì 0, giá trị của exchangeRate cần được tính toán. Theo công thức "exchangeRate = (totalCash + totalBorrows - totalReserves) / totalSupply", tỷ giá hối đoái hiện tại là "17,735,851,964,756,377,265,143,988,000,0 00,000,000,000,000,000 ", giá trị này lớn hơn nhiều so với tỷ giá hối đoái ban đầu được đặt "200.000.000.000.000.000.000.000.000".

Giá trị của " redeemTokens " được tính toán dựa trên tỷ giá hối đoái mới là " 1.99 ". Do đặc điểm làm tròn đi xuống của Solidity, giá trị của " redeemTokens " kết thúc là 1. Điều này có nghĩa là kẻ tấn công 0xa163 sử dụng mã thông báo soVELO với giá trị 1 để đổi gần như tất cả các mã thông báo VELO đã gửi trước đó. Đồng thời, kẻ tấn công cũng 0xa163 kiếm được WETH với giá trị "265.842.857.910.985.546.929" vay mượn từ soWETH.

soVELO.redeemUnderlying:

soVELO.exchangeRateStoredNội bộ:

  1. Kẻ tấn công 0xa163 chuyển tất cả WETH đã vay và đổi mã thông báo VELO cho kẻ tấn công cấp trên, sau đó tự hủy.

  2. Kẻ tấn công gọi chức năng "liquidateBorrow" của soWETH để thanh lý một số tài sản đã vay từ hợp đồng mới được tạo 0xa163 lệnh lấy lại mã thông báo soVELO bị khóa với giá trị là 1. Hiện tại, kẻ tấn công chỉ nắm giữ token soVELO với giá trị là 1.

  3. Kẻ tấn công gọi chức năng "đúc" của soVELO và một lần nữa thế chấp và đúc mã thông báo soVELO với mục đích thu thập đủ mã thông báo soVELO với giá trị 2, sau đó thực hiện các bước 3-8 ở trên một lần nữa để kiếm lợi nhuận từ các mã thông báo khác.

  4. Kẻ tấn công thực hiện thao tác ở bước 9 nhiều lần, hoàn trả khoản vay flash và rời khỏi thị trường với lợi nhuận.

Cách 100 đô la đòn bẩy 6,5 triệu

đô la Sau cuộc tấn công, người dùng @tonyke_bot trên X đã đúc 0,00000011 soVELO bằng cách đặt cọc 1144 mã thông báo VELO vào hợp đồng soVELO trong 0x0a284cd giao dịch. Lý do tại sao hoạt động này có thể ngăn chặn kẻ tấn công khỏi các cuộc tấn công tiếp theo là vì giao dịch này thay đổi quy mô của totalSupply trong soVELO và số lượng mã thông báo VELO totalCash được nắm giữ và tác động của sự tăng trưởng của totalSupply đối với việc tính toán tỷ giá hối đoái lớn hơn tác động của sự tăng trưởng của totalCash. Do đó, tỷ giá hối đoái trở nên nhỏ hơn, khiến kẻ tấn công không người theo lệnh long có thể sử dụng việc mất độ chính xác để kiếm soVELO khi tiến hành tấn công, khiến cuộc tấn công không người theo lệnh long khả thi.

Theo dõi tiền

Kẻ tấn công đã chuyển tiền ngay sau khi lấy số tiền thu được bất hợp pháp. Hầu hết các khoản tiền đã được chuyển đến bốn địa chỉ sau. Một số đã thay đổi địa chỉ để tiếp tục cuộc tấn công, và một số là rửa tiền:

1、0x4ab93fc50b82d4dc457db85888dfdae28d29b98d

Kẻ tấn công đã chuyển 198 WETH đến địa chỉ này và sau đó địa chỉ sử dụng cùng một phương thức tấn công để thu lợi bất hợp pháp trong các giao dịch sau:

Sau vụ tấn công, địa chỉ này đã chuyển số lợi bất hợp pháp nêu trên cho 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb.

2、0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb

Kẻ tấn công đã chuyển 724277 USDC và 2353 VELO đến địa chỉ này và đổi USDC lấy Ether. Sau đó, một số tiền ngay lập tức được chuyển đến chuỗi cross cầu Stargate. Hầu hết các quỹ bất hợp pháp vẫn còn ở địa chỉ này:

3、0xbd18100a168321701955e348f03d0df4f517c13b

Kẻ tấn công đã chuyển 33 WETH đến địa chỉ này và sử dụng dây chuyền vỏ để cố gắng rửa tiền. Liên kết rửa tiền như sau:

0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003 093C2B4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。

4、0x4fac0651bcc837bf889f6a7d79c1908419fe1770

Kẻ tấn công đã chuyển 563 WETH đến địa chỉ này và sau đó đến 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68, không có hành động nào khác cho đến nay.

Phương thức rửa tiền của kẻ tấn công lần này tương đối chuyên nghiệp, và các phương pháp cho thấy xu hướng đa dạng. Do đó, đối với những người tham gia Web3 chúng tôi, chúng tôi phải tiếp tục cải thiện khả năng chống rửa tiền về mặt bảo mật và cải thiện tính bảo mật của các dự án Defi thông qua KYT, AML và các sản phẩm bảo mật giao dịch blockchain liên quan khác.

tư vấn bảo mật

1 、 Luôn cập nhật kiểm toán và thử nghiệm hợp đồng. Tiến hành kiểm toán toàn diện trước khi triển khai hợp đồng thông minh, đặc biệt chú ý đến tất cả các phần liên quan đến tính toán tài chính. Đầu tiên, sử dụng kiểm tra tự động và tận dụng các bản cập nhật thời gian thực của các thư viện lỗ hổng để tiến hành quét bảo mật hợp đồng hiệu quả (ngành công nghiệp cũng đã dần dần mở nguồn một số công cụ kiểm toán bảo mật trưởng thành, bao gồm ZAN AI SCAN), đồng thời kết hợp kiểm tra thủ công để khắc phục sự cố đòi hỏi bí quyết chuyên sâu của ngành.

2 、 Việc mất độ chính xác cần phải được thực hiện nghiêm túc. Các vấn đề bảo mật do mất độ chính xác là vô tận, đặc biệt là trong các dự án Defi, nơi mất độ chính xác thường dẫn đến tổn thất tài chính nghiêm trọng. Các bên dự án và kiểm toán viên bảo mật nên xem xét cẩn thận các mã bị mất độ chính xác trong dự án và tiến hành kiểm tra để tránh lỗ hổng này càng nhiều càng tốt.

  1. Chúng tôi khuyến nghị rằng việc tạo ra một thị trường tương tự như cToken trong Compound và hoạt động đúc thế chấp đầu tiên nên được thực hiện bởi những người dùng đặc quyền để tránh bị thao túng bởi những kẻ tấn công và do đó thao túng tỷ lệ sàn giao dịch

    .
  2. Khi có các biến chính trong hợp đồng phụ thuộc vào giá trị của " this.balance " hoặc " token.balanceOf(), bạn cần xem xét cẩn thận các điều kiện để thay đổi biến khóa, chẳng hạn như liệu nó có được phép chuyển trực tiếp tiền tệ bản địa hoặc token vào hợp đồng hay không. phương thức để thay đổi giá trị của biến, hoặc giá trị của biến chỉ có thể được thay đổi bằng cách gọi một hàm cụ thể.

Tuyên bố từ chối trách nhiệm:

  1. Bài viết này được in lại từ [ZAN]. Tất cả bản quyền thuộc về tác giả gốc [ZAN]. Nếu có ý kiến phản đối bản in lại này, vui lòng liên hệ với nhóm Gate Learn và họ sẽ xử lý kịp thời.
  2. Tuyên bố từ chối trách nhiệm: Các quan điểm và ý kiến được trình bày trong bài viết này chỉ là của tác giả và không cấu thành bất kỳ lời khuyên đầu tư nào.
  3. Bản dịch bài viết sang các ngôn ngữ khác được thực hiện bởi nhóm Gate Learn. Trừ khi được đề cập, việc sao chép, phân phối hoặc đạo văn các bài báo đã dịch đều bị cấm.
Bắt đầu giao dịch
Đăng ký và giao dịch để nhận phần thưởng USDTEST trị giá
$100
$5500