游客发表
去年冬天,嵌入我在一个客户的式渗机房里蹲了三个小时。目标是嵌入一台2016年投产的西门子S7-1200 PLC,固件版本V4.1.3。式渗这台PLC控制着整条包装线,嵌入但它的式渗Web服务器居然还开着默认的8080端口,密码是嵌入"admin"。
我没用任何漏洞利用工具。式渗就是嵌入打开浏览器,输入IP,式渗敲进那六个字符。嵌入然后我看到了所有I/O点的式渗实时状态,还能直接改写输出寄存器。嵌入那一刻我意识到,式渗嵌入式渗透根本不需要什么0day——大多数时候,嵌入门就没锁。
传统IT系统有补丁周期、有EDR、有安全团队盯着。嵌入式设备呢?出厂即巅峰。厂商卖出去就不管了,固件三年不更新是常态。更麻烦的是,这些东西的设计哲学就是"能用就行"。实时操作系统跑着,内存就几百KB,你让它怎么实现完整的TLS栈?
我拆过一款国产IP摄像头。固件用binwalk解包后,里面有个telnetd,密码硬编码在/etc/passwd里。更离谱的是,这个密码在所有同型号设备上通用。厂商的逻辑大概是:反正用户不会改,那就别费事了。
嵌入式渗透的入口远不止网络服务。UART、JTAG、SPI Flash,这些调试接口经常就焊在板子上,连个封胶都懒得涂。我见过一台工业路由器,拆开外壳后UART的TX/RX/GND三个焊盘明晃晃地排在那里,波特率115200,接上FTDI就能拿到root shell。
还有固件更新机制。很多设备通过TFTP或HTTP拉取固件,签名校验?不存在的。你只要能中间人,或者干脆伪造一个更新服务器,就能让设备刷入任意固件。去年某品牌智能门锁的固件更新就是明文HTTP,我改了个bit,锁就永远不锁了。
说个具体的。某次测试一台HMI触摸屏,ARM Cortex-A8,跑Linux 3.2。我通过U-Boot的串口控制台进了系统——启动时按任意键就能中断自动引导,没有任何密码。进去之后发现/etc/shadow里root的密码哈希是DES的,8位以内秒破。
但真正有意思的是它的应用层。触摸屏上跑着一个Qt程序,通过本地socket和后台守护进程通信。我用strace跟了一下,发现守护进程接收JSON指令时没有做长度校验。发一个超长字符串,栈溢出,直接拿到守护进程的权限。这个守护进程以root运行,因为它要控制GPIO。
你看,从物理接口到应用逻辑,每一层都在给你递刀子。
我跟很多做嵌入式的工程师聊过。他们不是不知道安全问题,是排期里根本没有这一项。硬件成本压到极致,软件能跑就行。你跟他们提安全启动、提签名固件,他们回你一句:"加这些,BOM成本涨两块钱,老板能把我杀了。"
所以现实的做法是:网络隔离。把嵌入式设备关在单独的VLAN里,只放行必要的协议。禁用所有不需要的服务——telnet、ftp、http管理页面,关掉。物理接口用环氧树脂封死,或者至少把调试焊盘从PCB上去掉。
但说实话,这些措施在真正的攻击者面前也就是多花十分钟的事。嵌入式渗透的核心矛盾在于:设备生命周期十年起步,而安全威胁每年都在变。你没法给一台2010年的PLC打补丁,因为它连TCP/IP栈都是裁剪过的。
我最后在那个包装线项目里,给客户写了个Snort规则,监控对PLC 8080端口的异常写入。治标不治本,但至少下次有人用admin/admin登录的时候,我能知道。
这行干久了你会发现,嵌入式渗透更像考古——你面对的是十年前的决策,五年前的代码,和今天的安全需求。三者永远对不上。
友情链接