可核实的主张。
这不是一个“我们很安全”的营销页面,而是一组可核实的主张(SR-N),其中每一条你都可以在我们的漏洞悬赏计划中提出挑战以获得奖励。
对你服务器的访问
SR-1root 密码只使用一次,且不保存在我们这一侧。已核实+
该密码仅用于打开第一个 SSH 连接并安装一个服务用户。它作为我们连接的 SSH 认证凭据传递——而不是作为脚本参数或环境变量。我们的数据库中没有存放它的字段;它不会进入脚本运行环境,也不会写入日志(连接错误只包含地址和端口,绝不包含密码)。在内存中,它在使用后会被清除(尽力而为)——这是纵深防御,而非保证:Go 可能会在堆上保留该值的副本,直到垃圾回收为止。
坦诚的保留说明:它仍然是你服务器上的 root 密码。安装完成后,我们会禁用 SSH 的密码登录和 root 登录,但我们不会更改密码本身——如果你愿意,可以自行更改。“我们不存储它”是真的;“它不再是一个秘密”则不然。
SR-2安装后,密码登录和 root 的 SSH 登录都会被禁用。已核实+
PasswordAuthentication no、PermitRootLogin no,SSH 被移到非标准端口(默认 12011),启用 fail2ban(5 次失败后封禁一小时),仅允许密钥登录。公钥在使用前会被严格校验:包含换行符的(防止把额外的密钥塞进 authorized_keys)以及语法无效的密钥都会被拒绝。
防锁死机制:在内核(通过 ss)确认新的 SSH 端口确实处于监听状态之前,端口 22 不会被关闭;配置会用 sshd -t 检查,sudo 规则会用 visudo -cf 检查,两者出错时都会回滚。
SR-3管理密钥仅以加密形式存储。已核实+
面板使用的不是你的密码,而是它自己生成的一把独立密钥(ed25519)。私钥部分以 AES-256-GCM 加密后存放在数据库中。加密密钥(KEK)与数据库分开存储——存放在服务器环境变量中——并且在生产环境中是强制性的(不存在不安全的默认值:没有 KEK,加密子系统根本不会启动)。同一套加密还保护着数据库中的重要机密——Marzban 管理员密码/令牌/JWT、Reality 密钥、支付提供商密钥、代理凭据缓存、备份配置。
加密不仅隐藏数据,还对数据进行认证(GCM 认证标签):对加密字段的篡改会在解密时被检测到并拒绝。每个字段都用一个全新的随机 nonce 加密;KEK 的值从不进入日志——只有它的短 id。
关于能力令牌:/sub 订阅令牌是一个 bearer 密钥。为便于查找,我们只存储它的 SHA-256,而重新显示一个已签发链接所需的副本则以 AES-GCM 密文形式保存。较早的明文记录会在 HTTP 服务器启动之前,以 fail-closed 的方式迁移到新格式。支付 webhook 的 URL 标识符以明文存储,但它本身并不能对事件进行认证:真实性由一个单独的 HMAC 签名来验证。
SR-4私钥从不到达浏览器。已核实+
密钥只在服务器上、于内存中解密;普通 API 从不返回它。获取它的唯一途径是一个刻意设计的导出功能(“取走你的密钥”),并受登录加一次性邮箱验证码保护(验证码只以 HMAC 哈希形式存储,以恒定时间比较,TTL 为 10 分钟,5 次尝试机会)。所以密钥可以被有意取回,但不会通过普通请求“泄露”出去。
SR-5删除服务器时,密钥会同步从其记录中清除。已核实+
在服务器状态发生变化之前、以及在任何后台网络操作之前,存放管理密钥的字段会被同步清零。如果数据库没有确认清除,该操作会返回错误并可重试。删除仍然是“软删除”:数据行和非机密的服务数据会被保留。这并不意味着对已创建的备份进行物理擦除——它们的生命周期由备份保留策略管理。
SR-16经过审计的合作伙伴 API 会将访问范围限定在资源所有者。已核实+
经过审计的合作伙伴路由按 partner_id 授权,而这个 partner_id 是服务器从已签名的登录令牌中推导出来的——而不是取自客户端在路径或请求体中发送的内容。在返回或更改任何内容之前,系统会重新检查所请求的服务器、集群、inbound、路由、VPN 用户或支付是否属于你的账户;相应的数据库查询会按你的 partner_id 限定范围,而数据库结构(复合唯一键加复合外键)会拒绝无效的跨合作伙伴关联。隔离是分层的:应用层、用例层的重新检查、一个 partner_id 过滤条件,以及数据库结构。
坦诚的保留说明:这是通过对请求路径的代码审计来验证的,而不是通过公开的渗透测试——所以 SR-16 和其余各条一样,都可以在漏洞悬赏中被反驳。
坦诚说说面板的访问权限——它是完整的管理员权限,而非“受限”权限。坦诚说明+
为了自动配置一切(安装 Xray+Reality、应用配置、读取指标),面板在服务器上拥有完整的管理权限(等同 root,通过一个具备免密码 sudo 的服务用户实现)。这对管理是必要的,我们绝不会把它称作“受限”。
有哪些因素降低了风险:机密只通过进程的 stdin 传给服务器(而不是作为命令参数——它们不会出现在进程列表中);在首次安装之后,每一次管理连接都会校验服务器已固定的主机密钥(host key)——“中途”替换服务器会被拒绝。你能掌控的:访问权建立在一把你随时可以吊销的密钥之上——通过删除服务器(密钥会被清零),或者干脆在你的主机商处删除该 VPS(那样一切都会消失)。
你的数据与隐私
SR-6VPN 用户存在于你的服务器上;我们只持有最少量的服务性元数据。已核实+
VPN 账户本身(VLESS/Reality)在你主服务器上的 Marzban 中创建并存在。我们在中心侧只存储签发订阅链接所必需的内容:一个随机订阅令牌,以及一份代理凭据的加密快照(一份缓存;真实来源是你的 Marzban)。我们没有任何流量、IP 或用户访问历史记录。
以下是一份诚实的清单,列出终端用户的邮件确实会经过我们中央数据库的地方:登录验证码邮件由我们发送,因此地址会经过我们的发送队列(针对任何店面登录,包括免费登录);付款时,买家的邮件会到达支付 webhook 并进入支付日志;关联 Telegram 时,邮件会保存到个人资料中。这些是仅有的接触点——出于功能且因必要而存在;其中没有任何一处涉及流量或用户行为。
这些服务数据我们只保留必要的时长,并会自动清除:邮件在发送后即从发送队列中移除,支付事件正文在处理后移除,等待重试的事件则在 90 天窗口内移除。您可以通过联系支持来删除自己的账户及其相关数据(详见风险 7)。我们如实公开这一点,而非用含糊的措辞加以掩饰。
SR-7我们不收集你的流量或访问日志,而且服务器也不保留任何访问日志。已核实+
CreateYourVPN 平台不接收也不存储关于你或你的用户访问了哪些网站的信息。指标采集的数据结构是封闭的:它在物理上就没有存放 IP、域名或访问记录的字段——只有聚合数据(唯一在线数、总字节数、CPU/RAM/负载)。每个节点用一个与自身 id 绑定的 HMAC 令牌进行认证,并且只能为自己写入指标。节点上的负载均衡器(HAProxy)作为按 SNI 分流的 TCP 路由器工作,并不解密流量。在服务器本身上,系统日志(journal)的保留时间不超过大约一小时,且不会转发到 syslog。
除了平台层面之外,服务器同样不保留访问日志:每次推送配置时都会强制关闭 Xray 的访问日志(平台会将 log.access 设为 none),因此边缘代理不会记录用户连接到哪些地址。这一点在代码中被强制执行,并已推送到整个服务器群。
SR-8Web 分析用的是 Google Analytics;没有其他跟踪器。已核实+
为了了解网站和面板的使用情况,我们使用 Google Analytics(cookie 横幅会就 cookie 和统计数据的收集作出提示;详情见隐私政策)。没有其他第三方跟踪器:没有 Sentry、PostHog、Mixpanel,也没有广告像素(通过搜索两个前端代码已核实)。后端完全没有任何第三方遥测。面向最终用户的门店则完全不受分析工具覆盖——没有 GA,也没有跟踪器(可从其源码核实)。
保留说明:GA 会收到你的 IP(在 Google 一侧)以及所浏览面板页面的地址;面板 URL 只包含一个集群标识符,而不包含邮箱。
SR-9支付由外部处理——我们不会收到完整的卡号。已核实+
支付及所有卡片数据都在提供商一侧处理(Tribute / Lemon Squeezy)。我们只收到一个已签名的 webhook(HMAC-SHA256,恒定时间比较,在解析请求体之前、以及在任何数据库写入之前就已验证:不知道密钥的话,事件无法通过验证)。我们不会收到完整的卡号(PAN)或 CVV。同一个 webhook 的重复投递(提供商重试)不会导致重复发放权益——事件会被去重。
保留说明:提供商可能会在 webhook 请求体中包含卡片元数据(卡组织品牌和后 4 位)以及付款人的姓名和邮箱。工作进程在处理完成之前需要用到原始请求体;处理成功后,它会连同邮箱提示一起被删除。等待重试或人工审核的事件只会将原始请求体保留到留存期结束(90 天无活动),之后卡片元数据和付款人的邮箱会被自动清除。“没有完整卡号”是真的,但那是提供商的特性(我们自己并不过滤请求体);“我们对卡片一无所知”则不然。
坦诚说明我们存储了关于你(合作伙伴)的哪些信息。坦诚说明+
邮箱(登录所需)、上次登录时间、界面模式;用于计费的——余额和 Telegram(用于充值)。合作伙伴的 IP 不会存储在数据库中,我们也不保留面板中的点击或操作历史(除了出错时的一小段访问日志)。
服务器加固
SR-10防火墙拒绝一切,除了必需的部分。已核实+
防火墙默认拒绝入站连接。对外开放的有:443(VPN,Xray+Reality)、位于非标准端口的 SSH(默认 12011),以及——在主服务器上——Marzban 管理面板端口,且仅对控制平面的 IP 开放。端口 80 只在 Let's Encrypt 模式下为了 HTTP-01 才单独开放。SSH 迁移之后,端口 22 会被关闭。
节点的管理端口只对主服务器的 IP 开放,而不对外开放(该绑定若失败,会中止安装)。如果防火墙没有生效,安装就会失败。ICMP echo 仅对 IPv4 做了限制;我们不承诺服务器是“隐形的”,而且 IPv6 的 ICMP 会被保留,以便 IPv6 正常工作。
SR-11自动安全更新。已核实+
无人值守升级(unattended upgrades)会自动安装安全软件包更新。保留说明:自动重启被有意禁用(这样未经验证的内核就不会自行重启)——这意味着需要重启才能生效的修复(内核,有时是 OpenSSH)只有在手动或计划重启之后才会应用。“自动打补丁”对用户态(userland)而言是真的,但对需要重启的部分则不然。
坦诚谈谈“隐形”——我们并不这样宣称。坦诚说明+
我们绝不宣称服务器是“隐形的”或“无法被扫描”。端口 443 是开放的,会像任何 Web 服务器一样响应 TCP 连接。“在不正确的连接下它看起来像一个普通的、无关的网站”这一特性,是由 Xray 内部的 Reality 协议提供的——那是一个我们不会将其绝对化的独立组件。
平台(控制面板)
SR-12无需密码即可登录你的 CreateYourVPN 账户。已核实+
合作伙伴登录使用发送到邮箱的一次性 6 位验证码。账户没有密码。这不适用于被管理组件的内部凭据,例如自动生成的 Marzban 管理员密码。验证码由密码学生成器生成;只存储其 HMAC 哈希,且比较采用恒定时间。验证码是一次性的:成功后会被立即删除(不可重放);5 次错误尝试之后会被提前作废。签发的速率限制按邮箱计数,而非按 IP——无法通过更换地址来绕过。
SR-13会话受到保护。已核实+
会话令牌存放在一个 HttpOnly 且 Secure 的 cookie 中(JS 无法读取它),并在后端验证(不只是在边缘)。空闲超时和无操作时的自动登出是在客户端实现的,而不是在服务器上。令牌用 HS256 签名;验证时我们会严格拒绝任何其他算法(包括 “none”)——经典的算法替换攻击无法通过。门店令牌与合作伙伴面板令牌按受众(audience)区分:一个最终用户令牌在技术上无法到达合作伙伴 API(反之亦然)。即便持有一个仍然有效的令牌,已被删除的合作伙伴也会被拒绝。
保留说明:吊销是通过在每次请求时检查合作伙伴是否存在来实现的,而不是通过使令牌本身失效;登出会删除 cookie,但已签发的令牌在密码学上仍然有效,直到过期(最多一小时)。目前还没有集中式的吊销列表(一种有意识的 MVP 简化)。
SR-14令牌和机密不会泄露到浏览器中。已核实+
浏览器的本地存储中没有任何令牌(只有 UI 设置);没有任何机密或 API 地址进入客户端打包产物。只有服务器(Next.js)会把令牌放进一个 HttpOnly cookie。浏览器只通过服务器(Server Actions)与核心通信:前端不会从浏览器直接调用 API,而且 CORS 不允许浏览器读取来自其他来源的 API 响应。
用一处澄清替代先前的绝对说法:API 域名本身是一个公开主机——从技术上你可以在浏览器中打开它,但没有会话它不会返回任何需要授权的数据。
SR-15平台的公开域名使用 HTTPS,并配有严格的安全响应头。已核实+
CreateYourVPN 的公开域名通过带 HSTS 的 HTTPS 提供服务(max-age 为两年,includeSubDomains)。网页前端和 API 域名都会发送一套严格的安全响应头:限制性的 Content-Security-Policy、X-Content-Type-Options: nosniff、X-Frame-Options,以及严格锁定的 Referrer-Policy(API 上为 no-referrer;前端上为 strict-origin-when-cross-origin,前端还会发送限制性的 Permissions-Policy)。
这已在两个域名的生产环境中生效,并可独立验证——使用任何 HTTP 响应头检查工具或 SSL Labs 之类的服务即可。
坦诚谈谈风险(我们不承诺的部分)
缺少这一节的报告就是营销。以下是真正的边界:
控制面板存储着通往整个服务器机群的加密访问密钥。它自然是系统中最敏感的组件——我们也据此对其加以保护。
何以为护:重要机密在数据库中仅以密文形式存在;加密密钥(KEK)与数据库分开存放;密钥绝不会进入浏览器;并在删除服务器时被清零。订阅令牌还有额外一层防护——哈希查找(hash lookup)加上 AES-GCM——因此即便是一份没有 KEK 的数据库转储,也不含任何可用的 /sub 链接。
诚实的上限:加密能够可靠地抵御对数据库本身的窃取——无论是备份、副本还是转储。但它并不能消除面板主机被完全攻陷的风险,在那里 KEK 与数据库对单个进程都是可用的。正因如此,我们防御的主要着力点在于从根本上不让主机被接管:隔离、自动安全更新,以及尽可能小的暴露面。
专用的 KMS/HSM 将在即将到来的某个安全版本中推出。
当您添加一台服务器时,我们只会用您输入的临时密码连接它一次。正是在这第一次连接时,Man-in-the-Middle攻击(MITM)在理论上才有可能发生。我们通过多项彼此独立的措施将其化解,因此实际风险已降至为零。
该密码是一次性的:它仅用于这一次连接,在我们这一侧不作任何保存,也绝不重复使用。私钥绝不会经由网络传输——后续的身份验证依赖的是密钥对(公钥认证,pubkey),而非密码。
安装完成后,服务器上会立即禁用密码认证与 root 登录,更改 SSH 端口,并将访问方式切换为仅限密钥。从这一刻起,即便密码被截获,也再也打不开任何东西。
此后每一次管理连接都会校验服务器已固定的指纹(主机密钥固定,host-key pinning)——被「从中」替换的服务器会被拒绝。
因此,只有在最初安装的那几秒钟内、实际处于我们与服务器之间网络路径上的攻击者,才可能实施截获——即便在这种极端情形下,被截获的数据也会立即失效。
这是任何租用服务器的固有特性,并非只有我们如此:快照、救援(rescue)模式之类的功能对服务商是可用的,没有任何软件能加以防护。另一方面,选择一家值得信赖的服务商掌握在您手中,而服务器完全属于您——您可以随时更换主机商或删除这台机器。
没有人能承诺绝对的防护——所有软件都会出现新漏洞。我们的做法:安全更新会自动安装,而需要重启才能生效的修复(内核,有时是 OpenSSH)会在重启之后应用——无论是手动还是计划重启(见 SR-11)。
用于登录的您的邮件,以及在少数服务场景中终端用户的邮件(见 SR-6)。仅在必要时长内保留,并会自动清除(见风险 9)。
由于登录依赖邮件中的一次性验证码,您的邮箱实际上就是账户的钥匙——值得好好保护。第二因素暂时还没有:在当前阶段这是合理的,但值得了解。
我们只在某项操作需要期间保留个人数据,之后便会自动清除。邮件在消息发送完成后即从队列中移除,而一次成功支付事件的原始正文则在处理完成后即被移除。
只有一样东西留存更久:正等待重试或人工审核的支付事件。它们的原始正文并非无限期保留,而是保留到一个无活动的 90 天窗口结束为止,此后个人数据会被自动清零。
界面中自助式的「删除我的数据」功能目前尚未提供——该功能已在计划之中。在此之前,您可以通过联系支持来删除自己的账户及其相关数据。
在手动吊销或删除用户之前,一个 /sub 链接就是一个永久的 bearer 令牌;没有自动过期或轮换(一个泄露的链接会一直有效)。
如果您启用了向 Google Drive 或 S3 导出备份,用户数据便会离开您的服务器,此后对它的保护就取决于您的云——本报告不对其单独涵盖。这是您有意识的选择:该功能由您自己开启。
如何核实这一切。
上面每一条主张都是一次公开的下注。我们邀请你找出我们哪里说错了或有所美化:
赛道 A——经典漏洞(RCE、授权绕过、IDOR、信息泄露等等)。
赛道 B——反驳这份报告:证明任何一条 SR-N 是错误的,即可获得奖励,我们也会公开发布更正。
有所发现?
带上可复现的概念验证写信给我们。我们会在 72 小时内回复,并在内部分级评估。