Vào ngày 2021-08-18, Pinecone Finance đã bị hacker tấn công và đã lấy đi khoảng 3.5M PCTs, tương đương giá trị khoảng #200K. Dưới là ảnh chụp các giao dịch rút tiền của hacker.
Sau khi phát hiện sự việc, nhóm dự án đã lần ra địa chỉ ví của tin tặc và tìm thấy một số giao dịch được liên kết với địa chỉ ví nóng của CEX bao gồm Binance, Okex và Huobi. Nhóm dự án đã liên hệ với CEX và sẽ làm việc cùng nhau để theo dõi danh tính của tin tặc để khôi phục tổn thất.
- Huobi: 0x44d71fd44e3781950a1a4a2ce7c0c2049f401e8a3cad6e35bc156e542f412020
- Okex: 0x0038dad17f52a493e927b8400347b4210f23e557b83d26604b56c5ea698fef1e
- Binance: 0x223bb09fff14f67cefd2c8b6d144c2732f3a05a7506cb43645feec871d165618
Binance sau đó đã thông báo giữ tài khoản của hacker: https://twitter.com/PineconeFinance/status/1428306286639128578. Ngày 2020-08-19, hacker gửi lại toàn bộ tài sản cho dự án: https://twitter.com/PineconeFinance/status/1428287136554393603
Lỗ hổng nào trong contract để hacker lợi dụng
Nguyên nhân chính là do lỗi “False Deposit Bug“, việc xử lý gửi tiền trong contract của Pinecone Finance. Mặc dù việc gửi tiền thất bại nhưng contract vẫn coi nó là khoản tiền gửi hợp lệ và thực hiện xử lý bình thường.
Chi tiết cuộc tấn công của hacker
Đây là một giao dịch của hacker: 0x10236426cbe9a6380b7990150013125a623784ed1002fe3e34d07ff89ffa2619. Hacker không có đủ PCT nhưng lại đặt cược 200K PCT vào kho tiền. Tuy nhiên giao dịch vẫn thành công và nhận cho hacker khoản tiền 200K PCT hợp lệ được đặt cọc.
Vấn đề ở đây là tại sao team phát triển lại sử dụng hàm safeTransfer(). Bởi vì các hàm này xử lý khi không đủ số dư thay vì hoàn nguyên, nó thay đổi số lượng thành số dư sẵn có của người dùng. Bạn xem chi tiết hơn source code trong tệp PineconeFarm.sol.
Lỗi đã được đội dự án fix chỉ bằng thay đổi 1 kí tự, nhưng nếu thực sự fix lỗi kiểu này tôi cảm thấy vẫn còn rủi ro, ví dụ như trường hợp điều kiện vẫn thỏa mãn nhưng gọi hàm safeTransferFrom() trả về false do chưa approve chẳng hạn. Đây chỉ là ý kiến cá nhân.
Chi tiết xem: https://twitter.com/peckshield/status/1428233500260511746
Tái hiện lỗi trên mỗi trường Testnet
Lỗi này thực sự rất dễ nhìn ra nên mình cũng không thực hiện tái hiện trên môi trường testnet.
Nguồn: Tổng hợp
Trả lời