
Replay attack là hình thức tấn công trong đó một giao dịch hoặc ủy quyền từng hợp lệ được gửi lại cho hệ thống, khiến hệ thống thực thi lặp lại nội dung đó. Hãy tưởng tượng việc sao chép một văn bản đã ký và trình ở nhiều quầy khác nhau để nhận nhiều dấu xác nhận.
Trong blockchain, chữ ký được tạo bằng private key—đóng vai trò như con dấu số xác nhận rằng “Tôi đồng ý thực hiện hành động này”. Nếu một giao dịch đã ký có thể được nhận diện ở các ngữ cảnh khác, nó sẽ dễ bị tấn công replay.
Để ngăn trùng lặp, blockchain sử dụng một định danh duy nhất gọi là nonce. Có thể xem nonce như số seri cho mỗi thao tác—không bao giờ lặp. Hệ thống chỉ chấp nhận những nonce chưa sử dụng.
Trong môi trường cross-chain hoặc khi có fork, chainId cũng đóng vai trò quan trọng. ChainId giống như định danh mạng, gắn giao dịch với một chuỗi cụ thể và ngăn không cho nó bị thực thi lại trên chuỗi khác.
Replay attack thường xảy ra khi hệ thống không xác định rõ “ngữ cảnh” của một hành động. Ngữ cảnh bao gồm chuỗi blockchain mà hành động đó thuộc về, có định danh duy nhất hay không, có thời hạn hiệu lực, hoặc có gắn với domain hay smart contract cụ thể nào không.
Nếu chữ ký chỉ chứng minh sự đồng ý với một hành động—mà không xác định rõ chuỗi, ứng dụng hoặc khung thời gian—bất kỳ ai có được chữ ký đó đều có thể sử dụng lại ở nơi khác.
Nếu ứng dụng chỉ theo dõi trạng thái “đã dùng hay chưa” ở local hoặc cache thay vì trên chuỗi, replay attack sẽ dễ thực hiện hơn. Tương tự, sau khi xảy ra fork, nếu cả hai chuỗi cùng chia sẻ định dạng giao dịch và nonce, replay attack cross-chain có thể xảy ra.
Với replay trên cùng một chuỗi, kẻ tấn công chặn được thông điệp ủy quyền hoặc giao dịch đặc biệt và gửi lại trên cùng chuỗi đó. Điều này thường xảy ra khi “ủy quyền chữ ký offline” thiếu nonce duy nhất hoặc dấu thời gian hết hạn.
Với replay cross-chain, giao dịch hoặc thông điệp không có ràng buộc chainId, hoặc sau khi fork, cả hai chuỗi đều chấp nhận cùng một định dạng chữ ký. Kẻ tấn công có thể thực hiện lại một giao dịch hợp lệ từ chain A trên chain B.
Ở tầng smart contract, nếu hợp đồng không kiểm tra ID thông điệp đã xử lý hoặc thiếu tính idempotent (nghĩa là gọi lặp lại sẽ cộng dồn tác động), kẻ tấn công có thể thực thi một thao tác nhiều lần dù chỉ dự kiến thực hiện một lần.
Năm 2016, Ethereum chia tách chuỗi, tạo ra ETH và ETC. Do các giao dịch ban đầu không phân biệt giữa hai chuỗi, nguy cơ replay cross-chain xuất hiện. EIP-155 được giới thiệu năm 2016 nhằm thêm chainId vào giao dịch, giúp giảm mạnh các loại tấn công này (tham khảo: lịch sử Ethereum Improvement Proposal).
Trong các tình huống ủy quyền, nếu các chấp thuận chuyển khoản hoặc hạn mức dựa trên chữ ký thiếu thời hạn và nonce duy nhất, chữ ký có thể bị gửi lại nhiều lần. EIP-2612 ra đời năm 2020 nhằm chuẩn hóa ủy quyền bằng chữ ký cho ERC-20, yêu cầu bắt buộc nonce và thời hạn (tham khảo: Ethereum Improvement Proposal).
Nếu cầu nối cross-chain và giao thức nhắn tin không gán định danh duy nhất và không theo dõi trạng thái tiêu thụ của thông điệp, replay attack có thể gây ra việc mint hoặc giải phóng tài sản nhiều lần. Hiện nay, ngành đã giảm thiểu rủi ro này nhờ sử dụng message ID và theo dõi trạng thái trên chuỗi.
Trước tiên, kiểm tra nội dung mọi yêu cầu ký. Nếu ví của bạn yêu cầu “chữ ký mù” (không có thông tin giao dịch rõ ràng, domain hoặc chain), nguy cơ bị replay sẽ cao hơn.
Tiếp đó, xác minh xem ủy quyền có bao gồm thời hạn và nonce duy nhất không. Nếu thiếu một trong hai, rủi ro sẽ tăng lên.
Kiểm tra ngữ cảnh chuỗi được chỉ rõ. Nếu thiếu chainId hoặc domain separation (như trong domain EIP-712), nguy cơ replay giữa các môi trường khác nhau sẽ cao.
Cuối cùng, theo dõi các dấu hiệu thực thi lặp lại bất thường—như cùng một ủy quyền bị sử dụng nhiều lần, tài sản bị chuyển liên tục trong thời gian ngắn, hoặc thông điệp giống nhau gây tác động trên nhiều chuỗi.
Bước 1: Gắn giao dịch với ngữ cảnh chuỗi. Sử dụng chainId theo EIP-155 để giới hạn mỗi giao dịch chỉ thực thi trên chuỗi định sẵn, ngăn replay cross-chain.
Bước 2: Gán cho mỗi ủy quyền một nonce duy nhất và thời hạn. Các chuẩn như EIP-2612 và Permit2 yêu cầu mỗi chữ ký phải có nonce và deadline; ủy quyền hết hạn sẽ bị vô hiệu.
Bước 3: Ghi lại thông điệp hoặc nonce “đã dùng” trong smart contract. Mỗi thông điệp cần có ID không thể tái sử dụng và trạng thái tiêu thụ được lưu trên chuỗi để bảo đảm xử lý idempotent.
Bước 4: Sử dụng chữ ký có cấu trúc theo EIP-712. Chữ ký cần bao gồm domain (verifyingContract, name, version), chainId và nội dung rõ ràng, dễ đọc nhằm giảm nguy cơ bị lạm dụng hoặc replay.
Bước 5: Áp dụng xác thực hai chiều trong cầu nối cross-chain và các kênh nhắn tin. Cần xác minh cả chuỗi nguồn, chuỗi đích, tính duy nhất của thông điệp, số lô và trạng thái xử lý để ngăn chặn thực thi lặp lại qua nhiều tuyến khác nhau.
Bước 1: Chỉ ký trên giao diện hiển thị rõ nội dung. Từ chối chữ ký mù—đảm bảo màn hình ký có domain, thông tin chain và mô tả mục đích.
Bước 2: Đặt giới hạn cho ủy quyền. Ưu tiên ủy quyền có thời hạn và hạn mức; thường xuyên thu hồi quyền không dùng tới qua blockchain explorer hoặc công cụ quản lý. Khi rút tiền từ các sàn như Gate, luôn kiểm tra đã chọn đúng mạng và địa chỉ để tránh nhầm lẫn môi trường.
Bước 3: Tách biệt quỹ khỏi ví thao tác. Lưu tài sản chính trong ví phần cứng hoặc ví chỉ xem; tương tác với DApp bằng ví nóng nhỏ để hạn chế tổn thất khi bị lặp ủy quyền.
Bước 4: Sử dụng sổ địa chỉ và whitelist. Lưu các địa chỉ nhận thường dùng kèm ghi chú vào sổ địa chỉ Gate và kích hoạt whitelist rút tiền để giảm rủi ro do thao tác nhầm hoặc chữ ký phishing dẫn đến gửi lặp lại.
Bước 5: Theo dõi hoạt động bất thường. Nếu phát hiện giao dịch hoặc ủy quyền bị lặp lại nhiều lần trong thời gian ngắn, cần tạm dừng thao tác, thu hồi ủy quyền và kiểm tra bảo mật thiết bị, extension.
Replay attack là việc gửi lại cùng một giao dịch hoặc ủy quyền hợp lệ—vấn đề cốt lõi là thực thi lặp lại. Double-spending nhằm chi tiêu cùng một tài sản hai lần, thường liên quan đến cơ chế đồng thuận và tổ chức lại block—khác biệt về bản chất ở tầng giao thức.
Sybil attack sử dụng nhiều danh tính để giả mạo nhiều người dùng nhằm thao túng bỏ phiếu hoặc phân phối; không liên quan đến việc lặp lại giao dịch mà là gian lận ở tầng danh tính. Replay attack xảy ra ở tầng giao dịch/thông điệp.
Bên cạnh đó, man-in-the-middle thường sửa đổi dữ liệu hoặc định tuyến; replay attack có thể không thay đổi nội dung mà chỉ gửi lại dữ liệu giống hệt.
Kể từ khi EIP-155 đưa chainId vào năm 2016, replay attack cross-chain đã giảm mạnh; EIP-2612 (2020) và Permit2 tiếp tục chuẩn hóa cơ chế nonce và expiry cho các ủy quyền bằng chữ ký. Đến năm 2025, khi mạng đa chuỗi và Layer 2 phát triển mạnh, các kênh truyền thông điệp, anti-replay ID và thiết kế idempotent trở thành hạ tầng nền tảng.
Account abstraction (ví dụ: ERC-4337) thúc đẩy quản lý nonce theo domain và chiến lược—sử dụng nonce riêng cho từng thao tác giúp giảm rủi ro replay nội bộ domain. Cầu nối cross-chain hiện chú trọng xác thực nguồn và theo dõi thông điệp duy nhất để hạn chế cơ hội thực thi lặp lại.
Bản chất của replay attack là “nội dung hợp lệ bị thực thi lại trong sai ngữ cảnh”. Giải pháp là làm rõ ngữ cảnh: định danh chuỗi, nonce duy nhất, thời hạn, ràng buộc domain—và luôn ghi nhận trạng thái đã tiêu thụ trên chuỗi. Với developer: hãy áp dụng các chuẩn EIP-155, EIP-712, EIP-2612/Permit2 cùng thiết kế idempotent. Với người dùng: tránh chữ ký mù, dùng ủy quyền có thời hạn, tách ví theo chức năng và bật whitelist trên sàn để giảm thiểu rủi ro. Nếu phát hiện lặp lại bất thường liên quan đến tài sản, cần dừng thao tác và thu hồi ủy quyền ngay lập tức.
Replay attack không trực tiếp đánh cắp tài sản của bạn nhưng có thể dẫn đến các giao dịch độc hại bị lặp lại. Ví dụ, nếu bạn chuyển 100 token trên chain A nhưng kẻ tấn công replay giao dịch đó trên chain B, bạn có thể mất tiền trên cả hai chuỗi. Phòng thủ quan trọng nhất là sử dụng ví hỗ trợ xác thực chain ID và cẩn trọng khi thao tác cross-chain.
Các sàn tập trung như Gate có nhiều lớp bảo mật tích hợp; người dùng thông thường gần như không gặp rủi ro replay attack khi giao dịch trong nền tảng. Rủi ro chủ yếu phát sinh khi chuyển tài sản cross-chain bằng ví tự quản. Với giao dịch spot hoặc phái sinh trên Gate, các biện pháp kiểm soát rủi ro của nền tảng sẽ bảo vệ tài khoản của bạn.
Các thay đổi lớn trong hệ sinh thái (như hợp nhất hoặc fork chuỗi) thực sự làm tăng rủi ro replay attack. Tuy nhiên, các dự án thường triển khai biện pháp bảo vệ như cập nhật chain ID từ trước. Là người dùng, bạn nên đợi thông báo chính thức trước khi thực hiện thao tác cross-chain trong giai đoạn chuyển đổi để tránh trở thành mục tiêu.
Private key bị lộ đã là sự cố bảo mật nghiêm trọng. Replay attack khiến tình hình tồi tệ hơn vì kẻ tấn công không chỉ chuyển tài sản trên một chuỗi mà còn có thể replay giao dịch trên nhiều chuỗi—có thể rút cạn mọi tài sản tương tự ở mọi nơi. Bạn chỉ còn cách lập tức chuyển tài sản sang ví mới.
EIP-155 đưa vào cơ chế chain ID để mỗi giao dịch đều có định danh mạng riêng biệt—ngăn không cho nó bị thực thi trên chuỗi khác. Các mạng Ethereum hiện đại và chuỗi tương thích đều đã áp dụng tiêu chuẩn này, khiến hầu hết replay attack không còn khả thi. Chọn ví hỗ trợ EIP-155 là cách đơn giản nhất để người dùng tự bảo vệ mình.


