那个 VPN 应用是官方版本还是仿冒品?
复制的名称、有效的签名和能连通的隧道,证明的东西比看上去少。请把发布者、软件包和更新路径与开发者页面逐项对照。
仿冒软件会复制名称、图标和截图,而且连接得足够好,看起来很像真的。隧道能通并不能证明什么,因为真正的问题是二进制文件由谁编写。请把这当成身份核对,而不是安全审计,并且每个参考值都要来自你自己选择的渠道,而不是应用自己的页面。接下来有五项检查,任何一项都可能失败,而其余各项却通过。请按顺序做,因为后面的检查救不了前面的检查。
从你自己选择的渠道取得参考值
在看已安装了什么之前,先打开项目的官方下载说明,或贵组织受管的软件渠道。记下预期的商店发布者、软件包或安装程序的身份,以及受支持的平台,然后把这条记录放在下次更新时你能找到的地方。搜索结果或赞助位并不是那个渠道,付费位之所以排在自然结果之上,正是因为人们会点第一个匹配项。核对后请把页面加入书签,让下一次下载从决定出发,而不是从重复搜索出发。
镜像或第三方软件仓库也是一种渠道,它的可信度只等于其运营方。请写下你用了哪一个,因为这个细节正是人们在两次更新之间会忘掉的。
比较已安装的发布者,而不是名称
在平台有记录的地方,依赖它自己的签名和应用记录,然后读取版本、更新路径以及应用申请的权限。看到有效签名并不等于看到你预期的发布者,因为证书只能证明某个二进制文件由持有该证书的一方签过名。来自你从未听过的公司的签名仍然是有效签名,所以这项检查必须点明你本来想找的是哪一方。安装程序如果夹带额外软件、索要证书,或弹出你没想到的账户提示,就需要产品自己的文档给出解释。
# Windows: inspect the installed signature
Get-AuthenticodeSignature "C:\Program Files\WireGuard\wireguard.exe"
# macOS: check the bundle identity
codesign -dv --verbose=2 /Applications/WireGuard.app
# Linux: confirm the package origin
apt-cache policy wireguard运行与平台相符的检查,并把输出与第一步做的参考记录对照。发布者字段不一致,比任何视觉相似都更有信息量,因为复制一个图标毫无成本。如果输出提到项目的文档里根本没有的组织,就停在那里,不要登录。
已安装的签名究竟证明了什么
当项目发布校验和、签名或发布密钥时,要走完它记录的整套流程,包括获取参考密钥的那一步。印在与下载同一页面上的校验和只能证明文件与那一页相符,这个说法比看上去要弱。真正有用的问题是:签名能否沿着仿冒者控制不了的路径,链接到项目所记录的身份。人们往往把这一步简化成「文件到底有没有签名」。
从密钥服务器取来的密钥和印在 README 里的指纹并不是同等证据。在称该文件已验证之前,请先确定你实际用的是哪一种。
应用是真的,但配置文件不是
客户端和服务器配置文件来自两个不同的签发方,把它们混为一谈,是与装错二进制文件不同的一类错误。由某个项目维护的 OpenVPN 版本会痛快地加载无关运营方写的配置,这是正常行为,而不是被入侵的证据。反过来也一样:合法的配置文件并不能让非官方客户端变得可信。每个对象都要对照它自己的来源核验,绝不要让「能连上」把两项检查合成一项。
动手之前先问:两个对象里究竟哪一个存疑,因为补救办法不同。客户端有问题意味着重装,配置文件有问题意味着删掉一个文件再重新签发。
不确定就行动,然后彻底清理
如果身份仍不确定,就停止提供凭据,并通过你加过书签的已核验渠道独立获取软件。按照平台对不受欢迎应用的指引处理,而不是删掉一个文件夹然后指望没事。然后把接受的发布者、版本和核验方法记录下来,好让下一次更新能对照事实,而不是对照记忆。
换成合法版本之后,要在客户端和操作系统两边都过一遍旧的配置文件和已授予的权限。卸载下载来的文件会留下已安装的应用,而旧配置文件可能比创建它的客户端活得更久,并且仍然指向没人维护的端点。WireGuard 的官方安装页面就是一个值得保留的参考范例:它是开发者自己的清单,而不是镜像。