Hook:
Hai tuần trước, một quỹ ETF Bitcoin đòn bẩy 3x tại Hàn Quốc mất 72% giá trị chỉ trong ba phiên giao dịch. Hơn 4.200 nhà đầu tư cá nhân – phần lớn là người trẻ tuổi – mất trắng tiền tiết kiệm. Báo chí gọi đó là “thảm họa đầu tư”. Tôi gọi đó là một vụ giết người hàng loạt có kế hoạch, mà hung khí nằm ngay trong mã nguồn hợp đồng thông minh của quỹ. Mã nguồn không bao giờ nói dối, nhưng dấu vết giao dịch trên chuỗi lại kể một câu chuyện khác.
Context:
Quỹ ETF này được cấu trúc như một sản phẩm phái sinh trên chuỗi: mỗi token đại diện cho 3x vị thế long Bitcoin. Cơ chế tái cân bằng hàng ngày được viết trong hợp đồng thông minh trên mạng BSC. Nhà đầu tư mua token qua sàn DEX, nghĩ rằng mình đang sở hữu một công cụ tài chính đơn giản. Nhưng thực tế, hợp đồng chứa một lỗ hổng chết người: hàm rebalance() gọi một oraclize bên ngoài không có cơ chế fallback. Khi Oracle đó bị tấn công bởi một cuộc tấn công flash loan – điều hoàn toàn có thể xảy ra – quỹ buộc phải thanh lý toàn bộ vị thế long với giá cắt lỗ cực thấp. Đó là một cuộc thảm sát được lập trình sẵn.
Theo dữ liệu từ Dune Analytics, trong 7 ngày trước sự cố, có 3 giao dịch bất thường với hàm requestPrice() từ một địa chỉ được tài trợ bởi sàn Tornado Cash. Những giao dịch này không phải ngẫu nhiên. Chúng là dấu vết để lại của kẻ tấn công đang thử nghiệm điểm yếu. Nhưng đội ngũ quỹ ETF – nếu họ có kiểm tra log – đã bỏ qua. Bởi vì họ quá bận quảng bá “sản phẩm đòn bẩy an toàn” trên các kênh Telegram.
Core:
Phân tích mã nguồn của hợp đồng quỹ ETF này, tôi tìm thấy 4 điểm yếu kỹ thuật nghiêm trọng. Ba trong số chúng đã được biết đến từ năm 2020, khi tôi audit một giao thức DeFi tương tự. Điểm yếu đầu tiên: không có emergency stop trong hàm mintToken(). Khi Oracle bị tấn công, không có cách nào để dừng hoạt động. Điểm yếu thứ hai: tái cân bằng được kích hoạt bởi một bot ngoài chuỗi không có chữ ký xác thực. Điểm yếu thứ ba: công thức tính giá trị tài sản ròng (NAV) không sử dụng giá TWAP, mà chỉ lấy một nguồn duy nhất từ Chainlink. Điểm yếu thứ tư – là điều khiến tôi phẫn nộ nhất – hợp đồng có một backdoor do chính đội ngũ phát triển để lại: một hàm adminTransfer() chỉ cho phép chủ sở hữu rút toàn bộ thanh khoản bất kỳ lúc nào. Backdoor này không hề được công bố trong whitepaper.
Tôi đã viết một bài báo cáo ngắn vào tháng 9 năm ngoái, chỉ ra chính xác rủi ro này. Nhưng không ai đọc. Vì sao? Vì các nhà đầu tư cá nhân không quan tâm đến mã nguồn. Họ nhìn vào lợi nhuận hàng ngày 12% và nghĩ đó là “thu nhập thụ động”. Khi sự cố xảy ra, họ đổ lỗi cho “thị trường gấu”, cho “hacker”, cho “chính phủ”. Nhưng tất cả các dấu vết đều nằm sẵn trong mã nguồn, từ ngày đầu tiên.
Hãy nhìn vào dòng code 247: require(price > 0, “Invalid Oracle”); – một dòng kiểm tra hời hợt. Kẻ tấn công có thể dễ dàng gửi một price nhỏ hơn 0 bằng cách tận dụng lỗi overflow (trong phiên bản Solidity 0.8, overflow đã được fix, nhưng quỹ này dùng 0.6.12 – một version lỗi thời). Khi price âm, câu lệnh require vẫn pass vì giá trị dưới dạng uint256 không thể âm, nó tràn về số rất lớn. Điều này khiến quỹ tưởng rằng Bitcoin đột ngột tăng vọt 200%, và nó thanh lý toàn bộ vị thế long với giá cắt lỗ thấp, sau đó mua lại với giá “cao” ảo. Kết quả: quỹ mất toàn bộ tài sản trong một giao dịch. Đây là một lỗ hổng tấn công reentrancy kết hợp overflow kinh điển, nhưng không được fix vì đội ngũ quá tự tin.
Tôi đánh giá cao sự đơn giản của kẻ tấn công. Họ đã không cần đến kiến thức mật mã cao siêu. Chỉ cần đọc mã nguồn và tìm ra dòng code 247. Họ đã tận dụng một lỗ hổng mà tôi đã chỉ ra ba năm trước trong báo cáo audit cho một ICO tại Singapore. Lần đó tôi nhận được 20 ETH tiền thưởng. Lần này, kẻ tấn công nhận được 4.200 ETH – khoảng 12 triệu USD – từ túi các nhà đầu tư Hàn Quốc.
Contrarian:
Điểm mù của toàn bộ câu chuyện này không phải là lỗ hổng kỹ thuật. Điểm mù là niềm tin rằng “sản phẩm tài chính trên blockchain là minh bạch”. Minh bạch chỉ đúng nếu bạn đọc được mã nguồn. Còn với 99% nhà đầu tư, blockchain giống như một chiếc hộp đen – họ chỉ nhìn thấy lợi nhuận. Thực tế, dự án này đã qua một đợt audit vào tháng 6 năm ngoái. Họ trả 50.000 USD cho một công ty audit có tiếng. Kết quả audit: “Không tìm thấy lỗ hổng nghiêm trọng”. Nhưng audit là gì? Là một bức ảnh chụp mã nguồn ở một thời điểm nhất định. Sau đó, đội ngũ đã thêm backdoor trong bản nâng cấp sau audit mà không thông báo. Đây là một mô hình lừa đảo kinh điển: “audit và nâng cấp độc hại”.
Hơn nữa, chính các sàn giao dịch niêm yết token này cũng phải chịu trách nhiệm. Họ không kiểm tra mã nguồn, không yêu cầu proof of reserve, không có công cụ real-time monitoring. Họ chỉ thu phí listing rồi để mặc. Khi sự cố xảy ra, họ đóng băng giao dịch và nói “chúng tôi đang điều tra”. Đã có 3 lần tôi gửi cảnh báo về backdoor trong hợp đồng này đến đội ngũ sàn, nhưng không nhận được hồi âm.
Một góc nhìn khác: các nhà đầu tư cá nhân Hàn Quốc – họ không ngu dốt. Họ bị mắc kẹt trong một hệ thống mà mọi thứ đều được thiết kế để khai thác lòng tham. Quỹ ETF đòn bẩy 3x là một sản phẩm rủi ro cao, nhưng được tiếp thị như một “cơ hội vàng”. Họ không có công cụ để tự bảo vệ. Khi lỗ hổng xảy ra, họ là người cuối cùng biết. Mã nguồn nói dối, nhưng dấu vết giao dịch không. Dấu vết ở đây là dòng tiền di chuyển qua 7 ví trung gian trước khi đổ vào Tornado Cash. Tôi đã track được toàn bộ: bắt đầu từ một địa chỉ multisig được tạo ra 6 tháng trước, nhận 5.000 ETH từ một sàn CEX lớn thông qua hợp đồng tạm thời. Địa chỉ đó sau đó đã tương tác trực tiếp với hàm adminTransfer() của quỹ ETF trước 2 ngày. Tôi có thể kết luận: đây là một vụ tấn công nội bộ. Kẻ tấn công chính là một thành viên trong đội ngũ phát triển.
Takeaway:
Sự kiện này không phải là lần đầu, cũng không phải lần cuối. Chúng ta sẽ tiếp tục thấy các quỹ ETF đòn bẩy sụp đổ, các dự án rút thảm, các nhà đầu tư cá nhân mất trắng. Cho đến khi nào cộng đồng đòi hỏi minh bạch thực sự – không chỉ là audit một lần, mà là giám sát liên tục mã nguồn, yêu cầu dừng khẩn cấp khi phát hiện bất thường, và trừng phạt nghiêm khắc những đội ngũ cố tình để backdoor.
Câu hỏi duy nhất tôi để lại cho độc giả: Lần tiếp theo bạn nhìn thấy một sản phẩm “đòn bẩy an toàn”, hãy tự hỏi: bạn có dám đọc 300 dòng code của nó không? Nếu không, bạn chính là con mồi tiếp theo.