Vụ khai thác lỗ hổng contract ClaimCampaigns vào ngày 2024-04-19.
Code trên github ở thời điểm viết bài này là bản đã sửa lỗi, chúng ta có thể check contract nguyên bản chứa lỗ hổng trên etherscan.
Vụ khai thác lỗ hổng contract ClaimCampaigns vào ngày 2024-04-19.
Code trên github ở thời điểm viết bài này là bản đã sửa lỗi, chúng ta có thể check contract nguyên bản chứa lỗ hổng trên etherscan.
Bài viết này trình bày chi tiết cách thức vụ hack PrismaFi diễn ra vào ngày 2024-03-28.
PrismaFi là ứng dụng tài chính phi tập trung (Decentralized Finance - Defi) cho phép user nạp tài sản thế chấp (Collateral - ETH hoặc những đồng token đại diện có giá trị tương đương) của mình vào và vay ra đồng tiền ổn định (tương đương USD). Mục đích của việc này là khi user muốn sử dụng tiền mặt nhưng ko muốn bán số ETH đang sở hữu vì thấy được tiềm năng tăng giá trong tương lai.
Uniswap là ứng dụng giao dịch phi tập trung phổ biến đầu tiên sử dụng Automated Market Maker (AMM) thay cho orderbook mà chúng ta thường thấy ở các sàn giao dịch tập trung hay chứng khoán truyền thống.
Orderbook là tập hợp các lệnh đặt mua và lệnh đặt bán từ tất cả người dùng muốn tham gia trao đổi 1 cặp tiền tệ hàng hóa, khi mà lệnh mua và lệnh bán khớp nhau thì giao dịch được thực hiện giữa 2 người.
Tuy nhiên để quản lý 1 orderbook với số lượng lớn các order tốn rất nhiều tài nguyên tính toán của máy tính. Trong bối cảnh Blockchain có khả năng tính toán xử lý giao dịch đầu tiên là Ethereum giai đoạn đầu thì việc xử lý lượng lớn các order update liên tục theo thời gian thực gần như là không thể.
Contract Solidity khi dịch ra bytecode không được quá 24kb nếu không giao dịch deploy contract sẽ bị reject.
EVM - Etherium Virtual Machine là chương trình thực thi bytecode (sau khi được dịch ra từ Solidity hay Rust).
Thư viện (Library) dùng trong contract sẽ đc compile và deploy ra 1 địa chỉ riêng khác với địa chỉ deploy contract. Sau đó trong contract bytecode, ở các vị trí gọi đến hàm public của thư viện sẽ được link đến địa chỉ deploy của thư viện và gọi hàm bằng cách sử dụng opcode delegatecall
của EVM.
Đối với các hàm internal của thư viện được dùng trong contract, bytecode của hàm sẽ được nhúng trực tiếp vào trong contract, và contract gọi đến hàm bằng cách dùng opcode JUMP
giống như gọi các hàm internal bên trong contract (khác với việc sử dụng delagatecall
đối với hàm public của thư viện). Lưu ý là chỉ những hàm internal được gọi mới được nhúng vào contract bytecode (maximum 24kb).
Selector
bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7