CVE-2026-41489Pi-hole 是一个用于保护设备免受恶意内容侵害的 DNS sinkhole。在 6.0 至 Core 6.4.2 和 FTL 6.6.1 之前的版本中,存在一个严重的安全漏洞。该漏洞源于 systemd 执行的两个以 root 权限运行的 shell 脚本(pihole-FTL-prestart.sh 和 pihole-FTL-poststop.sh)。这些脚本在读取配置文件中的 `files.pid` 路径时缺乏严格的验证,直接将其用于特权文件操作(如安装和删除)。拥有 pihole 权限的攻击者可以将任意路径写入 `files.pid`,从而诱使 root 用户删除并重新创建系统上的任意文件(`ProtectSystem=full-restricted` 目录除外)。在默认安装环境下,攻击者可以通过操纵 SSH authorized keys 文件实现本地权限提升至 root。该漏洞已在 Core 6.4.2 和 FTL 6.6.1 版本中修复。
该漏洞属于典型的逻辑缺陷与输入验证不足导致的本地权限提升(LPE)。Pi-hole 服务通过 systemd 进行管理,其中定义了两个关键的脚本钩子:`pihole-FTL-prestart.sh`(服务启动前执行)和 `pihole-FTL-poststop.sh`(服务停止后执行)。这两个脚本均配置为以 root 权限运行。漏洞的核心机制在于这些脚本直接从配置文件中读取 `files.pid` 参数,并未对该路径参数进行合法性校验(例如检查路径是否在预期目录内,或是否包含路径遍历字符)。随后,脚本利用该未经验证的路径执行文件操作,包括 `rm -f`(删除文件)和 `install`(创建/设置文件)。攻击者通常拥有低权限的 `pihole` 账户,并能修改相关配置。攻击者可以将敏感系统文件路径(如 `/root/.ssh/authorized_keys`)写入 `files.pid` 配置项。当 Pi-hole 服务重启或经历停止/启动循环时,systemd 会以 root 身份调用上述脚本。`pihole-FTL-poststop.sh` 会执行 `rm -f` 命令删除目标文件(即 root 的 SSH 授权密钥文件),随后的 `pihole-FTL-prestart.sh` 会重新创建该文件。由于脚本以 root 权限运行,且根据描述“获取写入权限”,攻击者可以利用文件创建时的权限设置或脚本逻辑,将自己的 SSH 公钥写入该文件,或者利用脚本创建文件时的权限漏洞(例如设置宽松的权限)由攻击者随后写入内容。一旦攻击者的公钥被写入 `/root/.ssh/authorized_keys`,攻击者即可无需密码通过 SSH 以 root 身份登录服务器,从而完全控制系统。尽管 systemd 配置了 `ProtectSystem=full-restricted` 来保护文件系统,但该保护机制并未覆盖 `/root/.ssh` 等关键路径,使得此利用路径成为可能。