Securityadvancedarticle25 min read

Hack Cream Finance: phân tích cuộc tấn công borrow tiền nhanh trị giá 130 triệu USD | VCC

Vào ngày 27 tháng 10 năm 2021, tại khối 13,516,868, một giao dịch Ethereum duy nhất đã borrow và trả 500 triệu DAI, phát hành và quyên tặng khoảng 16 triệu USD tài sản trong kho Yearn, và thu về tổng cộng 130 triệu USD từ Cream Finance – mà không bao giờ có được các nguồn vốn cần thiết để bắt đầ

Vietcardano teamTeam

Đội ngũ biên tập VietCardanoCommunity — các chuyên gia blockchain và Cardano, cung cấp nội dung giáo dục và nghiên cứu chuyên sâu cho cộng đồng.

Published 14 tháng 9, 2026

Vào ngày 27 tháng 10 năm 2021, tại khối 13,516,868, một giao dịch Ethereum duy nhất đã borrow và trả 500 triệu DAI, phát hành và quyên tặng khoảng 16 triệu USD tài sản trong kho Yearn, và thu về tổng cộng 130 triệu USD từ Cream Finance – mà không bao giờ có được các nguồn vốn cần thiết để bắt đầu. Hack Cream Finance không phải là một chìa private key bị đánh cắp hay lỗi reentrancy. Đó là một manipulation giá cho borrow nhanh mà xem số tài chính nội bộ của kho Yearn – pricePerShare – như là một giá thị trường, tăng số đó bằng cách đơn giản là tặng tiền và sau đó sử dụng giá trị tăng lên làm tài sản thế chấp để borrow mượn trong 9 thị trường cho borrow. Không có bất kỳ nguồn vốn nào được trả lại. Hố – khoảng 130 triệu USD bad debt được hỗ trợ bởi 35 triệu USD tài sản thế chấp thực – nằm trên bảng cân đối tài chính của Cream cho đến khi phí giao thức lấp đầy nó vài tháng sau đó. Hiểu cách 8 triệu USD vốn quyên tặng tạo ra sức mạnh borrow mượn 130 triệu USD giải thích tại sao mỗi fork cho borrow lớn hiện nay đều xem các token kho có lãi suất như một oracle thứ hai, chưa được kiểm toán.

Cream Finance làm gì và tại sao chiến lược niêm yết của họ quan trọng

Cream Finance được ra mắt vào tháng 9 năm 2020 dưới dạng Compound fork trên Ethereum: một giao thức cho borrow không cần sự cho phép, trong đó người dùng cung cấp tài sản cho các thị trường CToken (CreamToken), nhận lãi suất được trả bởi các bên borrow, và borrow dựa trên giá trị tài sản đảm bảo mà được đánh giá bởi một Comptroller và một PriceOracle. Đến tháng 10 năm 2021, Cream quản lý tổng cộng 1,6 tỷ USD trong tổng giá trị bị khóa trên 40+ thị trường tài sản đảm bảo – gấp bốn lần số lượng của Compound – vì chiến lược của nó là niêm yết một cách mạnh mẽ: tài sản dài, token LP và phiếu kho chứa lợi nhuận mà các giao thức lớn cho rằng quá kỳ lạ để hỗ trợ.

Hai lựa chọn thiết kế đã làm cho vụ trộm 130 triệu USD trở nên có thể xảy ra. Thứ nhất, mỗi token được liệt kê làm tài sản đảm bảo cần có một đường dẫn oracle – một quy tắc tương ứng với getUnderlyingPrice(cToken) → USD. Đối với stablecoin, đường dẫn đó là Chainlink; đối với token Yearn yUSD mà kẻ tấn công chọn, đường dẫn là yUSD.getPricePerShare() yCRV_virtualPrice Chainlink(USDC). Thứ hai, Cream chia sẻ cấu trúc Comptroller của Compound nhưng không có tính bảo thủ của nó: yếu tố tài sản của yUSD là 75%, nghĩa là 100 USD yUSD với giá oracle có thể hỗ trợ 75 USD cho borrow trong ETH, WBTC hoặc stablecoin. Do đó, một lỗi giá trong lựa chọn đầu tiên đã trở thành lợi thế thông qua lựa chọn thứ hai.

Năm trước đã cho thấy rằng mỗi thị trường mới là một điểm tấn công mới. Vào tháng 2 năm 2021, ironBank của Alpha Homora + Cream đã mất ~$37,5 triệu thông qua borrow không có tài sản thế chấp; vào tháng 8 năm 2021, Cream đã mất ~$18,8 triệu khi hook tokensReceived của token AMP lại vào borrow. Cả hai đều là trường hợp đặc biệt của CToken mà thị trường ban đầu của Compound đã tránh được. Phân tích khai thác tài chính Cream tháng 10 hoàn thành bộ ba: một trường hợp đặc biệt của PriceOracle khi đưa một token vào sổ tiết kiệm đã không chỉ thêm một token mà còn một lưu lượng giá thứ hai – kế toán sổ tiết kiệm – mà không có bất kỳ nguồn dữ liệu Chainlink nào.

Diagram - Cream architecture: Comptroller + CToken markets + PriceOracle reading yUSD pricePerShare from Yearn vault, and the inflated collateral path the attacker exploited

Lịch sử: Một khối có giá 130 triệu USD (và hai cảnh báo trước đó)

Năm 2021 của Cream được mô tả như một cảnh báo trong tốc độ chậm, được tiếp theo bởi một vụ nổ đơn lẻ.

13 tháng 2, 2021 — Vấn đề bảo mật Alpha Homora đã sử dụng ironBank của Cream (một triển khai cho borrow không có tài sản đảm bảo) để borrow tiền mà không có khoản gửi tương ứng — khoảng 37,5 triệu USD bị mất. Nguyên nhân gốc là giả định của Comptroller rằng tất cả các người gọi borrow đã cung cấp tài sản đảm bảo thông qua quá trình bình thường; vai trò mới ironBank đã phá vỡ điều này. Cách sửa: hạn chế các người gọi không có tài sản đảm bảo.

30 tháng 8, 2021 — Vấn đề về mã token AMP. Người tấn công đã gọi borrow trên thị trường crAMP của Cream; hook ERC777 của AMP (tokensReceived) đã vào lại Cream trước khi borrow đã cập nhật các ghi chép tài chính nội bộ, cho phép một lần borrow khác dựa trên cùng một tài sản thế chấp — ~18,8 triệu USD bị đánh cắp. Cream không có bảo vệ chống lại việc reentrance trên đường dẫn borrow cho thị trường đó. Cách sửa: thêm bảo vệ.

27 tháng 10, 2021, ~11:02 UTC (block 13,516,868) — Manipulation giá cho borrow nhanh. Hợp đồng của kẻ tấn công, được tài trợ với ~9 ETH cho phí gas thông qua Tornado Cash, thực hiện một giao dịch:

  • borrow nhanh 500 triệu DAI từ DssFlash của MakerDAO (borrow nhanh không phí — Aave sẽ tính phí ~$450k với 0.09%).
  • Thay đổi DAI thành yCRV và tạo ra yUSD trong kho với giá hợp lý (~$8 triệu).
  • Tặng ~$8 triệu yCRV / yPool LP trực tiếp cho hợp đồng kho yUSD — một transfer nguyên thủy, không phải là khoản gửi, vì vậy không có cổ phiếu mới được tạo ra.
  • yUSD.pricePerShare tăng từ ~1.03 lên khoảng 3–6 lần giá hợp lý trong cùng một block.
  • Gửi yUSD bị phồng lên vào thị trường crYUSD của Cream thông qua mint; PriceOracle của Cream đọc pricePerShare bị phồng lên và ghi nhận ~$200 triệu tài sản ảo làm tài sản đảm bảo.
  • borrow ~$130 triệu trên chín thị trường (WETH, WBTC, CRV, YFI, LINK, DPI, USDC, USDT, DAI) để làm tài sản đảm bảo cho tài sản ảo đó.
  • Trả lại borrow nhanh 500 triệu DAI cộng với phí gas, giữ lại tài sản được borrow. Tài sản đảm bảo yUSD bị phồng lên (giá trị thực là ~$35 triệu) vẫn nằm trong crYUSD như khoản nợ không được thanh toán.

Tất cả đều là các bước nguyên tử – nếu bất kỳ bước nào bị hủy, toàn bộ giao dịch sẽ bị hủy. Nó không bị hủy.

27 tháng 10, ~13:00 UTC — Cream gọi hàm Comptroller._setBorrowPaused(true) trên tất cả các thị trường, tạm dừng việc borrow tiếp theo. PeckShield và SlowMist đã đăng tải các bài viết về nguyên nhân sâu trong vòng vài giờ. Tiền mã CREAM giảm ~30% trong ngày. Không có khoản tiền gửi nào còn bị rủi ro ngay lập tức vì borrow tiền — không là cung cấp — là con đường bị can thiệp.

28 tháng 10, 2021 → 2022 — Cream thông báo rằng không có khoản tiền nào được trả lại bởi kẻ tấn công và rằng giao thức sẽ hoàn trả cho các nhà đầu tư bị ảnh hưởng từ kho bạc và phí. Đến giữa năm 2022, khoản bad debt đã được hấp thụ thông qua doanh thu của giao thức — không phải bởi một khoản trả lại của kẻ tấn công (so sánh với khoản hoàn trả toàn bộ 611 triệu USD của Poly Network sáu tuần trước đó). TVL của Cream chưa bao giờ phục hồi trở lại mức cao nhất vào tháng 10.

Timeline - Three-exploit timeline: Feb Alpha Homora $37.5M, Aug AMP $18.8M, and the Oct 27 flash loan block that stole $130M, followed by pause and fee-funded repayment

Số liệu: Từ đâu mà số tiền 130 triệu USD đến và tại sao tài sản đảm bảo là ảo

Vào ngày 27 tháng 10 năm 2021, ETH ~$4,200 và BTC ~$60,000, giỏ tài sản được borrow cho biết các ưu tiên của kẻ tấn công: lấy tài sản sâu nhất, có khối lượng giao dịch lớn nhất trước, để việc thoát ra có thể ổn định bằng stablecoin → ETH, không phải token kỳ lạ → có khả năng trượt giá.

Chợ tín dụngKhoảng 100 triệu đồng borrowUSD vào thời điểm
WETH3,924 ETH~$16,5 triệu
WBTC476.29 WBTC~$28,5 triệu
CRV~ 1,6 triệu CRV~$8 triệu
YFI / LINK / DPI / mWETH—~ 8–10 triệu USD tổng cộng
Stables (DAI/USDT/USDC) + MKR—phần còn lại
Tổng9 thị trường~$130M ($130–131,5M trên các trang tổng hợp; sự khác biệt là chụp ảnh ETH/BTC)

Trên bên kia của sổ kế:

Sản phẩmGiá trị
Tiền gốc cho borrow Flash (MakerDAO DssFlash)500M DAI (không có phí)
Tài sản được triển khai để tăng giá (chế tác + donation)~ 16 triệu USD (tất cả từ borrow flash)
Gas seed (nhà đầu tư EOA thông qua Tornado Cash)~9 ETH
Giá trị tài sản đảm bảo được tăng lên và được ghi nhận bởi Cream~ 200 triệu USD
Kapasity tài sản thế chấp với hệ số 75%~$150 triệu (nhà tấn công borrow 130 triệu USD, để lại khoảng trống)
Giá trị thực của tài sản đảm bảo yUSD còn lại~$35 triệu
Hố bad debt (tiền borrow trừ đi tài sản đảm bảo thực tế)~$130 triệu
Tiền được trả lại bởi kẻ tấn công$0 (0% phục hồi)
Ai đã lấp đầy lỗ hổng đóPhí hoa hồng/quỹ trên năm 2022

Ba điểm tinh tế cần lưu ý. Thứ nhất, borrow tiền flash đã làm cho cuộc tấn công không cần vốn ở bất kỳ quy mô nào: việc cung cấp 16 triệu USD và cướp 130 triệu USD đều nằm trong cùng một giao dịch nguyên tử được tài trợ bởi 500 triệu DAI được borrow. Người tấn công không cần bất kỳ vốn chủ sở hữu nào ngoài 9 ETH cho phí – số tiền được donation để tạo ra con quái vật được tái sử dụng trong một khối. Thứ hai, người tấn công cố ý borrow quá ít (130 trong tổng số 150 khả năng) để giữ dưới mức giải thể trong cùng một giao dịch; nếu oracle đọc sai, việc sử dụng tối đa sẽ có nguy cơ bị quay lại. Thứ ba, trái với việc dừng USDT của Poly hoặc sửa lỗi trì hoãn quản trị của Compound, không có gì có thể được dừng – WETH và WBTC không phải là token có thể dừng phát hành – và không có cơ chế trên chuỗi nào có thể lấy lại borrow không có claim khi nó rời khỏi CToken.

Nguyên nhân: Khi một khoản đóng góp trở thành một khoản tiền

Hành động tấn công bằng borrow tiền flash của Cream Finance là một ví dụ điển hình về bối rối trên bề mặt của oracle: Cream đã tiêu thụ một phần tài khoản kho bạc như thể đó là giá thị trường, và tài khoản kho bạc có thể được chuyển động bằng cách tặng tiền.

Cách định giá yUSD (và tại sao đó không phải là giá thị trường)

Khối chứa yUSD của Yearn (0x5dbc...) là một khối chứa có lợi suất: người dùng gửi yCRV (Curve yPool LP) và nhận cổ phần yUSD; khối chứa thu được phí CRV và tăng totalAssets. Giá cổ phiếu được báo cáo bởi pricePerShare() là:

` pricePerShare = totalAssets / totalSupply `

totalAssets không phải là giá của Chainlink — nó là hệ thống kế toán nội bộ của kho: chủ yếu là balanceOf(vault) bằng yCRV cộng với lợi suất đã được tính. totalSupply là số lượng cổ phiếu yUSD còn tồn tại. Trong Yearn v1 (phiên bản được Cream liệt kê), totalAssets được tính từ số dư token nguyên thủy của kho, do đó bất kỳ địa chỉ nào cũng có thể tăng totalAssets bằng cách gọi transfer(vault, amount) với yCRV — một đóng góp tạo ra 0 cổ phiếu nhưng tăng pricePerShare bằng đóng góp / totalSupply, tức thì.

Oracle của Cream đã làm gì với số đó

PriceOracle.getUnderlyingPrice(crYUSD) của Cream được thiết kế để trả lời câu hỏi "1 yUSD có giá bao nhiêu đô la?" Nó đã làm được:

` price(yUSD) = yUSD.pricePerShare() yCRV_virtualPrice Chainlink(USDC/USD) `

yCRV_virtualPrice và Chainlink(USDC) là hợp lý trong ngày đó – yPool của Curve sâu và Chainlink được tổng hợp theo thời gian. Tuy nhiên, pricePerShare là giá hiện tại của một khối duy nhất được lấy từ việc ghi sổ kế toán. Người tấn công đã tăng nó lên 3-6 lần bằng cách cống hiến 8 triệu USD yCRV vào kho trong cùng một giao dịch trước khi Cream đọc nó.

Cách kẻ tấn công sử dụng vũ khí

  1. borrow flash 500 triệu DAI — không phí, borrow 1 lần từ MakerDAO DssFlash.
  2. Tạo yUSD với giá hợp lý: DAI → yCRV → deposit vào kho yUSD → nhận cổ phần yUSD (~ có giá trị 8 triệu USD). Điều này tạo ra cổ phần được kiểm soát bởi kẻ tấn công để sau đó nộp làm tài sản thế chấp.
  3. Tặng ~ 8 triệu USD của yCRV trực tiếp vào kho yUSD (transfer(vault, yCRV)). totalSupply không thay đổi; totalAssets tăng 8 triệu USD; pricePerShare tăng. Không có cổ phần được tạo ra cho kẻ tấn công trong khoản tặng này — giá trị được tích lũy cho tất cả các cổ phần hiện có, bao gồm cả ~ 8 triệu USD của kẻ tấn công.

Tại sao điều này rẻ hơn so với thủ thuật điều chỉnh giá AMM truyền thống

Hầu hết các thủ thuật của oracle (ví dụ, Mango Markets perp funding, MonoX single-pool price pump) sẽ di chuyển giá hiện tại của AMM bằng cách thay đổi, điều này sẽ trả phí trượt và cần độ sâu của kho. Đối với 130 triệu USD của ảo từ một AMM, bạn có thể cần 30–80 triệu USD vốn thay đổi và lựa chọn kho cẩn thận. Cung cấp pricePerShare của Cream không có phí trượt — công thức là chia, không phải là đường cong. Cung cấp 8 triệu USD sẽ di chuyển giá chính xác là 8 triệu USD / cung, theo đường thẳng. Tỷ suất hiệu quả của vốn chính là lý do tại sao toàn bộ pump phù hợp trong một borrow flash DAI 500 triệu USD với phí 0 USD và vẫn còn 130 triệu USD không gian.

Diagram - Root cause: flash loan -> mint yUSD -> donate to inflate pricePerShare -> Cream oracle reads spot vault accounting -> inflated crYUSD collateral -> borrow $130M, leaving bad debt

Tại sao yếu tố Oracle và Collateral đều thất bại

Cách thức gian lận giá cho borrow nhanh đã thành công ở điểm giao nhau của hai rủi ro chưa được đánh giá cao:

1. Tài khoản kho không phải là giá thị trường – nhưng Cream đã xem nó như một giá thị trường. Chainlink bảo vệ giá token (giá của yCRV hoặc USDC). Oracle của Cream cũng sử dụng giá cổ phần kho (pricePerShare), là phân chia nội bộ của hợp đồng, không phải là thị trường. Phân chia này không có nguồn dữ liệu của Chainlink, không có TWAP, không có bảo vệ trượt giá. Các nhóm kiểm toán một fork Compound tự nhiên kiểm tra các nguồn dữ liệu của Chainlink; họ hiếm khi nhận thấy rằng bất kỳ X.getPricePerShare() là một nguồn dữ liệu giá chưa được kiểm toán thứ hai, ẩn trong tầm nhìn. Cách sửa lỗi được áp dụng trên các fork sau tháng 10 năm 2021 là cấm đọc giá spot pricePerShare hoàn toàn – hoặc loại bỏ các token kho làm tài sản thế chấp hoặc sử dụng TWAP của giá cổ phần (ví dụ, cân bằng theo thời gian 30 phút) để một đợt tăng đột biến của một khối không thể được borrow trước khi nó bị đảo ngược.

2. yUSD vault v1 được thiết kế nhạy cảm với các khoản đóng góp. Vaults Yearn v1 tính tổng số dư token như là totalAssets để đơn giản hóa; nguyên tắc không đổi "không nên làm tăng giá pricePerShare" không được thực thi ở lớp vault vì đóng góp được coi là mang tính tự nguyện, không phải đối kháng. Sau Cream, vaults Yearn v2 đã thêm độ kháng đối với đóng góp – totalAssets được lưu trữ trong bộ nhớ và các khoản đóng góp thông qua các đường dẫn không liên quan đến việc nạp tiền không làm tăng ngay giá cổ phiếu – nhưng Cream đã liệt kê v1. Đây là bài học phân cấp chính xác: vaults và oracle cùng chịu trách nhiệm; việc cứng hóa một trong hai không đủ nếu còn lại một vẫn tin tưởng vào số dư nguyên thủy.

3. Thể chế tài sản như nhân tố nhân đôi hiệu suất. Lỗi của oracle bằng 3 lần là không tốt; nhân với nhân tố thể chế tài sản 75% sẽ trở thành nhân đôi thực sự là 2.25 lần. Nếu Cream liệt kê yUSD với collateralFactor = 0% – một thể chế tài sản không cho borrow, giống như một số giao thức làm cho các chứng từ kho bạc biến động – thì giá tăng sẽ không có tác dụng: có thể nhìn thấy nhưng không thể borrow. Chọn 75% tương đương với đảm bảo 75% tỷ lệ cho borrow so với giá có thể điều chỉnh. Sau Cream, tiêu chuẩn là 0% hoặc các nhân tố có một chữ số thấp cho bất kỳ token kho bạc mang lại lợi nhuận cho đến khi oracle được cứng hóa TWAP và chứng minh là không có sự hối lộ cùng nhau.

4. Quy chế cho borrow flash không phí đã làm giảm chi phí biên. Với 500 triệu DAI, phí 0,09% của Aave sẽ là khoảng 450.000 USD – vẫn là một con số nhỏ so với 130 triệu USD, nhưng đây là một chi phí phải được tính toán lợi nhuận và xử lý. borrow flash không phí DssFlash của MakerDAO được ra mắt vào giữa năm 2021 đã loại bỏ hoàn toàn sự cản trở này; toàn bộ cuộc tấn công trở thành phí gas + 1 wei. borrow flash không tạo ra lỗ hổng – những khoản đóng góp mới làm điều đó – nhưng chúng loại bỏ ràng buộc vốn sẽ khác thường nếu không có ai có thể thực hiện nó.

Người tấn công và tiền sau đó

Khác với cuộc đàm phán "trả lại tất cả" của Poly Network hoặc sự phân tán "người dùng tuyên bố nó" của Compound, vụ hack 130 triệu USD của cream là một vụ khai thác và thoát ra theo kiểu cổ điển, với tỷ lệ lợi nhuận 0% và không có điểm chặn của nhà phát hành.

Người tấn công EOA và hợp đồng tấn công được tài trợ để mua khí đốt thông qua Tornado Cash (khoảng 9 ETH), một đường ray bảo mật khiến người triển khai trở nên mơ hồ trước giao dịch. Mặt khác với các cuộc tấn công qua cầu, nơi một nhóm multisig là mục tiêu, người tấn công này không cần bất kỳ nội gián nào – chỉ cần biết về bề mặt donation pricePerShare và một borrow flash. PeckShield liên kết nguồn borrow flash với DssFlash của MakerDAO trên đường dẫn chuỗi; bài viết trước của SlowMist đề cập đến Aave v2 như một con đường thay thế – cả hai đều cung cấp DAI có quy mô 500 triệu, nhưng con đường 0 phí của MakerDAO phù hợp với kinh tế của giao dịch và sự đồng thuận của cộng đồng sau cuộc tấn công.

Một khi 130 triệu USD rời khỏi Cream, nó đã được thay đổi trong các khối: WBTC/WETH/CRV/YFI → ETH thông qua Uniswap v2/v3 và Curve 3Pool/Sushi; các stablecoin cũng được thay đổi thành ETH. Trong vòng 24 giờ, các công ty phân tích theo dõi khoảng 20 triệu USD+ chuyển sang các khoản gửi của Tornado Cash – nhánh rửa tiền tiêu chuẩn cho các vụ trộm sử dụng ETH vào cuối năm 2021, khi Tornado xử lý khối lượng lớn hơn trong năm 2022-2023 trước khi có các biện pháp trừng phạt. Quan trọng nhất, Tether không thể đóng băng số tiền trộm cắp – bộ sưu tập là WETH/WBTC, không phải USDT – và các giao dịch thay đổi của Curve/Uni không bị đảo ngược (không giống như các lỗi của Curve của Poly dưới áp lực danh sách đen). Không có nhà phát hành nào để gọi, không có chuỗi nào để ngừng, và không có công cụ đàm phán multisig.

Do đó, việc phục hồi hoàn toàn phụ thuộc vào Cream. Đội ngũ đã ngừng borrow trong buổi chiều đó, công bố danh sách người borrow và kế toán bad debt, và cam kết trả lại cho các nhà cung cấp bị ảnh hưởng (những người có WETH/WBTC được gửi vào và không bao giờ được trả lại) từ phí kho bạc và phí giao thức. Trong suốt năm 2022, doanh thu phí đã dần khắc phục lỗ hổng này – không cần phát hành mã thông báo cứu trợ. Không có thông báo về việc phục hồi theo luật. Phân tích lỗ hổng tài chính Cream khép lại vòng này một cách thô bạo: khi tài sản thế chấp là ảo, không có tài sản thế chấp để thanh lý – quy trình xã hội hóa thiệt hại cho đến khi mô hình doanh thu của nó bù đắp được.

Diagram - Fund flow: Tornado Cash gas seed + 500M DAI flash loan into yUSD donation and phantom collateral, $130M borrowed across 9 markets, swapped to ETH, partially to Tornado, with bad debt remaining and fee-funded repayment

Tiến trình chuyển tiền: Từ tài sản đảm bảo ảo sang ETH thực

Thông qua đầy đủ, được rút gọn:

  1. In — 9 ETH (Tornado) cho gas + 500M DAI flash loan (MakerDAO) cho vốn, 1 giao dịch.

Điều không xảy ra là được đánh giá: không có thêm DEX thất bại (không giống như ba lần phục hồi Curve của Poly), không có việc tạm dừng phát hành (không giống như việc tạm dừng 33 triệu USDT của Poly), không có drama về bản sửa lỗi bị trì hoãn (không giống như đồng hồ quản trị 7 ngày của Compound). Đường đi Cream không có rắc rối vì tài sản được borrow là những loại phổ biến nhất – ETH và WBTC – và bề mặt oracle là phần trăm kho, không phải là một bể AMM.

Các bài học: 5 biện pháp phòng vệ có thể ngăn chặn vụ tấn công của Cream Finance

Mỗi fork cho borrow có danh sách token chứa lợi suất sau tháng 10 năm 2021 đều mang một biến thể của rủi ro của Cream, trừ khi nó áp dụng những điều sau đây – tất cả đều là các kiểm tra tiêu chuẩn mà các nhà kiểm toán thực hiện trước khi đưa loại tài sản thế chấp mới vào danh sách trắng.

Checklist - 5 defense layers: TWAP or exclude vault tokens, cap collateralFactor at 0, per-block borrow caps, donation-resistant vaults, and oracle-review as part of listing governance

1. Không bao giờ sử dụng giá pricePerShare như là giá — hãy sử dụng giá TWAP hoặc loại bỏ token kho báu làm tài sản đảm bảo. Kết quả đọc tại totalAssets / totalSupply là một bề mặt chỉnh sửa khối duy nhất. Nếu một token kho báu phải là tài sản đảm bảo, hãy lấy mẫu giá pricePerShare trong một khung thời gian 30 phút (trình định giá kiểu Uniswap hoặc TWAP nội bộ kho báu) và cập nhật PriceOracle chỉ trên trung bình di chuyển. Nếu bạn không thể thêm TWAP, hãy không đưa token vào danh sách — loại bỏ nó.

2. Cài đặt giá trị collateralFactor bằng 0 cho các phiếu nhận tiền gửi có lãi suất cho đến khi oracle được nâng cấp. Xử lý hệ số tài sản đảm bảo của token tiền gửi như một thang điều chỉnh rủi ro cho oracle, không chỉ cho biến động. Một phiếu nhận tiền gửi có giá cổ phiếu có thể điều chỉnh ở mức 75% LTV sẽ biến mỗi lỗi của oracle 3 USD thành 2,25 USD bị đánh cắp thực sự. Cài đặt mặc định an toàn là 0% (chỉ cung cấp, không borrow), chỉ được nâng cao sau khi bốn biện pháp phòng thủ khác được chứng minh.

3. Cấp giới hạn cho borrow từng khối và giới hạn nợ cho từng thị trường (công cụ ngắt chuỗi). Mọi giao dịch borrow đơn lẻ > 5 triệu USD hoặc tổng số borrow > 15 triệu USD trong một khối, nên tự động ngừng thị trường đó và xếp hàng để xem xét quản trị. 130 triệu USD của Cream còn lại trong một khối – một hiện tượng về khối lượng mà không có người dùng khỏe mạnh nào tạo ra. Các giao thức cho borrow đã thêm giới hạn borrow sau tháng 10 năm 2021 (hệ chế phân cách của Aave v3, giới hạn borrow của Compound v3, giới hạn cho từng thị trường của Euler) coi điều này là điều kiểm soát đòn bẩy cao nhất.

4. Kho chứa chống lại các khoản đóng góp ở lớp kho chứa (mẫu Yearn v2). totalAssets không nên tăng lên khi thực hiện transfer đến kho chứa; chỉ các khoản gửi qua điểm vào deposit() của kho chứa mới ảnh hưởng đến giá cổ phiếu, với totalAssets được lưu trữ trong bộ nhớ đệm hoặc được kiểm tra. Quy chuẩn kho chứa của Yearn v2 và các phiên bản sau đó thực hiện điều này; việc thay đổi nó ở cấp tách nhánh có nghĩa là không bao giờ sử dụng số dư nguyên thủy làm totalAssets.

5. Quản trị danh sách: mỗi loại tài sản đảm bảo mới là một tích hợp oracle mới. Forking Compound cung cấp cho bạn động cơ cho borrow, nhưng mỗi thị trường mới thêm một nguyên tắc giá mới – getPricePerShare(), convertToAssets(), định giá LP AMM, v.v. Vì vậy, quá trình danh sách trắng của giao thức phải là một xét duyệt oracle, không chỉ là một cuộc bỏ phiếu về các tham số rủi ro: yêu cầu một kiểm tra phân cấp đường dẫn getUnderlyingPrice cho mã thông báo mới, với sự xác nhận rõ ràng rằng không có đọc phân chia nội bộ hoặc số dư hiện tại được sử dụng làm giá. Sự mất mát của Cream vào tháng 10 có nguồn gốc trực tiếp từ việc bỏ qua bước này đối với yUSD.

Các yếu tố này kết hợp với nhau khắc phục các lỗi cụ thể: (1) + (2) loại bỏ tác động của oracle, (4) loại bỏ bề mặt cống hiến, (3) hạn chế bán kính của vụ nổ nếu bề mặt bị bỏ lỡ, và (5) đảm bảo rằng (1) – (4) không bị bỏ lỡ khi thị trường mới trông nhỏ. Cách hack tài chính hiện là trường hợp tham chiếu mà bất kỳ quyển sách về giao thức cho borrow nào áp dụng khi đội ngũ của nó đề xuất thêm biên nhận kho tàng lấp lánh làm tài sản thế chấp.

Những câu hỏi thường gặp

Số tiền bị đánh cắp trong vụ tấn công của Cream Finance là bao nhiêu? Khoảng 130 triệu USD (các nhà tổng hợp đưa ra số 130–131,5 triệu USD tùy thuộc vào giá chụp nhanh ETH/BTC vào ngày 27 tháng 10 năm 2021). Người tấn công đã borrow khoảng 130 triệu USD trên 9 thị trường – WETH 3.924, WBTC 476, cùng với CRV, YFI, LINK, DPI và các stablecoin – với tài sản thế chấp ảo yUSD được tăng lên nhờ khoản đóng góp giá cổ phiếu. Tài sản thế chấp thực sự phía sau vị thế này là khoảng 35 triệu USD, để lại khoảng 130 triệu USD bad debt. Không có một khoản nào được trả lại.

Cách thức tấn công của Cream Finance hoạt động như thế nào? Đó là một manipulation giá cho borrow flash. Người tấn công đã borrow 500 triệu DAI, sử dụng khoảng 16 triệu USD trong số đó để phát hành cổ phiếu yUSD của Yearn và đền bù yCRV trực tiếp vào kho yUSD – điều này làm tăng giá pricePerShare (totalAssets / totalSupply) của kho 3-6 lần trong một khối. PriceOracle của Cream đọc giá pricePerShare hiện tại như giá yUSD, ghi nhận ~200 triệu USD tài sản ảo làm tài sản đảm bảo cho yUSD được gửi vào, và – với một nhân hệ số đảm bảo 75% – cho phép ~150 triệu USD khả năng borrow. Người tấn công đã borrow ~130 triệu USD (WETH, WBTC, stablecoin, v.v.), trả nợ cho borrow flash trong giao dịch tương tự và để lại yUSD bị phồng lên như khoản bad debt.

Cream hack là một cuộc tấn công cho borrow nhanh hay một cuộc tấn công oracle? Cả hai — và thứ tự có ý nghĩa. Việc cho borrow nhanh là đường ray tài chính (thực hiện không cần vốn), chứ không phải là lỗ hổng. Lỗ hổng đó là giá oracle: PriceOracle của Cream cho token Yearn yUSD vault đã sử dụng một số tài khoản vault hiện tại (pricePerShare) làm giá — một bề mặt điều khiển khối duy nhất. Việc cho borrow nhanh làm cho việc điều khiển trở nên rẻ và nguyên tử; lỗ hổng oracle làm cho nó có lợi. Hầu hết các cách viết tắt "tấn công cho borrow nhanh" làm tan rã hai thứ đó — chính xác hơn, nó là cho borrow nhanh → cúng tiền giá cổ phiếu → điều khiển oracle → borrow quá nhiều tài sản đảm bảo.

Khủng bố Cream Finance đã bị bắt hay có tiền được trả lại không? Khủng bố EOA được tài trợ cho gas thông qua Tornado Cash, khiến việc xác định nguồn gốc trước khi tấn công trở nên mù mờ; không có thông tin về danh tính nào được xác nhận công khai. Tài sản được borrow đã được trao đổi thành ETH thông qua Uniswap/Curve trong các khối và một phần chuyển sang Tornado Cash trong vòng 24 giờ. Không có tiền nào được trả lại (0% phục hồi). Vì số tiền được cướp là WETH/WBTC – không phải là USDT có thể tạm dừng phát hành – nên không thể tạm dừng Tether/Circle. Cream đã trả lại cho các nhà cho borrow bị ảnh hưởng từ phí của quy trình và kho bạc trong suốt năm 2022, không phải từ số tiền được phục hồi.

Điều gì đã xảy ra với Cream Finance sau vụ hack trị giá 130 triệu USD? Cream đã tạm dừng cho borrow vào cùng ngày hôm đó, công bố báo cáo về bad debt và cam kết hoàn trả toàn bộ tiền phí cho các nhà cung cấp bị ảnh hưởng. Trong suốt năm 2022, doanh thu từ phí đã bù đắp được khoản lỗ mà không cần đến sự hỗ trợ của ngân hàng trung tâm. Tuy nhiên, sau khi bị khai thác ba lần trong vòng tám tháng (tháng 2 ~ 37,5 triệu USD, tháng 8 ~ 18,8 triệu USD, tháng 10 ~ 130 triệu USD – tổng cộng hơn 185 triệu USD trong năm 2021), TVL của Cream chưa bao giờ phục hồi trở lại mức cao nhất vào tháng 10. Sự cố này đã kết thúc con đường phát triển của Cream như một nhà cho borrow độc lập và cuối cùng đã được xem xét như một ứng cử viên hợp nhất hệ sinh thái Yearn.

Cream hack có gì khác biệt so với các cuộc tấn công cho borrow flash khác? Cream là mô hình sạch nhất trong cho borrow flash → giá cổ phiếu kho bạc lợi nhuận → tài sản thế chấp → borrow. Hầu hết các cuộc tấn công tương tự đều sử dụng thủ thuật điều chỉnh giá AMM: MonoX (bể AMM đơn), Vee Finance (Pangolin đơn oracle), Indexed Finance (token LP giảm giá), BeanStalk (quản trị cho borrow flash). Vectơ đóng góp của Cream rẻ hơn việc thay đổi giá AMM (không có sự trượt giá — giá là một phân số, không phải là một đường cong) và chỉ cần ~8 triệu USD để tạo ra ~120 triệu USD tiền ảo. Tỷ suất hiệu quả vốn chính là lý do tại sao lỗ hổng của Cream là con số nhiều chữ số từ một giao dịch duy nhất trong khi các máy bơm dựa trên AMM thường cần các bể sâu hơn và lựa chọn token cẩn thận.

Kết luận

Hack tài chính Cream không tồn tại vì kích thước của nó — nó nằm giữa 2021 $18.8M AMP reentrancy và sự thất bại của Poly $611M cross-chain — nhưng vì bề mặt của nó quá dễ dàng di chuyển. Yearn không xây dựng một kho bị hỏng; MakerDAO không xây dựng một borrow flash bị hỏng; Cream đã fork đúng động cơ cho borrow của Compound. Sự thất bại là do cấu trúc: đưa ra một token kho có lợi suất như là 75% tài sản thế chấp mà không nhận ra rằng getPricePerShare() chính là một nguồn cung cấp giá. Một chuyển giao token nguyên liệu — một hành động trong bất kỳ bối cảnh nào khác là một món quà — đã trở thành, trong một giao dịch nguyên tử được tài trợ bằng nửa tỷ DAI được borrow, một cúng dường như một cuộc tấn công khiến cho việc ghi sổ kế toán bị phồng lên, lừa dối một oracle, và rút khỏi 9 thị trường. Cách khắc phục cũng là do cấu trúc và hiện nay là tiêu chuẩn: TWAP hoặc loại bỏ token kho, hạn chế các yếu tố tài sản thế chấp ở mức 0 cho đến khi được củng cố, thực hiện các thiết bị bảo vệ cho borrow, củng cố kho chống lại cúng dường, và xem xét mỗi danh mục mới như một oracle mới. Trong cho borrow DeFi, mỗi loại tài sản thế chấp mới là một nguyên tử giá mới — và mỗi giá chỉ là thật thà như số phân phần mà bạn quên bảo vệ.

Tags:

cream finance hackcream finance flash loancream 130 million hackflash loan price manipulationcream finance exploit analysis