Tác giả gốc: Samczsun
Biên soạn gốc: Thực tập sinh TechFlow
Trong bản nâng cấp, hợp đồng đã đánh dấu 0x00 là gốc hợp lệ, Kết quả là Nomad chứa đầy thông tin sai lệch. Kẻ tấn công đã khai thác điều này để sao chép/dán các địa chỉ giao dịch hợp lệ và trong lúc hỗn loạn, tài sản trên cầu nhanh chóng bị cạn kiệt.
Nomad là một trong những vụ hack lộn xộn nhất mà tôi từng thấy trên Web3, tiêu tốn hơn 150 triệu USD cho đến nay. Chính xác thì điều này xảy ra như thế nào và nguyên nhân gốc rễ là gì? Cho phép tôi đưa bạn vào hậu trường.

Mọi chuyện bắt đầu Nhân viên CIA Chia sẻ trên kênh Telegram ETHSecurity Tweet của Spreek , mặc dù tôi không biết chuyện gì đã xảy ra vào thời điểm đó, nhưng lượng lớn tài sản rời khỏi cầu nối chuỗi rõ ràng là một dấu hiệu xấu.

Ý tưởng đầu tiên của tôi là rằng dấu thập phân mã thông báo được cấu hình không chính xác. Rốt cuộc, theo quan điểm của tôi, có vẻ như cây cầu xuyên chuỗi đang chạy Khuyến mãi "Gửi 0,01 WBTC, nhận lại 100 WBTC".

Tôi không tin Lúc đầu, tuy nhiên, sau khi thực hiện một số hoạt động khai thác thủ công trên mạng Moonbeam, tôi đã xác nhận rằng trường hợp này thực sự đúng, chỉ có 0,01 WBTC được chuyển từ Moonbeam, nhưng 100 WBTC được nhận trên Ethereum mà không rõ lý do.


Trong Ngoài ra, giao dịch bắc cầu của WBTC thực chất không có bước Chứng minh, nó chỉ gọi trực tiếp `Process`. Chỉ có thể nói rằng việc xử lý một tin nhắn mà không có bằng chứng là rất tệ.

Trong trường hợp này có Có hai khả năng, hoặc bằng chứng đã được gửi riêng trong khối trước đó hoặc có vấn đề lớn với hợp đồng Bản sao. Tuy nhiên, hoàn toàn không có dấu hiệu nào cho thấy bất kỳ thông tin gần đây nào đã được chứng minh độc lập.

Vì vậy, chỉ có khả năng tiếp theo - có một lỗ hổng chết người trong hợp đồng Replica, nhưng bằng cách nào? Xem nhanh thông tin cho thấy tin nhắn đã gửi phải thuộc về một gốc có thể chấp nhận được, nếu không việc kiểm tra trên dòng 185 sẽ không thành công.

May mắn thay, có một cách đơn giản để kiểm tra giả định này. Tôi biết thư mục gốc của thư chưa được kiểm tra là 0x00 vì messages[_messageHash] hiển thị dưới dạng chưa được khởi tạo và tất cả những gì tôi phải làm là kiểm tra xem hợp đồng có chấp nhận thư mục gốc này hay không.

Hợp đồng được chấp nhận.. . ...

Sự thật Hóa ra trong quá trình nâng cấp, nhóm Nomad đã khởi tạo gốc tin cậy thành 0x00. Nói một cách thẳng thắn, sử dụng giá trị 0 làm giá trị khởi tạo là một thông lệ. Thật không may, trong trường hợp này nó có tác dụng phụ nhỏ là tự động xác thực mọi tin nhắn.


Đó là lý do tại sao điều này lại rất khó hiểu - bạn không cần biết gì về Solidity hoặc Merkle Trees. Tất cả những gì bạn phải làm là tìm một giao dịch hợp lệ, tìm/thay thế địa chỉ của bên kia bằng địa chỉ của bạn và phát lại giao dịch đó.
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia