
Danfoss SM-800A 固件被曝多个远程代码执行漏洞
来源标题:Multiple remote code execution vulnerabilities in danfoss sm-800A
Danfoss AK-SM800A 控制器固件存在多个远程代码执行漏洞。该设备运行基于 Yocto 的定制 Linux 发行版 Danux,使用 i.MX6 处理器,攻击面包括 NGINX 反向代理和 CGI 处理程序,核心逻辑由单体应用 sm_app 处理。
以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Danfoss AK-SM800A 的固件镜像可从其官网下载,其中包含以 7-zip 压缩的、负责应用逻辑的 ARM 二进制文件。Danfoss AK-SM800A 控制器在 i.MX6 处理器上运行 Danux —— 一个基于 Yocto 定制的 Linux 发行版。
我们先为固件搭建一个模拟环境。最省事的做法是在用户态模拟二进制文件,而不是连同内核一起模拟整个系统。挂载文件系统后,把 qemu-armel-static 复制进去,执行以下命令即可获得一个 shell:
$ sudo chroot . /qemu-armel-static /bin/sh sh-4.4#
正如 Claroty 所指出的,SM800A 平台由一个 NGINX 反向代理、一组 CGI 处理器,以及若干负责应用逻辑的独立进程组成。URL 以 .cgi 结尾的请求会被转发到由 sm_app 可执行文件创建的任务。
事实证明,sm_app 是一个庞大的单体应用,设备上发生的几乎所有事情都由它负责。它更像是一个运行在用户态进程里的迷你实时操作系统(RTOS)(这是平台整体迁移后常见的一种嵌入式架构选择)。它有一个包含 52 个条目的任务(线程)列表,其中包括 Task_Modbus_drv_task、Task_Ethernet、Task_IOHandler 和 Task_Web 等。在缺少大量设备和驱动的当前环境中运行 sm_app,几乎必然导致崩溃。对二进制文件打一些临时补丁来避免崩溃大概可行,但过程可能相当痛苦。
幸运的是,我们只关心 Task_Web,因此无需修复所有问题,我可以通过 LD_PRELOAD 进入该二进制文件,让它执行所有初始化代码直到进入 main(),从那里劫持代码流,应用一些钩子(这里不展开),然后启动 web 服务器。Danux 恰好自带 gcc:
$ gcc -shared -g -fPIC -o libpreload.so preload.c $ sudo chroot . /qemu-armel-static -E LD_PRELOAD=/libpreload3.so /danfoss/sm_app hi from hijacked code
再做些小的修补后,我们就可以与模拟的 web 服务器通信了:
$ curl -v -d '' http://127.0.0.1:8080/xml.cgi
- Trying 127.0.0.1:8080...
- Connected to 127.0.0.1 (127.0.0.1) port 8080
POST /xml.cgi HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: curl/8.5.0 Accept: / Content-Length: 0 Content-Type: application/x-www-form-urlencoded
< HTTP/1.1 200 < Date: Sat, 07 Nov 2026 21:44:33 GMT < Content-Type: text/xml < Content-Length: 75 < Connection: keep-alive < Server: Danfoss SM800A < Access-Control-Allow-Private-Network: true < Access-Control-Allow-Origin: * < Access-Control-Allow-Methods: GET, POST, OPTIONS < Access-Control-Allow-Headers: aksm-auth,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type < Cache-Control: no-store, no-cache <
- Connection #0 to host 127.0.0.1 left intact
首先要做的,是通过所谓的代码异味和反模式来了解这套代码库的安全质量。
第一个明显的坏味道是 strcpy 被极其随意地使用。strcpy() 函数不设长度参数,因此并不被推荐使用。该函数会不断从源缓冲区向目标缓冲区复制字节,直到遇到空字节为止。当源缓冲区由用户提供时,这往往成为内存破坏漏洞的常见来源。代码库中存在数百处 strcpy 调用,其中一些位于可被外部访问且无需认证的处理器函数中。事实上,在较早的固件版本中,每个命令处理器自行负责实施认证,而不是集中处理。这无谓地扩大了认证前的攻击面。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。