Derod memory consumption bug lead to DoS

Dero là một blockchain có công nghệ rất tốt, nhiều tiềm năng mà tôi đã có bài viết review. Trong quá trình tìm hiểu codebase của nó, tôi đã tìm ra một bug trong handshake protocol của derod - node của dero network. Lỗi này cho phép bất cứ attacker nào gửi một lượng lớn dữ liệu dẫn đến derod bị bội thực RAM mà chết :)

Sau đây là quá trình tôi tìm ra bug, kèm theo mã khai thác.

Package p2p phụ trách giao tiếp giữa các node với nhau. Package này xử lý một giao thức custom chạy trên tcp. Trong đó, bước đầu tiên là Handshake. Hãy cùng xem file handshake.go và xem nó handle handshake như thế nào.

Handshake có nhiều trường, nhưng có một trường đáng chú ý là PeerList. Trường này chứa danh sách là địa chỉ ip:port của các peers đang kết nối đến node hiện tại. Mục đích của trường này là broadcast địa chỉ của các peers ra network. Nhờ đó mà network có thể hoạt động mà không cần một centralized server nào.
Tuy nhiên, trong hàm Handle_Handshake lại không có điều kiện nào kiểm tra độ dài của trường PeerList. Điều đó có nghĩa là chúng ta có thể gửi một số lượng rất lớn danh sách ip:port trong quá trình handshake. Nếu lượng peer list này không được kiểm tra và gỡ bỏ thường xuyên sẽ dẫn đến overload memory và crash.

Và quả nhiên dự đoán của mình là chính xác. Hàm Peer_Add thêm các peer trong trường PeerList vào một global variable gọi là peer_map được định nghĩa trong file peer_pool.go. Hàm này thêm dữ liệu vào mà không hề kiểm tra xem dữ liệu có khả dụng hay không. Ngoài ra, trong file này cũng có hàm clean_up dùng để dọn dẹp peer_map. Tuy nhiên hàm này lại được gọi quá ít (khoảng mỗi 18 tiếng đồng hồ). 

Ok, bắt đầu viết PoC thôi nào.

PoC cũng không có gì khó, lúc đầu mình sử dụng ipv4 để gen ra dữ liệu fake.
Với không gian địa chỉ ipv4 chúng ta sẽ có 4,294,967,296 * 65535 tổ hợp ip:port. Mỗi chuỗi này có độ dài tối thiểu là 10 byte. Như vậy lượng data tối đa có thể gửi = lượng RAM tối thiểu để không bị crash >= 4,294,967,296 * 65535 * 10 byte, làm tròn thành 2,8 triệu gigabyte.
Ngoài ra mình cũng viết thêm một hàm fake dummy data dùng ipv6, cơ mà chắc không cần dùng đến đâu ))

Sau khi submit bug thì Dero team đã rất nhanh phát hành một bản fix, đồng thời reward 3000 Dero. Bán ra luôn chắc được $3000. Nhưng do khá tin tưởng vào công nghệ của dự án này, nên hold thêm vài tháng, chờ Dero ra mainnet Stargate chắc cũng phải x10 :)

Kết

Tôi chỉ là dân nghiệp dư, không có học hành bài bản gì. Hi vọng bài write-up này có thể gợi mở cho bạn điều gì đó hữu ích. Công nghệ blockchain đang là hot trend và là mảnh đất màu mỡ cho bug bounty hunters. Đừng ngại thử sức nhé!

Nhận xét

  1. Lúc viết bài này $dero có giá $1. Hôm qua trước sell ở > $3 :) Chờ mua lại giá $2, không biết có xuống đến $2 không. Main net chắc chỉ vài tuần nữa.

    Trả lờiXóa
  2. Top 5 Casinos for United States Gambling - Poormans
    1. 코인 갤러리 Ignition Casino · 2. Ignition Casino · 3. Wild 모모벳 Casino · 4. The Stars Gambling 골드머니 · 5. 케이 벳 William Hill Casino 유흥싸이트 · 6. Casino Cruise Casino · 7. Las Atlantis · 8. Royal Vegas

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Fully Homomorphic Encryption (FHE) là gì? Có ý nghĩa như thế nào với công nghệ blockchain?

Giới thiệu về Dero blockchain - Fully Privacy Smart Contract