# RPM 包安全特性大规模扫描系统 - 需求文档 ## 1. 项目背景 需要对 RPM 软件源中的所有二进制文件进行安全特性扫描,检查编译时开启的安全保护机制(如 PIE、NX、Stack Canary、Fortify Source 等),以评估软件源的整体安全状况。 ## 2. 核心需求 ### 2.1 基本功能 1. **RPM 包获取** - 从 RPM 软件源获取所有 RPM 包列表 - 支持配置软件源地址 2. **二进制文件提取** - 从 RPM 包中提取二进制文件 - 关注路径:`/usr/bin`, `/bin`, `/usr/sbin`, `/sbin`, `/usr/lib64`, `/usr/lib` - 识别 ELF 格式文件(可执行文件、动态库) 3. **安全检查** - 使用 `checksec` 工具检查 ELF 文件 - 检查项包括: - PIE (Position Independent Executable) - NX (No-Execute) - Stack Canary (Stack Protection) - Fortify Source - RELRO (Relocation Read-Only) - BIND_NOW - 涌出保护 4. **结果输出** - 支持 CSV 格式导出 - 支持生成统计报告 ### 2.2 大规模扫描需求 #### 2.2.1 性能要求 - 支持扫描数千个 RPM 包 - 并行处理提升效率 - 预计单次扫描时间:合理范围(待定) #### 2.2.2 预筛选优化 - 排除 `noarch` 架构的包(主要是 Python/Perl/文档) - 使用 `dnf repoquery` 提前识别包含二进制文件的包 - 只处理 x86_64 架构的包 #### 2.2.3 并行处理 - 使用 GNU Parallel 进行并发 - 可配置并发数(如 `-j 8`) ### 2.3 异常处理需求 1. **软链接处理** - 避免重复扫描同一个文件(如 `/bin` → `/usr/bin`) - 使用 `find -type f` 只处理真实文件 - 基于 inode 去重 2. **动态库处理** - 正确识别 `.so` 文件 - 处理插件式动态库(`/usr/lib64` 下的插件) 3. **内核模块排除** - 排除 `.ko` 内核模块文件 - 理由:checksec 的某些检查项(如 PIE)对内核模块不适用 4. **错误处理** - 网络下载失败重试 - 损坏的 RPM 包处理 - 解压失败处理 - checksec 超时处理 ## 3. 数据输出需求 ### 3.1 统计指标 - PIE 覆盖率(开启 PIE 的文件占比) - NX 覆盖率 - Stack Canary 覆盖率 - 危急项统计(如 NX 为 Disabled 的文件) ### 3.2 数据存储 - 初期:CSV 格式 - 进阶:数据库支持(SQLite/MySQL) - 可视化:Dashboard 展示 ## 4. 技术约束 1. **操作系统**:Linux(支持 DNF/YUM 包管理器) 2. **依赖工具**: - `dnf` 或 `yum`(RPM 包查询) - `checksec`(安全特性检查) - `GNU Parallel`(并行处理) - `rpm2cpio`(RPM 包解压) - `file`(文件类型识别) ## 5. 扩展需求 ### 5.1 增量扫描 - 记录已扫描的包 - 支持只扫描新增或更新的包 ### 5.2 断点续传 - 扫描中断后可继续 - 避免重复扫描已完成的部分 ### 5.3 分布式扫描(未来) - 支持多机并行扫描 - 结果汇总 ## 6. 交付物 1. 扫描脚本(Shell/Python) 2. 配置文件 3. 使用文档 4. 示例报告 ## 7. 非功能性需求 1. **可维护性**:代码清晰,注释完整 2. **可扩展性**:易于添加新的检查项 3. **可靠性**:异常处理完善 4. **性能**:支持大规模扫描