**Reentrancy vẫn là kẻ thù số một.**
Tuần trước, một giao thức bridge cross-chain mới huy động 50 triệu USD từ các quỹ đầu tư lớn. Tôi dành hai đêm để đọc mã nguồn Solidity của họ, và phát hiện ra điều tương tự: lỗ hổng reentrancy trong hàm withdraw() - giống y hệt cái tôi tìm thấy năm 2017 trong hợp đồng ICO Aragon One. Bytecode không bao giờ nói dối. Và nó đang nói: bridge này, nếu triển khai mà không vá, có thể mất toàn bộ tài sản.
Context: Cơ Chế Bridge Và Reentrancy
Bridge cross-chain hoạt động bằng cách giữ tài sản ở một contract trên chain nguồn, sau đó mint token tương ứng trên chain đích. Khi người dùng rút tài sản, contract gọi hàm withdraw() để chuyển ETH hoặc token ERC-20. Vấn đề là: nếu contract đích (receiver) là một contract thông minh, nó có thể có fallback function gọi lại contract bridge trước khi state được cập nhật.
Reentrancy là lỗi kinh điển: attacker gọi withdraw(), contract gửi ETH đến contract của attacker, fallback function của attacker gọi lại withdraw() lần nữa trước khi số dư của attacker được set về 0. Kết quả: attacker rút được nhiều lần số tiền thực tế.

Bridge mới này dùng mô hình "lock-mint-unlock-burn". Hàm withdraw() có dạng:
