Dưới đây là một số lỗi phổ biến trong mã Solidity mà hacker có thể tận dụng, cùng với ví dụ code mô phỏng cho mỗi lỗi:
- Lỗi tràn kiểu (Integer Overflow/Underflow):
function transferTokens(uint256 amount) public {
require(balance[msg.sender] >= amount);
balance[msg.sender] -= amount;
balance[hackerAddress] += amount;
}
- Lỗi hàm fallback không an toàn:
fallback() external payable {
balance[msg.sender] += msg.value;
}
- Lỗi Reentrancy:
mapping(address => uint256) balances;
function withdrawBalance() public {
uint256 amount = balances[msg.sender];
require(amount > 0);
(bool success, ) = msg.sender.call.value(amount)("");
if (success) {
balances[msg.sender] = 0;
}
}
- Lỗi phân quyền (Permission):
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function changeOwner(address newOwner) public onlyOwner {
owner = newOwner;
}
- Lỗi Solidity version:
Không có ví dụ mã cụ thể, nhưng việc sử dụng phiên bản Solidity cũ hơn có thể gây ra lỗi bảo mật. Vì vậy, luôn nên sử dụng phiên bản Solidity mới nhất để tận dụng các bản vá lỗi và nâng cao bảo mật.
- Lỗi tấn công DoS (Denial of Service):
Không có ví dụ mã cụ thể, nhưng hacker có thể tấn công bằng cách gửi các giao dịch phức tạp và tốn nhiều thời gian thực thi, gây ra tắc nghẽn hệ thống hoặc tiêu tốn tài nguyên.
- Lỗi phụ thuộc bên ngoài (External Dependency):
Không có ví dụ mã cụ thể, nhưng hacker có thể tận dụng lỗi trong việc xử lý dữ liệu từ nguồn bên ngoài để thay đổi hoặc làm sai lệch dữ liệu.
- Lỗi Solidity Compiler:
Không có ví dụ mã cụ thể, nhưng các lỗi hoặc lỗ hổng trong trình biên dịch Solidity có thể tạo ra các vấn đề bảo mật trong mã.
Lưu ý rằng các ví dụ trên chỉ mang tính chất minh họa và không phản ánh tất cả các trường hợp lỗi. Để tránh các lỗi trên, lập trình viên Solidity nên tuân thủ các quy tắc bảo mật, kiểm tra đầy đủ và kiểm tra lại mã, sử dụng các thư viện an toàn và cập nhật phiên bản Solidity mới nhất.
Tham khảo thêm về 10 tiêu chuẩn OWASP Smart contract
Digital Marketing Specialist