BSC Flash Loan Attack: Pancake Bunny

Vào tháng 2021 năm 7, chúng tôi đã chứng kiến ​​một số vụ tấn công nhắm mục tiêu vào các mục BSC DeFi. Cụ thể, một lỗ hổng liên quan đến việc đúc tiền thưởng trong công cụ tổng hợp lợi nhuận, Pancake Bunny, đã được sử dụng để đúc ~ 45 triệu mã thông báo BUNNY hoàn toàn không có gì, dẫn đến tổn thất tiền tệ khổng lồ 3 triệu đô la. Sau vụ hack đẫm máu, XNUMX nhiệm vụ được phân công —– AutoShark, Merlin Labs và Pancake Hunny —– đã bị tấn công bằng các phương pháp có thể so sánh được. Nhóm Amber '& rsquo; Nhóm Bảo mật Blockchain, doDrChiachih Wu đứng đầu, giải thích kỹ lỗ hổng và cung cấp một tài khoản chi tiết về việc tận dụng bằng cách tái tạo cuộc tấn công chống lại Pancake Bunny.

Bề mặt tấn công ẩn: balanceOf ()

Nhiều cá nhân nghĩ rằng khả năng phối ghép rất quan trọng đối với sự thành công của DeFi. Các thỏa thuận mã thông báo (ví dụ: ERC20) đóng một chức năng quan trọng ở lớp dưới cùng của Legos DeFi. Tuy nhiên, các nhà thiết kế có thể bỏ qua một số điều kiện không thể quản lý và không lường trước được khi kết hợp ERC20 vào các tác vụ DeFi của họ. Ví dụ: bạn có thể '& rsquo; không dự đoán khi nào và số lượng mã thông báo bạn sẽ nhận được khi bạn khôi phục số dư mã thông báo hiện có. Sự không thể đoán trước này tạo ra một khu vực bề mặt tấn công bí mật.

Trong nhiều trường hợp, các thỏa thuận khôn ngoan tham chiếu đến số dư của ERC20 trong lý luận dịch vụ của họ. Ví dụ: khi người dùng chuyển một số mã thông báo XYZ vào thỏa thuận khôn ngoan, XYZ.balanceOf () được gợi ý để kiểm tra xem số tiền mặt nhận được là bao nhiêu. Nếu bạn & rsquo; đã làm quen với cơ sở mã Uniswap, bạn rất có thể hiểu rằng thỏa thuận Uniswap V2Pair có rất nhiều lệnh gọi balanceOf ().

Trong bit mã, Uniswap V2Pair.mint () sử dụng số dư hiện có (số dư0, số dư1) và thông tin lưu giữ sổ sách (số tiền0, số tiền1) để lấy số lượng được người dùng chuyển (số tiền0, số tiền1). Tuy nhiên, nếu một ngôi sao xấu di chuyển một số thuộc tính (token1 hoặc token2) ngay trước lệnh gọi mint (), nạn nhân sẽ cung cấp nhiều tính thanh khoản hơn dự kiến, tức là, nhiều mã thông báo LP được đúc hơn. Nếu lợi ích được xác định dựa trên số lượng mã thông báo LP, ngôi sao xấu có thể được hưởng lợi khi lợi ích vượt qua chi tiêu.

Uniswap V2Pair.burn () có một mối đe dọa tương đương. Người gọi hàm mint () có thể đe dọa chính mình mà không có sự hiểu biết toàn diện về các mối đe dọa bao gồm. Đây là những gì đã xảy ra khi nói đến Pancake Bunny.

Nhận 110 USDT Tiền thưởng tương lai hoàn toàn miễn phí!

Trong bit mã ở trên, dòng 140 lấy số dư của mã thông báo LP thông qua balanceOf () và lưu trữ nó thành tính thanh khoản. Trong các dòng 144–– 145, một phần của mã thông báo LP tổng thể thuộc sở hữu của Uniswap V2Pair (tức là thanh khoản ngoài _ totalSupply) được sử dụng để lấy (số tiền0, số tiền1) với số dư hiện có (số dư0, số dư1) của 2 thuộc tính (tức , token0 và token1). Sau đó, (số tiền0, số tiền1) của 2 thuộc tính được chuyển đến địa chỉ trong dòng 148–– 149.

Tại đây, một ngôi sao xấu có thể kiểm soát (balance0, balance1) và tính thanh khoản bằng cách gửi một số token0 + token1 hoặc mã thông báo LP vào thỏa thuận Uniswap V2Pair ngay trước khi hàm mint () được gợi ý để khiến người gọi nhận được nhiều token0 + token1 hơn . Chúng tôi & rsquo; Sẽ cho bạn xem qua mã nguồnPancake Bunny và tiết lộ cho bạn cách mà ngôi sao xấu có thể kiếm tiền từ việc này.

Phân tích lỗ hổng: BunnyMinterV2

Trong mã nguồn Pancake Bunny, hàm BunnyMinterV2.mintFor V2 () giám sát việc đúc mã thông báo BUNNY làm lợi ích. Cụ thể, tổng số tiền sẽ được đúc (ví dụ: mintBunny) bắt nguồn từ các tiêu chí đầu vào, _ rút lui, và _ performanceFee. Phép tính được kết hợp với 3 hàm: _ zapAs setsTo BunnyBNB () (dòng 213), priceCalculator.valueOfAs set () (dòng 219) và amountBunnyTo Mint () (dòng 221). Vì ngôi sao xấu có thể tạo ra một lượng lớn BUNNY, vấn đề phụ thuộc vào trong số 3 chức năng đã chỉ ra ở trên.

Đọc bài viết:  Ethereum chứng kiến ​​chuỗi chiến thắng 3 tuần so với Bitcoin khi giá BTC giảm xuống dưới 39 nghìn đô la

Hãy để '& rsquo; s bắt đầu bằng _ zapAs đặt thành hàm BunnyBNB (). Khi thuộc tính chuyển vào là aCake- LP (dòng 267), một số lượng mã thông báo LP cụ thể được sử dụng để loại bỏ tính thanh khoản và lấy (số lượng Mã thông báo 0, số lượng Mã thông báo 1) của (mã thông báo0, mã thông báo1) từ nhóm thanh khoản (dòng 278). Với sự hỗ trợ của thỏa thuận zapBSC, các thuộc tính đó được chuyển sang mã thông báo BUNNY-BNB LP (dòng 287– 288). Sau đó, một số lượng mã thông báo BUNNY-BNB LP phù hợp sẽ được trả lại cho người gọi (dòng 298). Ở đây, chúng tôi gặp sự cố.Số lượng có khớp với số lượng mã thông báo LP mà bạn cho là sẽ bị đốt cháy không? (*) Việc thực hiện

Trong V2Router.removeLiquidity (), tính thanh khoản của mã thông báo LP (số lượng trong bộ zapPancakeA BunnyBNB ()) sẽ được gửi đến thỏa thuận To Pair (dòng 500) và Pancake Pair.burn () sẽ được gợi ý. Pancake số dư mã thông báo LP hiện có của Nếu Pair cao hơn 0, thì tổng số thực được đốt sẽ cao hơn số lượng, điều này gián tiếp làm tăng tổng số BUNNY sẽ được đúc.

Một bộ khác như BunnyBNB () là lệnh gọi zapBSC.zapTo (), lý doInToken đằng sau điều này là để trao đổi 2 thuộc tính được thu thập bởi removeLiquidity () thành mã thông báo BUNNY-BNB LP. Các thuộc tính zapBSC hoán đổi các thuộc tính thông qua Kể từ khi Hoán đổi, ngôi sao xấu có thể sử dụng các khoản vay flash để kiểm soát số lượng chuyển BUNNY-BNB.Pancake sang BunnyMinterV2.mint

Quay lại V2 (), bunnyBNBAmount được trả về bởi zapFor setsAs BunnyBNB () sẽ được nhập priceCalculator.valueOfTo set () để ước tính giá trị dựa trên BNB (tức là vauleAs BNB), có thể so sánh với hệ thống oracle.

Tuy nhiên priceCalculator.valueOf đặt () đề xuất số lượng BNB và BUNNY (dự trữ0, dự trữ1) trong BUNNY_BNB As Pair làm nguồn cấp dữ liệu chi phí, Pancake giúp ngôi sao xấu có thể sử dụng các khoản vay nhanh để kiểm soát số lượng mã thông báo BUNNY được đúc. số tiền

Hàm Mint () là một ước lượng toán học cơ bản. Đóng góp cho đầu vào được tăng thêm 5 (bunnyPerProfitBNB = 5e18), bản thân nó không có diện tích bề mặt tấn công, tuy nhiên bộ khuếch đại khuếch đại điều khiển được chỉ ra ở trên. Chiến đấu

Kể từ khi cho

Khi cuộc tấn công được kích hoạt bởi getReward (), chúng tôi yêu cầu được chứng nhận quyền lợi. Quét được hiển thị trong ảnh chụp màn hình Pancake ở trên, tin tặc To Bunny đã gợi ý hàm init () để sử dụng thỏa thuận trao đổi 1 WBNB thành WBNB- Mã thông báo USDT-LP và gửi () chúng vào VaultFlip

Như thỏa thuận Flip, vì vậy anh ta sẽ nhận được một số lợi ích bằng cách gợi ý getReward (). Exp đã tiết lộ ở trên, sử dụng hàmTo standard (), chúng tôi đã tạo lại lời gọi vaultFlipWe Flip.deposit () (dòng 62). Tuy nhiên, tương tự như vậy đã sử dụng thỏa thuận ZapBSC để hợp lý hóa việc nhận mã thông báo LP (dòng 54-57). Pancake, một là không & rsquo; không thể nhận được lợi ích cho đến khi người giữ For Bunny bắt đầu cuộc gọi thu hoạch () tiếp theo. Pancake yếu tố này,

Trong Bunny, hacker đã không & rsquo; t bắt đầu cuộc tấn công cho đến khi thỏa thuận thu hoạch () đầu tiên sau thỏa thuận init (). Do đó, mô phỏng của chúng tôi, không người giữ nào có thể bắt đầu thu hoạch ().

Khoản vay Flash đệ quy

Để, chúng tôi sử dụng chức năng của eth-brownie để đóng giả người quản lý và bắt đầu thu hoạch () thỏa thuận (dòng 25) .Pancake sử dụng tiền, người khai thác Pancake Bunny đã sử dụng 8 bể bơi quỹ khác nhau bao gồm 7 thỏa thuận Cho cặp và Nhóm Ngân hàng TubeHere Amber, Bảo mật chuỗi khối '& rsquo; nhóm s (*) vừa sử dụng 7 thỏa thuận sau đây của Pancake Pair '& rsquo; chức năng flash-swap để cho mượn 2.3 M WBNB:

Để hợp lý hóa các lệnh gọi hoán đổi flash, chúng tôi đã tải 2 tiêu chí vào đối số đầu vào thứ 4 của lệnh gọi Pancake Pair.swap () (dòng 72 hoặc dòng 74): cấp và thuộc tính. Biến cấp cho biết cấp nào của swap () gọi chúng ta là & rsquo; ở lại; biến thuộc tính là 0 hoặc 1, cho biết chúng tôi cần lấy token0 hoặc token1.

Đọc bài viết:  Anarchist Bar ở Brussels hiện chấp nhận tiền điện tử

Sử dụng hàm gọi lại pancakeCall (), chúng ta gọi một cách đệ quy Pancake Pair.swap () với cấp độ +1 cho đến khi chúng ta đạt đến cấp độ thứ bảy. Ở cấp hàng đầu, chúng tôi gợi ý shellcode () để thực hiện hành động chính hãng trong dòng 98. Khi shellcode () trả về, biến thuộc tính trả về thuộc tính thu được trong mỗi cấp phù hợp (dòng 102–– 104).

Bóp cò

Hàm shellcode () được gợi lên bởi cấp thứ bảy của pancakeCall () là cách sử dụng mã thực sự. Đầu tiên, chúng tôi giữ số dư hiện có của WBNB trong wbnbAmount (dòng 108), hoán đổi 15,000 WBNB thành mã thông báo WBNB-USDT-LP (dòng 112) và gửi chúng đến thỏa thuận đúc các mã thông báo LP đó (tức là thỏa thuận Pancake Pair) ở dòng 113. Hành động này nhằm kiểm soát lệnh gọi removeLiquidity () bên trong hàm _ zapAs setsTo BunnyBNB () như đã đánh giá ở trên, cho phép chúng tôi nhận được nhiều WBNB + USDT hơn dự kiến.

Hành động thứ hai là kiểm soát chi phí USDT được tham chiếu bởi _ zapAs setsTo BunnyBNB () để chuyển USDT thành WBNB. Vì _ zapAs setTo BunnyBNB () sử dụng Cặp bánh kếp WBNB-USDT để chuyển USDT sang WBNB, chúng tôi có thể chuyển phần còn lại của flash cho mượn WBNB sang USDT trên Pancake Swap. Làm như vậy sẽ làm cho WBNB cực kỳ rẻ và _ zapAs setsTo BunnyBNB () sẽ nhận được một lượng lớn WBNB không tương xứng khi chuyển từ USDT. Lưu ý rằng việc kiểm soát chi phí ở đây diễn ra trên bể bơi Pancake V1, không phải Pancake V2 '& rsquo; s Cặp bánh kếp như trong hành động trước.

Hành động cuối cùng là lời gọi getReward (). Lệnh gọi thỏa thuận cơ bản có thể tạo ra 6.9 triệu mã thông báo BUNNY (dòng 125). Các mã thông báo BUNNY sau đó có thể được chuyển sang WBNB trên Pancake Swap để hoàn trả khoản vay nhanh.

Trong mô phỏng của chúng tôi, ngôi sao xấu trả 1 WBNB và giành được 104 nghìn WBNB + 3.8 triệu USDT (tương đương với ~ 45 triệu USD).

Về nhóm Amber

Amber Group là một công ty tài trợ tiền điện tử quốc tế hàng đầu hoạt động trên toàn thế giới và mọi lúc với sự tồn tại ở Hồng Kông, Đài Bắc, Seoul và Vancouver Được thành lập vào năm 2017, Amber Group phục vụ hơn 500 khách hàng là tổ chức và thực sự đã giao dịch tích lũy hơn 500 tỷ đô la trong suốt hơn 100 sàn giao dịch, với hơn 1.5 tỷ đô la tài sản được quản lý. Vào năm 2021, Amber Group đã huy động được 100 triệu đô la trong khoản tài trợ Series B và trở thành kỳ lân FinTech gần đây nhất được định giá hơn 1 tỷ đô la. Để biết thêm thông tin, vui lòng kiểm tra: www.ambergroup.io.

Mọi nhà giao dịch giao dịch tiền điện tử trên sàn giao dịch Binance đều muốn biết về pumpnhập vào giá trị của tiền xu để kiếm lợi nhuận khổng lồ trong một khoảng thời gian ngắn.
Bài viết này có hướng dẫn về cách tìm hiểu khi nào và đồng xu nào sẽ tham gia vào “Pump”. Mỗi ngày, cộng đồng trên Kênh Telegram Crypto Pump Signals for Binance Tín hiệu cho Binance công bố 1-2 tín hiệu miễn phí về “Pump”Và báo cáo về thành công“Pumps ”đã được hoàn thành xuất sắc bởi ban tổ chức của cộng đồng VIP.
Các tín hiệu giao dịch này giúp kiếm được lợi nhuận từ 20% đến 150% chỉ trong vài giờ sau khi mua các đồng tiền được công bố trên kênh Telegram “Crypto Pump Signals for Binance Tín hiệu cho Binance ”. Bạn đã kiếm được lợi nhuận bằng cách sử dụng các tín hiệu giao dịch này chưa? Nếu không, sau đó thử nó! Chúng tôi chúc bạn may mắn khi giao dịch tiền điện tử và mong muốn nhận được lợi nhuận như những người dùng VIP của Crypto Pump Signals for Binance Tín hiệu cho kênh Binance. Có thể xem các ví dụ trên trang này!
John Lesley/ tác giả của bài báo

John Lesley là một nhà giao dịch giàu kinh nghiệm chuyên về phân tích kỹ thuật và dự báo thị trường tiền điện tử. Anh ấy có hơn 10 năm kinh nghiệm với nhiều loại thị trường và tài sản - tiền tệ, chỉ số và hàng hóa.John là tác giả của các chủ đề phổ biến trên các diễn đàn lớn với hàng triệu lượt xem và vừa là nhà phân tích vừa là nhà giao dịch chuyên nghiệp cho cả khách hàng và bản thân anh ấy.