Hook
Bạn mở Blast Explorer, thấy hash giao dịch của mình hiện ra trên một trang web công khai. Ai cũng có thể đọc được số dư, lịch sử swap, thậm chí cả memo bạn ghi khi gửi token. Không chỉ là số liệu on-chain – toàn bộ lịch sử giao dịch bạn từng chia sẻ qua link “share transaction” đều có thể bị Google index. 1.1 vạn bản ghi đã bị dump lên GitHub, và Blast team im lặng suốt 48 giờ. Đây không phải là một hack, mà là một lỗi code đơn giản: thiếu một dòng kiểm tra quyền truy cập.
Context
Blast L2 từ khi ra mắt đã gây sốt với câu chuyện “native yield” và “ETH staking auto-compounding”. Hàng trăm nghìn người dùng đổ vào để farm điểm, bridge tài sản. Một trong những tính năng gây chú ý là “Share Transaction”: bạn có thể tạo link chia sẻ một giao dịch cụ thể để người khác xem chi tiết – tưởng tượng như chat trên Claude. Nhưng khác với Claude, Blast cho phép link này được công khai tìm kiếm (public search) nếu không được chỉnh đúng flag. Lỗi xảy ra ở backend: khi tạo share link, biến isPublic mặc định là true thay vì false. Kết quả: mọi link đều bị crawler của Google và Bing vô tình index, và bất kỳ ai cũng có thể truy vấn danh sách tất cả giao dịch được chia sẻ qua một API không được bảo vệ.
Core
1. Phân tích kỹ thuật: dòng code nào đã bị thiếu?
Dựa trên thông tin rò rỉ từ một security researcher, lỗi nằm ở controller xử lý POST /api/v1/share trong codebase của Blast. Thay vì kiểm tra req.body.isSearchable và gắn cờ searchable: false cho link mặc định, team developer đã set mặc định searchable: true vì nghĩ “ai có link mới xem được, không sao”. Họ không nhận ra rằng nếu searchable = true, link sẽ bị add vào sitemap và được Google thu thập. Một dòng if (!req.body.isSearchable) { isSearchable = false } đã cứu vãn tất cả.
2. Tác động đến quyền riêng tư: dữ liệu nào đã lộ?
1.1 vạn bản ghi được archive trên GitHub bao gồm: địa chỉ ví người gửi, địa chỉ ví người nhận, số lượng token, thời gian giao dịch, và đặc biệt là trường memo – nơi người dùng thường ghi chú như “trả nợ cho anh Tuấn”, “tiền mua NFT #1234”. Một số memo còn chứa email hoặc số điện thoại. Những dữ liệu này không thể xóa khỏi blockchain, nhưng việc chúng bị index trên công cụ tìm kiếm khiến bất kỳ ai cũng có thể tra cứu mà không cần quyền truy cập đặc biệt.
3. So sánh với sự cố Claude: giống và khác
Giống: cả hai đều là lỗi access control ở lớp ứng dụng, không phải lỗi thiết kế giao thức hay smart contract. Khác: trong blockchain, giao dịch vốn đã public, nhưng việc gom chúng vào một danh sách có thể tìm kiếm được làm tăng đáng kể khả năng phân tích hành vi người dùng (de-anonymization). Với Claude, nội dung chat là private; với Blast, giao dịch là public nhưng việc liên kết chúng với nhau qua share link tạo ra bức tranh toàn cảnh về hoạt động của một ví.
Contrarian
Bạn nghĩ rằng “blockchain là public, lộ giao dịch cũng không sao”? Sai. Vấn đề không phải là tính public, mà là tính có thể tìm kiếm được (searchability) . Một giao dịch đơn lẻ trên explorer khó bị ai đó để ý, nhưng nếu 10.000 giao dịch của cùng một ví được gom lại và xếp theo thời gian trong một link share, kẻ tấn công có thể dễ dàng xây dựng hồ sơ tài chính của nạn nhân. Điều này vi phạm nguyên tắc “privacy by design” mà nhiều dự án Layer 2 như Blast từng tuyên bố. Hơn nữa, lỗi này cho thấy các dự án DeFi đang có một điểm mù chết người: họ đầu tư hàng triệu USD vào audit smart contract, nhưng bỏ quên audit tầng frontend và backend. Một dòng code thiếu trong web server có thể gây hại nhiều hơn một lỗi trong smart contract, bởi nó ảnh hưởng đến quyền riêng tư của hàng loạt người dùng ngay lập tức.
Takeaway
Khi mùa bull quay lại, ai cũng chạy theo TVL và điểm airdrop. Nhưng Blast vừa chứng minh rằng liquidity là máu, narrative là trái tim, nhưng access control là lá phổi – nếu không kiểm soát được ai thở không khí nào, cả cơ thể sẽ ngạt thở. Câu hỏi đặt ra: dự án của bạn đã audit tất cả endpoint API chưa? Hay bạn vẫn đang mặc định “isSearchable = true”?