2. dmesg 命令详解:从启动日志看透硬件级安全威胁

dmesg 这命令,说白了就是内核的“日记本”。系统从按下电源键到登录界面出现,内核干了什么、发现了什么硬件、报了什么错,全记在里面。我干了这么多年安全排查,每次遇到不明原因的宕机、硬件异常、甚至疑似后门,第一件事就是翻 dmesg。

你想想看,如果攻击者往你的服务器上插了个恶意的 USB 设备,或者 BIOS 被篡改过,这些痕迹大概率会出现在 dmesg 里。今天我们就把它彻底讲透。

2.1 dmesg 的基本用法

直接敲 dmesg,你会看到满屏的日志。但别慌,我们一条条来拆解。

# 查看所有内核日志
dmesg

# 实时监控新产生的日志(类似 tail -f)
dmesg -w

# 清空日志缓冲区(谨慎使用)
dmesg -c

# 显示人类可读的时间戳
dmesg -T

# 限制输出行数
dmesg -n 3   # 只显示级别 3(KERN_ERR)及以上的日志

我个人习惯,排查问题时先用 dmesg -T | tail -100 看最近 100 条。为什么?因为很多硬件故障是在系统运行一段时间后才触发的,只看启动阶段容易漏掉。

小技巧: 用 dmesg -H 可以输出带时间戳的人类友好格式,但注意这个时间是从系统启动开始算的秒数,不是绝对时间。需要绝对时间就用 -T。

2.2 过滤内核消息:从海量日志中精准定位

裸跑 dmesg 输出可能有几千行。怎么快速找到关键信息?我教你几招。

2.2.1 按日志级别过滤

内核日志有 8 个级别,从紧急到调试。我们最关心的是 KERN_ERR(3)和 KERN_CRIT(2)。

级别 数值 含义 排查优先级
KERN_EMERG 0 系统不可用 最高
KERN_ALERT 1 必须立即处理 高
KERN_CRIT 2 严重错误 高
KERN_ERR 3 一般错误 中
KERN_WARNING 4 警告 低
KERN_NOTICE 5 正常但重要 低
KERN_INFO 6 信息 参考
KERN_DEBUG 7 调试信息 极少用
# 只看错误和严重错误
dmesg -l err,crit

# 只看某个级别以上的日志
dmesg -l 3   # 显示级别 3 及以上的日志

2.2.2 按关键词过滤

用 grep 配合 dmesg 是最常见的操作。我排查硬件安全时,这几个关键词是必搜的:

# 搜索 USB 相关
dmesg | grep -i usb

# 搜索硬盘/存储相关
dmesg | grep -iE 'sd[a-z]|nvme|ata'

# 搜索错误
dmesg | grep -i error

# 搜索固件/BIOS 相关
dmesg | grep -i 'firmware|bios|uefi'

# 搜索可疑设备
dmesg | grep -i 'unknown|unrecognized|failed'
注意: 有些攻击者会篡改 dmesg 日志缓冲区。如果你发现 dmesg 输出异常地少,或者某些关键信息被刻意隐藏,那就要警惕了。我曾经遇到过一台服务器,dmesg 里完全看不到 USB 设备的插入记录,后来发现是内核模块被注入了过滤钩子。

2.3 时间戳解读:把内核时间翻译成人话

dmesg 默认的时间戳是从系统启动开始算的秒数。比如 [ 12.345678] 表示系统启动后 12.345678 秒。这玩意儿看着费劲,得换算。

# 查看系统启动时间
who -b

# 或者用 uptime 看运行时间
uptime -s

举个例子:系统启动时间是 2024-01-15 09:00:00,dmesg 里有一条 [ 3600.123456] 的错误。那实际发生时间就是 09:00:00 + 3600 秒 = 10:00:00 左右。

我建议,排查时直接用 dmesg -T 转成人类时间。但要注意,-T 依赖系统时钟,如果系统时间被篡改过,那转换出来的时间也是错的。遇到这种情况,我会用 dmesg 原始时间戳配合 uptime -s 手动推算。

# 直接看人类时间
dmesg -T | tail -20

# 输出示例
[Mon Jan 15 10:00:00 2024] usb 1-1: new high-speed USB device number 2 using xhci_hcd

2.4 实战排查:硬件级安全威胁

好了,理论讲完,咱们上实战。下面是我总结的几种常见硬件安全威胁,以及如何在 dmesg 里找到它们。

2.4.1 恶意 USB 设备(BadUSB、Rubber Ducky)

攻击者把伪装成键盘的恶意设备插到你的服务器上,模拟按键执行命令。dmesg 里会留下什么?

# 正常 USB 键盘插入
[ 1234.567890] usb 1-1: new low-speed USB device number 5 using xhci_hcd
[ 1234.573456] input: USB Keyboard as /devices/pci0000:00/.../input/input5

# 可疑的 BadUSB 设备(注意设备描述和 VID/PID)
[ 1234.567890] usb 1-1: new high-speed USB device number 5 using xhci_hcd
[ 1234.573456] input: HID 1234:5678 as /devices/pci0000:00/.../input/input5
[ 1234.580123] hid-generic 0003:1234:5678.0002: input,hidraw1: USB HID v1.10 Keyboard [HID 1234:5678] on usb-0000:00:14.0-1/input0

关键点: 正常的键盘厂商 VID/PID 是公开的(比如 Logitech 是 046d),如果看到一个不认识的 VID/PID,或者设备描述里写着 HID 1234:5678 这种通用描述,就要警惕了。

我曾经在客户机房排查时,发现一台离线服务器的 dmesg 里有一条 USB 键盘插入记录,但那个机柜根本没有键盘。后来调监控发现,有人半夜用 BadUSB 植入了后门。从那以后,我排查安全事件必查 dmesg 里的 USB 记录。

2.4.2 DMA 攻击(通过 Thunderbolt/PCIe 设备)

攻击者通过 Thunderbolt 或 PCIe 接口直接访问物理内存,绕过操作系统保护。dmesg 里会有这些特征:

# 可疑的 PCIe 设备热插拔
[ 5678.901234] pci 0000:04:00.0: [8086:15d9] type 00 class 0x0c0330
[ 5678.902345] pci 0000:04:00.0: DMAR: [DMA Write] Request device [04:00.0] fault addr 0x12345000
[ 5678.903456] DMAR: DRHD: handling fault status reg 3

关键点: 看到 DMAR、DMA fault、DRHD 这些关键词,说明有设备在尝试 DMA 操作。如果系统没有 Thunderbolt 设备,却出现了这些日志,那基本可以断定有人在搞鬼。

2.4.3 固件/BIOS 篡改

攻击者修改了 BIOS 或 UEFI 固件,植入持久化后门。dmesg 里可能出现的异常:

# 正常的 ACPI 表加载
[    0.123456] ACPI: RSDP 0x00000000BFFF0000 000024 (v02 ALASKA)
[    0.123789] ACPI: XSDT 0x00000000BFFF00A0 0000AC (v01 ALASKA A M I)

# 异常的 ACPI 表(注意签名和 OEM ID)
[    0.123456] ACPI: RSDP 0x00000000BFFF0000 000024 (v02 ??????)
[    0.123789] ACPI: XSDT 0x00000000BFFF00A0 0000AC (v01 ?????? ??????)

关键点: 正常的 ACPI 表会有明确的 OEM ID(比如 ALASKA、AMI、Phoenix)。如果看到 ?????? 或者奇怪的字符串,说明固件可能被改过。

2.4.4 硬件 Keylogger(硬件键盘记录器)

攻击者在键盘和电脑之间串入一个硬件记录器。dmesg 里会多出一个 HID 设备:

# 正常情况:只有一个键盘
[ 1234.567890] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0

# 异常情况:出现两个键盘设备
[ 1234.567890] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0
[ 1234.573456] input: HID 1234:5678 as /devices/pci0000:00/.../input/input5

关键点: 系统里不应该有两个键盘设备。如果发现多了一个,而且 VID/PID 不熟悉,那大概率是硬件 Keylogger。

2.5 知识体系总览

下面这张图,是我梳理的 dmesg 排查硬件安全威胁的完整流程。你可以把它当作一个检查清单。

dmesg 硬件安全排查流程 dmesg 日志分析 USB 设备审计 PCIe/DMA 监控 固件/BIOS 校验 检查 VID/PID 是否异常 确认设备描述是否匹配 核对 HID 设备数量 搜索 DMAR/DMA fault 检查 PCIe 热插拔记录 确认设备 class 类型 检查 ACPI 表签名 验证 OEM ID 是否合法 比对固件版本哈希 综合判断:是否存在硬件威胁? 是 → 取证并隔离设备 / 否 → 记录基线 💡 排查原则: 1. 先看异常设备(不认识的 VID/PID、奇怪的描述) 2. 再看异常行为(DMA 错误、ACPI 签名异常) 3. 最后对比基线(正常启动时的 dmesg 快照)

2.6 建立你的 dmesg 基线

说了这么多,其实最有效的办法是:在系统刚装好、确认安全的时候,保存一份 dmesg 快照。以后每次排查,拿当前日志和基线对比,差异一目了然。

# 保存基线
dmesg -T > /var/log/dmesg.baseline.$(date +%Y%m%d)

# 对比差异
diff /var/log/dmesg.baseline.20240115 <(dmesg -T)
我的习惯: 每次系统更新内核、更换硬件、或者做安全加固后,我都会重新保存一份基线。这样万一出问题,能快速定位是新硬件引入的,还是旧硬件被篡改了。

嗯,dmesg 这块内容其实很深,但掌握了今天讲的这些,你已经能应对 90% 的硬件安全排查场景了。记住:日志不会说谎,除非你读不懂它。