CrimsonGlory/wairz

GitHub: CrimsonGlory/wairz

一款基于 MCP 协议的 AI 辅助固件安全分析工具,支持嵌入式 Linux、RTOS、UEFI 和 Android 固件的自动化解包、逆向分析、漏洞检测与合规评估。

Stars: 0 | Forks: 1

Wairz - Every Firmware Has Secrets... WAIRZ Finds Them

上传固件镜像,进行解包,探索文件系统,分析二进制文件,并进行安全评估 —— 所有这些都通过 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 提供的 AI 分析功能来实现。 将任何兼容 MCP 的 AI Agent 连接到 Wairz 的 383 个分析工具 —— [Claude Code](https://docs.anthropic.com/en/docs/claude-code)、[Claude Desktop](https://claude.ai/download)、[OpenCode](https://opencode.ai/)、[Codex](https://github.com/openai/codex)、[Cursor](https://cursor.com/)、[VS Code + Copilot](https://code.visualstudio.com/docs/copilot/)、[Gemini CLI](https://github.com/google-gemini/gemini-cli)、[Windsurf](https://windsurf.com/) 等。 [观看演示视频](https://www.youtube.com/watch?v=gDLhtMFMmMM) ## 功能 - **固件解包** — 通过 binwalk3 和 unblob 自动提取 SquashFS、JFFS2、UBIFS、CramFS、ext、CPIO 和 Intel HEX 文件系统,支持多分区 - **RTOS 支持** — 解包时自动将固件分类为 `linux | rtos | unknown`(FreeRTOS / Zephyr / 裸机 Cortex-M),并支持手动覆盖。RTOS 项目拥有专用的工具类别,用于对原始 `.axf` / `.elf` blob 进行向量表解析、任务枚举、基地址恢复和内存映射分析 - **文件浏览器** — 使用虚拟树浏览提取的文件系统,查看文本/二进制/十六进制内容,并跨文件搜索 - **二进制分析** — 使用 radare2 和 Ghidra headless 对二进制文件进行反汇编和反编译,支持交叉引用、污点分析和能力检测 - **组件映射** — 交互式依赖图,显示二进制文件、库、脚本及其关系 - **安全评估** — 检测硬编码凭证、加密材料、硬编码 IP、setuid 二进制文件、不安全配置、弱权限和网络依赖项 - **攻击面评分** — 针对网络暴露、CGI、setuid、危险函数和已知 daemon 进行自动化的 0-100 风险评分 - **SAST** — 对 shell 脚本使用 ShellCheck,对 Python 脚本使用 Bandit,并附带 CWE 映射 - **cwe_checker** — 通过 Docker sidecar 进行二进制漏洞模式检测(17 种 CWE),支持 ARM/MIPS/x86 - **YARA 扫描** — 自定义规则 + 约 5000 条 YARA Forge 社区规则,支持按需更新 - **威胁情报** — ClamAV 恶意软件扫描、VirusTotal 哈希查询(隐私优先,不上传文件)、abuse.ch 套件(MalwareBazaar、ThreatFox、URLhaus、YARAify),以及用于通过 NSRL 识别已知良好二进制文件的 CIRCL Hashlookup - **SBOM & CVE 扫描** — 生成物料清单(CycloneDX 1.7、SPDX 2.3、CycloneDX VEX),带有通用二进制版本检测回退、通过 NVD 字典进行 CPE 丰富,以及针对 NVD 的漏洞扫描 - **固件模拟** — 用于单个二进制文件的用户模式,用于在隔离的 container 中完整启动 OS 的系统模式,支持 GDB、pcap 捕获和 Web endpoint 交互 - **网络协议分析** — 从模拟固件中捕获并分析流量:协议分析、不安全协议检测、DNS 查询、TLS 元数据 - **Fuzzing** — 带有 QEMU 模式的 AFL++,用于跨架构二进制模糊测试,具有自动生成字典/语料库和崩溃分类功能 - **固件对比** — 跨固件版本对比文件系统树、二进制文件和反编译函数 - **RTOS 和裸机支持** — 检测 FreeRTOS、VxWorks、Zephyr、ThreadX 及配套组件(lwIP、FatFs 等) - **UEFI 固件支持** — 使用 UEFIExtract 处理固件卷、模块列表、NVRAM 变量提取和 PE32+ 扫描 - **Android 固件** — 多阶段 APK 安全扫描:18 项清单安全检查(相当于 MobSF)、DEX 字节码模式检测(约 30 种不安全的 API 模式)、jadx 反编译 + mobsfscan SAST(43 条规则),并针对 system/priv-app APK 进行感知固件的严重性调整。包括所有 APK 的批量扫描、反编译源码查看器、权限分析、签名验证和 Android 设备状态审计 - **设备采集** — 通过主机端 bridge 直接从 ADB 连接的 Android 设备拉取固件 - **固件更新检测** — 识别 SWUpdate、RAUC、Mender、opkg、U-Boot 和自定义更新机制,并进行安全差距分析 - **CRA 合规性** — 欧盟网络弹性法案附件 I 评估(20 项要求),从现有发现中自动填充,Article 14 通知导出 - **实时设备 UART** — 通过主机端串行 bridge 连接到物理设备,以进行交互式控制台访问 - **Windows 取证工件** — 注册表配置单元、EVTX 事件日志、Prefetch、SRUM、MFT、USN Journal、LNK 文件、计划任务、WMI 持久化、DPAPI 主密钥、EFS 加密文件、BCD/ESP 启动链、MBR/VBR、ETL 跟踪、AppCompat/Shim DB、驱动程序签名和 BYOVD 检测、.NET 单文件捆绑包和 R2R stomping,以及存档/安装程序格式(MSI、MSIX、MSU、CAB、INF) - **Linux 取证工件** — systemd unit、journald 日志、container 工件、持久化机制和内核加固配置,每个都支持跨固件查找 - **ICS/OT 协议检测** — 可扩展的 YAML 驱动目录,用于识别嵌入在固件中的 Modbus/TCP、DNP3、Siemens S7comm 和其他工业协议 - **裸机 / MCU 芯片分析** — Schema 驱动的芯片系列目录(例如 TI C28x DSP),用于对原始 MCU/DSP 固件 blob 进行安全状况审计,可通过操作员提供的 YAML 描述符进行扩展 - **固件 carving 沙箱** — 隔离的、无网络的 shell 环境,包含完整的逆向工程工具集(binwalk、unsquashfs、jefferson、ubireader、mkimage 等),用于手动提取非标准的供应商封装 - **跨固件查找** — 数十个 `lookup_*_across_firmwares` MCP 工具允许 agent 在一次调用中查询整个项目语料库中的工件(驱动程序、注册表项、systemd unit、ICS 协议、芯片系列等),而不仅仅是当前活动的固件 - **Ghidra 研究工作区** — 跨会话的持久研究脚本、日志和存档导入,外加用于临时 headless 分析的 `run_ghidra_headless` 工具 - **通过 MCP 进行 AI 分析** — 383 个分析工具(跨越 34 个类别)公开给任何兼容 MCP 的 AI agent,用于自主安全研究 - **发现与报告** — 记录具有严重性评级和证据的安全发现,导出为 Markdown 或结构化叙述报告,并具有完整的评估编排 ## 架构 ``` Claude Code / Claude Desktop / OpenCode │ │ MCP (stdio) ▼ ┌─────────────────┐ ┌──────────────────────────────────┐ │ wairz-mcp │────▶│ FastAPI Backend │ │ (MCP server) │ │ │ │ 383 tools │ │ Services: firmware, analysis, │ │ │ │ emulation, fuzzing, sbom, uart │ └─────────────────┘ │ │ │ Ghidra headless · QEMU · AFL++ │ └──────────┬───────────────────────┘ │ ┌──────────────┐ ┌──────────────┼──────────────┐ │ React SPA │───▶│ PostgreSQL │ Redis │ │ (Frontend) │ │ │ │ └──────────────┘ └──────────────┴──────────────┘ Optional: wairz-uart-bridge.py (host) ←─ TCP:9999 ─→ Docker backend ``` ## 前置条件 - [Docker](https://docs.docker.com/get-docker/) 和 Docker Compose - [uv](https://docs.astral.sh/uv/getting-started/installation/)(仅用于本地开发) ## 关于该 Fork 该仓库是 [digitalandrew/wairz](https://github.com/digitalandrew/wairz) 的一个分支,在上游基础上进行了大量额外的提交,将 MCP 工具的覆盖面从上游基线扩展到了跨越 34 个类别的 384 个工具: - **eastmadc** — 大幅扩展了分析“walker”pipeline 及相应的 MCP 工具:一套庞大的 Windows 取证工件解析器(注册表配置单元、EVTX 事件日志、Prefetch、SRUM、MFT、USN Journal、LNK、计划任务、WMI 持久化、DPAPI、EFS、BCD/ESP 启动链、MBR/VBR、ETL 跟踪、AppCompat/Shim DB、驱动程序签名和 BYOVD、.NET 捆绑包以及存档/安装程序格式),Linux 取证工件解析器(systemd、journald、container、持久化、内核加固),ICS/OT 协议检测,Schema 驱动的裸机/MCU 芯片系列目录,Android 状态审计,固件 carving 沙箱,以及硬件固件/SBOM 扩展 —— 每个都有自己对应的 MCP 工具、数据库迁移和(在适用的地方)跨固件查找支持。 - **CrimsonGlory** — 主要致力于使 Ghidra MCP 集成更加灵活:支持原始 MIPS16E 二进制文件,提供 `run_ghidra_headless` 工具,支持跨会话的持久化 Ghidra 研究文件/脚本/日志,以及各种 CI、lint 和开发服务器(CORS/主机检查)的修复。 有关相对于上游的完整更改列表,请查看 git 历史。 ## 公测阶段 WAIRZ 目前处于**公测**阶段。您可能会遇到 bug 或功能不完善的地方。如果您遇到任何问题,请[在 GitHub 上提出 issue](https://github.com/digitalandrew/wairz/issues) 或通过 andrew@digitalandrew.io 联系我们。 WAIRZ 支持**嵌入式 Linux**、**RTOS/裸机**(FreeRTOS、VxWorks、Zephyr、ThreadX)、**UEFI** 和 **Android** 固件。自动检测在解包时运行,可以从项目页面进行覆盖。特定于 Linux 的工具(模拟、init-script 分析、SBOM 等)在 RTOS 项目中会被隐藏,取而代之的是专用的 RTOS 工具类别。有关详细信息,请参阅 [RTOS 支持](docs/features/rtos.md)。 ## 快速开始 ### Docker(推荐) ``` git clone https://github.com/digitalandrew/wairz.git cd wairz cp .env.example .env # 编辑 .env 并将 POSTGRES_PASSWORD 和 FIRMAE_DB_PASSWORD 设置为强随机值: # python3 -c 'import secrets; print(secrets.token_urlsafe(32))' # (对于全新的本地安装,任何值都可以;占位符将无法启动 stack。) docker compose up --build ``` - 前端:http://localhost:3000 - API 文档:http://localhost:8000/docs ### 带有热重载的 Docker(开发环境) ``` docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d ``` 后端 Python 代码的更改会通过 uvicorn `--reload` 自动生效。前端使用带有 HMR 的 Vite 开发服务器。代码更改无需重新构建 —— 仅在依赖项发生更改(`pyproject.toml` 或 `package.json`)时才需要重新构建。 ### 本地开发 ``` # 启动 PostgreSQL 和 Redis docker compose up -d postgres redis # Backend cd backend uv sync uv run alembic upgrade head uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 # Frontend (单独的终端) cd frontend npm install npm run dev ``` 或使用辅助脚本: ``` ./launch.sh ``` ## 通过 MCP 连接 AI Wairz 使用 MCP 让 AI Agent 访问固件分析工具。启动后端后,在您首选的客户端中注册 MCP 服务器: `--project-id` 是可选的 —— 在希望从 agent 内部切换项目的共享/团队实例上可以省略它。agent 会在首次使用时调用 `list_projects` 并询问您指的是哪个项目。 ### Claude Code ``` claude mcp add wairz -- docker exec -i wairz-backend-1 uv run wairz-mcp --project-id ``` 对于通过 SSH 访问的共享 Wairz 服务器(启动时未固定项目): ``` claude mcp add wairz -- ssh wairz-host docker exec -i wairz-backend-1 uv run wairz-mcp ``` ### Claude Desktop 添加到您的 Claude Desktop 配置中(Linux 上为 `~/.config/Claude/claude_desktop_config.json`,macOS 上为 `~/Library/Application Support/Claude/claude_desktop_config.json`): ``` { "mcpServers": { "wairz": { "command": "docker", "args": [ "exec", "-i", "wairz-backend-1", "uv", "run", "wairz-mcp", "--project-id", "" ] } } } ``` ### OpenCode 添加到您的 `opencode.json` 中(项目根目录或 `~/.config/opencode/opencode.json`): ``` { "mcp": { "wairz": { "type": "local", "command": ["docker", "exec", "-i", "wairz-backend-1", "uv", "run", "wairz-mcp", "--project-id", ""], "timeout": 30000, "enabled": true } } } ``` 连接成功后,您的 AI Agent 就可以自主探索固件、分析二进制文件、运行模拟、对目标进行 Fuzzing,并生成安全发现。MCP 服务器支持通过 `switch_project` 工具进行动态项目切换 —— 更改项目无需重启。 #### 包含多个固件版本的项目 当一个项目上传了多个固件时(对于通过 `diff_firmware` 在不同版本之间进行 diff 对比非常有用),MCP 服务器默认选择最早解包上传的固件。要针对特定版本,请在启动命令中添加 `--firmware-id `,或者将 `firmware_id` 传递给 `switch_project` MCP 工具。使用 `list_firmware_versions` 查找 ID。 ### MCP 工具(共 34 个类别 383 个) 准确计数:`create_tool_registry()` (`backend/app/ai/__init__.py`) 在 `backend/app/ai/tools/` 下的 32 个类别文件中注册了 380 个工具;`backend/app/mcp_server.py` 直接注册了另外 4 个(`get_project_info`、`switch_project`、`list_projects`、`save_code_cleanup`),总计 384 个。 | 类别 | 数量 | 工具 | |----------|-------|-------| | **Windows 取证** | 126 |list_appcompat_entries`, `lookup_appcompat_entry`, `lookup_appcompat_entry_across_firmwares`, `appcompat_walk_status`, `trigger_appcompat_walk`, `list_cab_contents`, `read_msix_manifest`, `dump_msi_custom_actions`, `parse_inf_basic`, `identify_psf_baseline`, `classify_driver_package_subtype`, `search_bcd_entries`, `bcd_walk_status`, `trigger_bcd_walk`, `lookup_bcd_entry_across_firmwares`, `list_dotnet_bundles`, `get_bundle_metadata`, `list_extracted_assemblies`, `get_assembly_il`, `scan_r2r_stomping`, `trigger_dotnet_decompile`, `list_dpapi_master_keys`, `lookup_dpapi_master_key`, `lookup_dpapi_master_key_across_firmwares`, `dpapi_walk_status`, `trigger_dpapi_walk`, `list_drivers`, `get_driver_info`, `list_signed_drivers`, `get_signing_tier_histogram`, `scan_inf_imports`, `diff_driver_matrix`, `lookup_byovd_driver`, `list_efs_encrypted_files`, `lookup_efs_encrypted_file`, `search_efs_by_sid`, `efs_walk_status`, `trigger_efs_walk`, `lookup_efs_recovery_agent_across_firmwares`, `search_esp_entries`, `esp_walk_status`, `trigger_esp_walk`, `lookup_esp_chain`, `lookup_esp_entry_across_firmwares`, `list_etl_events`, `lookup_etl_event`, `search_etl_events`, `etl_walk_status`, `trigger_etl_walk`, `lookup_etl_provider_across_firmwares`, `list_evtx_files`, `parse_evtx_file`, `query_evtx_events`, `evtx_walk_status`, `trigger_evtx_walk`, `search_events`, `evtx_walk_summary`, `lookup_event_record_across_firmwares`, `list_windows_injection_detections`, `windows_injection_walk_status`, `trigger_windows_injection_walk`, `lookup_volatility_injection_across_firmwares`, `search_lnk_records`, `lnk_walk_status`, `trigger_lnk_walk`, `lookup_lnk_record_across_firmwares`, `list_mbr_vbr_sectors`, `lookup_mbr_vbr_sector`, `lookup_mbr_vbr_sector_across_firmwares`, `search_mft_records`, `mft_walk_status`, `lookup_mft_record_across_firmwares`, `trigger_mft_walk`, `verify_authenticode`, `decode_rich_header`, `scan_dbx_revocation`, `detect_pe_arch_view`, `list_signatures`, `get_signature_chain`, `search_prefetch_records`, `prefetch_walk_status`, `trigger_prefetch_walk`, `lookup_prefetch_record_across_firmwares`, `list_windows_processes`, `windows_processes_walk_status`, `trigger_windows_processes_walk`, `lookup_windows_process_across_firmwares`, `list_hives`, `walk_hive`, `get_run_keys`, `scan_persistence`, `dump_subkey`, `diff_hives`, `trigger_registry_hive_walk`, `lookup_registry_extract_across_firmwares`, `search_scheduled_tasks`, `scheduled_task_walk_status`, `trigger_scheduled_task_walk`, `lookup_scheduled_task_across_firmwares`, `list_sdb_entries`, `lookup_sdb_shim`, `summarize_sdb_anomalies`, `lookup_sdb_entry_across_firmwares`, `search_srum_records`, `srum_walk_status`, `trigger_srum_walk`, `lookup_srum_record_across_firmwares`, `list_vhdx_partitions`, `list_bcd_entries`, `list_esedb_tables`, `dump_esedb_table`, `get_storage_summary`, `list_update_packages`, `get_package_metadata`, `get_supersedence_chain`, `list_kb_files`, `diff_kb_packages`, `list_usnjrnl_entries`, `lookup_usnjrnl_entry`, `lookup_usnjrnl_entry_across_firmwares`, `usnjrnl_walk_status`, `trigger_usnjrnl_walk`, `search_wmi_events`, `wmi_walk_status`, `trigger_wmi_walk`, `lookup_wmi_persistence` | | **Linux 取证** | 27 | `list_journald_entries`, `lookup_journald_entry`, `search_journald_messages`, `journald_walk_status`, `trigger_journald_walk`, `lookup_journald_entry_across_firmwares`, `list_systemd_units`, `lookup_systemd_unit`, `search_systemd_units`, `systemd_walk_status`, `trigger_systemd_walk`, `lookup_systemd_unit_across_firmwares`, `list_container_artifacts`, `lookup_container_artifact`, `search_container_images`, `container_walk_status`, `trigger_container_walk`, `lookup_container_image_across_firmwares`, `list_linux_persistence_entries`, `lookup_linux_persistence_entry`, `lookup_linux_persistence_across_firmwares`, `linux_persistence_walk_status`, `trigger_linux_persistence_walk`, `audit_kernel_config_firmware`, `lookup_kernel_config_across_firmwares`, `trigger_kernel_config_walk`, `get_kernel_config_extraction` | | **安全** | 26 | `check_known_cves`, `analyze_config_security`, `check_setuid_binaries`, `analyze_init_scripts`, `check_filesystem_permissions`, `analyze_certificate`, `check_kernel_hardening`, `scan_with_yara`, `extract_kernel_config`, `check_kernel_config`, `analyze_selinux_policy`, `check_selinux_enforcement`, `check_compliance`, `scan_scripts`, `shellcheck_scan`, `bandit_scan`, `check_secure_boot`, `update_yara_rules`, `detect_network_dependencies`, `detect_update_mechanisms`, `analyze_update_config`, `create_cra_assessment`, `auto_populate_cra`, `update_cra_requirement`, `export_cra_checklist`, `generate_article14_notification` | | **二进制分析** | 29 | `start_binary_analysis`, `check_binary_analysis_status`, `start_function_decompile`, `check_function_decompile_status`, `list_functions`, `disassemble_function`, `decompile_function`, `batch_decompile_functions`, `list_imports`, `list_exports`, `xrefs_to`, `xrefs_from`, `get_binary_info`, `analyze_binary_format`, `check_binary_protections`, `find_string_refs`, `resolve_import`, `check_all_binary_protections`, `trace_dataflow`, `find_callers`, `search_binary_content`, `get_stack_layout`, `get_global_layout`, `cross_binary_dataflow`, `detect_capabilities`, `list_binary_capabilities`, `analyze_raw_binary`, `detect_rtos`, `get_ghidra_analysis_logs` | | **模拟** | 25 | `list_available_kernels`, `download_kernel`, `start_emulation`, `run_command_in_emulation`, `stop_emulation`, `check_emulation_status`, `get_emulation_logs`, `diagnose_emulation_environment`, `troubleshoot_emulation`, `enumerate_emulation_services`, `get_crash_dump`, `run_gdb_command`, `save_emulation_preset`, `list_emulation_presets`, `start_emulation_from_preset`, `emulate_with_qiling`, `check_qiling_rootfs`, `start_system_emulation`, `system_emulation_status`, `list_firmware_services`, `run_command_in_firmware`, `stop_system_emulation`, `capture_network_traffic`, `get_nvram_state`, `interact_web_endpoint` | | **硬件固件** | 10 | `list_hardware_firmware`, `analyze_hardware_firmware`, `list_firmware_drivers`, `check_firmware_cves`, `find_unsigned_firmware`, `export_hardware_firmware_hbom`, `extract_dtb`, `verify_cve_attribution`, `describe_advisory`, `list_extension_points` | | **威胁情报** | 10 | `scan_with_clamav`, `scan_firmware_clamav`, `check_virustotal`, `scan_firmware_virustotal`, `check_malwarebazaar_hash`, `check_threatfox_ioc`, `check_urlhaus_url`, `enrich_firmware_threat_intel`, `check_known_good_hash`, `scan_firmware_known_good` | | **Android** | 9 | `analyze_apk`, `list_apk_permissions`, `check_apk_signatures`, `scan_apk_manifest`, `scan_apk_bytecode`, `scan_apk_sast`, `trigger_android_posture_walk`, `get_android_posture`, `lookup_android_posture_across_firmwares` | | **Fuzzing** | 9 | `analyze_fuzzing_target`, `generate_fuzzing_dictionary`, `generate_seed_corpus`, `generate_fuzzing_harness`, `start_fuzzing_campaign`, `check_fuzzing_status`, `stop_fuzzing_campaign`, `triage_fuzzing_crash`, `diagnose_fuzzing_campaign` | | **SBOM** | 9 | `generate_sbom`, `get_sbom_components`, `check_component_cves`, `run_vulnerability_scan`, `list_vulnerabilities_for_assessment`, `export_sbom`, `push_to_dependency_track`, `assess_vulnerabilities`, `set_vulnerability_status` | | **Ghidra 研究** | 10 | `list_ghidra_research_files`, `read_ghidra_script`, `save_ghidra_script`, `import_ghidra_archive`, `get_ghidra_import_status`, `export_ghidra_archive`, `resolve_firmware_path`, `run_ghidra_headless`, `list_ghidra_logs`, `read_ghidra_log` | | **文档** | 7 | `read_scratchpad`, `update_scratchpad`, `save_document`, `read_project_instructions`, `list_project_documents`, `read_project_document`, `save_code_cleanup` | | **文件系统** | 8 | `list_directory`, `read_file`, `search_files`, `file_info`, `find_files_by_type`, `get_component_map`, `get_firmware_metadata`, `extract_bootloader_env` | | **UART** | 8 | `uart_connect`, `uart_send_command`, `uart_read`, `uart_send_break`, `uart_send_raw`, `uart_disconnect`, `uart_status`, `uart_get_transcript` | | **报告** | 6 | `add_finding`, `list_findings`, `update_finding`, `generate_assessment_report`, `generate_executive_summary`, `run_full_assessment` | | **字符串** | 5 | `extract_strings`, `search_strings`, `find_crypto_material`, `find_hardcoded_credentials`, `find_hardcoded_ips` | | **网络** | 5 | `analyze_network_traffic`, `get_protocol_breakdown`, `identify_insecure_protocols`, `get_dns_queries`, `get_network_conversations` | | **UEFI** | 5 | `list_firmware_volumes`, `list_uefi_modules`, `extract_nvram_variables`, `identify_uefi_module`, `read_uefi_module` | | **RTOS** *(applies_to `rtos`)* | 5 | `detect_rtos_kernel`, `enumerate_rtos_tasks`, `analyze_vector_table`, `recover_base_address`, `analyze_memory_map` | | **对比** | 4 | `list_firmware_versions`, `diff_firmware`, `diff_binary`, `diff_decompilation` | | **裸机 / MCU** | 4 | `list_chip_families`, `audit_bare_metal_firmware`, `submit_bare_metal_descriptor`, `lookup_bare_metal_findings_across_firmwares` | | **ICS 协议** | 4 | `trigger_ics_protocol_walk`, `list_ics_protocols`, `lookup_ics_protocol_across_firmwares`, `describe_ics_protocol_anomalies` | | **Python AST** | 4 | `python_ast_walk_status`, `trigger_python_ast_walk`, `get_python_ast_summary`, `lookup_python_ast_across_firmwares` | | **项目** | 3 | `get_project_info`, `switch_project`, `list_projects` | | **cwe_checker** | 3 | `cwe_check_status`, `cwe_check_binary`, `cwe_check_firmware` | | **VulHunt** | 3 | `vulhunt_scan_binary`, `vulhunt_scan_firmware`, `vulhunt_check_available` | | **报告编写器** | 3 | `report_start`, `report_write_section`, `report_render` | | **文件格式检测** | 3 | `validate_file_format`, `list_file_formats`, `cross_firmware_format_collision_audit` | | **模块可达性** | 3 | `trigger_module_reachability_walk`, `get_module_reachability`, `lookup_module_across_firmwares` | | **网络暴露** | 3 | `trigger_network_exposure_walk`, `get_network_exposure`, `lookup_network_listener_across_firmwares` | | **DS1QRSetup 调用图** | 3 | `ds1qrsetup_callgraph_walk_status`, `trigger_ds1qrsetup_callgraph_walk`, `lookup_ds1qrsetup_callgraph_across_firmwares` | | **攻击面** | 2 | `detect_input_vectors`, `analyze_binary_attack_surface` | | **污点 LLM** | 2 | `scan_taint_analysis`, `deep_dive_taint_analysis` | | **Carving 沙箱** | 1 | `run_shell` | 上述许多类别附带一个 `lookup_*_across_firmwares` 工具 —— 这是一个项目聚合查询(例如“哪些固件共享此驱动程序哈希/注册表项/systemd unit/ICS 协议/芯片系列”),只需单次 MCP 调用即可得到解答,无需按固件逐一迭代。 ## UART Bridge(可选) 要通过 UART 访问实时设备,请在主机上运行该 bridge(USB 串行适配器无法轻易直通到 Docker): ``` pip install pyserial python3 scripts/wairz-uart-bridge.py --bind 0.0.0.0 --port 9999 ``` 该 bridge 是一个 TCP 服务器 —— 串行设备路径和波特率是通过 `uart_connect` MCP 工具指定的,而不是在命令行中指定。 在 Linux 上,允许 Docker 流量访问该 bridge,并确保正确配置了 `.env`: ``` sudo iptables -I INPUT -p tcp --dport 9999 -j ACCEPT ``` `.env` 中的 `UART_BRIDGE_HOST` 必须是 `host.docker.internal`(而不是 `localhost`)。更改 `.env` 后重启后端:`docker compose restart backend`。 有关完整的设置详细信息,请参阅 [UART 控制台文档](docs/features/uart.md)。 ## 设备采集 Bridge(可选) 要直接从 ADB 连接的 Android 设备拉取固件,请在主机上运行设备 bridge: ``` python3 scripts/wairz-device-bridge.py --bind 0.0.0.0 --port 9998 ``` 要在没有真实设备的情况下进行开发,请使用模拟模式: ``` python3 scripts/wairz-device-bridge.py --mock --port 9998 ``` 设置与 UART bridge 的模式相同:在 `.env` 中设置 `DEVICE_BRIDGE_HOST=host.docker.internal`,并允许 Docker 流量访问 9998 端口。 ## 技术栈 | 层级 | 技术 | |-------|------------| | 前端 | React 19, Vite, TypeScript, Tailwind CSS, shadcn/ui | | 代码查看器 | Monaco Editor | | 组件图 | ReactFlow + Dagre | | 终端 | xterm.js | | 状态管理 | Zustand | | 后端 | Python 3.12, FastAPI, SQLAlchemy 2.0 (async), Alembic | | 数据库 | PostgreSQL 16 | | 缓存 | Redis 7 | | 固件提取 | binwalk3, unblob, sasquatch, jefferson, ubi_reader, cramfs-tools, UEFIExtract | | 二进制分析 | radare2 (r2pipe), pyelftools, LIEF, capa | | 反编译 | Ghidra 11.3.1 (headless) 配有自定义分析脚本 | | 漏洞检测 | cwe_checker (17 CWEs), VulHunt, YARA (~5000 Forge 规则), ShellCheck, Bandit | | 威胁情报 | ClamAV, VirusTotal, abuse.ch (MalwareBazaar, ThreatFox, URLhaus, YARAify), CIRCL Hashlookup (NSRL) | | 模拟 | QEMU 用户模式 + 系统模式, FirmAE, Qiling (ARM, MIPS, MIPSel, AArch64) | | 网络分析 | Scapy(pcap 捕获 + 来自模拟固件的协议分析) | | Fuzzing | 带有 QEMU 模式的 AFL++ | | SBOM | CycloneDX 1.7, SPDX 2.3, CycloneDX VEX, NVD API (nvdlib), Grype, Syft | | Android | Androguard (APK 分析), ADB (设备采集) | | UART | pyserial (主机端 bridge) | | 合规性 | 欧盟 CRA 附件 I(20 项要求),ETSI EN 303 645 | | AI 集成 | MCP (Model Context Protocol) | | 容器 | Docker + Docker Compose | ## 项目结构 ``` wairz/ ├── backend/ │ ├── app/ │ │ ├── main.py # FastAPI application │ │ ├── config.py # Settings (pydantic-settings) │ │ ├── database.py # Async SQLAlchemy engine/session │ │ ├── mcp_server.py # MCP server with dynamic project switching │ │ ├── models/ # SQLAlchemy ORM models │ │ ├── schemas/ # Pydantic request/response schemas │ │ ├── routers/ # REST API endpoints │ │ ├── services/ # Business logic │ │ ├── ai/ # MCP tool registry + 383 tool implementations │ │ │ └── tools/ # 32 category files (filesystem, binary, security, emulation, hardware_firmware, windows_*, linux_*, ics_protocol, bare_metal, cwe_checker, vulhunt, attack_surface, network, uefi, taint_llm, etc.) │ │ └── utils/ # Path sandboxing, output truncation │ ├── alembic/ # Database migrations │ └── pyproject.toml ├── frontend/ │ ├── src/ │ │ ├── pages/ # Route pages (explorer, emulation, fuzzing, SBOM, etc.) │ │ ├── components/ # UI components (file tree, hex viewer, component map, etc.) │ │ ├── api/ # API client functions │ │ ├── stores/ # Zustand state management │ │ └── types/ # TypeScript type definitions │ └── package.json ├── ghidra/ │ ├── Dockerfile # Ghidra headless container │ └── scripts/ # Custom Java analysis scripts ├── emulation/ │ ├── Dockerfile # QEMU container (ARM, MIPS, MIPSel, AArch64) │ └── scripts/ # Emulation helper scripts ├── fuzzing/ │ └── Dockerfile # AFL++ container with QEMU mode ├── scripts/ │ ├── wairz-uart-bridge.py # Host-side UART serial bridge │ └── wairz-device-bridge.py # Host-side ADB device acquisition bridge ├── docker-compose.yml ├── launch.sh # Local development launcher ├── .env.example └── CLAUDE.md ``` ## 配置 所有设置均通过环境变量或 `.env` 文件进行配置: | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `DATABASE_URL` | *(通过 `.env` 中的 `POSTGRES_PASSWORD` 设置)* | PostgreSQL 连接 | | `REDIS_URL` | `redis://redis:6379/0` | Redis 连接 | | `STORAGE_ROOT` | `/data/firmware` | 固件存储目录 | | `MAX_UPLOAD_SIZE_MB` | `2048` | 固件最大上传大小 | | `MAX_TOOL_OUTPUT_KB` | `30` | MCP 工具输出截断限制 | | `GHIDRA_PATH` | `/opt/ghidra` | Ghidra 安装路径 | | `GHIDRA_TIMEOUT` | `300` | Ghidra 反编译超时时间(秒) | | `FUZZING_IMAGE` | `wairz-fuzzing` | Fuzzing 容器镜像名称 | | `FUZZING_TIMEOUT_MINUTES` | `120` | Fuzzing 活动最大持续时间 | | `FUZZING_MAX_CAMPAIGNS` | `1` | 并发 Fuzzing 活动最大数量 | | `UART_BRIDGE_HOST` | `host.docker.internal` | UART bridge 主机名 | | `UART_BRIDGE_PORT` | `9999` | UART bridge TCP 端口 | | `DEVICE_BRIDGE_HOST` | `host.docker.internal` | 设备采集 bridge 主机名 | | `DEVICE_BRIDGE_PORT` | `9998` | 设备采集 bridge TCP 端口 | | `NVD_API_KEY` | *(空)* | 可选的 NVD API key,用于获取更高速率限制 | | `VIRUSTOTAL_API_KEY` | *(空)* | 可选的 VirusTotal API key(仅哈希查询,无文件上传) | | `ABUSECH_AUTH_KEY` | *(空)* | 可选的 abuse.ch 身份验证 key,用于获取更高速率限制 | | `CLAMAV_HOST` | `clamav` | ClamAV daemon 主机名(Docker 服务) | | `CLAMAV_PORT` | `3310` | ClamAV daemon TCP 端口 | | `API_KEY` | *(空)* | 可选的 API key,用于 REST endpoint 身份验证 | | `LOG_LEVEL` | `INFO` | 日志级别 | ## 安全 Wairz 会摄取并分析不受信任的固件二进制文件;部署层面本身也需要小心。默认的 `docker-compose.yml` 强制执行以下规则: **必需的密钥。** `POSTGRES_PASSWORD` 和 `FIRMAE_DB_PASSWORD` 是必需的 —— 如果未在 `.env` 中设置它们,执行 `docker compose up` 会报错: ``` $ docker compose config error while interpolating services.postgres.environment.POSTGRES_PASSWORD: required variable POSTGRES_PASSWORD is missing a value ``` 使用以下命令生成强密码: ``` python3 -c 'import secrets; print(secrets.token_urlsafe(32))' ``` 不要提交 `.env` 文件。仅将 `.env.example` 用作模板。 **绑定默认值。** 后端(`:8000`)和前端(`:3000`)默认绑定到 `127.0.0.1` —— 仅限本地访问。`/ws` WebSocket endpoint 尚未经过身份验证,因此在设置 `API_KEY` *并且* 对 WebSocket 进行身份验证门控之前,将后端暴露给局域网是不安全的。在您了解其中的权衡之后,如果需要允许局域网访问: ``` # .env API_KEY= BACKEND_HOST_BIND=0.0.0.0 FRONTEND_HOST_BIND=0.0.0.0 ``` Postgres(`:5432`)和 Redis(`:6379`)始终绑定到环回接口 —— 无法覆盖。使用 `docker compose exec postgres psql ...` 进行主机端数据库访问,而不是通过网络套接字。 **轮换凭证。** 编辑 `.env`,然后重新创建受影响的容器: ``` docker compose up -d ``` 特别针对 Postgres,针对现有的 `pgdata` 卷更改 `POSTGRES_PASSWORD` 需要在运行中的容器内执行 `ALTER USER wairz WITH PASSWORD ...`,或者使用一个全新的卷。`pg-backup` 服务(每晚将 `pg_dump` 导出到 `${BACKUP_DIR:-./backups}`)使通过转储和恢复进行轮换可以安全地进行试验。 **生产环境。** 对于生产部署,请考虑使用外部密钥管理器(HashiCorp Vault、AWS Secrets Manager、SOPS 加密的 `.env` 文件),而不是明文的 `.env`。`docker-compose.prod.yml` Docker-secrets 变体已在路线图中,但目前尚未包含在代码树中。 ## 测试固件 适合测试的优秀固件镜像: - **[OpenWrt](https://downloads.openwrt.org/)** — 结构良好的嵌入式 Linux(MIPS、ARM) - **[DD-WRT](https://dd-wrt.com/)** — 类似于 OpenWrt - **[DVRF](https://github.com/praetorian-inc/DVRF)** (Damn Vulnerable Router Firmware) — 故意设计为存在漏洞的固件,非常适合安全测试 ## 许可证 [AGPL-3.0](LICENSE)
标签:DNS 反向解析, 二进制分析, 云安全运维, 云资产清单, 人工智能, 固件分析, 域名收集, 嵌入式系统, 搜索引擎查询, 测试用例, 用户模式Hook绕过, 请求拦截, 身份验证强制, 逆向工具, 逆向工程