# 星连协议安全评测：第一代开源实现、测试范围与四项发现

VPNDevelop结合源码与测试记录，分析星连第一代协议固定提交中的三项中危、一项低危问题，并给出修复与验收建议。受审版本的四项发现均未关闭；已有基准测试和有限模糊测试不能代替生产验证，竞态检测受阻也不能记为通过。

报告日期：2026-11-13；整理日期：2026-11-13T20:17:00+08:00。

受审提交：6540bf335d0b370453421dabebafc2d1fc8840ea

仓库：https://github.com/SingLinkLabs/singlink-protocol

本文为VPNDevelop对该开源项目的审查与分析，结合公开源码、审查记录和测试证据，从产品开发与工程实践角度评估功能实现、安全边界及改进方向。结论以注明的源码版本和测试范围为准；源码审查不等同于对当前商业客户端或线上服务的安全认证。

## 测试范围

- 握手、令牌与加密帧（已执行）：报告记录源码审查、原有基准、篡改对照和有限模糊测试；不是密码学形式证明或旁路攻击实验。
- 重放、撤销与引擎生命周期（已执行）：报告使用合成凭据、本机回环连接及可控制时序验证缺陷；没有对生产节点进行攻击或修补。
- NAT64 地址策略（已执行）：仅执行纯解析器和策略等价性测试，没有真实 NAT64 转换器、外部拨号或路由环境验证。
- 依赖公告与静态检查（静态检查）：报告记载 go vet 完成；Windows、Linux 源码视角的已知漏洞检查无匹配发现。Linux 源码视角不等于 Linux 运行测试。
- 竞态检测（受阻）：ThreadSanitizer 在有效执行前发生内存分配错误 87；没有可用的竞态检测通过结论。
- 命令行、FFI 与部署（静态检查）：CLI 基准语句覆盖率为 0%；无完整命令行端到端验证。CGO_ENABLED=0 基准排除 FFI；App 报告中的 ABI 冒烟测试应单独理解。systemd 范例未在该 Windows 测试主机运行。
- 真实网络与生产隐私（未覆盖）：没有大陆运营商可用性、真实 NAT64 拓扑、长期高并发、生产日志、账户后端或全平台流量泄漏测试。
- 最新商用产品与后续提交（未覆盖）：当前商用第二代协议、官方客户端、仓库其他提交与修复后的重新验证均不在该报告结论范围内。

## 问题清单

### P-01 进程重启后，部分带未来时间戳的首包可能被重复接受

中危；状态：受审版本未修复，尚无修复后复测。

证据：报告证据 P-REPRO：同一进程拒绝重复首包，新建且复用相同节点密钥的服务实例却再次接受了同一合成首包。这里模拟了重启后的内存状态丢失，没有重启真实系统服务。

影响：前提是攻击者已取得经过认证的内层首包，客户端时钟在允许范围内超前，且新进程沿用旧密钥。可能造成早期应用数据重复交付；不等于解密、伪造令牌或已证实重复付款。普通外层 TLS 旁观者不因此获得内层首包。

建议：使用跨进程持久化、原子化的重放记录，或收紧早期数据策略并设计重启密钥轮换。验收须覆盖真实重启、并行进程、时钟偏差和存储故障；重复请求应在第二次连接目的地之前被拒绝。

### P-02 撤销清单解析失败时，最后有效清单可能被不完整结果覆盖

中危；状态：受审版本未修复，尚无修复后复测。

证据：报告证据 P-REPRO：先载入有效合成撤销记录，再提供包含超长行的临时输入；解析中止后原记录不再被视为撤销。源码安装新映射前没有处理扫描器错误。

影响：依赖受信任的文件生成或传递流程先发生异常。尚在有效期内的已撤销凭据可能重新具备连接资格；签名、有效期和设备持有证明仍会检查。没有证据表明远端用户能写入该文件。

建议：整份解析和验证成功后才原子替换，失败时保留最后有效清单并告警。区分明确清空与解析失败，补测截断、无效条目和超限输入；日志不得输出完整凭据。

### P-03 NAT64 等价地址未一致应用自定义 IPv4 与节点本机地址规则

中危；状态：受审版本未修复，尚无修复后复测。

证据：报告证据 P-REPRO：纯策略测试中，被 IPv4 规则拒绝的合成目标，通过等价 NAT64 地址得到不同结果；私有地址负向对照仍被拒绝。没有外部网络连接。

影响：实际影响依赖节点具备相应 NAT64 路由且目标被相关 IPv4 规则拒绝。不能推导为所有部署均受影响，也不能描述为所有内网地址都可绕过。

建议：对明确支持的转换前缀，同时校验原 IPv6 与等价 IPv4 地址；未支持时应明确拒绝。修复后先验证策略矩阵，再在受控 NAT64 网络确认拒绝发生于建立连接之前。

### P-04 停止操作没有取消尚未完成的引擎启动

低危；状态：受审版本未修复，尚无修复后复测。

证据：报告证据 P-REPRO：可控制的启动回调在 Stop 返回后继续完成，Running 又变成 true。该结果来自确定性顺序测试，不依赖已受阻的竞态检测器。

影响：需要本地调用方在启动未完成时停止。旧任务可能随后留下活动传输；未证明远端控制或实际 DNS 泄漏。它与 App 的 A-02 位于不同层，不能简单叠加为两个独立远程攻击。

建议：以取消上下文和启动代次使旧操作失效，过期回调返回的传输立即清理。验收覆盖先停后完成、重复停止、启动失败及新一轮连接，避免旧操作影响新连接。

## 这份星连协议评测回答什么？

它回答的是：**第一代开源协议的指定源码版本，在给定本机测试条件下表现怎样，哪些问题已有证据，哪些问题仍需验证。** 它不回答某款商用 VPN 今天是否安全、是否能在大陆连接，或是否真正零日志。

VPNDevelop从VPN协议开发与运行维护的角度，对该开源实现进行审查与分析，重点关注加密边界、状态管理和异常输入处理。本文结合固定版本源码与2026年11月13日v1.0审查记录，说明问题影响、修复建议和验收条件。测试数据采用已有本机验证记录；中危、低危为基于触发条件与影响的定性分级，不是CVSS评分。

## 固定版本与来源怎么核对？

唯一受审提交为 **6540bf335d0b370453421dabebafc2d1fc8840ea**，对应第一代 1.0.0-draft、规范 draft 3。报告涉及 33 个受 Git 跟踪文件，包含协议库、令牌与连接解析、握手与数据帧、TCP/UDP 转发、目的地策略、撤销控制、本地代理、运行引擎、命令行、FFI 源码和部署范例。

[官方固定版本 README](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/README.md) 将这代开源实现与当前商用第二代协议区分。其内部审查说明属于供应商资料，不能替代独立验证。**仓库后续更新不自动继承本页结论：既不能据旧报告认定新版本仍有问题，也不能仅凭新提交宣称问题已修复。**

## 加密保护在哪结束？

数据路径可概括为：应用 → 本地代理或客户端 API → 经过认证的加密链路 → 星连节点 → 目标服务。节点验证令牌与设备证明、执行目的地策略后再转发。协议内层加密终止于节点；应用自身的 HTTPS 可继续保护到目标网站，纯 HTTP 内容在出口仍可读取。这个边界不等于发现了内容日志。

| 构造 | 报告记录的实现 | 不能据此推出的结论 |
| --- | --- | --- |
| 数据加密 | AES-256-GCM；方向密钥分别派生 | 使用标准原语不代表整体协议已经认证 |
| 初始协商 | X25519 与静态 ML-KEM-768 混合构造 | 不能笼统宣称所有数据都有后量子前向保密 |
| 密钥派生 | HKDF-SHA-256 与用途、方向及握手上下文绑定 | 不免除端点、密钥保管与部署风险 |
| 客户端认证 | Ed25519 签发令牌和设备持有证明 | 完整连接链接含敏感设备材料，仍须像密码保管 |
| 外层传输 | 默认最低 TLS 1.3，可选原始 TCP | 原始 TCP 或弱化验证选项不能等同默认安全属性 |

首包可携带最多 8 KiB 早期数据，对后来获得相关静态节点秘密的人不具备前向保密。后续流量增加临时 X25519，具有文档描述的传统前向保密目标；静态 ML-KEM 密钥被攻破后不提供后量子前向保密。这些是 [SPEC 已披露的边界](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/SPEC.md#L241-L290)，不是新增漏洞。

## 报告实际记录了哪些测试结果？

下表为**受审版本已有测试记录**，执行环境记录为Windows和Go 1.27.4。数据用于分析该版本的行为与验证缺口，不代表修复后的重新测试结果。

| 检查项 | 结果 | 应怎样理解 |
| --- | --- | --- |
| 原有基准 P-BASELINE-R2 | 37 个顶层测试通过，含 6 个模糊测试种子框架 | 更正首次参数错误后的有效基准；不掩盖首次退出失败 |
| 问题复现 P-REPRO | 4 项复现成功 | PASS 表示缺陷确实发生，不表示安全修复通过 |
| 密码学对照 | 修改过的认证数据被拒绝，方向密钥分离 | 有限输入的实现对照，不是保密性形式证明 |
| 静态检查 P-VET | go vet 完成 | 不等于发现全部逻辑错误 |
| 已知漏洞检查 | Windows、Linux 源码视角未输出匹配发现 | 不涵盖未知漏洞；Linux 视角不是 Linux 运行测试 |
| 竞态检测 P-RACE-R3 | 受阻，错误 87 | 无有效通过结论，需要在兼容环境补测 |

基准语句覆盖率为 **1296/1914，67.71%**。其中协议库 81.38%、本地代理 75.78%、引擎 39.17%，命令行 0%。该基准关闭 CGO，未纳入 FFI，不能把这个比例叫作“全部安全测试覆盖率”。

六个模糊测试目标分别使用 20 秒、2 个工作进程，总计 2,629,775 次执行，未观察到崩溃或测试不变量失败。不同目标执行数差异明显；这些短时探索不能代替长期模糊测试、资源压力测试或生产容量测量。

## 四项问题应按什么顺序处理？

优先处理 P-01 的跨重启重放和 P-02 的撤销故障放行；二者涉及认证后的请求行为与权限变更。随后统一 P-03 的等价地址策略，再处理 P-04 的取消与清理语义。详细条件、影响和建议见本页问题清单。

修复不是让现有复现用例继续显示 PASS。原用例刻意断言不安全行为，修复验收应增加“拒绝该行为”的负向回归，同时确认正常连接没有受损。P-04 需要与 [开源 App 专栏](/reviews/singlink-app) 的 A-02 协同验证：引擎停止与界面状态两层都应拒绝过期操作。

## 仍不能给出结论的范围

- **大陆网络可用性：** 没有运营商、地区、时段、节点和长期采样，不能给出能用率或抗封锁排名。
- **零日志：** 源码中没有常规内容记录，不代表生产反向代理、账户后台、崩溃转储和基础设施不保留元数据。
- **真实部署安全：** systemd 与防火墙范例没有在报告的 Windows 主机实际验证；真实权限、路由和密钥轮换另需核对。
- **长期稳定与容量：** 没有长时间高连接数测试，不提供吞吐、并发或内存安全保证。
- **完整应用保护：** 协议测试不能证明客户端 DNS、IPv6、断线保护或全设备隧道正常。

## 常见问题

### 四项发现意味着当前星连商用服务有同样问题吗？

不能这样推断。报告只针对指定第一代开源提交，当前商用第二代协议与官方客户端不在范围内。判断运行服务需要先确认二进制对应源码和部署配置。

### 没有确认高危问题，是否可以说“安全通过”？

不可以。有限审查没有确认高危，不等于高危不存在。四项发现仍未关闭，竞态检测受阻，真实部署和多个关键边界尚未覆盖。

### 加入 ML-KEM 就代表所有流量都抗量子攻击吗？

不代表。需要区分初始混合协商、早期数据、后续会话和静态密钥事后泄漏。本实现已有明确的前向保密限制，不能只用算法名称概括整个系统。

### 问题什么时候可以标为已修复？

需要公开可核对的修复提交、对应负向用例与正常功能回归、适用环境和复测日期。只有提交说明而没有复测证据时，状态应写“待复测”，不是“已验证修复”。

## 版本记录与后续复测

| 日期 | 记录 | 状态 |
| --- | --- | --- |
| 2026-11-13 | v1.0源码审查记录与有限本机验证，本站分析问题影响及修复方向 | P-01 至 P-04 均未关闭 |
| 待安排 | 修复提交核对、兼容环境竞态检测、真实重启与受控 NAT64 验证 | 本页尚无修复后复测记录 |

后续更新应保留旧版本结论，并说明变化的是源码、部署条件还是测试方法。引用本页时请注明VPNDevelop、完整提交、报告日期和本机验证条件，不要省略适用范围。


## 来源

- [官方源码：本报告受审提交](https://github.com/SingLinkLabs/singlink-protocol/commit/6540bf335d0b370453421dabebafc2d1fc8840ea)
- [固定版本说明与第一代产品边界](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/README.md)
- [协议规范：密钥与前向保密限制](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/SPEC.md#L241-L290)
- [重放控制源码](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/singlink/server.go#L289-L308)
- [撤销清单加载源码](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/singlink/server.go#L528-L575)
- [目的地策略源码](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/singlink/policy.go#L206-L284)
- [引擎启动与停止源码](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/engine/engine.go)
- [官方安全问题报告流程](https://github.com/SingLinkLabs/singlink-protocol/blob/6540bf335d0b370453421dabebafc2d1fc8840ea/SECURITY.md)

本文件为简体中文整理版，不是原始审计报告，也不包含原始日志、源码或复现脚本。
