Tuần trước, một giao thức cross-chain hàng đầu đã bị khai thác 12 triệu USD. Điều thú vị không phải số tiền mất, mà là code thực thi đã hé lộ một lỗ hổng thiết kế mang tính hệ thống. Tôi đã dành 48 giờ phân tích transaction log, và phát hiện ra rằng nguyên nhân không nằm ở oracle hay relayer như mọi người nghĩ. Vấn đề thực sự nằm trong giả định tin cậy của chính giao thức.
LayerZero tự hào là giải pháp cross-chain phi tập trung, cho phép các ứng dụng giao tiếp giữa các blockchain mà không cần trung gian. Nhưng cơ chế của nó dựa vào hai thực thể: oracle (cung cấp block header) và relayer (cung cấp proof). Nếu cả hai thông đồng, giao thức sụp đổ. Đây không phải điều mới – tất cả các giải pháp cross-chain hiện tại đều có giả định tin cậy. Tuy nhiên, điểm mù nằm ở lớp ứng dụng: các developer thường mặc định rằng giao thức đã xử lý mọi rủi ro, và họ chỉ cần tích hợp đơn giản. Sai lầm đó đã dẫn đến vụ hack.
Khi tôi đào sâu vào contract bị tấn công, tôi thấy rõ một pattern: giao thức đã ủy quyền việc xác thực message cho LayerZero, nhưng không kiểm tra tính toàn vẹn của dữ liệu payload. Trong một giao dịch điển hình, relayer gửi proof kèm payload, oracle gửi block header. LayerZero Endpoint xác minh proof trên header, sau đó gọi hàm receivePayload của contract đích. Nhưng lỗ hổng nằm ở chỗ: contract đích không kiểm tra xem payload có khớp với hash mà nó kỳ vọng hay không. Hacker đã lợi dụng điều này để gửi payload giả mạo, trong khi proof và header đều hợp lệ vì chúng tham chiếu đến một block thật. Kết quả: 12 triệu USD chảy vào ví hacker thông qua một message cross-chain trông có vẻ hợp lệ.
Tôi nhớ lại năm 2020 khi xây bot arbitrage trên Uniswap. Bot của tôi sử dụng một cơ chế đơn giản: đọc giá từ nhiều pool, tính toán arbitrage, và gửi transaction. Nếu tôi không kiểm tra slippage – thứ mà Uniswap coi là trách nhiệm của user – bot sẽ bị sandwich attack. Bài học ở đây giống hệt: giao thức cung cấp hạ tầng, nhưng security cuối cùng nằm ở layer ứng dụng. LayerZero không có lỗi trong code Endpoint của họ, nhưng thiết kế của họ cho phép những lỗ hổng như vậy tồn tại. Đây là trade-off giữa tính linh hoạt và bảo mật.
Contrarian angle: Hầu hết mọi người đổ lỗi cho oracle hoặc relayer. Họ nói rằng nếu oracle và relayer thông đồng thì mọi thứ đều có thể xảy ra. Nhưng sự thật là oracle và relayer trong vụ này hoàn toàn trung thực. Vấn đề nằm ở logic xác thực message của contract ứng dụng. LayerZero không bắt buộc kiểm tra payload hash; nó để developer tự quyết định. Và developer – vì thiếu kinh nghiệm hoặc do áp lực thời gian – đã bỏ qua bước này. Kết quả là một lỗ hổng mà ngay cả audit cũng không phát hiện, bởi vì audit tập trung vào code Endpoint, không phải code ứng dụng.
Từ góc nhìn của một người đã audit hàng trăm contract từ ICO 2017, tôi thấy pattern này lặp đi lặp lại. Năm 2021, tôi phát hiện lỗ hổng trong zkSync light client. Lỗi tương tự: một component bảo mật yếu, nhưng design của giao thức cho phép nó được khai thác. LayerZero không phải ngoại lệ. Vấn đề mang tính cấu trúc: cross-chain về bản chất là phức tạp hơn nhiều so với các ứng dụng đơn chuỗi. Không thể kiểm tra mọi thứ ở on-chain, nên phải tin vào off-chain component. Nhưng tin tưởng mù quáng là công thức cho thảm họa.
Takeaway: Đừng bao giờ tin rằng giao thức đã lo hết cho bạn. Smart contract không mơ – chỉ thực thi. Mọi giả định tin cậy đều có thể bị khai thác nếu developer không hiểu sâu. LayerZero là công cụ mạnh, nhưng nó đặt trách nhiệm bảo mật lên vai bạn. Nếu bạn không kiểm tra payload hash, hacker sẽ làm điều đó thay bạn. Các cuộc tấn công tương tự sẽ còn xảy ra, cho đến khi cộng đồng học được bài học: cross-chain không phải là magic, nó là engineering với trade-off rõ ràng. Mở log bot, tìm cơ hội – nhưng trước hết, hãy đọc code thực thi.