Ngày 2 tháng 12 năm 2021, BadgerDAO – nhà tổng hợp lợi nhuận Bitcoin lớn nhất trên Ethereum – phát hiện ra rằng 120 triệu đô la đã biến mất khỏi khoảng 100 ví người dùng. Các hợp đồng không bị ảnh hưởng, các kho đã được kiểm toán, và không có bất kỳ private key nào bị đánh cắp. Điều bị phá vỡ là trang web. Trong 22 ngày, một đoạn mã độc hại được chèn vào thông qua một khóa API của Cloudflare đã âm thầm thay đổi mọi giao dịch mà người dùng chấp thuận trên app.badger.com, thay thế khoản tiền gửi trong kho của nạn nhân bị tấn công Badger DAO hack bằng một approval mã thông tin vô hạn cho một địa chỉ được kiểm soát bởi attacker. Khi các approval được rút sau đó bằng transferFrom, blockchain đã làm chính xác những gì được yêu cầu – vì sự nói dối đã xảy ra trong trình duyệt, không phải trên chuỗi. Hiểu tại sao sự kiện phá vỡ giao diện trước của DeFi này thành công – và tại sao Content-Security-Policy, Subresource Integrity và các mã thông tin API có quyền hạn thấp nhất sẽ ngăn chặn nó – lại đặt lại khung bảo mật DeFi cho mỗi nhóm vẫn xem trang web của mình như là một chiến lược tiếp thị hơn là một giới hạn tin cậy.
BadgerDAO làm gì và tại sao kho Bitcoin của nó trở thành mục tiêu hấp dẫn
BadgerDAO được ra mắt vào cuối năm 2020 với một mục tiêu duy nhất: các chủ sở hữu Bitcoin muốn nhận lợi tức mà không cần rời khỏi tài sản BTC của họ. Thông qua giao thức, Badger đã xây dựng Setts – các kho chứa lợi tức trên Ethereum, chấp nhận các tài sản gắn với Bitcoin (wBTC, renBTC, ibBTC) và các mã thông báo LP Curve, sau đó tự động tích lũy các phần thưởng của Curve, Convex và Badger. Đến tháng 11 năm 2021, Badger đã quản lý tổng giá trị bị khóa khoảng 1,5 tỷ USD, với các kho Curve bveCVX và ibBTC / renBTC chứa lượng tiền BTC ổn định mà rất ít nhà cung cấp dịch vụ khác có thể so sánh.
Hai đặc điểm đã làm cho Badger trở thành một mục tiêu frontend có giá trị độc nhất. Thứ nhất, người dùng của nó là những người BTC whale – ví chứa 50–1,000+ wBTC (mỗi wBTC có giá trị khoảng 55,000 USD vào thời điểm đó), không phải là những người dùng cá nhân. Một sự đồng ý bị xâm phạm có thể có giá trị 50 triệu USD. Thứ hai, các token của kho của Badger (bveCVX, bCRV, bBadger, ibBTC LP) là các ERC-20 hoạt động giống như tiền – một khi attacker giữ một sự đồng ý vô hạn, transferFrom có thể hoạt động ở bất kỳ khối tương lai nào mà không cần tương tác người dùng thêm. Không có khóa thời gian trên một khoản cho phép, không có thiết bị phân phối cấp kho, và không có việc tạm dừng phát hành (không giống như USDT, wBTC không thể được tạm dừng một cách trung tâm). Trang frontend là điểm hẹp nhất kiểm soát giá trị rộng nhất.
Điều quan trọng là các hợp đồng của Badger đã được kiểm toán (Haechi, 2021) và không có lỗi lặp lại hoặc lỗi kế toán. Việc khai thác không cần lỗi hợp đồng vì nó không bao giờ chạm đến logic hợp đồng – nó nhận được các approval hợp pháp thông qua giao diện người dùng bị xâm phạm, sau đó sử dụng các hợp đồng chính xác như đã thiết kế. Điểm khác biệt này là lý do tại sao các danh sách kiểm tra sau khi chết cho các giao thức cho vay và kho bây giờ phân tách "kiểm toán hợp đồng" và "thẩm tra giới hạn tin cậy giao diện trước" làm hai cổng độc lập.
Thời gian: 22 ngày trong trang web trước khi ai đó phát hiện ra
Sự xâm nhập của Badger DAO là một cuộc xâm nhập theo phong cách APT – sự bền vững quan trọng hơn tốc độ.
10 tháng 11, 2021 — attacker, sau khi lấy được khóa API của Cloudflare thuộc về một kỹ sư của BadgerDAO, đã sử dụng API của Cloudflare để tạo hoặc chỉnh sửa một đường dẫn Cloudflare Worker trên api.badger.com. Worker đã chèn khoảng 40 dòng JavaScript bị che giấu vào mỗi phản hồi được cung cấp bởi app.badger.com. Badger sau đó xác nhận rằng khóa có phạm vi rộng (sửa Workers + Zone, không có danh sách IP cho phép, không có lịch quay vòng và không có cổng MFA khi sử dụng API). Sự chèn đã hoạt động kể từ ngày này, nhưng các biện pháp khắc phục đã được triển khai để tránh phát hiện sớm.
10 tháng 11 – 1 tháng 12, 2021 (thời gian tồn tại) — Mã được chèn chạy trong trình duyệt của mỗi người truy cập. Nó bao quanh window.ethereum.request, chặn eth_sendTransaction và eth_sign, và — khi người dùng gửi một khoản tiền hợp lệ — thầm thay thế hoặc bổ sung một approve(attackerContract, 0xfff…fff) (MAX_UINT / approval vô hạn) cho bất kỳ token nào trong ví, sau khi gọi eth_call để kiểm tra số dư và mục tiêu các chủ sở hữu lớn. Giao diện người dùng vẫn hiển thị chi tiết giao dịch mong đợi; địa chỉ người chi của approval (do attacker kiểm soát) không bao giờ được hiển thị dưới dạng cảnh báo dễ đọc. Trong hơn ba tuần, hơn 100 ví đã tích lũy các quyền chấp thuận vô hạn cho các hợp đồng của attacker. attacker đã thay đổi địa chỉ người chi một lần trong thời gian tồn tại để phân chia rủi ro.
2 tháng 12, 2021, ~00:00–06:00 UTC — Các thành viên cộng đồng trên Discord báo cáo về các hoạt động transferFrom không được phép. Trên chuỗi, attacker đã bắt đầu thu thập các phiếu chấp thuận tích lũy theo từng lô — không phải tất cả cùng một lúc, để giữ cho mức gas và biểu đồ TVL luôn ổn định. Người bị hại lớn nhất đã mất khoảng 50 triệu USD (wBTC + token kho).
2 tháng 12, 2021, ~09:00 UTC — BadgerDAO phát hiện được lỗ hổng hoạt động, ngừng hoạt động tất cả kho và smart contract thông qua chức năng quản trị pause(), và đưa app.badger.com ra khỏi hoạt động. Khóa API của Cloudflare đã bị hủy, các Worker đã bị xóa, và hash của mã độc đã được công bố để xác minh. Không có thêm tiền nào bị rút sau khi ngừng hoạt động.
2–3 tháng 12, 2021 — PeckShield, BlockSec và SlowMist đã công bố các bài viết độc lập về nguyên nhân sâu sau vài giờ, tất cả đều tập trung vào khóa API của Cloudflare → chèn Worker → chuỗi approval vô hạn. Phân tích hack bằng dao badger đã được củng cố từ giả thuyết đến sự đồng thuận trước khi có bài viết hậu quả chính thức.
10 tháng 12, 2021 — BadgerDAO đã đăng bài phân tích kỹ thuật sau khi xảy ra sự cố trên Medium: Cloudflare API key bị xâm phạm đã được xác nhận, chi tiết về việc chèn, địa chỉ của attacker và một kế hoạch khắc phục (CSP, SRI, phạm vi token, canary frontend). Một khung thanh toán do Quỹ tài chính tài trợ đã được đề xuất trong các bài viết về quản trị sau đó.
2022–2023 — Kiểm tra pháp y (SlowMist, Chainalysis) theo dõi các khoản tiền được tích lũy và gửi vào tài khoản Tornado Cash trong khoảng 100 lô ETH. Trong số 120 triệu USD, khoảng 70 triệu USD trở lên đã bị làm mờ qua máy trộn vào tháng 1 năm 2022; cấu trúc chủ yếu là BTC khiến việc rửa tiền trở nên phức tạp hơn vì wBTC phải được giải nén và kết nối trước khi trộn. Không có danh tính của attacker được xác nhận công khai; không có khoản tiền nào được trả lại.
Số liệu: 120 triệu USD đi đâu và tại sao nó tập trung vào BTC
Tiêu đề tròn lại thành 120 triệu đô la, nhưng việc kiểm tra lại các nhà tổng hợp cho thấy sự khác biệt dự kiến theo giá chụp nhanh. PeckShield đưa ra 120,3 triệu đô la, BadgerDAO cho biết 120 triệu đô la, và Rekt báo cáo 120 triệu đô la – sự khác biệt tương ứng với giá trong ngày của BTC (53.000 – 57.000 đô la vào ngày 2 tháng 12 năm 2021). Sử dụng 120 triệu đô la với sự khác biệt được ghi nhận; độ chính xác vượt quá đó phụ thuộc vào chụp nhanh.
| Sản phẩm | Giá trị |
|---|---|
| Thiệt hại chủ yếu | ~$120 triệu (~$120–121 triệu theo snapshot USD) |
| Máu chiến được tính bằng BTC | ~2,100 BTC (wBTC + ibBTC_interest-bearing) ≈ 85–90 triệu USD |
| BADGER + LP bảo tàng | ~151 BADGER + bBadger / bveCVX / bCRV / ibBTC Curve LP ≈ 25–30 triệu USD |
| ERC-20 còn lại | DIGG, renBTC LP, các hóa đơn kho chứa khác ≈ 5 triệu USD |
| Tài khoản bị ảnh hưởng | ~100 với các approval vô hạn; ~10 với thiệt hại > 1 triệu USD |
| Người bị hại lớn nhất | ~$50 triệu (wBTC của cá voi đơn lẻ + token sett) |
| Việc vay bằng Flash có liên quan không? | Không – đây không phải là một cuộc tấn công bằng khoản vay nhanh; các approval được thu thập trong nhiều tuần |
| Tiền đã được hoàn trả | $0 (0% phục hồi) — do attacker kiểm soát, không có lệnh tạm dừng của nhà phát hành |
| Ai chịu thiệt hại | Người dùng ban đầu; Khung thanh toán tài chính/hành chính của Badger được đề xuất |
Ba điểm khác biệt giữa các số này với các tổn thất khác trong năm 2021. Thứ nhất, ~75% giá trị được liên kết với BTC, không phải là stablecoin – trái ngược với các vụ khai thác cho vay như Cream Finance (130 triệu USD trong các lĩnh vực khác nhau). Giá BTC vào cuối năm 2021 có nghĩa là mỗi cá voi bị đánh cắp có giá trị hàng chục triệu USD. Thứ hai, tỷ lệ tập trung theo nạn nhân rất cao: 10 ví lớn nhất chiếm khoảng 60% tổng số, vì mã lệnh được chèn ưu tiên các số dư lớn thông qua kiểm tra balanceOf trước khi yêu cầu approval. Thứ ba, vì wBTC và ibBTC không thể được đóng băng như USDT của Tether (khi Tether đã đóng băng 33 triệu USD trong vụ tấn công mạng Poly), không có điểm chặn trên chuỗi để thu hồi tiền sau cuộc thanh lý – một khi transferFrom được thực hiện, tài sản trở thành thuộc quyền chủ sở hữu.
Nguyên nhân: Làm thế nào một khóa API của Cloudflare trở thành một nguồn tiền 120 triệu USD cho smart contract
Đây là chuỗi approval mã độc hại gồm bốn liên kết. Bất kỳ một liên kết nào cũng bị phá vỡ, và 120 triệu đô la sẽ không bị mất.
1. Khóa API Cloudflare có tuổi thọ dài, phạm vi rộng
Thông tin chứng thực bị xâm phạm là chìa khóa API toàn cầu hoặc token API có phạm vi thuộc về một kỹ sư có quyền truy cập Workers Scripts:Edit + Zone:Edit. Nó không có danh sách IP cho phép, không có thời hạn TTL ngắn, không có lịch sử thay đổi, và — quan trọng hơn — API của Cloudflare không yêu cầu MFA cho việc sử dụng chìa khóa ngay cả khi tài khoản có MFA cho việc đăng nhập. Trong thực tế, bất kỳ ai có được chuỗi đó có thể thay đổi bất kỳ đường dẫn được proxy bởi Cloudflare cho các miền của Badger. Báo cáo của Badger rõ ràng phân biệt điều này với "Cloudflare bị hack", tức là cơ sở hạ tầng của Cloudflare không bị xâm phạm; một chìa khóa có phạm vi đã bị lạm dụng, giống như một chìa khóa GitHub bị rò rỉ có thể thay đổi một kho lưu trữ.
2. Cloudflare Worker được chèn vào api.badger.com
Dùng API, attacker đã tạo hoặc cập nhật một Worker Cloudflare gắn với đường dẫn api.badger.com (cùng tên miền cung cấp API cho giao diện trước và, thông qua Workers, có thể được chèn vào các phản hồi của app.badger.com). Worker đã thêm một thẻ – khoảng 40 dòng, bị che giấu, không có import bên ngoài – được thực thi trước bất kỳ gói hợp lệ nào. Vì Cloudflare nằm trước nguồn gốc, các log của nguồn gốc không hiển thị bất kỳ thay đổi nào trong tệp; sự chèn chỉ tồn tại ở đầu cuối.
3. Interceptor window.ethereum trong trình duyệt
JS được chèn đã thay thế trình cung cấp Ethereum mà MetaMask cung cấp:
` const orig = window.ethereum.request.bind(window.ethereum); window.ethereum.request = async (args) => { if (args.method === 'eth_sendTransaction') { // silently add infinite approval to attacker spender // for tokens where balanceOf(victim) > threshold } return orig(args); }; `
Trong thực tế, khi người dùng nhấp vào "Nạp tiền" trên Badger Sett, mã lệnh đầu tiên gọi eth_call với balanceOf cho wBTC, BADGER và token vault, được lọc cho các số dư lớn, sau đó tạo ra các giao dịch approve(attackerSpender, 0xffff…ffff) dựa trên quá trình ký của người dùng. Màn hình thông báo ví hiển thị thông báo chung "Đồng ý" hoặc, trong một số trường hợp, sự đồng ý độc hại được ghép nối với giao dịch hợp lệ để người dùng chỉ ký một lần nhưng cho phép hai người chi tiêu.
4. approval vô hạn → quá trình transferFrom bị trì hoãn
Một approve(spender, MAX) là vĩnh viễn cho đến khi bị hủy bỏ rõ ràng – không có hạn sử dụng cấp kho. attacker đã chờ từ vài ngày đến vài tuần, sau đó gọi token.transferFrom(victim, attacker, amount) cho mỗi nạn nhân một cách thoải mái, thực hiện các đợt thanh toán để tránh vượt quá các giới hạn bất thường về gas và TVL. Vì transferFrom với một approval hợp lệ là hành vi của EVM chính xác, các nhà nghiên cứu khối và các hợp đồng kho không thấy gì sai. Lập luận được kiểm toán của kho đã chuyển tiền một cách trung thực dựa trên một approval hợp lệ – bản thân approval đã được lấy bằng cách gian lận một tầng bên trên.
Tại sao không có bất kỳ biến số hợp đồng nào bị vi phạm
Khi xem trên chuỗi, giao dịch đã tiêu hao một nạn nhân trông giống như một lệnh rút tiền bình thường được ủy quyền cho một hợp đồng trợ lý. Vấn đề duy nhất bị phá vỡ – "người dùng có ý định sử dụng tiền này" – tồn tại trong giao diện người dùng của trình duyệt, không phải trong EVM. Chính vì vậy mà các kiểm tra smart contract đã được thông qua: chúng xác minh các tính chất không thay đổi trong các hợp đồng, không phải là bản đồ giữa những gì giao diện trước được hiển thị và những gì người dùng ký.
Tại sao các biện pháp bảo vệ trình duyệt đã có không được kích hoạt
Mỗi lớp có thể ngăn chặn một đoạn mã được chèn vào biên đã bị thiếu hoặc cấu hình sai trên app.badger.com vào tháng 11 năm 2021. Phần này sẽ liệt kê chúng để người đọc kiểm tra các giao diện trước của DeFi có thể kiểm tra các mục tương tự.
Content-Security-Policy (CSP) — không có. Một Content-Security-Policy: script-src 'self' với một nonce hoặc hash cho mỗi đoạn mã inline hợp lệ sẽ khiến trình duyệt từ chối thực thi đoạn mã được gắn vào Worker vì nguồn gốc/hash của nó không được cho phép. Trình duyệt sẽ ghi một vi phạm CSP vào điểm kết thúc báo cáo, điều này — nếu có ai theo dõi — sẽ phát hiện sự xâm nhập ngay từ ngày đầu. Không có CSP được triển khai trên giao diện trước của Badger vào thời điểm đó (được xác nhận bởi các khuyến nghị sau khi kiểm tra và CertiK/BlockSec). Cách sửa chữa chính xác hơn là script-src 'self' 'nonce- với một URI báo cáo nghiêm ngặt; 'unsafe-inline' phá vỡ hoàn toàn hệ thống phòng thủ và, do bỏ sót, thực sự là chính sách.
Subresource Integrity (SRI) — không được thực thi. Mặc dù không có CSP, việc đánh dấu gói frontend bằng integrity="sha384- sẽ khiến trình duyệt tạo ra khóa cho đoạn mã được tải và từ chối thực thi nó khi không phù hợp. Một đoạn mã được chèn vào đầu sẽ làm thất bại SRI. Để tránh thay đổi khóa gói, đoạn mã được chèn vào bên ngoài gói đã được khóa dưới dạng một đoạn riêng biệt, và đó chính là lý do tại sao danh sách cho phép của CSP đối với script-src — không chỉ là SRI của gói — là bổ sung cần thiết.
Sự bảo vệ token của Cloudflare – không có bất kỳ biện pháp bảo vệ nào. Chìa khóa API bị xâm phạm là (a) có tuổi thọ dài và không được thay đổi, (b) có phạm vi rộng hơn Workers, (c) không được gắn với danh sách IP được phép, và (d) không được theo dõi bởi cảnh báo trong hồ sơ kiểm tra API. Mọi biện pháp giảm thiểu – token có phạm vi theo vai trò, thời gian tồn tại 30 ngày với thay đổi, gắn IP hoặc cảnh báo Slack/PagerDuty khi cập nhật mã lệnh Worker – sẽ ngăn chặn việc ghi hoặc giảm thời gian tồn tại từ 22 ngày xuống chỉ còn vài giờ.
Không có giám sát canary / hash mã của script trên phía trước. Một chuỗi triển khai có thể tạo ra hash cho mỗi script được phát hành và so sánh hash phản hồi của app.badger.com với hash mong đợi (qua một canary bên ngoài Cloudflare) sẽ phát hiện ngay 40 dòng mã bổ sung. Các giao diện phía trước hiện đại (ví dụ, sau vụ tấn công vào giao diện người dùng Bybit Safe vào năm 2025) coi điều này là một biến không đổi trong quá trình triển khai; vào năm 2021, điều này khá hiếm.
approval UX – phụ thuộc vào sự tin tưởng của MAX. Từ năm 2020, UX của DeFi đã làm bình thường hóa các approval vô hạn để tiết kiệm gas trong các lần nạp tiền lặp lại. Người dùng không có lý do để nghi ngờ một cửa sổ "approval" mà họ thường bỏ qua vì nó là một chi phí của quy trình. Các công cụ hủy bỏ (Revoke.cash, Etherscan Token Approvals) đã tồn tại nhưng không được hiển thị trong bất kỳ ví nào như một bước vệ sinh sau giao dịch mặc định.
Kết hợp với nhau, 5 điều kiểm soát này tương ứng trực tiếp với danh sách kiểm tra phòng thủ 5 lớp trong phần cuối.
attacker và cách thức tấn công này được giữ kín trong ba tuần
Cơ quan điều tra về vụ tấn công DAO Badger vẫn chưa được giải quyết công khai; không có thông tin về danh tính của attacker và không có bất kỳ khoản tiền nào được trả lại. Tính cách hoạt động trên chuỗi cho thấy một người điều hành đã đối xử với giao diện trước giống như một chiến thuật bám trụ (APT) – không phải là hành động đột nhập và cướp bóc.
Chương trình được chèn vào là chọn lọc: nó gọi balanceOf cho mỗi token trước khi yêu cầu approval, lọc các ví chứa hơn một mức giới hạn (được báo cáo là tương đương > 100.000 USD), và bỏ qua các số dư nhỏ để hạn chế spam approval có thể cảnh báo người dùng khi kiểm tra các bản ghi của eth_sendTransaction. attacker đổi mới hợp đồng chi tiêu một lần giữa thời gian — một địa chỉ mới thay thế địa chỉ đầu tiên — cho thấy họ nhận thức được rằng hệ thống theo dõi approval của Etherscan có thể phát hiện một người chi tiêu duy nhất có hơn 100 approval vô hạn. Giai đoạn thu thập được được phân phối theo từng giờ, không phải một khối, điều này giúp giữ phí gas ở mức trung bình và các biểu đồ TVL trông mượt mà hơn; TVL của Badger lớn đến mức một sự giảm 5–10 triệu USD trông giống như sự biến động bình thường khi rút tiền từ kho.
Khác với các cuộc tấn công cho vay flash phải thành công một cách đồng bộ (thất bại = quay lại = không có thiệt hại), cuộc tấn công này có đặc tính ngược lại: mỗi nạn nhân là độc lập. Cách duy nhất để thu thập và tiêu hao các phiếu chấp thuận của một người dùng là không ảnh hưởng đến người dùng tiếp theo. Điều đó có nghĩa là attacker không cần phải mạo hiểm với việc quay lại sẽ làm lộ toàn bộ kế hoạch, và không cần vốn ngoài gas. Chi phí của cuộc tấn công là khoảng vài chục đô la trong gas cho các cuộc thanh tra; chi phí để đăng ký là một khóa API bị đánh cắp hoặc brute force.
Rửa tiền: Tại sao việc trộn Bitcoin nặng là khó che giấu
Sau khi được thu thập, các nguồn tài chính đã được đồng nhất vào các EOA được kiểm soát bởi attacker – EOA chính được xác định trong quá trình phân tích sau khi sự cố là 0x1fcdb04d0c5364fbd92c73ca8af9baa72c269107 và hợp đồng chi tiêu liên quan. Phân tích pháp y của SlowMist và Chainalysis mô tả các bước tiếp theo:
- BTC-pegged loot đã được giải nén và đổi sang ETH. wBTC và ibBTC Curve LP phải được rút ra khỏi Badger/Curve, giải nén và đổi sang ETH thông qua Curve 3Pool và Uniswap để trở thành có thể trộn lẫn. Mỗi bước (rút tiền khỏi khoá → giải nén → đổi sang) tạo ra các sự kiện có thể theo dõi và sự trượt giá, và chậm trễ trong việc tập hợp so với vụ trộm tiền ETH bản địa.
Thuế giải nén là lý do tại sao các cuộc tấn công frontend/approval sau này chuyển sang mục tiêu các approvals gốc của ETH (ETH được đặt cọc, LP ổn định) khi có thể: số bước chuyển đổi giữa hành vi trộm cắp và bí mật thấp hơn.
Tiến trình chuyển tiền: Từ một approval giả đến BTC thực sự
Tối ưu hóa từ đầu đến cuối:
- Đăng nhập — Khóa API của Cloudflare bị đánh cắp (chi phí: lừa đảo hoặc đặt mật khẩu) → Tích hợp Worker trên
api.badger.com, ngày 10 tháng 11.
Điều không xảy ra là được xác định: không có đường dẫn DEX thất bại (không giống như ba lần quay lại Curve của Poly trong trường hợp front-running), không có việc tạm dừng phát hành (không giống như việc Tether tạm dừng 33 triệu USDT của Poly), không có sự ngừng hoạt động của chuỗi, và không có dấu vân tay cho vay flash (không giống như Cream/Beanstalk/Euler). Đường đi Badger là không thể nhìn thấy chính xác vì nó sử dụng các đường dẫn chính xác của hệ thống với các quyền được lấy bằng cách gian lận.
Trả lời: Tạm dừng, phân tích sau khi xảy ra sự cố và người nào đã trả tiền
Trả lời của BadgerDAO diễn ra theo đồng hồ sự cố DeFi tiêu chuẩn, nhưng với thái độ bồi thường đáng chú ý.
Điều khiển (2 tháng 12 năm 2021). Đội ngũ đã sử dụng chức năng quản trị pause() của kho, ngừng các khoản gửi, rút và tính lãi trên tất cả các Setts. Trang web chính được tắt, Cloudflare Workers và các khóa API đã bị hủy, và hash của mã độc đã được công bố để người dùng có thể xác minh việc xóa nó. Điều này ngăn chặn các quá trình rút tiền tiếp theo bằng transferFrom – nhưng đến lúc đó các approval quan trọng đã được lưu trữ dưới dạng hạn mức, vì vậy chỉ có các hành động phụ như tính lãi của attacker bị chặn.
Thông tin công bố (10/12/2021). Trong bản báo cáo sau sự cố, Cloudflare đã tiết lộ véc-tor API, cơ chế chèn Worker, thời gian hoàn toàn tiệt kiệm, và các biện pháp tăng cường được đề xuất: CSP + SRI trên giao diện trước, các token Cloudflare có phạm vi/không tồn tại lâu với liên kết IP và cảnh báo theo dõi, tính toán khóa trên giao diện trước, và chuyển đổi từ việc chấp thuận vô hạn làm giao diện người dùng mặc định. Bản báo cáo sau sự cố cũng đã khẳng định rằng hệ thống của Cloudflare không bị xâm nhập – một thông tin chứng minh đã bị đánh cắp – để tránh sai sót trong việc xác định nguyên nhân thất bại.
Thảo luận về phục hồi (tháng 12 năm 2021 – 2022). Mặt khác với Poly Network (nhà tấn công đã thỏa thuận về việc hoàn trả toàn bộ số tiền bị đánh cắp) hoặc Euler Finance (197 triệu USD được hoàn trả phần lớn), nhà tấn công của Badger không thỏa thuận và số tiền bị đánh cắp không thể được tạm dừng phát hành. Ban quản trị của Badger đã thảo luận về việc hoàn trả bằng cách sử dụng các khoản dự trữ của ngân hàng, phí giao thức và một khung phát hành mã thông báo mới; kế hoạch cuối cùng sử dụng một sự kết hợp của BADGER từ dự trữ và doanh thu phí theo thời gian. Dạy bài học cho người dùng là rằng chỉ đơn giản là pause() không thể lấy lại transferFrom sau khi đã được cấp quyền – đó là lý do tại sao các kiểm soát cấp ví (tạm dừng các dòng tiền, bảng điều khiển quyền hạn) hiện được coi là một phần của trách nhiệm của giao thức, không chỉ là UX của ví.
Tái tạo giao diện trước (2022). Sự cố đã thúc đẩy một quá trình khôi phục an ninh giao diện trước rộng hơn: Badger đã tái tạo chuỗi xử lý giao diện trước với các bản phát triển có ký hiệu CI, báo cáo CSP và quyết định rõ ràng để đối xử với các khóa phát triển trang web tương đương với các khóa phát triển hợp đồng trong an ninh hoạt động.
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 DAO Badger
Mẫu tấn công frontend của DeFi không phải là mới mẻ – năm 2022 đã chứng kiến sự chiếm quyền của frontend Curve (570.000 USD thông qua DNS), và năm 2025 thêm vào đó là sự vi phạm giao diện người dùng của ví Bybit Safe (1,4 tỷ USD) – nhưng Badger là trường hợp tham chiếu khi tất cả năm biện pháp phòng thủ tiêu chuẩn đều không có mặt cùng một lúc. Nếu có một trong những biện pháp đó, kết quả sẽ giảm hoặc bị loại bỏ hoàn toàn, chỉ còn 120 triệu USD.
1. Hạn chế phạm vi token API của Cloudflare (và tất cả các edge) xuống mức tối thiểu, với việc gắn và thay đổi. Không nên cho bất kỳ khóa API nào có quyền chỉnh sửa Workers+Zone, phạm vi toàn cầu, thời hạn TTL vô hạn và sử dụng có thể truy cập trên toàn thế giới. Thay thế tất cả các khóa tồn tại lâu dài bằng token có phạm vi (Workers: chỉ có thể chỉnh sửa cho khu vực cụ thể), gắn mỗi token với một danh sách IP cho phép / mTLS, thiết lập thời hạn hết hạn 30 ngày với thay đổi và thông báo về mỗi lần cập nhật mã lệnh Worker thông qua webhook theo dõi để gửi đến PagerDuty. Xử lý token viết của Worker như là một private key của nhà phát triển – vì nó là như vậy.
2. Cài đặt CSP + SRI trên mỗi giao diện đầu vào của DeFi và theo dõi điểm kết thúc báo cáo. Content-Security-Policy: script-src 'self' 'nonce- (không bao giờ là 'unsafe-inline') cộng với integrity="sha384- trên mỗi gói khiến trình duyệt từ chối một đoạn mã được chèn vào đầu cuối, bất kể nó đến từ đâu. Gửi một đường dẫn báo cáo và cảnh báo về vi phạm đầu tiên của CSP – vi phạm đó chính là tín hiệu xâm nhập, ngay từ ngày đầu tiên, không phải ngày thứ 22. Caching địa phương của hash đoạn mã tốt nhất được biết (ngoài CDN) cung cấp một tín hiệu canary thứ hai.
3. Kết thúc mặc định chấp thuận vô hạn – thực hiện giới hạn cho mỗi giao dịch và hủy bỏ chấp thuận. Người dùng đã quen với việc chấp thuận "MAX" để tiết kiệm gas. Các giao thức nên yêu cầu cấp phép chính xác hoặc hạn chế chặt chẽ (ví dụ, "số tiền + 5%" cho sự trễ, hoặc giới hạn cho mỗi khoản gửi) và ví nên nhắc nhở về sự thay đổi trong cấp phép ("chấp thuận này cho phép người chi kiểm soát toàn bộ số dư wBTC của bạn – có nên chấp thuận thay thế không?"). Tích hợp Revoke.cash / Etherscan Token Approvals như một bước vệ sinh sau giao dịch, và thêm một bảng điều khiển cấp giao thức để đánh dấu các địa chỉ có >10 chấp thuận vô hạn chưa được thực hiện cho cùng một người chi – mô hình tấn công Badger sẽ xuất hiện trong vòng vài giờ.
4. Chạy một canary kiểm tra toàn diện bên ngoài CDN. Một công việc cron bên ngoài Cloudflare (ví dụ, một canary được cố định trong một nhà cung cấp đám mây khác) tải về app.badger.com mỗi phút, tạo ra hash cho phản hồi và so sánh nó với hash được phát hành bởi CI sẽ báo cho biết 40 dòng bổ sung trong lần tải đầu tiên sau ngày 10 tháng 11. Các log của Cloudflare đã hiển thị một bản cập nhật của Worker, nhưng không có ai theo dõi; một canary bên ngoài loại bỏ tình huống "chú hổ bảo vệ nhà gà".
5. Thêm một giới hạn chuyển từ cấp kho. Mặc dù đã có approval, một kho có thể áp dụng giới hạn mức chuyển từ theo khối / theo giờ (ví dụ, dừng nếu > 2 triệu đô la của khối lượng chuyển từ hướng tới một người tiêu dùng duy nhất trong một khối, hoặc > 10 triệu đô la trong một giờ). Điều này không thay thế cho các approval — nó hạn chế phạm vi tác động khi lớp chấp thuận bị xâm phạm. Các quy trình cho vay đã áp dụng giới hạn cho vay sau Aave v3; các quy trình kho / tổng hợp nên áp dụng giới hạn chuyển từ để hạn chế các rủi ro lớn về việc rút tiền theo lô. Kết hợp với một hàm pause() cũng ngừng chuyển từ đối với các người tiêu dùng được đánh dấu, điều này sẽ hạn chế số tiền thu được chỉ ở một phần nhỏ của 120 triệu đô la.
Các yếu tố này tạo thành một mô hình cạnh giới hạn tin cậy: (1) loại bỏ bề mặt ghi dữ liệu, (2) làm cho việc ghi dữ liệu thành công trở nên vô hại trong trình duyệt, (3) loại bỏ vũ khí ghi dữ liệu vô hạn của trình duyệt, (4) phát hiện việc ghi dữ liệu ngay cả khi (2) bị bỏ qua, và (5) ngăn chặn thiệt hại khi tất cả các yếu tố (1)–(4) thất bại. Badger không có bất kỳ yếu tố nào; mỗi giao thức cung cấp giao diện trước có hơn 10 triệu đồng tiền bảo lãnh nên phải có tất cả năm yếu tố này.
Những câu hỏi thường gặp
Số tiền bị đánh cắp trong vụ tấn công Badger DAO là bao nhiêu? Khoảng 120 triệu USD (các nhà tổng hợp đưa ra con số 120–121 triệu USD tùy thuộc vào giá chụp nhanh ETH/BTC vào ngày 2 tháng 12 năm 2021). Bên cạnh đó, thành phần lớn nhất là khoảng 2.100 BTC trong wBTC/ibBTC cộng với 151 BADGER và Curve vault LP token (bveCVX, bCRV). Có khoảng 100 ví bị ảnh hưởng, trong đó thiệt hại lớn nhất là khoảng 50 triệu USD. Trong bản phân tích sau vụ việc của giao thức, PeckShield, BlockSec và SlowMist đều đưa ra con số 120 triệu USD với sai số trong phạm vi 1% – sự chênh lệch này do thời điểm chuyển đổi USD, không phải do bằng chứng mới trên chuỗi.
DAO Badger bị tấn công như thế nào? Đó là một cuộc tấn công frontend exploit DeFi, không phải lỗi trong smart contract. Một attacker đã đánh cắp một khóa API của Cloudflare, sử dụng nó để chèn ~40 dòng JavaScript vào app.badger.com thông qua một Worker của Cloudflare, và cho phép mã đó tạm dừng window.ethereum.request để mỗi giao dịch kho chứa hợp pháp của người dùng có số dư lớn cũng ký một infinite approve(attacker, MAX) cho wBTC, BADGER và các token kho chứa. Từ vài ngày đến vài tuần sau đó, attacker đã gọi transferFrom(victim, attacker, amount) để rút từng hạn mức vô hạn theo từng lô. Các hợp đồng kho chứa đã hoạt động đúng cách – approval mà chúng tôn trọng đã được lấy bằng cách gian lận trong trình duyệt. Xem biểu đồ nguyên nhân gốc ở trên để xem toàn bộ chuỗi.
Làm thế nào một lỗ hổng front-end khác với một lỗi hack smart-contract? Một lỗi hack smart-contract (ví dụ, việc gian lận giá pricePerShare của Cream, lỗi về khoản đóng góp của Euler) khai thác logic bên trong hợp đồng để giao dịch mà người dùng ký được thực hiện theo cách khác so với mong muốn của chuỗi. Một lỗ hổng front-end như Badger thay đổi các điều người dùng ký – chuỗi tôn trọng nó chính xác như đã ký, nhưng giao diện người dùng nói dối về người chi tiêu. Đó là lý do tại sao các kiểm toán hợp đồng không phát hiện ra Badger: lỗi đó là một trang web bị xâm phạm, không phải là một biến cố bị xâm phạm. Vì vậy, phòng thủ nằm trong trình duyệt và CDN (CSP, SRI, vệ sinh token), không chỉ trong Solidity.
Tiền bị đánh cắp đã bị đóng băng hay được trả lại chưa? Không, không có sự phục hồi nào – 0%. Mặt khác với vụ tấn công mạng của mạng Poly, nơi Tether đã đóng băng 33 triệu USDT, số tiền được cướp của Badger chủ yếu là wBTC/ibBTC và các token LP trong kho, không thể đóng băng trung tâm, và ETH được trao đổi đi đã đến Tornado Cash (trước khi bị cấm vào năm 2021) trong khoảng 100 lô ETH – Chainalysis đã theo dõi khoảng 70 triệu USD+ thông qua máy trộn vào tháng 1 năm 2022. attacker không đàm phán về việc trả lại (so sánh với việc Poly trả lại toàn bộ 611 triệu USD). Quỹ BADGER và phí giao thức của Badger đã tài trợ cho việc hoàn trả trong suốt năm 2022.
Có thể tôi hủy duyệt một token xấu sau khi bị tấn công ở phía trước không? Có — và đây là hành động của người dùng có tác động lớn nhất. Duyệt (spender, MAX) cho phép quyền chuyển từ cho đến khi bạn cụ thể hủy bỏ nó. Sử dụng Revoke.cash, công cụ kiểm tra Duyệt token của Etherscan hoặc gọi trực tiếp approve(spender, 0), sau đó thay đổi ví mới cho hoạt động mới. Hủy duyệt là một nút tắt tức thì có chi phí gas: một khi hạn mức là 0, attacker không thể thu thập token đó lại ngay cả khi họ vẫn giữ hợp đồng spender. Như một thói quen, chỉ duyệt số tiền chính xác bạn định gửi và giữ cho bề mặt hạn mức của bạn được hiển thị trong bảng điều khiển duyệt của ví.
Điều gì đã thay đổi trong bảo mật DeFi sau vụ hack Badger DAO? Ba thực tiễn đã trở thành tiêu chuẩn cho bất kỳ giao diện trước (frontend) nào có thể yêu cầu approval token. Thứ nhất, chăm sóc token của Cloudflare — token có phạm vi, thời hạn ngắn, liên kết với địa chỉ IP và cảnh báo theo hồ sơ kiểm toán — giờ đây là một mục trong danh sách kiểm tra hoạt động, không phải là một điều cần suy nghĩ sau. Thứ hai, CSP + SRI + canary bên ngoài là ba yếu tố phòng thủ được mong đợi của trình duyệt; các nhà kiểm toán (BlockSec, CertiK, Trail of Bits) giờ đây bao gồm các đánh giá về giới hạn tin cậy của giao diện trước cùng với kiểm toán hợp đồng. Thứ ba, cải cách UX approval — giới hạn theo giao dịch, yêu cầu thay đổi cho phép và nhắc nhở hủy bỏ sau giao dịch — được tích hợp trong ví và các quy trình có danh sách token kho báu BTC hoặc có lợi suất như tài sản đảm bảo. Các sự cố giao diện trước sau này (Curve DNS chiếm đoạt 570.000 USD, giao diện UI của Bybit 1,4 tỷ USD) củng cố bài học của Badger: trang web là một phần của bề mặt tấn công và phải được bảo vệ như một kho báu.
Kết luận
Sự tấn công của DAO Badger đã biến bài học khó khăn nhất của DeFi thành một con số duy nhất: 120 triệu đô la, được lấy đi mà không vi phạm bất kỳ hợp đồng nào, bằng cách phá vỡ trang web yêu cầu người dùng ký. Các kho được kiểm toán, chuỗi hoạt động minh bạch, toán học đúng – và tất cả đều không quan trọng vì một khóa API của Cloudflare có phạm vi rộng và không có ràng buộc có thể thản nhiên thay đổi app.badger.com trong 22 ngày. Mỗi nạn nhân đã ký vào một khoản gửi trông giống như một khoản gửi và thực sự đã ký mất quyền kiểm soát vô hạn đối với tài sản được gắn với Bitcoin; sau đó, attacker đã xem các quyền đó như một ngân hàng.
Khung này lại định nghĩa lại những gì được coi là an toàn. Một giao thức DeFi không phải là một tập hợp các smart contract có trang web trên đó – nó là một sự kiện ký kết diễn ra trong trình duyệt, được truyền tải bởi một CDN, được hiển thị bằng JavaScript và được nói nhẹ nhàng với một ví mà hầu hết người dùng tin tưởng ngay từ cái nhìn đầu tiên. Hủy hoại bất kỳ một trong những liên kết đó và các hợp đồng sẽ làm chính xác những gì chúng được chỉ định với số tiền mà chúng không bao giờ được chạm vào. Các giải pháp – token có phạm vi, CSP/SRI, tính toán bằng gà mồi, tối giản hóa approval và giới hạn tốc độ cấp kho – đều cũ hơn DeFi chính nó. Chúng đơn giản chưa được triển khai trên trang duy nhất mà chúng quan trọng nhất. Trong DeFi, mỗi approval mới là một chìa khóa mới, và mỗi giao diện trước là một cánh cửa kho với private key của nó.
