Trong các giao thức mạng bảo mật, việc thiết lập phiên kết nối đòi hỏi hai đầu kênh phải xác thực danh tính và thỏa thuận khóa tạm thời (ephemeral keys). Do các gói tin bắt tay khởi tạo phải truyền qua mạng Internet công cộng vốn không đáng tin cậy, chúng trở thành mục tiêu ưa thích của các cuộc tấn công mạng. Kẻ tấn công dù không thể giải mã lưu lượng đường hầm vẫn có thể bắt giữ các gói bắt tay hợp lệ rồi gửi lại hàng loạt về phía máy chủ VPN.

Ở các giao thức truyền thống như IPsec IKEv2 hoặc OpenVPN, khi nhận một gói tin bắt tay, máy chủ buộc phải cấp phát vùng nhớ đệm, phân tích chuỗi chứng chỉ số phức tạp hoặc thực hiện các phép tính hàm mũ tốn nhiều tài nguyên tính toán. Một làn sóng các gói tin bắt tay bị phát lại (replay attack) sẽ nhanh chóng làm cạn kiệt tài nguyên CPU và bộ nhớ máy chủ, dẫn tới tình trạng từ chối dịch vụ (DoS) đối với người dùng thực.

WireGuard loại bỏ nguy cơ này thông qua một kiến trúc tối giản và thông minh. Nằm trực tiếp bên trong phần tải dữ liệu đã xác thực của mỗi gói khởi tạo bắt tay là một nhãn thời gian tăng đơn điệu dài 12 byte tuân theo chuẩn TAI64N. Nhờ việc đối soát nhãn thời gian này trong thời gian hằng số trước khi cấp phát tài nguyên phiên, WireGuard loại bỏ thẳng tay các gói tin phát lại với mức tiêu hao tài nguyên gần như bằng không.

Mô hình rủi ro từ cuộc tấn công phát lại gói bắt tay

Để hiểu lý do WireGuard cần tới nhãn thời gian mã hóa, hãy xem xét quy trình trao đổi thông điệp khởi tạo trong mô hình bắt tay Noise_IK:

Quy trình trao đổi bắt tay trong WireGuard (Noise_IKpsk2):
Client (Bên khởi tạo)                                  Server (Bên phản hồi)
  |                                                              |
  |--- Gói tin loại 1: Handshake Initiation -------------------->|
  |    - Khóa công khai tạm thời không mã hóa (32 bytes)         |
  |    - Khóa tĩnh được mã hóa (48 bytes AEAD)                   |
  |    - Nhãn thời gian TAI64N được mã hóa (28 bytes AEAD)       |
  |    - Mã xác thực mac1 (16 bytes), mac2 (16 bytes)            |
  |                                                              |
  |<-- Gói tin loại 2: Handshake Response -----------------------|

Trong gói tin khởi tạo, danh tính khóa tĩnh và nhãn thời gian của client được mã hóa bằng khóa sinh ra từ các phép toán Diffie-Hellman giữa khóa tạm thời, khóa tĩnh của client và khóa tĩnh của máy chủ.

Nếu kẻ tấn công thu thập được một gói tin Loại 1 hợp lệ trên đường truyền, chúng không thể chỉnh sửa nội dung vì thẻ xác thực Poly1305 sẽ phát hiện ngay. Tuy nhiên, nếu thiếu cơ chế xác định độ tươi mới (freshness), kẻ tấn công có thể phát lại đúng chuỗi byte đó hàng triệu lần:

  • Máy chủ sẽ giải mã thành công danh tính và xác thực gói tin.
  • Máy chủ phải thực hiện phép nhân điểm trên đường cong Curve25519 để tạo phản hồi.
  • Máy chủ phải cấp phát bộ nhớ để lưu trạng thái phiên bắt tay mở một nửa (half-open session).

Sự chênh lệch về chi phí này (kẻ tấn công tốn rất ít công sức trong khi máy chủ tiêu tốn nhiều năng lượng xử lý) sẽ biến các cổng VPN thành mục tiêu dễ bị đánh sập.

Cấu trúc chi tiết của nhãn thời gian TAI64N

Thay vì sử dụng mốc thời gian chuẩn UNIX thông thường, WireGuard tích hợp chuẩn TAI64N do chuyên gia mật mã Dan Bernstein thiết kế. Chuẩn giờ UNIX truyền thống thường chịu ảnh hưởng bởi hiện tượng giây nhuận (leap seconds), khiến đồng hồ hệ thống có thể bị lùi lại hoặc phân tán giây, tạo ra các khoảng thời gian không tăng đơn điệu mà kẻ xấu có thể lợi dụng để phát lại gói tin.

Giờ nguyên tử quốc tế (TAI) cung cấp một thang đo giây liên tục và không bao giờ lùi. Định dạng TAI64N biểu diễn thời gian này với độ chính xác đến từng nano giây thông qua cấu trúc nhị phân 12 byte tinh gọn:

Cấu trúc nhị phân của nhãn thời gian TAI64N (12 Bytes):
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      TAI64 Giây (Phần cao)                    |
|                   (Số nguyên 64-bit Big-Endian)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      TAI64 Giây (Phần thấp)                   |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Độ lệch Nano giây (Nano)                  |
|                   (Số nguyên 32-bit Big-Endian)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  1. Phần giây TAI64 (8 bytes): Đếm số giây liên tục trôi qua kể từ thời điểm khởi thủy (với giá trị $2^{62}$ tương ứng mốc 1970-01-01 00:00:10 TAI), hoàn toàn tránh được rủi ro tràn số trong tương lai.
  2. Phần nano giây (4 bytes): Lưu trữ phần lẻ giây trong khoảng từ $0$ đến $999.999.999$. Độ chính xác nano giây bảo đảm ngay cả khi kết nối lại liên tục, nhãn thời gian sinh ra luôn luôn lớn hơn mốc trước đó.

Bên trong gói tin Loại 1, 12 byte này được mã hóa bằng ChaCha20-Poly1305 thành khối dữ liệu 28 byte (12 byte dữ liệu mã hóa cộng với 16 byte thẻ xác thực). Nhờ được mã hóa, kẻ nghe lén trên đường truyền không thể đọc trộm nhãn thời gian để nhận diện độ lệch đồng hồ phần cứng của người dùng.

Cơ chế xác thực trong nhân Linux với thời gian hằng số

Khi mô-đun kernel WireGuard tiếp nhận một gói tin Handshake Initiation, trình tự xử lý diễn ra hết sức chặt chẽ:

Gói tin bắt tay đi vào (Loại 1)
         |
         v
[Kiểm tra MAC1: Băm SipHash của gói tin với Khóa công khai của Server]
         |
         +--> Không hợp lệ? Hủy bỏ ngay (Chưa cấp phát bộ nhớ)
         v
[Thực hiện trao đổi khóa DH: Khóa tạm thời * Khóa tĩnh]
         |
         v
[Giải mã Khóa tĩnh và giải mã nhãn thời gian TAI64N qua AEAD]
         |
         +--> Thẻ xác thực sai? Hủy bỏ ngay
         v
[So sánh thời gian hằng số với giá trị last_sent_handshake của đối tác]
         |
         +--> Nhãn thời gian nhận được <= last_sent_handshake?
         |         |
         |         v
         |    Hủy bỏ ngay (Phát hiện gói phát lại! Không tạo phiên)
         v
[Cập nhật giá trị last_sent_handshake = Nhãn thời gian mới nhận]
         |
         v
[Tiến hành tạo gói phản hồi bắt tay Loại 2]

Máy chủ so sánh nhãn thời gian vừa giải mã với giá trị last_sent_handshake lưu trong bảng đối tác. Nếu giá trị nhận được nhỏ hơn hoặc bằng giá trị đã lưu, gói tin bị loại bỏ ngay tức khắc mà không gửi lại bất kỳ thông báo lỗi nào, không cấp phát bộ nhớ và không làm xáo trộn các phiên đang chạy.

Toàn bộ phép so sánh được thực thi trong thời gian hằng số (constant-time), loại bỏ hoàn toàn nguy cơ rò rỉ thông tin qua kênh phụ đo thời gian (timing attacks).

Tiêu chí kỹ thuật Nhãn thời gian UNIX Nhãn thời gian TAI64N WireGuard Thách thức ngẫu nhiên (Nonce)
Kích thước tiêu hao 4 đến 8 bytes 12 bytes 16 đến 32 bytes
Số lượt RTT để xác thực tươi mới 1 RTT 0 RTT (xác thực tức thì) 1 RTT đầy đủ (trao đổi token)
Khả năng chống lỗi giây nhuận Dễ bị lùi giờ hoặc lệch pha Miễn nhiễm hoàn toàn (thang TAI) Miễn nhiễm (sinh ngẫu nhiên)
Chống theo dõi đồng hồ thiết bị Dễ bị lộ trong header rõ Ẩn an toàn trong khối AEAD Không bị lộ
Bộ nhớ máy chủ cần duy trì Cao (phải nhớ danh sách nonce) Bằng không (chỉ 1 mốc/đối tác) Trung bình (lưu cache cookie)

Xử lý các tình huống lệch đồng hồ, chế độ ngủ và lỗi phần cứng

Do WireGuard bắt buộc nhãn thời gian phải tăng đơn điệu (mới > cũ), các hiện tượng dịch chuyển đồng hồ trong thực tế được xử lý như sau:

Độ lệch giờ giữa máy khách và máy chủ

WireGuard không yêu cầu đồng hồ của hai bên phải khớp từng giây. Máy chủ không kiểm tra xem thời gian của client có trùng với giờ thực của máy chủ hay không; máy chủ chỉ kiểm tra xem nhãn thời gian mới có lớn hơn nhãn thời gian ở lần bắt tay trước của chính client đó hay không. Một thiết bị có đồng hồ chạy chậm hơn máy chủ 2 giờ vẫn kết nối bình thường, miễn là đồng hồ của nó tiếp tục chạy tiến về phía trước.

Thiết bị di động ở chế độ ngủ sâu

Khi điện thoại hoặc máy tính xách tay chuyển sang chế độ ngủ, đồng hồ phần cứng có thể bị trôi nhẹ. Khi thức dậy, hệ điều hành đồng bộ lại thời gian qua NTP. Nếu đồng hồ nhảy tiến lên, lần bắt tay tiếp theo tự động mang nhãn thời gian cao hơn và kết nối thành công ngay lập tức.

Khắc phục hiện tượng đồng hồ bị nhảy lùi

Nếu thiết bị cạn sạch pin khiến đồng hồ phần cứng RTC bị đặt lại về năm 1970, gói bắt tay sẽ bị từ chối vì nhãn thời gian nhỏ hơn mốc đã lưu trên máy chủ. Thiết bị chỉ cần đồng bộ lại thời gian thực tế qua mạng hoặc làm mới phiên là có thể thiết lập kết nối thông suốt.

Giải pháp đồng bộ hóa thích ứng trong hạ tầng RiceGuard

Để bảo vệ các đường hầm doanh nghiệp trước các sự cố nhảy lùi đồng hồ trên thiết bị di động, VPNRice tích hợp cơ chế đối soát thông minh vào lõi RiceGuard:

  • Bộ đếm đơn điệu trong vùng lưu trữ bảo mật: Trên các nền tảng di động có nguy cơ bị lệch giờ do nhà mạng cập nhật múi giờ, RiceGuard duy trì một bộ đếm nhịp đơn điệu riêng biệt. Nếu phát hiện đồng hồ hệ thống bị chỉnh lùi, hệ thống tự động bù trừ độ lệch để bảo đảm nhãn TAI64N gửi đi luôn tăng tiến.
  • Khôi phục trạng thái kết nối hai chiều: Khi cổng gateway nâng cấp hoặc bảo trì phần cứng, hệ thống quản lý khóa của RiceGuard đồng bộ bảng nhãn thời gian an toàn giữa các cụm nút, bảo đảm người dùng không bị khóa ngoài kết nối.
  • Phối hợp cùng cơ chế Cookie MAC2: Trong các đợt tấn công từ chối dịch vụ quy mô lớn, RiceGuard kết hợp việc lọc nhãn TAI64N với cơ chế Cookie không trạng thái, xử lý hàng triệu gói tin rác mỗi giây mà không làm tăng tải CPU máy chủ.

Nhờ vận dụng triệt để tiêu chuẩn TAI64N, WireGuard và RiceGuard đem lại khả năng phòng vệ kiên cố trước các đợt tấn công phát lại, duy trì tốc độ kết nối tức thì và bảo đảm độ ổn định cho mọi hạ tầng mạng.

Tải VPNRice.\n