Chuỗi phân tích tấn công BlockSec DeFi 4 Những quan niệm sai lầm: Phân tích sự kiện tấn công hợp đồng Memestake của Sanshu Inu
BlockSec
2021-08-03 07:27
本文约5655字,阅读全文需要约23分钟
Phân tích một cách có hệ thống các sự cố bảo mật DeFi và phân tích nguyên nhân gốc rễ đằng sau các sự cố bảo mật

Tài chính phi tập trung (DeFi), với tư cách là một dạng dự án phổ biến trong hệ sinh thái chuỗi khối, tính bảo mật của nó đặc biệt quan trọng. Kể từ năm ngoái, hàng chục sự cố an ninh đã xảy ra.

Là một nhóm nghiên cứu dài hạn (https://blocksecteam.com) liên quan đến bảo mật DeFi, BlockSec đã độc lập phát hiện ra một số sự cố bảo mật DeFi và kết quả nghiên cứu đã được công bố trong các hội nghị bảo mật hàng đầu (bao gồm USENIX Security, CCS và Mũ đen). Trong khoảng thời gian tiếp theo, chúng tôi sẽ phân tích một cách có hệ thống các sự cố bảo mật DeFi và phân tích nguyên nhân gốc rễ đằng sau các sự cố bảo mật.

Đánh giá trước đây:

(1)Đánh giá trước đây:

(2)[Một trong loạt bài phân tích cuộc tấn công BlockSec DeFi] Tôi tự nói: Phân tích sự kiện tấn công ChainSwap

(3)[Phân tích tấn công DeFi BlockSec Series 2] Cho đi mọi thứ: Phí Sushiswap bị đánh cắp

[Chuỗi phân tích tấn công BlockSec DeFi 3] Đánh cắp bầu trời và thay đổi một ngày: Phân tích chuyên sâu về sự cố tấn công Akropolis

0xffffffff. Lời nói đầu

Vào lúc 03:40 ngày 21 tháng 7 năm 2021, giờ Bắc Kinh, hệ thống phát hiện tấn công của chúng tôi đã phát hiện một giao dịch bất thường. Qua phân tích mở rộng về giao dịch, chúng tôi nhận thấy đây là sự cố mà cơ chế giảm phát token (deflation token) KEANU đã được sử dụng để tấn công vào lỗ hổng cơ chế tính toán phần thưởng của hợp đồng Memestake do Sanshu Inu triển khai. lợi nhuận khoảng 56 ETH cá nhân. Sau đây là phân tích chi tiết như sau:

  • Đọc gợi ý:

  • Các bạn mới làm quen với DeFi (Ethereum) có thể đọc lại từ đầu, tuy nhiên bài viết tương đối dài nên nếu không đọc được các bạn nhớ chú ý trước khi rời khỏi.

Nếu bạn hiểu rõ hơn về các dự án tổng hợp DeFi như Akropolis, bạn có thể bắt đầu trực tiếp từ "Phân tích tấn công 0x2".

0x0.Giới thiệu cơ bản

Kể từ đầu năm nay, Dogecoin (DOGE) và Shiba Inucoin (SHIB) đã thu hút sự chú ý rộng rãi, đồng thời, các đồng meme liên quan khác cũng trở nên phổ biến, điều này cũng đã kích hoạt một số lượng lớn các bên dự án phát triển meme của riêng họ xu và cung cấp xu meme xung quanh các dịch vụ xu meme, trong đó Sanshu Inu là thành viên. Sanshu Inu không chỉ phát hành đồng xu meme SANSHU, mà còn tạo ra hợp đồng Memestake như một nhóm canh tác cho đồng xu meme. Miễn là người dùng cam kết tiền xu meme trong Memestake, họ có thể nhận được mã thông báo Mfund làm phần thưởng.

Mặt khác, một số lượng lớn tiền xu meme là mã thông báo giảm phát, nghĩa là việc phát hành các mã thông báo đó sẽ giảm dần. Giảm phát của một số đồng xu meme được thực hiện bằng cách khấu trừ một tỷ lệ đồng xu nhất định để tiêu hủy và phân phối lại mỗi khi người dùng thực hiện chuyển khoản giao dịch (chuyển khoản), điều này sẽ khiến số lượng mã thông báo thực tế mà người nhận nhận được ít hơn số tiền thanh toán thực tế theo số lượng của người trả tiền. Mã thông báo giảm phát KEANU tham gia lần này áp dụng kiểu triển khai này.

Nguyên tắc chung của cuộc tấn công là giảm số lượng KEANU mà nó nắm giữ bằng cách điều khiển Memestake thực hiện nhiều lần chuyển KEANU vào và ra, để sử dụng các kẽ hở trong chức năng tính toán phần thưởng của nó để khiến Memestake gửi một lượng lớn Mfund đến kẻ tấn công.

Phân tích mã 0x1.

Để dễ hiểu, trước tiên chúng tôi giới thiệu ngắn gọn về hai hợp đồng vật lý liên quan đến cuộc tấn công này: hợp đồng KeanuInu của mã thông báo KEANU và hợp đồng Memestake.

Hợp đồng KeanuInu


Như đã đề cập ở trên, khi KeanuInu nhận ra việc chuyển mã thông báo KEANU, nó sẽ khấu trừ một tỷ lệ phần trăm tiền nhất định để tiêu hủy và phân phối lại, và tỷ lệ tiêu hủy được đặt thành một giá trị cố định - 2%. Như thể hiện trong hình, khi các hàm transfer() và transferFrom() của KeanuInu được gọi, số tiền chuyển được hiển thị trong lệnh gọi hàm không nhất quán với số tiền được ghi trong nhật ký sự kiện phát ra.http://tx.blocksecteam.com:8080/Do sự phức tạp của cuộc gọi triển khai mã thực tế của nó, nó sẽ không được hiển thị ở đây.Các bạn quan tâm có thể kiểm tra việc thực hiện hợp đồng trên etherscan.io theo địa chỉ hợp đồng được cung cấp trong phụ lục sau. Ngoài ra, hai ảnh chụp màn hình ở trên là từ công cụ phân tích giao dịch do chúng tôi tự phát triển, hiện đang ở giai đoạn thử nghiệm mở. Chào mừng bạn đến bấm vào

dùng thử. Cách công cụ của chúng tôi kết hợp các lệnh gọi hàm với nhật ký sự kiện được tạo trong quá trình hữu ích hơn cho việc phân tích các vấn đề như mã thông báo giảm phát.

hợp đồng kỷ niệm

Hình bên dưới là chức năng gửi tiền của MemeStake. Đầu tiên, hàm gọi updatePool để cập nhật trạng thái của nhóm quỹ, sau đó chuyển mã thông báo của người dùng cho chính nó. Khi _amount đến lớn hơn 0, quá trình chuyển sẽ được thực hiện trên dòng 1295 của mã.

Tuy nhiên, do đặc điểm giảm phát của mã thông báo KEANU, mặc dù số tiền được chuyển vào khi gọi hàm safeTransferFrom là _amount, nhưng số tiền thực sự được chuyển vào nhóm quỹ nhỏ hơn _amount. Và trong quá trình phân tích mã, chúng tôi nhận thấy rằng đích đến của quá trình chuyển tiền là chính bạn, nghĩa là đối với MemeStake, tất cả tiền gửi của người dùng bằng một loại tiền tệ nhất định (chẳng hạn như mã thông báo KEANU) đều thuộc về MemeStake.

Ở dòng 1296 sau khi chuyển, MemeStake sẽ đăng ký tiền gửi của người dùng, nhưng đăng ký ở đây vẫn là _amount (và số tiền chuyển thực tế nhỏ hơn _amount), vì vậy số tiền gửi thực của người dùng nhỏ hơn user.amount đã đăng ký.

Cuối cùng, ở dòng 1299, có thể thấy tham số user.rewardDebt cũng được tính toán dựa trên (lớn hơn giá trị thực) user.amount.

Hình bên dưới là chức năng rút tiền của MemeStake. Đầu tiên, hàm kiểm tra xem user.amount có đủ số dư hay không, nhưng vì bản thân user.amount lớn hơn giá trị thực nên việc kiểm tra ở đây là không chính xác. Tiếp theo, hàm updatePool cũng sẽ được gọi để cập nhật trạng thái của nhóm quỹ.

Trong dòng 1321, chức năng rút tiền trước tiên sẽ khấu trừ số dư đã đăng ký trong user.amount, sau đó gọi chức năng chuyển để chuyển mã thông báo trở lại cho người dùng. Giống như chức năng gửi tiền, logic ở đây cũng có vấn đề, vì mỗi lần chuyển sẽ gây ra giảm phát nên số tiền chuyển cho người dùng sẽ ít hơn số tiền chuyển thực tế.

Cuối cùng, hãy xem chức năng updatePool của MemeStake. Trước hết, có thể thấy từ dòng 1255, mỗi lần gọi sẽ ghi lại số khối được cập nhật lần cuối, nếu khối được gọi lần này giống với lần cập nhật trước, nó sẽ trả về trực tiếp, nghĩa là updatePool sẽ chỉ cập nhật mỗi khối A trạng thái nhóm quỹ.

pool.accMfundPerShare += mFundReward / token.balanceOf(MemeStake)

Tiếp theo, ở dòng 1259, số dư của chính MemeStake trong hợp đồng mã thông báo sẽ được lấy (như đã đề cập ở trên, mỗi khi người dùng gửi tiền, mã thông báo sẽ được chuyển sang MemeStake). Cuối cùng, trong dòng 1275, số dư này sẽ được sử dụng làm mẫu số để tính phần thưởng cho mỗi lần gửi và rút tiền của nhóm quỹ (nghĩa là tham số pool.accMfundPerShare). Nó được tính như sau:

rewardMfund = user.amont * pool.accMfundPerShare / 1e18 - user.rewardDebt。

Quay lại vấn đề rút tiền, chúng ta hãy xem cách tiền gửi và rút mã thông báo phần thưởng Mfund được chuyển. Đầu tiên, tại dòng 1325 của chức năng rút tiền trong hình trên, hãy tính xem người dùng có mã thông báo Mfund đang chờ xử lý chưa được phát hành hay không. Công thức tính toán là:

user.rewardDebt = user.amount * pool.accMfundPerShare / 1e18

Và bonusDebt được tính như sau (dòng 1325 trong hình):

  • Do đó, không khó để chúng tôi xây dựng một cuộc tấn công có thể xảy ra từ mã:

    • Đầu tiên, trong một giao dịch, nhóm quỹ của MemeStake bị cạn kiệt bằng cách liên tục gọi các chức năng gửi và rút tiền. Thao tác này khai thác ba vấn đề về mã:

    • Trước hết, user.amount được lập hóa đơn nhiều hơn giá trị thực, vì vậy mọi lần rút tiền đều có thể thành công.

    • Thứ hai, tiền của tất cả người dùng trong MemeStake nằm trong một nhóm, vì vậy mỗi lần chuyển tiền thực sự đốt cháy mã thông báo KEANU được gửi bởi những người dùng khác trong nhóm.

  • Thứ ba, vì updatePool không thực hiện cập nhật trạng thái trong cùng một khối nên nó sẽ không ảnh hưởng đến tham số pool.accMfundPerShare, cũng như không tạo ra phần thưởng mã thông báo Mfund.

    • Tiếp theo, trong khối tiếp theo, hãy gọi trực tiếp chức năng rút tiền.

    • Sau đó, tại dòng 1315 của chức năng rút tiền, số tiền thưởng Mfund được tính là rất lớn, dẫn đến phần thưởng Mfund rất lớn.

0x2.Phân tích tấn công

0x2.Phân tích tấn công

Nguyên nhân của lỗ hổng và cách thức khai thác lỗ hổng đã được giới thiệu ở trên, tiếp theo chúng tôi sẽ giới thiệu về cách kẻ tấn công thực sự tiến hành cuộc tấn công.

  • Như thể hiện trong hình, cuộc tấn công có thể được chia thành 4 bước, trong đó bước tấn công chính là bước 2, sử dụng các đặc điểm của mã thông báo giảm phát để thao túng tính toán phần thưởng của Memestake.Bước 1 (chuẩn bị), đầu tiên kẻ tấn công tạo và khởi tạo hai hợp đồng, trong đóhợp đồng mộtKEANUĐể thực hiện một hợp đồng đầu tư thông thường, kẻ tấn công đã gửi khoảng 2.049B vào Memestake thông qua hợp đồng 1, để mở đường cho bước 3 kiếm được số lượng lớn phần thưởng MFUND.hợp đồng hai

  • Để thao tác hợp đồng tính toán phần thưởng Memestake, thao tác phê duyệt của mã thông báo có liên quan được thực hiện trước tiên.0x00edỞ bước thứ hai (thao túng), kẻ tấn công trước tiên cho vay nhanh một lượng lớn mã thông báo KEANU từ uniswapV2, sau đó gửi và rút một số lượng lớn mã thông báo KEANU về Memestake thông qua hợp đồng 2, khiến Memestake buộc phải giao dịch một lượng lớn KEANU. Vì KEANU là mã thông báo giảm phát, mỗi giao dịch sẽ đốt cháy 2% số tiền giao dịch, dẫn đến khoản tiền gửi thực tế của người dùng trong Memestake nhỏ hơn số tiền người dùng đã đăng ký và khoản tiền rút được chuyển cho người dùng theo người dùng. số tiền ( Xem phân tích mã để biết chi tiết), dẫn đến việc giảm liên tục lượng nắm giữ mã thông báo KEANU trong nhóm Memestake và cuối cùng là 1e-07. Như thể hiện trong hình dưới đây, các giao dịch liên quan là

  • , ảnh chụp màn hình giao dịch chưa hoàn tất, vui lòng nhấp vào liên kết để tự xem.MfundBước 3 (lợi nhuận), trước tiên kẻ tấn công gọi hàm Memestake.updatePool() thông qua hợp đồng 2 và sửa đổi accMfundPerShare của nhóm nơi đặt KEANU, bởi vì giá trị này phụ thuộc vào số lượng mã thông báo KEANU mà nhóm nắm giữ và đây là trong Nó đã được thao tác ở bước thứ hai (xem phân tích mã bên dưới để biết công thức cụ thể). Điều này cho phép hợp đồng 2 nhận được nhiều hơn giá trị bình thường trong lần rút tiền tiếp theo0xa945(khoảng 61M) Mã thông báo này được sử dụng làm phần thưởng. Bước 3 xảy ra trong giao dịch

  • Đồng thời, kẻ tấn công bắt đầu đổi một phần MFund lấy được các token như WETH.Tornado.CashBước 4 (kết thúc), kẻ tấn công sẽ đổi MFund, KEANU và các mã thông báo khác lấy được thành ETH và chuyển

Chuyển đi, cho đến nay cuộc tấn công đã kết thúc và kẻ tấn công đã kiếm được 55.9484578158357 ETH (địa chỉ EOA của kẻ tấn công và hợp đồng tấn công đã triển khai vẫn còn một số mã thông báo SANSHU và KEANU chưa được tính), khoảng 100.000 đô la Mỹ.0x0333Hình dưới đây cho thấy địa chỉ tấn công

Ảnh chụp màn hình giao dịch, ảnh chụp màn hình giao dịch chưa hoàn chỉnh, vui lòng nhấp vào liên kết địa chỉ để xem chi tiết.

tấn công liên quan

Điều thú vị là cả bước 2 và 3 của cuộc tấn công đều liên quan đến các giao dịch flashbot.0x00edCác giao dịch liên quan ở bước 2

Do việc áp dụng flashloan UniswapV2, trước và sau giao dịch, nó tương đương với việc sử dụng khoảng 38ETH để mua KEANU, điều này tạo ra không gian chênh lệch giá lớn. Do đó, giao dịch đã bị kẹp bởi một kẻ tấn công khác (tấn công sandwich), tức là kẻ tấn công trong sự kiện này cũng là nạn nhân của một sự kiện sandwich khác. Kẻ tấn công bánh sandwich đã kiếm được lợi nhuận là 3,2769697165652474ETH, nhưng đã mang lại cho người khai thác 2,405295771958891249ETH, với lợi nhuận ròng là 0,8716739446063562ETH.0xa945trong khi giao dịch liên quan đến cuộc tấn công ở bước 3

Vì một số lượng lớn MFunds đã được bán trong nhóm uniswap, nên không gian chênh lệch giá đã được tạo ra, vì vậy nó đã hoạt động trở lại và trở thành một giao dịch flashbot. Người tìm kiếm đã kiếm được lợi nhuận là 0,13858054192600666ETH, trong đó 0,099085087477094764ETH đã được chuyển cho người khai thác và lợi nhuận ròng là 0,03949545444891189ETH.Bạn có thể tìm thấy phần giới thiệu chi tiết về các cuộc tấn công flashbot và sandwich trong phần giới thiệu về các cuộc tấn công khác của chúng tôi. Vì việc triển khai khoản vay chớp nhoáng được kết hợp với Swap thông thường trong UniswapV2, vui lòng tham khảo tài liệu của chúng tôi để biết nguyên tắc triển khai cụ thể và lý do tại sao có không gian chênh lệch giá trong bước thứ hai.Towards A First Step to Understand Flash Loan and Its Applications in DeFi Ecosystem (SBC 2021).

0x3. Tóm tắt và đề xuất bảo mật

0x3. Tóm tắt và đề xuất bảo mật

Kẻ tấn công đã sử dụng các đặc điểm của mã thông báo giảm phát để kiểm soát số lượng mã thông báo được nắm giữ bởi nền tảng, điều này ảnh hưởng đến việc tính toán và phân phối mã thông báo phần thưởng, từ đó kiếm được lợi nhuận là 55,9484578158357 ETH. Lý do cho điều này là nền tảng Sanshu Inu thiếu một số cân nhắc về bảo mật nhất định khi giới thiệu mã thông báo giảm phát, cho phép kẻ tấn công lợi dụng nó.

  • Do đó, các khuyến nghị bảo mật của chúng tôi cho các bên dự án có liên quan như sau:

  • Trước khi dự án đi vào hoạt động, cần phải tìm một công ty bảo mật đủ tiêu chuẩn để tiến hành kiểm toán bảo mật. Chúng ta có thể thấy rằng do thuộc tính tiền lego của defi, nhiều dự án defi có thể được kết hợp theo ý muốn, do đó tạo ra ảnh hưởng lẫn nhau và đây là lý do thường xuyên xảy ra các sự cố bảo mật trong lĩnh vực defi. Do đó, các vấn đề bảo mật mà các bên dự án cần chú ý không chỉ giới hạn trong các dự án của riêng họ mà còn cần xem xét các lỗ hổng bảo mật tồn tại trong quá trình tương tác với các dự án khác.

Được thúc đẩy bởi công nghệ bảo mật cốt lõi, nhóm BlockSec từ lâu đã quan tâm đến bảo mật DeFi, chống rửa tiền kỹ thuật số và lưu ký tài sản kỹ thuật số dựa trên điện toán bảo mật, cung cấp dịch vụ bảo mật hợp đồng và bảo mật tài sản kỹ thuật số cho các bên dự án DApp. Nhóm đã xuất bản hơn 20 bài báo học thuật về bảo mật hàng đầu (CCS, USENIX Security, S&P) và các đối tác của nhóm đã giành được danh hiệu học giả về quyền riêng tư và bảo mật có ảnh hưởng nhất trên thế giới của AMiner (xếp thứ sáu trên thế giới trong giai đoạn 2011-2020). Các kết quả nghiên cứu đã được CCTV, Tân Hoa xã và các báo cáo phương tiện truyền thông nước ngoài trao giải thưởng. Đã độc lập phát hiện hàng tá lỗ hổng bảo mật và mối đe dọa DeFi, đồng thời giành vị trí đầu tiên trên thế giới trong Cuộc thi Điện toán Quyền riêng tư của Viện Y tế Quốc gia năm 2019 (SGX Track). Được thúc đẩy bởi công nghệ, nhóm tuân thủ khái niệm cởi mở và đôi bên cùng có lợi, đồng thời làm việc với các đối tác cộng đồng để xây dựng một hệ sinh thái DeFi an toàn.

https://www.blocksecteam.com/
contact@blocksecteam.com

BlockSec
作者文库