Làn sóng tấn công DeFi: Hơn 200 triệu USD bị đánh cắp trong tháng 5 – Ai là nạn nhân tiếp theo?
Võ Tuấn
Cái bug hôm qua, bài học hôm nay. #DeFi
Hơn 200 triệu USD đã bốc hơi khỏi các giao thức DeFi chỉ trong tháng 5 vừa qua. Đây không phải là một con số dự báo từ báo cáo phân tích thị trường. Đây là tổng thiệt hại tôi tổng hợp từ ba vụ tấn công riêng biệt: một lending pool trên Arbitrum (85 triệu USD), một cross-chain bridge (73 triệu USD), và một yield aggregator (42 triệu USD). Cả ba đều có một điểm chung: mã nguồn đã được audit bởi các công ty uy tín. Nhưng audit không đồng nghĩa với an toàn tuyệt đối. Đó là bài học đắt giá nhất mà tháng 5 này để lại.
Thị trường đang tăng, TVL các pool thanh khoản đổ về như nước. Các dApp cạnh tranh nhau bằng APY khủng, lôi kéo người dùng bằng những token vô giá trị. Nhưng sau 8 năm lội trong đống hợp đồng thông minh, tôi biết một sự thật: APY càng cao, rủi ro càng lớn. Không phải ngẫu nhiên mà ba vụ tấn công đều xảy ra vào giai đoạn thị trường nóng nhất. Khi FOMO lên đỉnh, khi mọi người đổ xô vào các pool để kiếm lợi nhuận, đó chính xác là lúc kẻ tấn công kích hoạt những lỗ hổng mà họ đã âm thầm chuẩn bị từ nhiều tháng trước.
Lending pool bị tấn công trên Arbitrum là case study kinh điển. Hợp đồng cho phép người dùng vay tài sản thế chấp dưới dạng LP token. Lỗi logic nằm ở hàm tính toán giá trị tài sản thế chấp. Cụ thể, contract sử dụng một oracle giá trên chuỗi, nhưng không kiểm tra độ trễ (stale price). Kẻ tấn công đã tạo ra một liquidity pool giả trên một sàn DEX ít thanh khoản, thao túng giá LP token, sau đó dùng nó làm tài sản thế chấp để rút sạch pool lending. Tổng thiệt hại: 85 triệu USD. Điều đáng buồn là lỗi này đã từng được mô tả trong một bài báo kỹ thuật từ năm 2021. Nhưng team phát triển không đọc.
Bridge cross-chain bị tấn công vì một lý do tương tự. Protocol này sử dụng cơ chế xác thực tin nhắn dựa trên một bộ validators. Cơ chế hoạt động có vẻ an toàn: cần chữ ký từ 7 trên 10 validators để thông qua một giao dịch. Nhưng kẻ tấn công đã khai thác lỗ hổng trong hàm xử lý signature aggregation. Bằng cách gửi một mảng chữ ký rỗng, contract vẫn coi điều kiện xác thực là đạt. Kết quả: 73 triệu USD chuyển sang một chain lạ mà không ai biết. Tôi đã thấy kiểu lỗi này ít nhất ba lần trong các audit của mình. Nó xuất phát từ việc lập trình viên tin tưởng rằng dữ liệu đầu vào luôn đúng, thay vì kiểm tra triệt để.
Yield aggregator bị tấn công thông qua một lỗi reentrancy cổ điển. Hợp đồng thông minh cho phép người dùng rút tiền trước khi cập nhật số dư. Kẻ tấn công đã gọi hàm rút nhiều lần trong cùng một giao dịch, rút tổng cộng gấp 10 lần số dư thực tế. 42 triệu USD biến mất chỉ trong 12 giây. Điều trớ trêu là phiên bản đầu tiên của contract này đã được audit bởi một công ty hàng đầu. Nhưng bản nâng cấp sau đó đã thêm một tính năng mới mà không audit lại. Đó là lỗi mà tôi gọi là “upgrade without audit” – nguyên nhân số một dẫn đến thảm họa trong DeFi.
Nhìn từ góc độ bảo mật, cả ba vụ tấn công đều có thể phòng tránh. Lending pool cần kiểm tra độ trễ oracle và giới hạn giá trị thế chấp từ các pool thanh khoản giả. Bridge cần kiểm tra mảng chữ ký không rỗng. Aggregator cần tuân thủ mô hình Checks-Effects-Interactions. Không có kỹ thuật hack nào mới. Chỉ là sự lười biếng trong kiểm thử và sự thiếu hiểu biết về các lỗ hổng đã được phát hiện từ lâu. Nhưng thị trường tăng đang che đậy tất cả.
Tôi có một quan điểm khác biệt với đám đông. Họ bảo rằng “audit là đủ”, rằng “hợp đồng đã được verify”. Sai. Audit chỉ là một bức ảnh chụp ở một thời điểm. Mỗi lần thêm code mới, mỗi lần thay đổi tham số, mỗi lần triển khai lại, bạn đã tạo ra một hợp đồng mới cần được kiểm tra lại. Hơn 60% các vụ hack đến từ các bản nâng cấp, không phải từ code gốc. Các protocol nên xem audit như một quy trình liên tục, chứ không phải một cái mốc “đã xong”.
Dựa trên kinh nghiệm của tôi, những lỗ hổng này sẽ còn lặp lại trong các giao thức khác. Đặc biệt trong các dự án đang chạy chiến dịch liquidity mining, nơi tốc độ phát triển được ưu tiên hơn bảo mật. Kẻ tấn công chỉ cần scan các block mới để tìm các contract chưa được audit, hoặc các contract nâng cấp thiếu kiểm tra. Và khi thị trường tăng, lượng thanh khoản lớn sẵn sàng để rút, khiến động cơ tấn công càng mạnh.
Liệu chu kỳ tấn công này có dừng lại? Tôi không lạc quan. Chỉ cần một dự án chạy farm APY 1000% trên một contract chưa audit, thì kẻ hack sẽ luôn chờ sẵn. Người dùng cần tự hỏi: Tôi có hiểu code của giao thức mình đang gửi tiền vào không? Hay tôi chỉ thấy con số APY rồi nhấn Approve? Dữ liệu tháng 5 cho thấy câu trả lời quá rõ ràng.