BackupPC Web 管理界面未授权访问风险分析与边界验证

GobySec  5小时前

从认证委托模型出发,讨论 CGI 管理入口的暴露面、指纹判据与误报边界

漏洞类型未授权访问 / 敏感信息暴露
综合评分CVSS 3.1 · 6.5(中危)
影响产品BackupPC(Web 管理界面 BackupPC_Admin
披露时间2017-10-12
标准编号该问题未分配 CVE、CNVD、CNNVD 等标准编号
影响版本公开资料未给出明确的受影响版本区间,无法核实具体版本边界

摘要

BackupPC 的 Web 管理界面并不自行实现登录认证,而是把认证完全委托给前置 Web 服务器,再通过 REMOTE_USER 环境变量取得已认证的用户名。这一设计本身并无问题,但它把安全边界整体推给了部署方:一旦前置认证被移除、被忽略,或把 $Conf{CgiAdminUsers} 配置为通配符,未认证请求就会被当作合法管理员请求处理。

本文从该认证模型出发,梳理管理入口的暴露面,给出可用于资产识别与边界验证的请求包,并重点说明一个容易被忽略的问题:「页面返回 200」并不足以证明未授权访问成立——BackupPC 在权限被拒绝时同样会返回 200,只是渲染的是自己的错误页。

01 产品背景

BackupPC 是一款高性能的企业级开源备份系统,把 Linux、Windows 与 macOS 主机的数据集中备份到服务器磁盘。它采用拉取式(pull)架构,通过 rsync、SMB、tar 等协议从客户端取回数据;Web 界面供管理员查看日志文件、修改配置、查看当前状态,也允许普通用户启动或取消自己主机的备份、浏览并还原备份中的文件。

Web 界面由名为 BackupPC_Admin 的 CGI 程序提供。上游仓库中该程序位于 cgi-bin/BackupPC_Admin;在常见的发行版打包中,它会以 index.cgi 之名安装到 CGI 目录,并以 /backuppc/ 作为访问前缀对外提供,因此典型入口形如 http://<host>/backuppc/index.cgi

02 漏洞概述与影响评估

认证不在 CGI 里

BackupPC_Admin 的源码头部注释把这一点写得很直白:脚本要求 Web 服务器传入 sc ript_NAMEREMOTE_USER,而后者的取得依赖 .htaccess 形式的认证;若使用其他认证方式,需要自行改写取用户名的代码。官方文档给出的典型配置是在 .htaccess<Location> 中使用 Basic 认证并要求有效用户,也可改用 LDAP 或反向代理侧的 auth_basic

AuthType basic
AuthName "access"
AuthUserFile /etc/httpd/conf/passwd
require valid-user

风险来自这层委托

如果前置认证没有被正确启用——例如 .htaccess 缺失、父目录未开启 AllowOverride 导致该文件被静默忽略、或反向代理在转发时丢掉了认证环节——请求就会在没有 REMOTE_USER 的情况下进入 CGI。此时是否放行,取决于 $Conf{CgiAdminUsers} 的取值:

return 0 if ( $User eq "" && $Conf{CgiAdminUsers} ne "*" || ... );

if ( $Conf{CgiAdminUsers} ne "" ) {
    $Privileged ||= ($Conf{CgiAdminUsers} =~ /\b\Q$User\E\b/);
    $Privileged ||= $Conf{CgiAdminUsers} eq "*";
}

官方文档对这一配置的后果有直接说明:把 $Conf{CgiAdminUsers} 设为 '*' 相当于关闭用户认证,任何访问者都获得对所有主机与全部备份的完整权限,且不再要求 Web 服务器设置 REMOTE_USER

官方文档另有明确警告:若普通用户可以直接执行 BackupPC_Admin,则 they can access backup files for any PC。因此该 CGI 的属主与权限同样属于需要核查的范围。

一旦落到该状态,可读什么

未认证访问者可以获得的内容包括:备份主机清单、备份日志、备份任务的起止时间与执行结果、目录结构与文件列表;在浏览与还原视图中,还可以进一步读取备份文件的实际内容。对把备份当作最后一道数据防线的场景而言,备份内容的可读性往往等价于生产数据的可读性——备份通常不做脱敏,且保留周期长。

评分

按 CVSS 3.1 评估,综合评分 6.5(中危),向量 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N:攻击向量为网络可达、攻击复杂度低、无需目标用户交互、作用域不变;机密性影响为高(备份清单、日志、路径与文件内容均可读取),完整性与可用性不受直接影响;利用依赖目标侧已存在的认证配置缺陷,故权限分量取低权限前提。

03 影响范围

公开资料未给出明确的受影响版本区间。从实现结构看,该问题不依赖某个特定版本的代码缺陷,而取决于部署时的认证配置,因此所有把 Web 管理界面暴露在不可信网络、且认证环节缺失的 BackupPC 部署都可能受影响。

判断自身是否处于风险中,应以「访问 /backuppc/ 是否被要求输入凭据」为准,而不是以版本号为准。

04 成因分析

  • 认证委托模型的边界责任转移。 CGI 不实现认证,安全边界整体落在 Web 服务器配置上;配置一旦漂移,程序侧不会报警。
  • 便利配置的长期留存。 $Conf{CgiAdminUsers} = "*" 常用于调试或内网简化部署,但在系统迁移、重建镜像时容易被一并带到生产环境。
  • 配置文件被静默忽略。 .htaccess 只有在父目录允许覆盖时才生效;管理员看到文件存在便认为认证已开启,是最常见的误判。
  • 反向代理链路丢失认证。 在代理转发、容器编排或网关改写路径的场景中,认证中间件可能被绕过或未挂载到新的路由前缀上。
  • 端口与路径直接暴露。 把备份服务器放在公网可达位置,等于把上述所有配置风险直接暴露给任意扫描者。

05 资产识别与面板指纹

BackupPC 页面的头部会通过配置项 $Conf{CgiImageDirURL} 拼出静态资源地址,在 Debian/Ubuntu 打包下该值通常形如 /backuppc/image。这个路径是相对稳定的界面特征,可用于资产定位:

body="/backuppc/image"

若目标使用了自定义的资源目录,可改用动作名称作为特征。BackupPC_Admin 通过一张动作分派表把 URL 参数映射到具体功能模块,其中 editConfig(配置编辑)、LOGlist(日志列表)、view(视图)等名称会出现在页面链接中:

body="/backuppc/image" || body="action=editConfig" || body="action=LOGlist"

版本差异提示:部分资料使用 body="/backuppc/image/logo.gif" 作为资产特征。需要说明的是,BackupPC 4.x 的前端资源中并不存在 logo.gif(4.x 使用的是 logo320.png),该特征只能覆盖更早的 3.x 部署。作为资产定位条件,它不够稳健,建议以上述资源目录或动作名称为准。

探测请求包

GET /backuppc/index.cgi?action=view&type=LOG HTTP/1.1
Host: 192.0.2.10
User-Agent: Mozilla/5.0
Accept: */*
Connection: close

(192.0.2.10 取自文档保留网段,为示意地址,不对应任何真实主机。)

语义说明:action=view 会被动作分派表映射到视图模块,type=LOG 指定查看日志。该请求读取的是备份日志视图,属于只读操作。

判定条件的表述是:响应状态码为 200,且响应体中出现字符串 backuppc。这里必须强调:这个字符串是小写的,而它在页面头部由静态资源路径(如 /backuppc/image/...)满足——而这段头部在权限拒绝页上同样会被渲染。因此该组合的准确定性是「界面指纹」,不是「漏洞成立」。

06 认证边界验证方法

以下步骤均为只读,不触发任何写操作(备份启动、停止、删除、配置编辑等动作一律不调用)。

  1. 先看认证是否被要求。 不携带任何凭据请求 /backuppc/(不带动作参数),观察是否返回 401 并携带认证质询头。这是最直接的判据。
  2. 再请求日志视图。 发送上面的请求包,记录状态码与响应体。
  3. 区分「管理界面」与「权限拒绝页」。 关键点在于:当权限校验返回 0 时,程序不会返回 401,而是渲染自己的错误页,状态码仍是 200。因此必须检查响应体里有没有真正的内容区(主机列表、日志正文、导航容器),而不能只看状态码或产品名。
  4. 读取错误页给出的线索。REMOTE_USER 未设置时,错误页会输出一段提示,指出该变量缺失可能意味着安装存在问题,并说明脚本期望 Web 服务器完成认证后把用户名传进来。看到这段提示可以确认前置认证确实缺失;但访问是否被放行,仍取决于 $Conf{CgiAdminUsers}——这正是判定未授权访问是否成立的分水岭。
  5. 核对服务端配置。 在授权范围内检查 $Conf{CgiAdminUsers} 是否为 "*",以及 Web 服务器配置中该路径是否真的挂了认证指令。

误报风险

  • 小写字符串 backuppc 会被页面头部的静态资源路径满足,而该头部也出现在错误页上,导致「200 + 命中」不等于「访问被放行」。
  • 反向代理或网关返回的统一错误页可能包含产品名,同样造成误命中。
  • 不同发行版的访问前缀与资源目录可能不同,写死路径会同时造成漏报与误报。
  • 因此该判据应定位为「资产/界面识别」;报告结论必须由第 1、3、5 步共同支撑。

07 修复建议

  1. 在 Web 服务器层强制认证。 Apache 侧使用 Basic 认证并要求有效用户,Nginx 侧使用 auth_basic;LDAP 等其他方式同理。
  2. 确认认证配置真的生效。 检查父目录是否允许 .htaccess 覆盖,或直接把认证指令写进服务器主配置的 <Location> 段,避免被静默忽略。
  3. 不要使用通配授权。$Conf{CgiAdminUsers} 保持为空或按用户/用户组显式授权,禁止设为 "*"
  4. 收敛网络暴露面。 不要把管理界面放在公网可达位置;确需远程访问时置于 VPN 或零信任网关之后。
  5. 核查 CGI 权限。 确认 BackupPC_Admin 的属主与权限设置正确,普通用户不能直接执行或修改它。
  6. 若使用 SCGI,务必限制端口。 官方文档明确警告 SCGI 服务端口不能被任何不可信来源访问,需在主机防火墙上封禁。
  7. 把备份加密与访问审计纳入常规。 备份介质加密可以显著降低「备份内容被读取」的实际损失;对管理界面的访问做日志留存与异常告警。

08 参考资料

授权声明

本文用于授权范围内的安全评估与防御加固参考。文中所有主机地址均取自文档保留网段(192.0.2.0/24 等),为示意地址,不对应任何真实系统。请勿在未获得明确书面授权的情况下对任何系统执行本文所述的验证操作;未获授权的测试可能违反相关法律法规,风险由操作者自行承担。

最新评论

昵称
邮箱
提交评论