Hợp đồng tiền điện tử DBXen bị tấn công sáng 12/03, thiệt hại ước tính khoảng 150.000 USD do lỗi xử lý không nhất quán danh tính sender trong giao dịch ERC2771.
Sự cố xuất phát từ việc dùng hai nguồn sender khác nhau trong cùng luồng đốt token, làm sai lệch trạng thái theo chu kỳ và phá vỡ logic tính toán của các hàm nhận phí và phần thưởng, tạo cơ hội rút tiền vượt mức.
- DBXen bị tấn công, tổn thất ước tính 150.000 USD.
- Lỗi do không nhất quán _msgSender() và msg.sender trong ERC2771.
- Phá vỡ claimFees()/claimRewards(), cho phép rút dư tiền.
Nguyên nhân kỹ thuật: lệch sender giữa _msgSender() và msg.sender
Vấn đề cốt lõi là danh tính sender không đồng nhất trong giao dịch ERC2771, khiến cập nhật trạng thái cho user và forwarder bị lệch nhau.
Trong hàm burnBatch(), decorator gasWrapper() dùng _msgSender() (user thực) để cập nhật state. Nhưng callback onTokenBurned() lại dùng msg.sender (forwarder). Hệ quả: accCycleBatchesBurned được ghi nhận cho user, còn lastActiveCycle bị cập nhật nhầm cho forwarder.
Sự không nhất quán này làm đứt mạch logic theo chu kỳ, tạo ra trạng thái on-chain sai: dữ liệu burned batches và chu kỳ hoạt động không còn khớp cùng một thực thể, dẫn đến các phép tính tiếp theo dựa trên giả định sai.
Cách lỗi dẫn đến rút tiền vượt mức: sai logic claimFees và claimRewards
Khi chạy updateStats() cho user, hợp đồng hiểu nhầm còn burned batches chưa xử lý, làm tính sai rewards và fees, giúp kẻ tấn công rút thêm tiền để hưởng lợi.
Cụ thể, vì accCycleBatchesBurned đã được cập nhật cho user nhưng lastActiveCycle của user không được cập nhật tương ứng, hợp đồng suy luận sai rằng vẫn tồn tại burned batches chưa được xử lý trong chu kỳ. Từ đó, logic của claimFees() và claimRewards() bị phá vỡ, dẫn đến việc tính toán phần thưởng/phí cao hơn thực tế.
Theo giám sát, vụ tấn công được ghi nhận vào sáng 12/03 và ước tính gây thiệt hại khoảng 150.000 USD.





