首页
社区
课程
招聘
[原创]用 AI 写了一套 IoT 固件扫描审计系统 IFDA
发表于: 1天前 677

[原创]用 AI 写了一套 IoT 固件扫描审计系统 IFDA

1天前
677

91eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8U0m8^5M7X3!0G2N6q4)9J5c8V1W2r3c8p5p5`.

面向 IoT 固件二进制的自动化逆向工程与漏洞发现工具。本仓库实现了
firmware-analysis-requirements.md 中描述的分析核心

仅限防御性/授权用途。 只分析你拥有所有权或已获得授权评估的固件。详见需求文档 §1.3。

按照既定计划,第一迭代交付二进制逆向工程(FR-RE)漏洞发现(FR-VUL)。默认摄取与解包
(FR-ING / FR-EXT)已经把文件产出到磁盘上——直接指向单个 ELF 文件或已解包的固件目录树即可。

各引擎封装了现有工具:capstone(多架构反汇编,无论宿主机架构如何都能处理 MIPS/ARM)、
pyelftools + binutils(ELF 解析、缓解措施检测)。更重的污点分析引擎(angr)作为未来
可选项,可在同一接口后面替换接入。

Python 核心是一个库 + CLI。项目选择的混合架构把批量/大规模语料的编排、REST API
(FR-INT-1)、排队(FR-ING-4)和 Web UI 放到独立的 Go 服务层service/,已实现),
由它通过 CLI 一次驱动一个分析任务。JSON 模型(ifda/model.py)是两者之间的契约;核心
@@IFDA@@<json> 格式流式输出进度事件,供服务层展示实时任务进度。构建和运行方法见
service/README.md

分析核心(Python 3.10+)

服务层(Go 1.22+)

Web UI

可选增强能力

完整的分步环境搭建(Go 升级、交叉编译器、Ghidra + JDK 的坑、验证方法)见
ENVIRONMENT.md

cve-bin-tool 会维护自己的本地 CVE 数据库(NVD + OSV + RedHat + GitLab Advisory + Curl,
约 1GB+);某台机器上首次扫描时会下载/更新该数据库,所以第一次运行会较慢且需要联网。
没有它的话 analyze() 仍能运行,只是 CVE 关联会退化为使用内置的小型精选数据库
data/vuln_db.json,报告里会带上一条关于该依赖缺失的明显警告(NFR-USE-1——
某个组件缺失时功能降级,而不是让整个任务崩溃)。

运行 ifda 有两种方式:CLI(单次运行,便于脚本化)和服务(队列 + REST API +
带实时进度的 Web UI)。

analyze 接受单个 ELF 文件或一个目录(已解包的固件目录树)。它会遍历目录树一次,
并运行每一个阶段:逐二进制的逆向工程/漏洞检测、跨二进制污点分析、敏感信息 +
签名规则 + 熵值检测、shell 和 PHP/Python/Lua 脚本注入检测、文件系统加固检查。

参数:-addr-core-workers(默认 2)、-queue-data(分诊状态 + 上传目录;
默认 $TMPDIR/ifda-service)、-auth(默认 true)、-user/-pass(仅在账号首次创建时
播种密码——不会覆盖已经通过 Web UI 修改过的密码;加 -reset-pass 可强制覆盖)。
完整说明见 service/README.md

Web UI(Alpine.js,内嵌——无需构建步骤,可离线使用):提交一个服务器路径
上传一个文件,然后查看实时 SSE 进度并浏览:

REST 接口(完整表格见 service/README.md):

分诊状态:new | confirmed | false_positive | accepted_risk。重复提交一个未变化的
目标会直接返回缓存结果。

格式 方式 内容
JSON --json / GET …/report 完整结构化报告(集成契约)
Markdown --md 执行摘要 + 每条发现的详情
CycloneDX SBOM --sbom 组件清单 + 检测到的 CVE(可直接导入 Dependency-Track)
需求项 状态 位置
FR-RE-1 反汇编(多架构) re/disasm.py(capstone)
FR-RE-3 CFG / 调用图 / 函数边界 ✅(符号表 + 线性扫描兜底) re/disasm.py
导入调用解析 ✅ x86/x86_64 + ARM/AArch64(PLT)+ MIPS(GOT/jalr $t9 re/disasm.py
ARM/Thumb-2 + 交互跳板(veneer) ✅(映射符号模式切换、跳板跟踪) re/disasm.py
FR-INV-4 嵌入式敏感信息/凭据 ✅(密钥、哈希、硬编码凭据/令牌、熵值兜底) inventory/secrets.py
FR-INT-3 外部化签名规则(YARA 风格) ✅(可更新的 JSON 规则库;可选 yara-python 桥接) rules/engine.py, data/secret_rules.json
FR-INV-3 脚本分析(shell/CGI 命令注入) ✅(分级污点分析) scripts/shell.py
FR-INV-3 脚本分析(PHP/Python/Lua 注入) ✅(命令/代码/文件包含/反序列化) scripts/langs.py
文件系统加固(setuid、全局可写、弱权限、init 脚本) fs/hardening.py
FR-RE-5 缓解措施(NX/canary/RELRO/PIE/fortify) re/mitigations.py
FR-RE-6 交叉引用(调用点、字符串) ✅(调用/导入交叉引用) re/disasm.py
FR-RE-7 可脚本化 API ✅(库 + CLI) pipeline.py, cli.py
FR-RE-2 反编译伪代码 ✅(可选启用 Ghidra headless;丰富发现结果) re/decompile.py
FR-VUL-1 已知 CVE 关联 ✅ 内置精选离线库 + 必需的 cve-bin-tool(NVD/OSV/RedHat/GitLab/Curl,350+ 组件) vuln/cve.py, vuln/cve_bin_tool.py, data/vuln_db.json
FR-VUL-2 危险函数检测 vuln/dangerous_funcs.py
FR-VUL-3 污点分析/可达性 ✅(调用图启发式) vuln/taint.py
FR-VUL-4 漏洞类别覆盖 ◑ 溢出/命令注入/代码注入/文件包含/反序列化/格式化字符串/弱加密 vuln/catalog.py, scripts/langs.py
FR-VUL-5 跨二进制分析 ✅(全局调用图,CGI→库) vuln/crossbinary.py
FR-VUL-7 优先级排序 + 证据 vuln/findings.py, model.py
FR-VUL-8 分诊状态持久化 vuln/findings.py
FR-VUL-6 模拟/动态验证 ⬜ 计划中(可选,沙箱化)
FR-REP-1 JSON + Markdown 输出 report/
FR-REP-2 SBOM(CycloneDX 1.5) ✅(SPDX 待办) report/sbom.py
FR-INT-1 REST API + 队列 + Web UI(仪表盘、筛选、分诊、SSE) ✅(Go 服务层,Alpine.js) service/
FR-ING-4 批量提交 + 去重缓存 ✅(worker + 路径-mtime 缓存) service/job.go
        ┌───────────────────────────── Python 分析核心(本仓库) ──────┐
 解包    │ loader/      re/            vuln/           inventory/ scripts/ fs/  │
 产物 ──┼► load_elf ─► disassemble ─► dangerous_funcs ► secrets  shell    加固│─► JSON /
 (FR-   │ (架构、      缓解措施       污点分析(源→汇)   + 规则/ (命令    检查  │  Markdown
  EXT)  │  导入表、    调用图         CVE 关联          签名     注入)         │  + SBOM
        │  字符串)     交叉引用       跨二进制 +        + 熵值检测              │  (CycloneDX)
        │                             优先级/分诊                             │
        └─────────────────────────────────────────────────────────────────────┘
                         ▲
                         │ 每个任务执行一次 `ifda.cli analyze --progress`
            Go 服务/编排层(service/)  ← 队列、worker、
            REST API(FR-INT-1)、去重缓存、带实时进度的 Web UI
# Python 分析核心
apt-get install -y python3-capstone python3-pyelftools   # 或: pip install -e .
pip install cve-bin-tool   # 必需: FR-VUL-1 广域 CVE 覆盖(NVD/OSV/RedHat/GitLab/Curl)
pip install yara-python    # 可选: 存在 data/yara/*.yar 时启用 YARA 阶段

# Go 服务层(可选——仅在需要 REST API + Web UI 时安装)
cd service && go build -o ifda-service .                # Go 1.22+
# 分析一个二进制文件或已解包的目录树;默认把 JSON 输出到 stdout。
python3 -m ifda.cli analyze /path/to/extracted_rootfs --json report.json --md report.md

# 同时生成 CycloneDX 格式的 SBOM。
python3 -m ifda.cli analyze ./rootfs --json report.json --sbom sbom.json

# 在 stderr 上输出机器可读的进度事件(供服务层使用)。
python3 -m ifda.cli analyze ./rootfs --json report.json --progress

# 用 Ghidra 反编译的伪代码丰富发现结果(可选启用;需要 Ghidra,
# 设置 GHIDRA_HOME 或安装到 /opt/ghidra)。较慢;缺失时优雅降级为空操作。
python3 -m ifda.cli analyze ./rootfs --md report.md --decompile

# 对某个发现做分诊;跨重新扫描持久保存(FR-VUL-8)。
python3 -m ifda.cli triage triage.json <finding_id> false_positive
python3 -m ifda.cli analyze ./rootfs --triage triage.json   # 已静音的发现会被剔除
cd service
go build -o ifda-service .                 # Go 1.22+,仅首次需要
./ifda-service -addr :8080 -core ..        # -core = 仓库目录(省略时自动探测)
# 打开 http://localhost:8080
# 提交一个任务(返回 {"id": ...});去重缓存对未变化的目标直接返回缓存结果
curl -XPOST localhost:8080/api/jobs -H 'Content-Type: application/json' \
     -d '{"target":"/path/to/extracted_rootfs"}'

curl -N  localhost:8080/api/jobs/<id>/events             # 实时进度(SSE,无需轮询)
curl     localhost:8080/api/jobs/<id>/report             # 发现结果 JSON(叠加了分诊状态)
curl     "localhost:8080/api/jobs/<id>/report?format=md" # 或 format=sbom;加 &download=1 下载

# 对某个发现做分诊——按指纹持久化,跨重启和重新扫描依然有效(FR-VUL-8)
curl -XPOST localhost:8080/api/jobs/<id>/triage -H 'Content-Type: application/json' \
     -d '{"finding_id":"<finding_id>","state":"false_positive"}'

# 把文件上传到服务器端,再把返回的路径当作 target 提交
curl -F "file=@firmware.bin" localhost:8080/api/upload   # -> {"target": "...", "name": ...}

仅限防御性/授权用途。 只分析你拥有所有权或已获得授权评估的固件。详见需求文档 §1.3。

完整的分步环境搭建(Go 升级、交叉编译器、Ghidra + JDK 的坑、验证方法)见
ENVIRONMENT.md

格式 方式 内容
JSON --json / GET …/report 完整结构化报告(集成契约)
Markdown --md 执行摘要 + 每条发现的详情
CycloneDX SBOM --sbom 组件清单 + 检测到的 CVE(可直接导入 Dependency-Track)

[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!

收藏
免费 0
打赏
分享
最新回复 (5)
雪    币: 1049
活跃值: (1900)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
23小时前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
大哥给力,现在模型能力很强了,angr来做污点分析引擎似乎没有必要?
21小时前
0
雪    币: 1044
活跃值: (1463)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
向雨 大哥给力,现在模型能力很强了,angr来做污点分析引擎似乎没有必要?
考虑到不同模型能力参差不齐,以及不同公司的模型擅长的方向不一样,目前扫描分析还没加接入大模型的功能,先阶段只是让大模型写扫描器,后续成熟了再考虑接入 AI 分析
20小时前
0
雪    币: 158
活跃值: (5091)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
17小时前
0
雪    币: 1714
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
太给力了
13小时前
0
游客
登录 | 注册 方可回帖
返回