扫描器结果会给出一个地址、一个端口以及在那里协商出的某种东西。它不会指出该套接字背后的进程,而在 VPN 主机上,多个进程可以共用一台机器,其中只有一个是隧道。从旁路工具读到版本字符串,或在磁盘上发现某个库文件,增加的是关于主机的证据,而不是关于监听者的证据。只有当发现被绑定到一个正在运行的组件,再与公告实际声明的范围对照时,它才变得可处置。

顺序很重要:先组件,后公告,最后修复。

报告说的是端口,不是程序

从真正被评估的端点开始。针对 HTTPS 管理端口的探测测量的是 Web 服务、它的 TLS 栈以及位于其前面的任何代理;它对另一个端口上的 OpenVPN 或 WireGuard 监听者一无所知。反向代理和管理代理会让情况更糟,因为证书和横幅可能属于前端,而有漏洞的库位于其后的后端进程中。

把目标、传输方式、端口和服务名与结果一起记录下来,让范围随发现一起流转。

正在运行的构建究竟是什么

在通用主机上,已安装的软件包和已加载的库是两个不同的问题。包数据库可能列出一个已修补的版本,而长时间运行的守护进程仍把旧的共享对象映射在内存中;捆绑的设备镜像也可能自带任何包管理器都不会报告的库。先问服务管理器什么在运行,再检查进程及其链接关系。

systemctl status openvpn-server@server --no-pager
ps -o pid,lstart,args -C openvpn
ss -lntup | grep -E '1194|443'
dpkg -l | grep -i -E 'openvpn|libssl'
ldd "$(command -v openvpn)" | grep -i ssl

进程列表里的启动时间,是人们常跳过的一个细节。在上次软件包升级之前启动的守护进程,仍在运行它开机时加载的那个构建,而这正是清单说已修补、套接字却说不是的情形。

把构建与公告的范围对齐

公告会描述产品、版本,有时还有必要条件,而这三个字段并不总与某个包版本一致。OpenVPN 的 2014 年四月 Heartbleed 公告 是个有用的历史例子,因为它把受影响的 Access Server 版本与暴露情况不同的 Web 服务和 VPN 守护进程区分开来。教训是读懂文本覆盖的是哪个组件,而不是对 OpenSSL 一词做模式匹配。

那份公告也已过时。它给出的已修补版本号如今不再是安装建议,而 2014 年修复的缺陷,与今天你所运行分支上的后续问题毫无关系。

先解决分歧,再关闭暴露

当清单与评估不一致时,检查两者描述的是否为同一端点和同一运行时:另一个地址、前端代理、第二个服务、仍绑定该端口的旧进程,或包管理器从未见过的捆绑库。先在这个边界上解决,再去改写报告。

应用受支持的修复,重启受影响的服务,并确认现在运行的正是新构建。磁盘上的文件已修补、旧进程却仍在处理流量,这不叫修复。

然后处理该组件在暴露窗口内可能持有的东西。打补丁与更换凭据回答的是不同问题,存放在受影响主机附近的证书本身并不是泄露清单。按事件负责人的流程执行吊销、会话清除和客户端更新,并记录哪个组件受影响、证据为何适用、什么把它关闭。后来复核时要读的,正是这份记录。

相关文章