fkie-cad/cwe_checker
GitHub: fkie-cad/cwe_checker
一款基于 Ghidra 的跨架构二进制静态分析工具,用于在 ELF 可执行文件中自动检测常见的 CWE 漏洞模式。
Stars: 1343 | Forks: 140
# cwe_checker



[](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) 中
## 安装说明
### 使用 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`,文件中包含了使用说明。
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报告查看器, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 可视化界面, 固件安全, 域名收集, 请求拦截, 逆向工程, 通知系统, 静态分析