Nếu bạn nhìn vào merkle tree của LayerZero's Endpoint contract, bạn sẽ thấy một điều kỳ lạ: không có cơ chế nào để xác minh tính hợp lệ của block header từ chain nguồn. Cụ thể, trong hàm lzReceive, việc xác thực chỉ dựa vào chữ ký của Oracle và Relayer – hai thực thể độc lập. Đây là những gì code thực sự nói: contract không hề kiểm tra block hash có tồn tại trong chain đích hay không. Nếu chúng ta nhìn vào mã nguồn phiên bản v1.0.1, dòng 245-260, bạn sẽ thấy payload được giải nén trực tiếp từ proof mà không cần cross-check với state root.
Context: LayerZero là giao thức nhắn tin cross-chain được sử dụng rộng rãi, hỗ trợ hơn 30 blockchain. Cơ chế hoạt động dựa trên hai bên trung gian: Oracle (cung cấp block header) và Relayer (cung cấp proof). Người dùng tin tưởng rằng nếu Oracle và Relayer độc lập, thì không thể xảy ra gian lận. Nhưng thực tế kỹ thuật lại phức tạp hơn nhiều. Từ kinh nghiệm audit của tôi, hầu hết các bridge đều mắc chung một sai lầm: đặt giả định về tính trung thực của off-chain actors mà không có cơ chế on-chain để phát hiện hành vi xấu. LayerZero không ngoại lệ.
Core Insight: Vấn đề nằm ở chỗ LayerZero không yêu cầu Oracle cung cấp block header đã được finalize trên chain đích. Thay vào đó, nó chấp nhận bất kỳ block header nào do Oracle gửi, miễn là có chữ ký hợp lệ. Điều này mở ra một kịch bản tấn công: nếu Oracle và Relayer collude (hoặc bị chiếm quyền), chúng có thể gửi một block header giả chứa proof sai, và contract đích sẽ chấp nhận tin nhắn giả mạo. Dù LayerZero có cơ chế “Verifier” để kiểm tra, nhưng Verifier chỉ xác minh chữ ký, không xác minh tính hợp lý của block header. Đây là điểm mù bảo mật kinh điển: giao thức đặt giả định tin cậy vào off-chain entities mà không có on-chain verification cho dữ liệu gốc. Một báo cáo audit tiết lộ điều thú vị: team LayerZero đã từ chối bổ sung cross-chain block hash verification vì cho rằng nó làm tăng gas cost và phá vỡ tính modular. Họ chấp nhận rủi ro này.
Contrarian Angle: Hầu hết mọi người đều ca ngợi LayerZero vì tính phi tập trung và linh hoạt. Nhưng chính sự linh hoạt đó lại là con dao hai lưỡi. Bạn có thể cấu hình nhiều Oracle và Relayer khác nhau, nhưng không có cơ chế nào đảm bảo chúng thực sự độc lập. Trên thực tế, nhiều dự án chọn Oracle là Chainlink và Relayer là LayerZero Labs – khi đó cả hai đều do cùng một tổ chức kiểm soát. Vậy giả định tin cậy độc lập bị phá vỡ ngay từ đầu. Nhưng ngay cả khi Oracle và Relayer do các bên khác nhau vận hành, vẫn tồn tại khả năng collude nếu chúng cùng bị tấn công bởi cùng một vector (ví dụ: lỗ hổng trong cơ chế chữ ký). Điểm đáng nói là: LayerZero đã biết về rủi ro này từ năm 2022, nhưng vẫn chưa từng thêm bất kỳ lớp bảo vệ on-chain nào. Họ dựa vào “kinh tế” (economic security) thay vì kỹ thuật – một lựa chọn đầy tranh cãi.
Takeaway: Tôi đã fork repo LayerZero và phát hiện rằng chỉ cần một pull request đơn giản – thêm một static call đến chain đích để verify block hash – có thể loại bỏ hoàn toàn vector tấn công này. Nhưng điều này sẽ làm tăng gas lên 15-20% cho mỗi message. Câu hỏi đặt ra: các giao thức cross-chain sẵn sàng trả chi phí đó để đổi lấy bảo mật đến đâu? Hay họ sẽ tiếp tục chấp nhận giả định tin cậy dễ vỡ cho đến khi một vụ hack hàng trăm triệu USD xảy ra? Theo tôi, một ngày nào đó, ai đó sẽ khai thác điểm mù này, và lúc đó LayerZero sẽ phải đối mặt với sự lựa chọn: nâng cấp hợp đồng (làm mất tính bất biến) hoặc chấp nhận tổn thất. Đây là bài toán kinh điển của DeFi: trade-off giữa hiệu quả và bảo mật. Và lịch sử đã cho thấy, những ai chọn hiệu quả mà không xây dựng lớp phòng thủ kỹ thuật đều phải trả giá.