Hôm nay, SingLinkLabs, đội ngũ đứng sau SingLinkVPN, đã công bố toàn bộ mã nguồn của giao thức SingLink trên GitHub theo giấy phép Apache-2.0. Từ nay, bất kỳ ai cũng có thể đọc đặc tả, chạy mã, kiểm tra độ bảo mật và xây dựng sản phẩm của riêng mình dựa trên đó.
Khi công bố kế hoạch mã nguồn mở của SingLinkVPN, chúng tôi đã cho biết một giao thức VPN và một ứng dụng khách VPN sẽ lần lượt được phát hành theo từng giai đoạn. Đây chính là bước đó. Giao thức được phát hành cùng lúc với bản nguyên mẫu thế hệ đầu tiên của ứng dụng SingLinkVPN chạy trên nó. Xem thêm nguyên mẫu ứng dụng SingLinkVPN nay đã là mã nguồn mở.
Kho mã: SingLinkLabs / singlink-protocol · Phiên bản: 1.0.0-draft (tên trên đường truyền
SingLink/1, bản nháp đặc tả số 2) · Giấy phép: Apache-2.0 · Ngôn ngữ: Go, chỉ dùng thư viện chuẩn
Những gì được phát hành
Bản đặc tả. SPEC.md mô tả định dạng truyền tải đến từng byte, nhờ đó giao thức có thể được triển khai độc lập.
Thư viện giao thức viết bằng Go. Thư viện chỉ dùng các hàm mật mã trong thư viện chuẩn của Go, không phụ thuộc vào bất kỳ bên thứ ba nào.
Công cụ dòng lệnh để tạo khóa, cấp thẻ truy cập, tạo liên kết kết nối, chạy node và ứng dụng khách, và khởi động bản demo trên một máy duy nhất.
Proxy cục bộ cho ứng dụng (SOCKS5 và HTTP) cùng giao diện thư viện C (
libsinglink), để ứng dụng trên mọi nền tảng đều có thể tích hợp giao thức.Ví dụ triển khai: một cấu hình node mẫu và một tệp dịch vụ systemd đã được gia cố bảo mật.
Báo cáo đánh giá bảo mật nội bộ, kèm mọi phát hiện và bản sửa lỗi: SECURITY-AUDIT.md.
SingLink 2.0 và giao thức mở SingLink là hai giao thức khác nhau
Các ứng dụng SingLinkVPN chính thức chạy trên những giao thức vận hành thực tế của chúng tôi, trong đó có SingLink 2.0. Mã nguồn lõi của SingLink 2.0 không nằm trong đợt phát hành này và vẫn được giữ kín.
Giao thức SingLink công bố hôm nay (gọi là giao thức mở SingLink khi cần phân biệt với SingLink 2.0) là một giao thức riêng biệt, được SingLinkLabs thiết kế từ đầu để phát triển mở. Hiện các ứng dụng chính thức chưa sử dụng giao thức này. Người dùng hiện tại không có gì thay đổi: vẫn là những ứng dụng đó, tài khoản đó và các kết nối đó.
Vì sao chúng tôi mở mã nguồn
Tuyên bố về bảo mật cần kiểm chứng được. Trao đổi khóa hậu lượng tử, ràng buộc thiết bị và khả năng chống dò quét là những điều rất dễ nói. Khi mã nguồn và đặc tả được công khai, ai cũng có thể tự kiểm chứng.
Càng nhiều người xem, lỗi càng sớm được phát hiện. Các nhà nghiên cứu và kỹ sư bên ngoài sẽ nhận ra những vấn đề mà đội ngũ nội bộ bỏ sót.
Người khác có thể xây dựng tiếp trên đó. Nhà phát triển có thể thử nghiệm, tích hợp vào dự án của mình và đề xuất cải tiến.
Đúng như kế hoạch đã đề ra. Công bố một giao thức là một trong những giai đoạn chúng tôi đã cam kết.
Cách hoạt động, nói một cách dễ hiểu
Tóm gọn trong một câu: nhìn từ bên ngoài, người dùng chỉ đang truy cập một trang web HTTPS bình thường. Bên trong ẩn một yêu cầu truy cập đã được mã hóa, và máy chủ chỉ chuyển tiếp lưu lượng cho người có thẻ hợp lệ.
Thiết kế này dùng ba loại khóa. Hãy hình dung hệ thống an ninh của một tòa nhà văn phòng:
Khóa node là ổ khóa cửa. Mỗi máy chủ có một khóa riêng. Chỉ máy chủ đó mới mở được yêu cầu của người dùng, điều này cũng chứng minh người dùng đã đến đúng máy chủ thật.
Khóa phát hành là con dấu của phòng nhân sự. Khóa này nằm ở hệ thống tài khoản phía sau, nơi đóng dấu lên từng thẻ truy cập kèm gói dịch vụ, ngày hết hạn, giới hạn tốc độ và giới hạn số thiết bị.
Khóa thiết bị là dấu vân tay của người dùng. Khóa này nằm trên điện thoại hoặc máy tính của người dùng và ký vào mọi kết nối, chứng minh thẻ đang được chính chủ sử dụng.
Máy chủ chỉ cần biết con dấu trông như thế nào là có thể tự kiểm tra thẻ. Vì vậy các node không giữ cơ sở dữ liệu người dùng và không lưu trữ dữ liệu người dùng.
Điều gì diễn ra trong một lần kết nối
Ứng dụng mở một kết nối trông giống như một kết nối HTTPS bình thường tới một trang web.
Gói tin đầu tiên mang một khóa dùng một lần cho kết nối này, một bản mã hậu lượng tử và một phần được niêm phong chứa đích đến, thẻ truy cập, tối đa 8 KB dữ liệu thật đầu tiên và chữ ký thiết bị trên toàn bộ yêu cầu. Không cần thêm lượt khứ hồi nào.
Máy chủ kiểm tra mọi thứ: có giải mã được yêu cầu hay không, con dấu có thật không, chữ ký thiết bị có khớp không, thời gian có đúng không, và yêu cầu có phải là gói phát lại, đã hết hạn hay đã bị thu hồi hay không.
Chỉ khi vượt qua mọi bước kiểm tra, máy chủ mới phản hồi và bắt đầu chuyển tiếp. Nếu bất kỳ bước nào thất bại, kết nối được chuyển nguyên vẹn sang một trang web thật. Kẻ dò quét máy chủ chỉ thấy một trang web bình thường, không có khác biệt nào về thời gian phản hồi.
Hai bên kết hợp các khóa dùng một lần của mình để tạo khóa phiên cho kết nối này. Dữ liệu được mã hóa theo từng khối, các khối đầu tiên được thêm đệm, và khóa được tự động thay mới sau một lượng sử dụng nhất định.
Đặc tính bảo mật
Hai lớp mã hóa. HTTPS ở bên ngoài cộng với lớp AES-256-GCM riêng của giao thức ở bên trong, nên ngay cả CDN chấm dứt HTTPS cũng không thể xem nội dung.
Bảo vệ hậu lượng tử. Trao đổi khóa kết hợp X25519 cổ điển với ML-KEM-768 (FIPS 203). Kẻ tấn công phải phá được cả hai.
Bảo mật chuyển tiếp. Mỗi kết nối dùng khóa dùng một lần, nên nếu sau này máy chủ bị xâm nhập thì lưu lượng trước đó vẫn không thể bị giải mã. Ngoại lệ là gói tin đầu tiên (xem phần giới hạn bên dưới).
Ràng buộc thiết bị. Một thẻ truy cập bị sao chép từ đâu đó sẽ vô dụng nếu không có khóa của thiết bị mà nó được cấp cho.
Chống phát lại. Gửi lại một gói tin bị bắt được sẽ không có tác dụng, kể cả sau khi máy chủ khởi động lại.
Chống dò quét. Các yêu cầu đã hết hạn, bị thu hồi, phát lại hay giả mạo đều được xử lý như nhau: chúng được chuyển sang trang web thật.
Kiểm soát tập trung. Khi một tài khoản hoặc thiết bị bị thu hồi, các kết nối đang hoạt động của nó trên mọi máy chủ sẽ bị đóng trong khoảng 10 giây.
Máy chủ được gia cố. Giới hạn kết nối theo từng máy chủ và từng IP, ngân sách CPU dành cho bắt tay, cùng danh sách chặn đầy đủ các địa chỉ riêng và địa chỉ dùng cho mục đích đặc biệt.
Ý tưởng đến từ đâu
Giao thức SingLink học hỏi từ những thiết kế đã được kiểm chứng: kết nối chỉ với một yêu cầu từ VLESS và Trojan, cách chuyển kết nối thất bại sang trang web thật từ Trojan và obfs4, mẫu bắt tay Noise NK, cách dẫn xuất khóa và xử lý 0-RTT từ TLS 1.3, trao đổi khóa hậu lượng tử lai từ bản dự thảo tiêu chuẩn X-Wing, mã hóa theo khối từ Shadowsocks AEAD, token có chữ ký từ JWT và PASETO, token ràng buộc thiết bị từ OAuth DPoP, HAProxy PROXY protocol, cùng cơ chế chống phát lại và chống quá tải từ WireGuard.
Đây chỉ là những ý tưởng thiết kế. Toàn bộ mã được viết từ đầu. Không có đoạn mã nào từ Xray, V2Ray, sing-box hay WireGuard.
Tình trạng hiện tại và các giới hạn đã biết
Đây là bản nháp. Phiên bản là 1.0.0-draft và định dạng truyền tải vẫn có thể thay đổi.
Mới chỉ có đánh giá bảo mật nội bộ. Hai người đánh giá đã kiểm tra riêng thiết kế mật mã và phần triển khai, ghi nhận 31 phát hiện: 2 mức High, 14 mức Medium, còn lại là Low hoặc mang tính thông tin. Không phát hiện nào phá vỡ được tính bảo mật hay xác thực của lưu lượng người dùng. Tất cả phát hiện mức High và Medium đều đã được sửa hoặc giảm thiểu, mỗi phát hiện đều có kiểm thử hồi quy, và mọi bộ phân tích cú pháp đều được kiểm thử fuzz.
Chưa có kiểm toán độc lập. Chúng tôi khuyên không nên dựa vào giao thức này cho các mục đích rủi ro cao cho đến khi nó được kiểm toán độc lập, việc mà chúng tôi dự định thực hiện trước khi gọi đây là bản ổn định.
Gói tin đầu tiên không có bảo mật chuyển tiếp. Gói này được bảo vệ bằng khóa dài hạn của máy chủ, vì vậy nên xoay vòng khóa máy chủ định kỳ. Giao thức có hỗ trợ xoay vòng khóa.
Chưa được thử nghiệm thực tế tại Trung Quốc đại lục. Dấu vân tay TLS và kích thước gói tin đầu tiên của giao thức vẫn có thể bị phân biệt. Với người dùng tại Trung Quốc đại lục, các ứng dụng SingLinkVPN chính thức vẫn tiếp tục dùng các giao thức vận hành hiện có của chúng tôi.
Máy chủ cần có tên miền riêng, một chứng chỉ được trình duyệt chấp nhận và một trang web thật phía sau.
Dùng thử và tham gia
Với Go 1.24 trở lên, make test chạy bộ kiểm thử, make cli biên dịch công cụ dòng lệnh, và singlink demo khởi động một máy chủ và ứng dụng khách cục bộ trên cùng một máy. README trong kho mã hướng dẫn cách chạy máy chủ.
Chúng tôi hoan nghênh câu hỏi, báo cáo lỗi và Pull Request trên GitHub. Vui lòng báo cáo lỗ hổng bảo mật một cách riêng tư, không đăng trong Issue công khai. Quy trình được mô tả trong SECURITY.md.
Giấy phép và nhãn hiệu
Mã nguồn được cấp phép theo Apache-2.0: bạn được dùng, sửa đổi và phân phối lại, kể cả cho mục đích thương mại, theo các điều khoản của giấy phép. Tên "SingLink", "SingLinkVPN" và logo là nhãn hiệu của SingLinkLabs, và giấy phép không cho phép sử dụng chúng ngoài việc mô tả nguồn gốc của sản phẩm. Các phiên bản sửa đổi và bản fork nên được phát hành với tên và biểu tượng riêng.
Đọc thêm
Nguyên mẫu ứng dụng SingLinkVPN nay đã là mã nguồn mở, cùng mã nguồn trên GitHub
Sách trắng kỹ thuật SingLink 2.0, giao thức vận hành của các ứng dụng chính thức
