copyleftdev/kindi

GitHub: copyleftdev/kindi

一款面向固件与软件供应链的加密证据搜寻工具,利用 SIMD Aho-Corasick 与并行化实现高性能模式匹配。

Stars: 0 | Forks: 0

kindi

Cryptographic evidence hunter for embedded firmware and software supply chains.

Performance · Quick Start · Field Test · AI Output · Fuzzing · Website

以 **Al-Kindi**(801-873 CE)命名,这位阿拉伯博学者撰写了 *Risalah fi Istikhraj al-Mu'amma* —— 第一篇通过频率分析破解密码的已知论文。一千二百年后,Kindi 做了他做过的事:在文本中寻找隐藏的密码模式,但速度达到每秒 200 MB,使用 SIMD 加速的 Aho-Corasick 自动机。 ``` cargo install kindi ``` ## 性能 | Operation | Regex alternation | Kindi | Speedup | |---|---|---|---| | Keyword search (434 patterns) | 10,814 us | 332 us | **33x** | | API search (4,427 patterns) | 55,795 us | 318 us | **175x** | | Throughput | 1.2 - 6.1 MB/s | 199 - 208 MB/s | **33 - 175x** | ### 如何 传统扫描器构建 `(?:kw1|kw2|...|kw4427)` 并逐行运行 `re.finditer()`。这是每行 O(n * m) 的复杂度。 Kindi 将所有模式编译为一个 [Aho-Corasick 自动机](https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm) —— 单次 O(n) 扫描,内部的 SIMD `memchr` 循环,零分配搜索。词边界在匹配后强制执行。通过二分查找的 `LineIndex` 获取行号,并使用 Rayon 并行扫描文件。 ## 快速开始 ``` # 扫描固件源代码树 kindi --keywords patterns/keyword_list.txt --api-defs patterns/api_definitions.txt ./firmware # 二进制文件分析 kindi --keywords patterns.txt --scan-binary ./build/output # AI 代理模式(3 KB 而非 100 MB) kindi --keywords patterns.txt --toon ./target # 快速扫描 + CSV 导出 kindi --keywords patterns.txt --quick --csv -o results/ ./src # 过滤噪声 kindi --keywords patterns.txt --ignore-evidence-types generic,Hash ./src ``` ## 实地测试 四个传奇的 C 语言单仓代码库。相同的模式数据库。真实的基准测试。 | Repo | Files | Source | Hits | Time | Throughput | Toon | |---|---|---|---|---|---|---| | **Linux kernel** | 93,188 | 1.7 GB | 108,010 | 0.64s | 14K files/s | 3.5 KB | | **OpenSSL** | 6,098 | 144 MB | 272,051 | 1.03s | 5.9K files/s | 3.4 KB | | **Wireshark** | 7,256 | 357 MB | 48,923 | 1.40s | 5.2K files/s | 3.5 KB | | **FFmpeg** | 10,260 | 112 MB | 4,281 | 0.38s | 27K files/s | 2.7 KB | | **Total** | **116,802** | **2.3 GB** | **433,265** | **3.45s** | | **13 KB** | 所有四个 toon 输出合并总计:**3,272 tokens**。这仅占 1M token 上下文窗口的 **0.3%**。 ## 发现内容 48+ 种加密算法、协议和库调用: - **对称加密** -- AES、DES、3DES、Blowfish、Twofish、Camellia、ChaCha20、RC4、CAST5 - **非对称加密** -- RSA、DSA、ECC、Diffie-Hellman、ElGamal - **哈希** -- SHA-1、SHA-2、SHA-3、MD5、MD4、BLAKE、RIPEMD、HMAC - **协议** -- TLS、SSL、SSH、Kerberos、PKCS、PKI - **库** -- OpenSSL、libgcrypt、Crypto++、WinCrypt - **弱加密标记** -- DES(已由 NIST 弃用)、MD5(碰撞攻击)、SHA-1(NIST-2030)、RC4(偏差密钥流)、Blowfish(64 位块) ## AI 代理输出 `--toon` 压缩输出以便于 LLM 消费。对 Linux 内核的扫描生成 100 MB 的 JSON(26M token)。Toon 给出 3 KB(864 token)。压缩比 **30,228:1**。 ``` @kindi pkg=linux files=93188 hits=108010 matched=4909 t=0.934s #by_type count=8 AES 10804 908f drivers/crypto/atmel-aes.c:323 SHA2 3851 449f include/crypto/sha2.h:203 DES 2948 263f drivers/gpu/drm/amd/...:225 #weak count=4 DES 2948 263f DEPRECATED:NIST-withdrawn MD5 1193 219f BROKEN:collision-attacks SHA1 1364 330f DEPRECATED:NIST-2030 RC4 87 12f BROKEN:biased-keystream #hot top=3 1010 drivers/crypto/inside-secure/safexcel_cipher.c AES,DES,SHA1 940 drivers/crypto/axis/artpec6_crypto.c AES,SHA2,HMAC 927 drivers/md/dm-crypt.c AES,HMAC,MD5 #methods keyword 107562 api 448 ``` 设计原则: - 我(AI)永远不需要全部 N 个匹配项。我需要聚合结果和深入分析能力。 - 重复的 JSON 字段名是纯粹的令牌浪费。位置格式消除了它们。 - 证据按类型分组,而非按文件分组。这是提问的方式。 - 弱加密预先分类。不要让我查阅训练数据来确认 NIST 状态。 - 省略上下文行(占 JSON 体积的 70%)。在深入分析模式下可用。 ## 架构 ``` src/ pattern.rs -- Aho-Corasick SIMD automaton, per-pattern \b word boundaries detect.rs -- Rayon parallel scanning, encoding fallback, method tracking extract.rs -- Archive extraction, SHA-256 cycle detection, path sanitization toon.rs -- Token-optimized output with weak crypto classification language.rs -- File classification (13 languages + binary) output.rs -- Crypto-spec v3.0 JSON + CSV error.rs -- Typed errors main.rs -- CLI ``` ### 内存安全 零 `unsafe`。生产代码中零 `unwrap()`。每个热路径索引都经过边界检查的 `.get()`。 | 防护 | 机制 | |---|---| | 缓冲区溢出 | `PathBuf`、`Vec`、`.get()` 边界检查 | | 空指针引用 | 每个 I/O 边界使用 `Result` | | 使用后释放 | 通过 `Drop` 的 RAII | | OOM | 分配前通过 `MAX_FILE_SIZE`(256 MB)防护 | | 路径遍历 | `sanitize_entry_path()` 剥离 `../` 和开头的 `/` | | 压缩包炸弹 | 提取图中的 SHA-256 循环检测 | ## 模糊测试 8 个 libFuzzer 目标,采用结构感知的 `Arbitrary` 输入: | 目标 | 不变量 | |---|---| | `fuzz_pattern_parse` | 对任意 INI+JSON 不会崩溃 | | `fuzz_pattern_search` | `matched_text == content[begin..end]`,强制执行边界,过滤类型不存在 | | `fuzz_extract_zip` | 所有文件位于目标目录下(无遍历) | | `fuzz_extract_tar` | 对损坏的 tar/gz/bz2/xz 不会崩溃 | | `fuzz_encoding` | 输出始终为有效 UTF-8 | | `fuzz_full_pipeline` | detection_method 正确,验证代码有效,JSON 往返,CSV 格式良好 | | `fuzz_extract_path_sanitize` | 无目录逃逸 | | `fuzz_language_classify` | 源码暗示文本,二进制暗示非源码 | ``` rustup toolchain install nightly cargo +nightly fuzz run fuzz_pattern_search cargo +nightly fuzz run fuzz_full_pipeline -- -max_total_time=300 ``` ## 测试 35 个单元测试。零编译器警告。 ``` cargo test # 35 tests cargo bench # Criterion benchmarks ``` ## CLI 参考 ``` kindi [OPTIONS] ... Options: --keywords Keyword pattern file [default: keyword_list.txt] --api-defs API pattern file (whole-word matching) -i, --ignore-case Case-insensitive -q, --quick Quick scan (presence only) --source-only Source files only --scan-binary Include binary files -s, --stop-after Stop after N matched files --ignore-evidence-types Filter types (comma-separated) -o, --output Output directory [default: .] --csv CSV alongside JSON --toon AI agent token-optimized output --pretty Pretty JSON -v, --verbose Verbose ``` ## 来源 ## 许可 Apache-2.0
标签:Aho-Corasick, AI代理模式, Al-Kindi, cargo, Rayon, Rust, SIMD, 二进制分析, 云安全运维, 关键词猎手, 内存安全, 加密, 取证, 可视化界面, 固件分析, 安全扫描, 密码分析, 密码学, 嵌入式安全, 并行计算, 开源安全工具, 快速搜索, 性能优化, 手动系统调用, 文本挖掘, 时序注入, 检测绕过, 模式匹配, 漏洞扫描器, 网络流量审计, 自动化资产收集, 软件供应链, 逆向工程平台, 通知系统, 零不安全, 频率分析