binsleuth 0.4.0

ELF/PE binary security hardening checker and section-level entropy analyzer
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
<div align="center">

# 🔍 BinSleuth

**ELF/PE バイナリのセキュリティ設定検証とエントロピー解析を行う、高速 Rust 製 CLI ツール。**
インストール不要の依存ゼロ設計。ミリ秒単位で解析結果を返します。

![BinSleuth social preview](https://repository-images.githubusercontent.com/1174345949/ddfc9174-be34-4b79-931d-1b8d3e71fcdf)

[![Crates.io](https://img.shields.io/crates/v/binsleuth.svg)](https://crates.io/crates/binsleuth)
[![Downloads](https://img.shields.io/crates/d/binsleuth.svg)](https://crates.io/crates/binsleuth)
[![docs.rs](https://docs.rs/binsleuth/badge.svg)](https://docs.rs/binsleuth)
[![CI](https://github.com/long-910/BinSleuth/actions/workflows/ci.yml/badge.svg)](https://github.com/long-910/BinSleuth/actions/workflows/ci.yml)
[![Release](https://github.com/long-910/BinSleuth/actions/workflows/release.yml/badge.svg)](https://github.com/long-910/BinSleuth/actions/workflows/release.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![MSRV](https://img.shields.io/badge/rustc-1.85%2B-orange.svg)](https://www.rust-lang.org)
[![Tests](https://img.shields.io/badge/tests-85%20passing-brightgreen.svg)](#)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/long-910?label=Sponsor&logo=githubsponsors&color=EA4AAA)](https://github.com/sponsors/long-910)
[![Ko-fi](https://img.shields.io/badge/Ko--fi-Support-FF5E5B?logo=ko-fi&logoColor=white)](https://ko-fi.com/long910)

**Language / 言語 / 语言:**
[English](README.md) · [日本語](README.ja.md) · [中文](README.zh.md)

</div>

---

## BinSleuth とは?

BinSleuth は **Rust 製のセキュリティ特化型静的バイナリ解析ツール**です。
コンパイル済み実行ファイルの「セキュリティ健康診断」として、以下の問いに即答します。

- *「このバイナリは現代的なセキュリティ保護が有効になっているか?」*
- *「このセクションはパック・暗号化されたマルウェアの可能性があるか?」*
- *「危険な OS レベル関数をインポートしていないか?」*

大規模なリバースエンジニアリングスイートを起動することなく、**セキュリティエンジニア・マルウェア研究者・開発者**がコマンドラインから即座に答えを得られるよう設計されています。

---

## 機能

### 1. セキュリティ・ハーデニングチェック

| フラグ | 説明 | ELF | PE |
|--------|------|-----|----|
| **NX** | スタック/データ領域を実行不可にしてコードインジェクションを防止 | `PT_GNU_STACK` | `NX_COMPAT` |
| **PIE** | 位置独立実行形式 — ASLR によるアドレスランダム化を有効化 | `ET_DYN` | `DYNAMIC_BASE` |
| **RELRO** | 再配置テーブルの読み取り専用化 — GOT 上書き攻撃を防止 | `PT_GNU_RELRO` + `BIND_NOW` | N/A |
| **Stack Canary** | バッファオーバーフロー検知シンボルの有無 | `__stack_chk_fail` | `__security_cookie` |
| **FORTIFY_SOURCE** | fortified libc ラッパー(`__*_chk`)— 文字列/メモリ操作関数にコンパイル時境界チェックを付与 | `__memcpy_chk`, … | `__memcpy_chk`, … |
| **No RPATH/RUNPATH** | 組み込みライブラリ検索パスの不在 — 書き込み可能ディレクトリや相対パスを使ったライブラリ注入を防止 | `DT_RPATH` / `DT_RUNPATH` | N/A |
| **Stripped** | デバッグシンボル / DWARF 情報の除去 — リバースエンジニアリングを困難に | `.debug_*` セクション | デバッグディレクトリ |

各チェックは **Enabled(有効)** / **Partial(部分的)** / **Disabled(無効)** / **N/A** のいずれかで報告されます。

### 2. セクション・エントロピー解析

各セクションの [シャノンエントロピー](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC) を計算します。

```
H = -Σ P(x) · log₂(P(x))       範囲: [0.0 – 8.0]
```

| エントロピー範囲 | 解釈 |
|----------------|------|
| 0.0 – 4.0 | 通常のコード / データ |
| 4.0 – 7.0 | 圧縮リソース(正常範囲) |
| **> 7.0** | **⚠ パック / 暗号化の疑い — 要調査** |

### 3. 危険シンボル検出

マルウェアや脆弱なバイナリに頻出するシンボルをフラグし、**カテゴリ付き**で報告します。

| カテゴリ | JSON値 ||
|---------|-------|---|
| **コード実行** | `exec` | `system`, `execve`, `popen`, `WinExec`, `CreateProcess` |
| **ネットワーク** | `net` | `connect`, `socket`, `gethostbyname`, `WinHttpOpen` |
| **メモリ操作** | `mem` | `mprotect`, `mmap`, `VirtualAlloc`, `VirtualProtect` |

### 4. セキュリティスコア

すべてのレポートにはハーデニング結果を重み付け集計した **0〜100 のセキュリティスコア** が含まれます。

| チェック | 配点 |
|---------|------|
| NX | 20 |
| PIE | 20 |
| RELRO(Full) | 15 · Partial: 7 · N/A: 15 |
| Stack Canary | 15 |
| FORTIFY_SOURCE | 10 |
| No RPATH/RUNPATH | 10 |
| Stripped | 5 |
| 危険シンボルなし | 5(1シンボルにつき −1) |

---

## インストール

### crates.io から(推奨)

```bash
cargo install binsleuth
```

### ソースからビルド

```bash
git clone https://github.com/long-910/BinSleuth.git
cd BinSleuth
cargo build --release
# バイナリ出力先: ./target/release/binsleuth
```

### 要件

- Rust **1.85** 以降
- システムライブラリ不要 — 純粋 Rust 実装

---

## 使い方

```
binsleuth [OPTIONS] <FILE>

引数:
  <FILE>  解析対象の ELF または PE バイナリのパス

オプション:
  -v, --verbose  エントロピーが正常なセクションも含めてすべて表示
      --json     カラーターミナル出力の代わりに JSON 形式で出力
      --strict   ハーデニング保護が欠如しているか危険シンボルが検出された場合に終了コード 2 で終了
                 (CI パイプラインで有用)
  -h, --help     ヘルプを表示
  -V, --version  バージョンを表示
```

### 基本的な解析

```bash
binsleuth /usr/bin/ls
binsleuth ./myapp.exe
binsleuth ./suspicious_binary
```

### 全セクション表示(低エントロピーセクションも含む)

```bash
binsleuth --verbose /usr/bin/python3
```

### JSON 出力(スクリプト / CI 連携)

```bash
binsleuth --json /usr/bin/ls | jq '.hardening.nx'
```

### CI パイプライン — ハーデニング問題があれば失敗させる

```bash
binsleuth --strict ./myapp && echo "Hardening OK" || echo "Hardening FAILED"
# 終了コード 0 = 正常、2 = ハーデニング問題あり、1 = パースエラー
```

### 出力例 — ハーデニング済みバイナリ

```
╔══════════════════════════════════════════════════════╗
║              BinSleuth — Binary Analyzer             ║
╚══════════════════════════════════════════════════════╝

  File:    /usr/bin/ls
  Format:  ELF
  Arch:    X86_64

  ── Security Hardening ──────────────────────────────────

  [ ENABLED  ]  NX (Non-Executable Stack)
  [ ENABLED  ]  PIE (ASLR-compatible)
  [ ENABLED  ]  RELRO (Read-Only Relocations)
  [ ENABLED  ]  Stack Canary
  [ ENABLED  ]  FORTIFY_SOURCE
  [ ENABLED  ]  No RPATH/RUNPATH
  [ ENABLED  ]  Debug Symbols Stripped

  ── Section Entropy ─────────────────────────────────────

  Section                      Size (B)     Entropy  Status
  ──────────────────────────────────────────────────────────────────────
  All sections within normal entropy range.
  (run with --verbose to show all sections)

  ── Dangerous Symbol Usage ──────────────────────────────

  No dangerous symbols detected.

  ────────────────────────────────────────────────────────
  Analysis complete.
```

### 出力例 — 疑わしい / パック済みバイナリ

```
  ── Section Entropy ─────────────────────────────────────

  Section                      Size (B)     Entropy  Status
  ──────────────────────────────────────────────────────────────────────
  UPX0                           491520       7.9981  ⚠  Packed/Encrypted suspected
  UPX1                            32768       7.9912  ⚠  Packed/Encrypted suspected

  2 section(s) with entropy > 7.0 detected!

  ── Dangerous Symbol Usage ──────────────────────────────

  3 dangerous symbol(s) found:
    ▶  execve    [exec]
    ▶  mprotect  [mem]
    ▶  socket    [net]
```

---

## ライブラリとして使う

`binsleuth` は CLI に加えて、Rust ライブラリクレートとしても利用できます。VS Code 拡張などの可視化ツールのコア解析エンジンとして設計されています。

`Cargo.toml` に追加してください:

```toml
[dependencies]
binsleuth = "0.4"
```

### 統合 API(推奨)

```rust
// 1回の呼び出しでハーデニング・セクション・スコアすべてを取得
let data = std::fs::read("path/to/binary")?;
let report = binsleuth::analyze(&data)?;

println!("スコア: {}/100", report.security_score);
println!("PIE:   {:?}", report.hardening.pie);

for sec in &report.sections {
    println!("{}: va={:#x} entropy={:.4} rwx={}{}{}",
        sec.name, sec.virtual_address, sec.entropy,
        if sec.permissions.read  { 'r' } else { '-' },
        if sec.permissions.write { 'w' } else { '-' },
        if sec.permissions.execute { 'x' } else { '-' },
    );
}

for sym in &report.hardening.dangerous_symbols {
    println!("  {:?}  {}", sym.category, sym.name);
}

// JSON 文字列として取得(stdout への出力なし)
let json: String = report.to_json_pretty();
```

### 低レベル API

```rust
use binsleuth::analyzer::hardening::HardeningInfo;
use binsleuth::analyzer::entropy::SectionEntropy;

let hardening = HardeningInfo::analyze(&data)?;
let sections  = SectionEntropy::analyze(&data)?;
```

完全な実行例は [docs.rs の API ドキュメント](https://docs.rs/binsleuth) と [`examples/basic.rs`](examples/basic.rs) を参照してください。

---

## プロジェクト構成

```
BinSleuth/
├── Cargo.toml
├── README.md              ← 英語(デフォルト)
├── README.ja.md           ← 日本語
├── README.zh.md           ← 中国語(簡体字)
├── CHANGELOG.md
├── LICENSE
├── examples/
│   └── basic.rs           # ライブラリ使用例
└── src/
    ├── lib.rs             # ライブラリクレートのルート(パブリック API)
    ├── main.rs            # CLI エントリーポイント(clap)
    ├── analyzer/
    │   ├── mod.rs
    │   ├── entropy.rs     # シャノンエントロピー + SectionEntropy
    │   └── hardening.rs   # NX / PIE / RELRO / Canary / シンボル
    └── report/
        ├── mod.rs
        ├── terminal.rs    # カラーターミナル出力
        └── json.rs        # JSON 出力シリアライザ
```

### 主要な型

|| ファイル | 役割 |
|----|---------|------|
| `AnalysisReport` | `analyzer/mod.rs` | 統合結果:ハーデニング + セクション + スコア |
| `HardeningInfo` | `analyzer/hardening.rs` | ハーデニングチェック結果の集約 |
| `CheckResult` | `analyzer/hardening.rs` | `Enabled` / `Partial(msg)` / `Disabled` / `N/A` |
| `DangerousSymbol` | `analyzer/hardening.rs` | シンボル名 + `SymbolCategory`(Exec / Net / Mem) |
| `SectionEntropy` | `analyzer/entropy.rs` | セクション名・仮想アドレス・ファイルオフセット・サイズ・エントロピー・パーミッション |
| `SectionPermissions` | `analyzer/entropy.rs` | `read``write``execute` ブールフラグ |
| `TerminalReporter` | `report/terminal.rs` | カラーターミナルレンダラー |

---

## 対応フォーマット

| フォーマット | アーキテクチャ | NX | PIE | RELRO | Canary | FORTIFY | RPATH |
|------------|-------------|----|-----|-------|--------|---------|-------|
| ELF 32-bit | x86, ARM, MIPS … |||||||
| ELF 64-bit | x86-64, AArch64 … |||||||
| PE 32-bit (PE32) | x86 ||| N/A ||| N/A |
| PE 64-bit (PE32+) | x86-64 ||| N/A ||| N/A |

---

## 終了コード

| コード | 意味 |
|--------|------|
| `0` | 解析正常終了 |
| `1` | ファイルが見つからない / パースエラー / 非対応フォーマット |
| `2` | `--strict` モード: 解析成功だがハーデニング問題を検出 |

---

## テスト

```bash
# 全テスト(ユニット + 統合)
cargo test

# ユニットテストのみ
cargo test --lib

# 統合テストのみ(ビルド済みバイナリが必要)
cargo test --test cli

# Lint
cargo clippy -- -D warnings

# フォーマットチェック
cargo fmt --check
```

テストスイートは **ユニットテスト 56 件**・**統合テスト 26 件**・**ドックテスト 3 件**(合計 85 件)で構成されています。

| モジュール | テスト数 | カバー範囲 |
|-----------|---------|-----------|
| `analyzer::entropy` | 17 | シャノン公式、境界値、単調性、`extract_permissions`(ELF/COFF)、セクションメタデータ |
| `analyzer::hardening` | 23 | PE ヘッダー解析、RELRO 状態、FORTIFY_SOURCE、RPATH、ELF 自己解析、危険シンボルカテゴリ判定 |
| `analyzer`(mod) | 16 | `compute_score` 境界値・各チェック減点、`AnalysisReport` API、JSON シリアライズ |
| `tests::cli` | 26 | CLI フラグ、JSON 出力、strict モード、stripped 検出、エラー処理、`security_score`、セクションメタデータ、危険シンボルカテゴリ |
| ドックテスト | 3 | ライブラリ API スモークテスト |

---

## コントリビュート

コントリビューションを歓迎します!

1. リポジトリをフォーク
2. フィーチャーブランチを作成: `git checkout -b feat/your-feature`
3. 必要に応じてテストを記述
4. `cargo test && cargo clippy -- -D warnings` でチェック
5. Pull Request を作成

詳細は [CONTRIBUTING.md](CONTRIBUTING.md) *(準備中)* をご覧ください。

---

## ロードマップ

- [x] JSON 出力モード(`--json`- [x] DWARF / PDB デバッグ情報 / stripped 検出
- [x] CI 向け strict モード(`--strict`、終了コード 2)
- [x] FORTIFY_SOURCE 検出(`__*_chk` シンボルスキャン)
- [x] RPATH/RUNPATH 検出(ライブラリ注入リスク)
- [x] ライブラリ API — `AnalysisReport::analyze()` 統合エントリーポイント
- [x] セキュリティスコア(0〜100)— ダッシュボード・バッジ表示用
- [x] セクション仮想アドレス・ファイルオフセット・rwx パーミッション
- [x] 危険シンボルカテゴリ(Exec / Net / Mem)— 可視化ツール向け色分け対応
- [ ] VS Code 拡張(可視化フロントエンド)
- [ ] SARIF 出力フォーマット
- [ ] macOS Mach-O 対応
- [ ] 2つのバイナリのインポート差分(`binsleuth diff a.out b.out`- [ ] Yara スタイルのバイトパターンマッチング

---

## ライセンス

MIT ライセンスのもとで公開されています。詳細は [LICENSE](LICENSE) をご覧ください。

---

## 謝辞

- [object]https://crates.io/crates/object — クロスプラットフォームバイナリ解析
- [clap]https://crates.io/crates/clap — CLI 引数パーサー
- [anyhow]https://crates.io/crates/anyhow — エラーハンドリング
- [colored]https://crates.io/crates/colored — ターミナルカラー出力

---

<div align="center">
❤️ と Rust で作られています
</div>