工业控制系统中一个“来历不明”的U盘,是如何被追查到底的?
某个清晨,某智能制造车间的操作员工作站突然弹出一条系统提示:“检测到新USB设备接入”。这本是再平常不过的一幕——操作员拷个报表、传个配置文件,插个U盘再正常不过。但这一次,日志里跳出的几个字段却让安全工程师皱起了眉头:
idVendor=1d6b, idProduct=0101, Manufacturer: Linux 5.4.0-91-generic xhci-hcd1d6b?这不是Linux内核自己用的VID吗?怎么从物理USB口冒出来了?
一场关于未知USB设备的排查就此展开。
当一个U盘插入工控机时,系统究竟知道了什么?
在大多数人眼里,USB设备就是一个“即插即用”的黑盒。但在操作系统底层,每一次热插拔都是一场精密的“身份审查”。
当你把一个U盘塞进工控机的瞬间,主机就开始了一场快速而严谨的“枚举”流程:供电、分配地址、索取描述符、匹配驱动……整个过程通常在毫秒级完成。而最关键的是——哪怕设备最终没能挂载成功,只要它完成了基本枚举,就会在系统中留下完整的“数字指纹”。
这些所谓的“设备描述”,远不止你看到的那个盘符那么简单。它们才是真正的“身份证信息”:
| 字段 | 含义 | 安全意义 |
|---|---|---|
| VID(Vendor ID) | 厂商编号,由USB-IF统一分配 | 可追溯至制造商,全球唯一 |
| PID(Product ID) | 产品型号ID,厂商自定义 | 区分具体设备类型 |
| Serial Number | 序列号 | 高端设备具备个体唯一性 |
| Device Class | 设备类别,如存储、HID、通信等 | 直接反映功能与风险等级 |
| Manufacturer/Product String | 厂商名/产品名字符串 | 辅助识别,但可伪造 |
| bcdUSB | 支持的USB协议版本 | 判断设备新旧与性能 |
比如常见的SanDisk U盘:
VID=0781, PID=5567 → 查库可知为 Cruzer Blade Class=08 → 大容量存储设备 Serial=4C530001... → 每个设备独一无二正是这些细节,构成了我们追踪“未知USB设备”的第一道防线。
🔍关键洞察:攻击者可以伪装产品名称,甚至模拟合法VID/PID,但要批量伪造真实存在的序列号+类描述+协议一致性,成本极高。换句话说,设备描述的组合特征,比杀毒软件更早告诉你“这家伙不对劲”。
我们是怎么抓住那个“可疑U盘”的?
回到开头那起事件。操作员只是像往常一样插了个“转接头”,可系统日志却捕捉到了异常信号:
[ 9876.543210] usb 2-2: new full-speed USB device number 3 using ohci-pci [ 9876.544000] usb 2-2: New USB device found, idVendor=1d6b, idProduct=0101 [ 9876.544005] usb 2-2: Product: USB2.0 Hub [ 9876.544010] usb 2-2: Manufacturer: Linux 5.4.0-91-generic xhci-hcd三个危险信号立刻浮现:
- VID=1d6b 是 Linux 内核用于虚拟主机控制器的保留标识,不该出现在外部设备上;
- 它自称是一个“Hub”(集线器),意味着可能扩展出更多隐藏设备;
- 厂商字符串直接暴露了内核版本,极可能是某种调试工具或恶意固件模拟。
这不是普通U盘,更像是有人试图通过USB通道建立隐蔽连接。
第一步:翻遍所有日志,找出蛛丝马迹
我们在该工作站执行了以下命令,提取完整上下文:
# 查看内核实时日志 dmesg | grep -i "usb.*2-2" # 检查历史系统日志 journalctl -u systemd-udevd --since "2024-04-05 10:00" | grep -i usb结果确认:设备仅短暂存在约40秒后被拔出,期间未生成任何文件访问记录,也没有触发防病毒告警。传统防护手段完全失效。
第二步:构建设备指纹数据库,实现精准比对
为了不再“靠人眼查日志”,我们搭建了一个轻量级USB设备指纹库,结构如下:
{ "timestamp": "2024-04-05T10:23:15+08:00", "host": "scada-opstation", "port_path": "2-2", "vid": "1d6b", "pid": "0101", "class": "09", // Hub类 "product": "USB2.0 Hub", "manufacturer": "Linux 5.4.0-91-generic xhci-hcd", "serial": null, "risk_level": "high" }并将所有历史USB接入事件导入ELK平台,做了一次全厂区扫描。结果令人惊讶:过去一周内,另有两台HMI设备也记录过相同VID/PID组合,时间均发生在非工作时段。
这已经不是误操作,而是有规律的行为。
第三步:视频回溯+人员定位,闭环追责
调取现场监控录像发现,当天上午10:23,张姓操作员确实在该工作站插入了一个外形类似CH340芯片的USB转串口模块。他声称是为了临时调试一台老式仪表。
问题在于:为什么一个串口适配器会报出“Hub”类设备?又为何使用Linux内核保留VID?
进一步分析其携带设备的固件后确认:这是一个经过修改的开发板,烧录了自定义USB描述符,意图绕过简单的白名单检查。虽然本次无恶意代码注入,但已具备中间人攻击(MITM)能力——它可以监听、篡改甚至注入PLC通信流量。
第四步:从被动响应到主动防御
事件处理并未止于警告和通报。我们推动实施了几项实质性改进:
✅ 实施USB设备白名单策略
利用udev规则,在设备接入时自动校验VID/PID是否在注册清单中:
# /etc/udev/rules.d/99-usb-whitelist.rules ACTION=="add", SUBSYSTEM=="usb", \ ENV{ID_VENDOR_ID}=="0781", ENV{ID_MODEL_ID}=="5567", GOTO="usb_accept" ACTION=="add", SUBSYSTEM=="usb", \ ENV{ID_VENDOR_ID}=="abcd", ENV{ID_MODEL_ID}=="1234", GOTO="usb_accept" ACTION=="add", SUBSYSTEM=="usb", \ RUN+="/usr/local/bin/block_usb.sh %k" LABEL="usb_accept"只有SanDisk企业级U盘、特定型号加密狗等预登记设备才能正常挂载。
✅ 关键端口物理封禁 + BIOS级控制
- 对非维护用途的USB接口进行胶封或使用物理锁;
- 在BIOS中关闭前置USB端口,仅开放后置指定接口;
- 启用UEFI安全启动,防止恶意固件加载。
✅ 集成至终端安全管理平台
将USB日志采集脚本升级为守护进程,支持:
- 自动脱敏上传至SIEM系统;
- 联动身份认证,记录“谁在何时接入了什么设备”;
- 触发实时告警并推送至运维微信群。
不只是查U盘,更是重建工控安全的认知边界
这次排查看似只解决了一个“小问题”,实则暴露出工业控制系统中最脆弱的一环:我们太习惯于防御网络层面的攻击,却忽视了物理接口的“最后一厘米”。
想想看:
- Stuxnet(震网病毒)是怎么进来的?U盘。
- 某石化厂PLC程序被篡改?维修人员带入感染设备。
- 某电力调度系统数据泄露?实习生用私人U盘拷贝日志。
这些都不是理论推演,而是真实发生过的事故。
而我们的应对方式,往往停留在“贴个封条”“发个通知”这种低效管理手段上。真正有效的做法,应该是:
🛠 把USB接入变成一次“可审计、可追溯、可阻断”的标准化操作
就像你在银行转账需要双重验证一样,任何外部设备接入关键系统,都应该经历:
- 身份识别:VID/PID/序列号是否在册?
- 用途申报:是否关联工单?是否有审批记录?
- 行为监控:接入期间是否有异常读写?
- 责任绑定:操作员账号+时间戳+视频记录三重关联。
唯有如此,才能把“人为失误”关进制度的笼子。
给工控安全团队的几点实战建议
如果你也在负责工厂的信息安全,不妨从以下几个动作开始:
1. 立即跑一遍“USB资产普查”
在每台工控机执行:
lsusb -v | grep -E "(idVendor|idProduct|iProduct|iManufacturer)" > usb_inventory.txt整理出当前所有合法设备的VID/PID清单,作为白名单基础。
2. 部署最小化日志采集脚本
无需复杂系统,一个几行的shell脚本就能实现基本审计:
#!/bin/bash # log_usb.sh - 记录每次USB接入 echo "$(date): USB ADD on $1, VID=$(cat /sys/bus/usb/devices/$1/idVendor 2>/dev/null)" >> /var/log/usb.log配合udev规则启用即可。
3. 建立“高风险设备”特征库
重点关注以下类型:
-VID=1d6b(Linux虚拟设备)
-Class=02(CDC通信类,常用于4G模块或恶意C2通道)
-Class=ef(Miscellaneous,杂项设备,易被滥用)
- 无序列号、空厂商字符串的设备
一旦出现,立即告警。
4. 推动管理制度落地
技术只是工具。必须配套制定:
- 《外部设备接入管理办法》
- 《移动介质使用登记表》
- 《违规接入处罚机制》
并在入职培训中明确告知员工:“插U盘不是小事,出了问题要追责。”
结束语:安全,始于对每一个细节的较真
那个写着“Linux 5.4.0-91-generic xhci-hcd”的U盘早已被收缴封存,但它留下的警示仍在回响。
在工业控制系统中,最危险的从来不是那些复杂的APT攻击,而是我们认为“应该没问题”的侥幸心理。
一次随意的插拔,可能打开潘多拉魔盒;
一条不起眼的日志,或许就是入侵前的最后预警。
而我们要做的,就是让每一个VID、每一个PID、每一次接入,都无所遁形。
毕竟,在关乎生产安全的世界里,
没有“差不多”,只有“零差错”。
如果你正在构建自己的工控安全体系,欢迎留言交流实践心得。也别忘了点赞+收藏,让更多一线工程师看到这场“从U盘说起”的安全觉醒。