Hàm fallback
1 có thể gây ra một lỗ hổng phổ biến và nghiêm trọng: reentrancy.
Xét contract dưới đây:
Để khai thác contract này, đầu tiên attacker sẽ gọi hàm deposit
để đăng ký địa chỉ của hắn vào mapping balances
cũng như là gọi hàm withdraw
lần đầu tiên
Sau đó, attacker sẽ tạo ra một hàm fallback
mà có gọi sử dụng hàm withdraw
của contract FallbackVulnerability
:
Câu lệnh msg.sender.call.value(_amount)("");
ở trong hàm withdraw
sẽ gọi hàm fallback
và hàm này sẽ tiếp tục gọi withdraw
. Việc này sẽ ngăn cho câu lệnh balances[msg.sender] -= _amount;
được thực thi. Dẫn đến, tài khoản của kẻ tấn công luôn thỏa điều kiện ở trong câu lệnh if
.
Attack cũng có thể sử dụng hàm receive
thay cho fallback
vì FallbackVulnerability
chỉ gửi msg.value
mà không gửi msg.data
.