fkie-cad/cwe_checker

GitHub: fkie-cad/cwe_checker

一款基于 Ghidra 的跨架构二进制静态分析工具,用于在 ELF 可执行文件中自动检测常见的 CWE 漏洞模式。

Stars: 1343 | Forks: 140

cwe_checker logo

# cwe_checker ![Acceptance tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4279b401c4231813.svg) ![Unit tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/f7b3ebe895231818.svg) ![Docker-Pulls](https://img.shields.io/docker/pulls/fkiecad/cwe_checker.svg) [![文档](https://img.shields.io/badge/doc-stable-green.svg)](https://docs.cwe-checker.io/index.html) ## 什么是 cwe_checker? cwe_checker 是一套检测工具,用于发现常见的漏洞类别,例如空指针解引用和缓冲区溢出。 这些漏洞类别在正式场合被称为[通用缺陷枚举](https://cwe.mitre.org/)(CWE)。 这些检查基于多种分析技术,范围从简单的启发式方法到基于抽象解释的数据流分析。 它的主要目标是帮助分析师快速找到潜在的脆弱代码路径。 它的主要关注点是 Linux 和 Unix 操作系统上常见的 ELF 二进制文件。 cwe_checker 使用 [Ghidra](https://ghidra-sre.org/) 将二进制文件反汇编为一种通用的中间表示, 并在这种 IR 上实现了自己的分析。 因此,只要 Ghidra 能进行反汇编的分析,就可以在大多数 CPU 架构上运行, 这使得 cwe_checker 成为固件分析的宝贵工具。 以下几个理由应该能说服您尝试一下 *cwe_checker*: - 它非常易于设置,只需构建 Docker 容器! - 它可以分析多种 CPU 架构的 ELF 二进制文件,包括 x86、ARM、MIPS 和 PPC - 由于其基于插件的架构,它具有很强的可扩展性 - 它是可配置的,例如可以将分析应用于新的 API - 可以查看在 Ghidra 中带有注释的结果 - cwe_checker 可以作为插件集成到 [FACT](https://github.com/fkie-cad/FACT_core) 中

Usage Example

## 安装说明 ### 使用 Docker 镜像 最简单的方法是从 [Github 容器注册表](https://github.com/fkie-cad/cwe_checker/pkgs/container/cwe_checker) 拉取最新的 Docker 镜像: - `docker pull ghcr.io/fkie-cad/cwe_checker:latest` 获取基于当前 master 分支的镜像。 - `docker pull ghcr.io/fkie-cad/cwe_checker:stable` 获取基于最新稳定发布版本的镜像。 - `docker pull ghcr.io/fkie-cad/cwe_checker:v0.9` 获取基于 v0.9 稳定发布版本的镜像。 不过,建议您在新版本发布后尽快切换到较新的稳定版,因为稳定版本之间的改进可能会非常显著。 如果您想自己构建 Docker 镜像,只需运行 ``` docker build -t cwe_checker . ``` 通过这种方式,您还可以为基于 ARM 的 PC(例如较新的 Apple Mac)构建原生 Docker 镜像。 预构建的 Docker 镜像目前仅基于 x86。 ### 本地安装 为了在本地构建和安装 *cwe_checker*,必须安装以下依赖项: - [Rust](https://www.rust-lang.org) >= 1.82 - [Ghidra](https://ghidra-sre.org/) >= 10.2 运行 `make all GHIDRA_PATH=/path/to/ghidra_folder`(请填入本地 Ghidra 安装路径的正确位置)来编译和安装 cwe_checker。 如果您省略 `GHIDRA_PATH` 参数,安装程序将会在您的文件系统中搜索本地已安装的 Ghidra。 ## 使用方法 *cwe_checker* 接收一个二进制文件作为输入, 基于静态分析在二进制文件上运行多项[检查](#checks) 然后输出在分析过程中发现的 CWE 警告列表。 如果您使用官方的 Docker 镜像,只需运行 ``` docker run --rm -v /PATH/TO/BINARY:/input ghcr.io/fkie-cad/cwe_checker /input ``` 如果您在本地安装了 *cwe_checker*,请运行 ``` cwe_checker BINARY ``` 如果您使用 nix flakes,请运行 ``` nix run github:fkie-cad/cwe_checker -- BINARY ``` 您可以通过位于 `src/config.json` 的配置文件来调整大多数检查的行为。 如果对其进行了修改,请添加命令行参数 `--config=src/config.json`,以告知 *cwe_checker* 使用修改后的文件。 有关其他可用命令行参数的信息,您可以向 *cwe_checker* 传递 `--help` 参数。 目前有针对 Linux 可加载内核模块 (LKM)分析的*实验性*支持。*cwe_checker* 会识别您是否传入了 LKM,并执行 用户空间程序可用的 CWE 检查子集。分析可以通过单独的[配置文件](src/lkm_config.json)进行配置。 如果您使用的是稳定版本,您还可以查看[在线文档](https://docs.cwe-checker.io/index.html)以获取更多信息。 ### 针对 Bare-Metal 二进制文件 cwe_checker 提供了对分析 bare-metal 二进制文件的实验性支持。 为此,需要通过 `--bare-metal-config` 命令行选项提供一个 bare-metal 配置文件。 此类配置文件的示例可在 `bare_metal/stm32f407vg.json` 中找到 (该文件是为 STM32F407VG MCU 创建并测试的)。 有关更多信息,请查看[在线文档](https://docs.cwe-checker.io/index.html)。 ## 文档与测试 我们测试套件的测试二进制文件可以通过 `make compile_test_files` 构建(需要安装 Docker!)。然后可以使用 `make test` 运行测试套件。 源代码文档可以通过 `make documentation` 构建。对于稳定版本,可以在[这里](https://docs.cwe-checker.io/index.html)找到文档。 ## 已实现的检查 到目前为止,已实现以下分析: - [CWE-78](https://cwe.mitre.org/data/definitions/78.html):操作系统命令注入(目前在标准运行中处于禁用状态) - [CWE-119](https://cwe.mitre.org/data/definitions/119.html) 及其变体 [CWE-125](https://cwe.mitre.org/data/definitions/125.html) 和 [CWE-787](https://cwe.mitre.org/data/definitions/787.html):缓冲区溢出 - [CWE-134](https://cwe.mitre.org/data/definitions/134.html):使用外部控制的格式化字符串 - [CWE-190](https://cwe.mitre.org/data/definitions/190.html):整数溢出或环绕 - [CWE-215](https://cwe.mitre.org/data/definitions/215.html):通过调试信息暴露信息 - [CWE-243](https://cwe.mitre.org/data/definitions/243.html):在不更改工作目录的情况下创建 chroot 监狱 - [CWE-332](https://cwe.mitre.org/data/definitions/332.html):PRNG 中熵不足 - [CWE-337](https://cwe.mitre.org/data/definitions/337.html):伪随机数生成器(PRNG)中的可预测种子 - [CWE-367](https://cwe.mitre.org/data/definitions/367.html):检查时间到使用时间(TOCTOU)竞争条件 - [CWE-416](https://cwe.mitre.org/data/definitions/416.html):释放后使用及其变体 [CWE-415](https://cwe.mitre.org/data/definitions/415.html):双重释放 - [CWE-426](https://cwe.mitre.org/data/definitions/426.html):不可信的搜索路径 - [CWE-467](https://cwe.mitre.org/data/definitions/467.html):在指针类型上使用 sizeof() - [CWE-476](https://cwe.mitre.org/data/definitions/476.html):空指针解引用 - [CWE-560](https://cwe.mitre.org/data/definitions/560.html):在 umask() 中使用 chmod 风格的参数 - [CWE-676](https://cwe.mitre.org/data/definitions/676.html):使用具有潜在危险的函数 - [CWE-782](https://cwe.mitre.org/data/definitions/782.html):暴露具有不充分访问控制的 IOCTL - [CWE-789](https://cwe.mitre.org/data/definitions/789.html):使用过大尺寸值的内存分配 请注意,由于采用了捷径、静态分析本身的特性以及过度近似,误报和漏报的情况都在所难免。 您可以在[特定检查的文档页面](https://docs.cwe-checker.io/cwe_checker_lib/checkers/index.html)上找到关于每项检查内部工作原理以及已知误报和漏报原因的信息。 ## 集成到其他工具中 cwe_checker 附带了一个用于 Ghidra 的脚本, 该脚本会解析 cwe_checker 的输出,并在反汇编器中为发现的 CWE 添加注释,以便于进行手动分析。 该脚本位于 `ghidra_plugin/cwe_checker_ghidra_plugin.py`,文件中包含了使用说明。

Ghidra Integration

cwe_checker 也作为插件集成到了 [FACT](https://github.com/fkie-cad/FACT_core) 中。 如果您想将 cwe_checker 集成到您自己的分析工具链中,您可以使用 `--json` 命令行参数(结合 `--quiet` 或 `--out=...` 命令行选项),从而以易于解析的 JSON 输出格式生成 CWE 警告。 ## cwe_checker 的内部工作原理是什么? 使用 `cargo doc --open --document-private-items --no-deps` 构建文档将为您提供有关 cwe_checker 内部结构的更多信息。 然而,最好的文档仍然是源代码本身。 如果您有疑问,请务必在我们的[讨论页](https://github.com/fkie-cad/cwe_checker/discussions)上提问! 我们一直在努力提高可扩展性和完善文档,您的问题将帮助我们实现这一目标! 为了快速/初步了解其内部结构,您还可以查看 *doc* 文件夹中有关 *cwe_checker* 的会议演讲幻灯片。 到目前为止,我们已经在以下会议上展示了 cwe_checker: - [Pass The SALT 2019](https://2019.pass-the-salt.org/talks/74.html)([幻灯片](doc/slides/cwe_checker_pts19.pdf)) - [Black Hat USA 2019](https://www.blackhat.com/us-19/arsenal/schedule/index.html#cwe_checker-hunting-binary-code-vulnerabilities-across-cpu-architectures-16782)([幻灯片](doc/slides/cwe_checker_BlackHatUSA2019.pdf)) - [Black Hat USA 2022](https://www.blackhat.com/us-22/arsenal/schedule/#cwe_checker-architecture-independent-binary-vulnerability-analysis-26960)([幻灯片](doc/slides/cwe_checker_BlackHatUSA2022.pdf)) ## 致谢 该项目部分由[德国联邦信息安全局(BSI)](https://www.bsi.bund.de)资助。 特别感谢 BAP 社区(尤其是官方的 gitter)解答问题并探讨解决方案。 ## 许可证 ``` Copyright (C) 2018 - 2024 Fraunhofer FKIE (firmware-security@fkie.fraunhofer.de) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ```
标签:ELF, Ghidra, Web报告查看器, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 可视化界面, 固件安全, 域名收集, 请求拦截, 逆向工程, 通知系统, 静态分析