文章总结: FirmSA是基于FirmAE升级的IoT固件安全分析工具,通过GUI界面降低使用门槛,提供运行和调试两种模式。采用Docker标准化环境实现多实例隔离,支持动态调试功能(串口控制台、Shell终端、流量分析、GDB调试)和详细日志输出。工具尚未开源,但承诺后续择机发布。 综合评分: 85 文章分类: IoT安全,安全工具,漏洞分析,安全运营,移动安全
【软件开发】FirmSA——全新IoT固件安全分析工具(FirmAE Pro Max)
原创
SkyAsh SkyAsh
云淡纤尘
2026年6月21日 07:30 山东
在小说阅读器读本章
去阅读
临近博主毕业大吉,同时又被分到毕业设计组,在找了许多设计方向之后,也是决定在老师的帮助和多个师哥的大力支持下,准备对IoT固件产生一些想法,最初对FirmAE的探索碰了一鼻子灰,最终下定决心对FirmAE做一个升级,毕竟这玩意是真门槛高,并且环境敏感的跟什么一样。环境稍微差一点甚至多了个什么组件就直接死给你看。也是让我下定决心对他进行二次开发作为我的毕业设计。本工具目前尚未有开源计划,因为牵扯到很多组件,待博主完成迁移测试和后续进一步开发之后,将择机开源,感谢各位佬支持
开发UI界面
首先FirmAE是一个命令行工具,也就造成很多师傅使用的门槛比较高,为此我特地开发了GUI界面,以便于操作。
我将FirmSA设计为了运行模式和调试模式。运行模式就是仿真Web界面,调试模式就是串口控制台,Shell终端,流量分析,GDB调试四个动态调试功能。
同时增加了一个进度条,因为FirmAE在进行网络推断的时候会卡很久,导致很多师傅分不清是环境问题导致的程序停止运行还是在推导过程中
image
image
看到上面两张图估计各位师傅会吐槽:这TM是个什么丑玩应,还不如我继续用命令行。鄙人也是考虑到这一点,做了个Web UI出来。毕竟上边的UI我看着也难受
下面就是Web UI的样子,是不是好看了很多很多……(此处省略N个很多)
image
以上就是对于UI的升级,可以降低以下师傅们入门的门槛
Docker标准化环境(本人认为FirmSA最NB的创意)
曾经在搞了解FirmAE的时候真的是快把我折磨疯了,从虚拟机到云服务器,从WSL到Docker,从Ubuntu18.04试到Ubuntu24.04,从Python3.6到Python3.11,鬼知道那一段时间我经历了什么,服务器都被我重置了N次,最后终于是搞出来了合适的环境,然后还要把他制作成Docker镜像,,,,,,,
到现在我都怀疑那段时间我为什么没有放弃,,,,
介绍下我对Docker的利用
容器部署方案
FirmSA采用了基于Ubuntu 20.04的定制化Docker镜像作为运行基础,镜像构建过程中首先采用国内阿里云镜像站以加速依赖安装,还有一些工具也在阿里云镜像站找到了平替并且做了适配。
运行过程使用两个容器,主服务容器命名为firmsa1,使用firmsa:2.0镜像,数据库服务采用PostgreSQL 13独立容器部署
数据持久化通过命名卷postgres_data实现,即使容器重建数据也不会丢失。两个容器通过depends_on机制建立启动顺序依赖,确保数据库就绪后再启动主服务。
这样可以保证每次使用仿真环境都是一个全新的可用系统,不会因为上一次运行导致遗留某些东西致使下次运行失败,,,,,,搞过的师傅都懂的痛
image
网络配置和端口映射
网络架构方面,FirmSA的Docker容器通过Linux TUN/TAP设备实现QEMU虚拟机的网络桥接,容器内运行的QEMU实例可以通过tap设备与宿主机网络通信,进而访问外网或接受外部连接。每个仿真实例会被分配独立的IP地址,记录在scratch目录下的对应IID子目录中
关于Web端口映射,我先将Web服务的80映射到QEMU虚拟机的5000端口,在将其映射到Docker容器的5000端口
image
文件系统挂载
FirmSA在docker-compose.yml配置文件中,外部固件目录通过环境变量HOST_FIRMWARE_DIR指定,默认路径为/opt/FirmSA/firmware,以:ro后缀挂载至容器的/work/external_firmwares路径;宿主机的/etc/localtime和/etc/timezone时区文件同样采用只读方式映射,确保容器内的时间设置与宿主机保持同步的同时防止意外修改。毕竟师傅们也不想弄着弄着原来的固件文件就废了,尤其是在注重证据性的场景。
image
多实例隔离运行
这也是我使用Docker的另一个初衷,每个固件仿真实例都被封装在独立的Docker容器中运行,实现了进程、文件系统、网络栈、设备访问等资源的完全隔离。docker_helper类的run_core方法负责单个容器的完整生命周期管理,它首先调用_safe_container_name方法生成唯一的容器标识符
每个Docker容器通过Linux cgroup机制获得独立的CPU配额、内存限制和网络带宽控制,单个实例出现内存泄漏或死循环只会影响自身容器不会拖垮整个主机系统。--rm标志配合stop_core调用确保异常退出的容器也能被及时清理,避免残留容器持续消耗资源。日志重定向机制将每个容器的标准输出和错误输出导入独立的日志文件便于后续逐个排查问题。超时控制贯穿整个流程:提取阶段300秒超时防止卡死在复杂格式解析上,IID获取300轮每秒一次的轮询总计约五分钟的超时防止数据库连接异常导致的无限等待
动态调试功能
因为这个程序主要是需要在Windows系统实现,所以我也给四个调试功能加了Windows适配,这样可以在Windows的PowerShell实现调试
串口控制台
Shell
image
流量分析(就是集成的TcpDump)
image
GDB调试
image
详细日志输出
运行模式
[*] 开始仿真 - 模式: run, 固件: ./firmware/DIR645A1_FW103RUB08.bin, 品牌: auto
[> ] 2% | 检查数据库服务...
[!] PostgreSQL 容器不存在,正在创建...
[=> ] 5% | 检查容器状态...
[==> ] 10% | 检查 Docker 镜像...
[*] 检查 Docker 镜像...
[+] 镜像 firmsa:2.0 已就绪
[==> ] 10% | 创建新容器...
[*] 创建新容器...
Container firmsa-postgres Running
Container firmsa1 Creating
Container firmsa1 Created
Container firmsa1 Starting
Container firmsa1 Started
[*] 环境部署中...
[==> ] 10% | 正在执行 ./setup/download.sh...
[=======> ] 30% |
[=======> ] 30% | 正在执行 ./setup/install.sh...
[======================> ] 90% |
[======================> ] 90% | 正在执行 ./setup/init.sh...
[=========================] 100% |
[*] 安装额外工具 (tcpdump)...
[+] tcpdump 安装成功
[=========================] 100% | 部署完成
[+] 环境部署成功
[*] 开始运行仿真 (模式: 运行模式, 固件: /work/FirmSA/firmware/DIR645A1_FW103RUB08.bin)...
[*] 正在执行运行前环境清理...
[*] /work/FirmSA/firmware/DIR645A1_FW103RUB08.bin emulation start!!!
[*] Extract done!!!
[+] get architecture done!!!
[+] Start emulation!!!
[IID] 1
[MODE] run
mke2fs 1.45.5 (07-Jan-2020)
e2fsck 1.45.5 (07-Jan-2020)
[*] infer network start!!!
[+] Network reachable on 192.168.0.1!
[+] Web service on 192.168.0.1
Creating TAP device tap1_0...
Set 'tap1_0' persistent and owned by uid 0
Bringing up TAP device...
Creating TAP device tap1_1...
Set 'tap1_1' persistent and owned by uid 0
Bringing up TAP device...
Starting port forwarding 5000 -> 192.168.0.1:80...
Starting emulation of firmware... 192.168.0.1 true true 28.080236719 55.543240577
调试模式
[*] 开始仿真 - 模式: debug, 固件: ./firmware/DIR645A1_FW103RUB08.bin, 品牌: auto
[> ] 2% | 检查数据库服务...
[=> ] 5% | 检查容器状态...
[*] 检测到已停止的容器: firmsa1
[==> ] 10% | 启动已存在的容器...
[*] 启动已存在的容器...
[+] 容器已启动,跳过环境部署
[*] 开始运行仿真 (模式: 调试模式, 固件: /work/FirmSA/firmware/DIR645A1_FW103RUB08.bin)...
[*] 正在执行运行前环境清理...
[*] 调试模式: 运行 run.sh -c 准备环境...
[*] /work/FirmSA/firmware/DIR645A1_FW103RUB08.bin emulation start!!!
[*] 正在获取 IID...
[*] 检测到 IID: 1
[*] 后台启动 QEMU: /work/FirmSA/scratch/1/run_debug.sh
[+] QEMU 已在后台启动,等待初始化...
[======================> ] 90% | 等待 QEMU 初始化...
[======================> ] 90% | 等待 QEMU 初始化... (1s)
[=======================> ] 95% | QEMU 启动完成
[+] QEMU 已完全启动,可以使用调试功能!
[*] 目标 IP: 192.168.0.1
[*] 正在下发 GUI 调试服务脚本...
[!] GUI 调试服务未检测到 31337/31338,后续可通过调试按钮再次拉起
[*] 执行调试操作 1 (IID: 1)
[*] 正在连接 socat 控制台...
[*] 执行调试操作 2 (IID: 1)
[*] 正在检查 netcat 端口 192.168.0.1:31337...
[*] netcat 端口未就绪,尝试通过 telnet 启动...
[+] netcat 服务已启动
[*] 正在连接 netcat (192.168.0.1:31337) 并初始化 telnet 环境...
[*] 正在启动 telnetd 服务...
[+] telnet 服务已就绪,正在连接 192.168.0.1:31338...
[*] 执行调试操作 3 (IID: 1)
[*] 正在抓包 tap1_0...
[*] 正在检查 netcat 端口 192.168.0.1:31337...
[+] netcat 端口已就绪
[*] 正在获取目标设备进程列表...
[*] 目标设备进程列表:
PID USER VSZ STAT COMMAND 1 root 808 S init 2 root 0 SW [kthreadd] 3 root 0 SW [ksoftirqd/0] 4 root 0 SW [kworker/0:0] 5 root 0 SW< [kworker/0:0H] 6 root 0 SW [kworker/u2:0] 7 root 0 SW< [khelper] 8 root 0 SW [khungtaskd] 9 root 0 SW< [writeback] 10 root 0 SWN [ksmd] 11 root 0 SW< [crypto] 12 root 0 SW< [bioset] 13 root 0 SW< [kblockd] 14 root 0 SW< [ata_sff] 15 root 0 SW< [cfg80211] 16 root 0 SW [kworker/0:1] 17 root 0 SW [kswapd0] 18 root 0 SW [fsnotify_mark] 35 root 0 SW [scsi_eh_0] 36 root 0 SW< [scsi_tmf_0] 37 root 0 SW [scsi_eh_1] 38 root 0 SW< [scsi_tmf_1] 39 root 0 SW [kworker/u2:1] 40 root 0 SW [kworker/u2:2] 41 root 0 SW [kworker/u2:3] 44 root 0 SW< [kpsmoused] 45 root 0 SW< [ipv6_addrconf] 46 root 0 SW< [deferwq] 47 root 0 SW< [kworker/0:1H] 48 root 912 S /bin/sh /etc/init.d/rcS 50 root 916 S /bin/sh 66 root 1048 S < udevd --daemon 122 root 1692 S xmldb -n wrgn39_dlob.hans_dir645_V1 -t 123 root 1048 S servd -d schedule_off 248 root 908 S logd -p notice 249 root 884 S klogd -p notice 306 root 1000 S gpiod 640 root 1148 S /var/run/fakedns --port=63481 --address=/#/1.33.203.3 745 root 1024 S ddnsd 785 root 984 S telnetd -l /usr/sbin/login -u Alphanetworks:wrgn39_dl 817 root 912 S /bin/sh /etc/scripts/cpuload.sh 839 root 1684 S /firmadyne/sh /firmadyne/network.sh 847 root 1676 S /firmadyne/sh /firmadyne/debug.sh 849 root 1680 S /firmadyne/busybox telnetd -p 31338 -l /firmadyne/sh 850 root 1668 S /firmadyne/busybox sleep 36000 1046 root 892 S portt -c DNAT.PORTT 2082 root 1668 S /firmadyne/busybox sleep 60 2111 root 1048 S udhcpc -i eth2.2 -H dlinkrouter -p /var/servd/WAN-1-u 2517 root 1684 S /firmadyne/sh 2700 root 1132 S /usr/sbin/jcpd -i br0 2706 root 1108 S /usr/sbin/hotplugd -D 2714 root 1108 S /usr/sbin/hotplugd -D 2716 root 1108 S /usr/sbin/hotplugd -D 3354 root 904 S updatewifistats -s /etc/scripts/upwifistatshlper_G_ba 3524 root 908 S neaps -i br0 -c /var/run/neaps.conf 3533 root 884 S netbios -i br0 -r dlinkrouter 3534 root 900 S llmnresp -i br0 -r dlinkrouter 3563 root 1072 S udhcpd /var/servd/LAN-1-udhcpd.conf 3683 root 1072 S udhcpd /var/servd/LAN-2-udhcpd.conf 4062 root 1280 S mDNSResponderPosix -b -i br0 -f /var/rendezvous.conf 4179 root 1044 S dnsmasq -C /var/servd/DNS.conf 4430 root 1016 S lld2d -c /var/lld2d.conf br0 ra0 4490 root 4972 S httpd -f /var/run/httpd.conf 4604 root 804 S sleep 1 4618 root 1676 S /firmadyne/sh 4619 root 812 R ps
写在最后
一路走来呢磕磕绊绊,大学生涯即将结束,从公众号创立之初,离不开各位同僚的支持,也非常感谢我的指导老师和师哥师姐们的帮助和指导。希望未来踏入工作岗位之后,能够继续不忘初心,用我自己的绵薄之力为社会做出更多贡献。最近一年因为各种备考的事务导致分身乏术,未来我会继续深耕取证技术,争取为师傅们带来更多有用的知识和技巧,也能开发更多实用的小工具给师傅们使用。再次感谢张老师,各位同学以及同僚的支持
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:云淡纤尘 SkyAsh SkyAsh《【软件开发】FirmSA——全新IoT固件安全分析工具(FirmAE Pro Max)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论