#binary-file #binary #binary-parser #security #elf #multi-platform #pe

bin+lib checksec

快速的多平台(ELF/PE/MachO)二进制检查命令行实用程序和库

8 个版本

0.0.9 2022 年 6 月 10 日
0.0.8 2020 年 11 月 24 日
0.0.7 2020 年 8 月 20 日
0.0.6 2020 年 6 月 13 日
0.0.2 2020 年 3 月 29 日

#2032命令行实用程序

每月 31 次下载
用于 3 crates

Apache-2.0

80KB
1.5K SLoC

checksec.rs

crates.io docs.rs github-actions

用 Rust 编写的快速多平台(ELF/PE/MachO)二进制检查程序。

cargo crate 定期发布

使用 goblin 进行多平台二进制解析支持,使用 ignore 进行快速递归路径迭代,并尊重各种过滤器,如 glob、文件类型以及 .gitignore 文件和 serde 进行序列化/反序列化。

现有技术

此类工具存在大量现有技术。有些是独立的命令行实用程序,有些是框架或调试器的插件,但所有都是特定平台的。

项目 作者 语言 活跃
checksec.sh (原始) Tobias Klein bash 2009 年 1 月 28 日 - 2011 年 11 月 17 日
checksec Dhiru Kholia python 2013 年 4 月 18 日 - 2014 年 3 月 19 日
checksec.sh Brian Davis bash 2014 年 2 月 14 日 - 当前
pwntools - checksec Gallopsled python 2014 年 11 月 8 日 - 当前
CheckSec.c hugsy c 2015 年 12 月 7 日 - 2018 年 4 月 24 日
checksec klks c++ 2017 年 3 月 25 日
iOS-checksec.py ChiChou python 2017 年 4 月 6 日
checksec-win Lucas Leong c++ 2017 年 8 月 21 日
winchecksec Trail Of Bits c++ 2018 年 8 月 17 日 - 当前
pe_mitigation_check.py David Cannings python 2018 年 9 月 20 日

注意:此列表并不完整

构建/安装

git (HEAD)

git clone https://github.com/etke/checksec.rs && cd checksec.rs
cargo build --release
cargo install --path .

cargo

cargo install checksec

交叉编译

对于想要为目标操作系统或架构编译的实例,请参阅 rust-cross

用法

USAGE:
    checksec [FLAGS] [OPTIONS]

FLAGS:
    -h, --help           Prints help information
    -j, --json           Output in json format
        --pretty         Human readable json output
    -P, --process-all    Check all running processes
    -V, --version        Prints version information

OPTIONS:
    -d, --directory <DIRECTORY>    Target directory
    -f, --file <FILE>              Target file
    -p, --process <NAME>           Name of running process to check

示例

独立的 checksec

单个二进制文件
$ checksec -f test/binaries/true-x86_64
ELF64: | Canary: true CFI: false SafeStack: false Fortify: true Fortified: 2 NX: true PIE: None Relro: Partial RPATH: None RUNPATH: None | File: test/binaries/true-x86_64
单个二进制文件(JSON 输出)
$ checksec -f test/binaries/true-x86_64 --json
{"binaries":[{"binarytype":"Elf64","file":"test/binaries/true-x86_64","properties":{"Elf":{"canary":true,"clang_cfi":false,"clang_safestack":false,"fortified":2,"fortify":true,"nx":true,"pie":"None","relro":"Partial","rpath":{"paths":["None"]},"runpath":{"paths":["None"]}}}}]}
正在运行的过程
$ checksec -P
-zsh(34)
  ELF64: | Canary: true CFI: false SafeStack: false Fortify: true Fortified: 8 NX: true PIE: Full Relro: Full RPATH: None RUNPATH: None | File: /bin/zsh
checksec(216)
  ELF64: | Canary: false CFI: false SafeStack: false Fortify: false Fortified: 0 NX: true PIE: Full Relro: Full RPATH: None RUNPATH: None | File: /home/etke/.cargo/bin/checksec
init(1)
  ELF64: | Canary: false CFI: false SafeStack: false Fortify: false Fortified: 0 NX: true PIE: None Relro: Partial RPATH: None RUNPATH: None | File: /init
正在运行的过程(JSON 输出)
$ checksec -P --json
{"processes":[{"binary":[{"binarytype":"Elf64","file":"/bin/zsh","properties":{"Elf":{"canary":true,"clang_cfi":false,"clang_safestack":false,"fortified":8,"fortify":true,"nx":true,"pie":"PIE","relro":"Full","rpath":{"paths":["None"]},"runpath":{"paths":["None"]}}}}],"pid":34},{"binary":[{"binarytype":"Elf64","file":"/init","properties":{"Elf":{"canary":false,"clang_cfi":false,"clang_safestack":false,"fortified":0,"fortify":false,"nx":true,"pie":"None","relro":"Partial","rpath":{"paths":["None"]},"runpath":{"paths":["None"]}}}}],"pid":1},{"binary":[{"binarytype":"Elf64","file":"/home/etke/.cargo/bin/checksec","properties":{"Elf":{"canary":false,"clang_cfi":false,"clang_safestack":false,"fortified":0,"fortify":false,"nx":true,"pie":"PIE","relro":"Full","rpath":{"paths":["None"]},"runpath":{"paths":["None"]}}}}],"pid":232}]}

libchecksec

只需将以下内容添加到任何具有goblin依赖项的当前项目中,即可在goblin::Object::{Elf, Mach, PE}对象上启用checksec属性。

checksec crate依赖项添加到您的项目Cargo.toml中。

[dependencies]
checksec = { version = "0.0.9", features = ["elf", "macho", "pe", "color"] }

现在在您的项目源中,指定对checksec crate的依赖,并导入所需的模块以访问相关的Properties属性。

extern crate checksec;
use checksec::elf;
use checksec::macho;
use checksec::pe;

您现在可以直接从goblin::Object访问所有实现的安全检查函数。

有关库使用示例,请参阅examples/

待办事项

libchecksec 待办事项

  • 平台特定检查
    • ELF
      • 可防御的
      • Rpath RW
    • PE
      • Authenticode验证
    • MachO
      • Rpath RW
  • 平台无关检查
    • MachO
      • @rpath内容到shared::VecRpath,类似于ELF中的DT_RPATH/DT_RUNPATH
      • 代码签名验证

checksec 待办事项

  • ?

项目 待办事项

  • 测试 (cargo test)

贡献

欢迎改进!

  • 有关想法,请查看GitHub Issues页面。
    • 想添加某些内容?请提交问题并标记为improvement
  • 发现了问题?提交问题并包含以下信息
    • 问题描述
    • 预期行为
    • 附加bug标签
  • 为了进行审查的拉取请求;
    • 必须使用提供的项目rustfmt.toml进行格式化
    • 必须没有使用提供的项目clippy.toml的Clippy警告/错误(如果有)

依赖关系

~7–18MB
~222K SLoC