Reentrancy Attack là gì?
Reentrancy Attack là khi một hợp đồng chuyển quyền điều khiển sang hợp đồng khác trong quá trình gọi và mã bên ngoài đó nhảy trở lại hợp đồng ban đầu trước khi hợp đồng này kịp cập nhật hồ sơ. Mánh thời gian đó cho phép kẻ tấn công lặp lại các hành động nhạy cảm như rút tiền nhiều lần. Hãy tưởng tượng bạn yêu cầu hoàn tiền, rồi quay lại quầy trước khi thu ngân khóa két.
“Chỉ mã cũ mới bị Reentrancy Attack.” Không đúng. Bất kỳ hợp đồng nào gọi ra ngoài trước khi cố định trạng thái của chính nó đều có thể dễ bị tấn công nếu logic lỏng lẻo.
Cách hoạt động của Reentrancy Attack
Tóm tắt. Một hợp đồng thông minh điển hình có hàm rút tiền gửi quỹ cho người gọi. Nếu nó gửi tiền trước rồi mới xóa số dư, kẻ tấn công có thể chèn một hàm gọi lại và yêu cầu thêm trước khi số dư được đặt về 0.
- Bắt đầu: Kẻ tấn công gửi một ít tiền để tạo vẻ hợp lệ.
- Gọi: Kẻ tấn công kích hoạt hàm rút tiền trên hợp đồng mục tiêu.
- Hồi đáp: Hợp đồng mục tiêu gửi tiền, khiến hàm fallback của kẻ tấn công chạy.
- Lặp lại: Hàm fallback đó gọi lại hàm rút tiền trước khi số dư được cập nhật.
- Rút cạn: Vòng lặp tiếp diễn cho đến khi hợp đồng hết tiền hoặc hết gas. Đó chính là mánh.
Chỉ một sai lầm nhỏ về thứ tự, vấn đề lớn xuất hiện.
Tại sao Reentrancy Attack quan trọng
Bạn cần quan tâm vì lỗi về thời điểm có thể di chuyển tiền thật rất nhanh. Thêm nữa, đây là một dạng khai thác cổ điển mà mọi nhà phát triển và người dùng nên nhận ra ngay.
- Lợi ích: Nhận diện mẫu tấn công giúp bạn phát hiện mã rủi ro và bảo vệ quỹ.
- Góc nhìn: Nó lợi dụng tính công khai vì mọi thứ trên một blockchain đều có thể nhìn thấy và được gọi.
- Mức độ liên quan: Bạn sẽ gặp nó trong DeFi, cầu nối, kho bạc, thậm chí các khoản thanh toán quản trị cho DAO.
Thực hiện kiểm tra rồi cập nhật trạng thái rồi mới tương tác. Cập nhật số dư trước, sau đó mới gọi ra ngoài. Thêm một lớp bảo vệ chống Reentrancy Attack đơn giản để tăng an toàn.
Các đặc điểm chính của Reentrancy Attack
Dưới đây là những yếu tố làm cho nó hoạt động:
- Đệ quy: Mã bên ngoài gọi lại vào cùng một hợp đồng trước khi hành trình hoàn tất.
- Thứ tự: Lỗi xuất hiện khi gửi tiền hoặc gọi ra ngoài xảy ra trước khi cập nhật trạng thái.
- Chéo: Nó có thể bật qua nhiều hợp đồng, không chỉ một hàm.
- Tài sản: Hoạt động với ETH, token và thậm chí các khoản tín dụng kế toán nếu mã viết kém.
Các biến thể
Nhiều dạng khác nhau, cùng gây đau đầu cho mã lỏng lẻo:
- Đơn: Vào lại cùng một hàm nhiều lần.
- Chéo: Vào lại qua một hàm khác trong cùng hợp đồng.
- Nhiều hợp đồng: Vào lại giữa hai hoặc nhiều hợp đồng trong một vòng lặp.
- Chỉ đọc: Ảnh hưởng tới hàm view hoặc oracle giá để đánh lừa các ghi sau đó.
Sửa Reentrancy Attack không chỉ liên quan một hàm. Rà soát mọi lời gọi ra ngoài, thêm test cho các chuỗi gọi bất thường, và lên lịch kiểm toán định kỳ.
Ví dụ
Vụ khai thác The DAO năm 2016 lợi dụng vòng lặp reentrancy trên hàm rút tiền trước khi số dư được xóa, rút cạn một kho bạc lớn trong vài phút.
Thông tin thú vị
Câu khẩu hiệu cộng đồng "kiểm tra rồi cập nhật trạng thái rồi tương tác" xuất phát từ các hướng dẫn bảo mật ban đầu và được giữ lại vì ngắn gọn, dễ nhớ và thực tế hiệu quả.
Tóm tắt
Phiên bản rút gọn để bạn mang theo: nếu mã bên ngoài có thể gọi bạn trước khi bạn hoàn tất ghi sổ, hãy giả định nó sẽ làm vậy và bạn có thể trao tiền miễn phí. Đó chính là Reentrancy Attack.
