ResearchForumOnline/ZSEC-Shield

GitHub: ResearchForumOnline/ZSEC-Shield

一款基于确定性规则和签名验证的本地按需文件扫描器,通过精确的字节与哈希匹配实现离线检测与可恢复隔离。

Stars: 0 | Forks: 0

# ZSEC Shield ZSEC Shield 是一款适用于 Python 3.11+ 的确定性、非 AI、按需文件扫描器。 它使用 SHA-256 对常规文件进行哈希处理,应用精确的字节和摘要规则,验证 仅包含数据的 Ed25519 签名规则源,生成结构化的 JSON,并可以 将明确选定的匹配项移动到可恢复的隔离区。 这是一个 MVP,而不是一个完整的防病毒产品。它没有内核驱动程序、 实时文件系统拦截、行为监控、内存扫描器、云 信誉服务、漏洞拦截器,也无法保证主机是干净的。 ## 安全边界 - 扫描是本地且按需进行的。不使用任何 AI 模型、API 密钥、遥测端点或 云上传。 - 不跟随 Symlinks 和 Windows reparse points。跳过特殊文件。 - 默认情况下,递归扫描会保持在初始文件系统内。 - 默认情况下跳过大于 64 MiB 的文件;该限制是明确的且 会被报告。 - 除非存在 `--quarantine`,否则禁用隔离。 - 恢复操作永远不会覆盖现有目标,并且已验证的恢复 对象在恢复后会被保留。 - 在使用规则源中的规则之前,会检查源签名、schema、时间戳、密钥状态、序列号和 payload 摘要。 - 源对象仅接受 SHA-256 和精确的字面字节规则。Command、script、 package、firewall、URL-action 和 configuration 字段将被拒绝。 - 如果源、trust store 或 rollback record 无效,则所有源规则都将被忽略 ,并且命令会报告结果未完成。内置规则仍然可用。 请参阅 [威胁模型](docs/THREAT_MODEL.md) 和 [Feed 格式](docs/FEED_FORMAT.md)。 ## 平台范围 扫描核心使用 Python 和标准文件系统调用,适用于: - Windows 10 和 11; - 当前受支持的 macOS 版本; - 主流 Linux 发行版。 清单适配器是只读的。它们识别基本的 OS 和 runtime 上下文,但不 断言补丁、Microsoft Defender、XProtect、包数据库或安全 控件是健康的。 ## 安装以进行评估 使用 Python 3.11 或更高版本创建一个隔离环境: ``` py -3.11 -m venv .venv .\.venv\Scripts\python.exe -m pip install --upgrade pip .\.venv\Scripts\python.exe -m pip install -e . .\.venv\Scripts\zsec-shield.exe --version ``` 在 macOS 或 Linux 上: ``` python3.11 -m venv .venv .venv/bin/python -m pip install --upgrade pip .venv/bin/python -m pip install -e . .venv/bin/zsec-shield --version ``` 运行时依赖项是 `cryptography`,仅用于 Ed25519 验证。 ## 快速开始 扫描单个文件或目录: ``` zsec-shield check ./downloads ``` 扫描多个根目录并保存机器可读的报告: ``` zsec-shield check ./downloads ./incoming --report ./reports/check.json --json ``` 检查状态和只读清单: ``` zsec-shield status --json zsec-shield inventory --json ``` `scan` 命令是 `check` 的别名。 ### EICAR 测试检测 内置规则集可以检测规范 EICAR 防病毒测试文件的精确字节和 SHA-256。EICAR 是一种无害的测试模式,而不是恶意软件。现有的 防病毒软件可能会在 ZSEC Shield 打开它之前阻止或删除它,因此 请仅在隔离的测试目录中使用官方的 EICAR 测试说明。测试 套件在内存中验证签名,并且不会将规范的 EICAR 内容写入磁盘。 ## 隔离与恢复 正常的检查不会更改扫描的内容: ``` zsec-shield check ./incoming ``` 隔离需要明确的标志: ``` zsec-shield check ./incoming --quarantine --report ./reports/quarantine.json ``` 对于每个匹配的文件,ZSEC Shield 首先创建一个私有的恢复副本并对其进行哈希处理。 只有当源仍然与扫描结果匹配时,它才会删除原始文件。如果源 删除失败,元数据会显示 `copy_only`,并且命令会返回一个未完成的退出 代码。这不会被报告为成功的隔离。 列出并恢复条目: ``` zsec-shield quarantine list --json zsec-shield quarantine restore 00000000-0000-0000-0000-000000000000 zsec-shield quarantine restore ENTRY-ID --destination ./recovered/sample.bin ``` 恢复需要一个现有的、非 reparse 的父目录,并拒绝覆盖。 在此 MVP 中故意没有提供 purge 命令。 ## 签名 Feed 更新 打包的 keyring 是故意留空的:这个 MVP 不会捏造一个生产环境的 trust anchor。在 keyring 中绑定一个由操作员控制的 Ed25519 公钥并显式传递, 设置 `ZSEC_SHIELD_KEYRING`,或者将其放置在 `STATE_DIR/trusted_keys.json`。 ``` zsec-shield --keyring ./trusted_keys.json update --file ./feed.json --json zsec-shield --keyring ./trusted_keys.json update --url https://security.example/feed.json --json zsec-shield --keyring ./trusted_keys.json check ./incoming ``` 远程 URL 必须使用无凭据的 HTTPS,并且最多通过三次 重定向后仍保持 HTTPS。Feed 大小被限制在 2 MiB 以内。在安装前会对更新进行验证; 旧序列以及使用不同签名内容的序列重用将被拒绝。 该 Feed 仅提供检测数据。它无法请求执行、删除、 隔离、安装包、网络访问或系统更改。 ## 状态目录 使用全局 `--state-dir` 或 `ZSEC_SHIELD_HOME` 覆盖状态根目录。 默认值如下: | 平台 | 默认值 | | --- | --- | | Windows | `%LOCALAPPDATA%\ZSEC\Shield` | | macOS | `~/Library/Application Support/ZSEC Shield` | | Linux | `$XDG_STATE_HOME/zsec-shield` 或 `~/.local/state/zsec-shield` | 当状态根目录位于请求的扫描根目录之下时,它会自动被排除。 ## 退出代码 | 代码 | 含义 | | --- | --- | | `0` | 扫描完成且没有配置的规则匹配,或者诊断/更新命令成功。 | | `1` | 匹配到一个或多个已配置的规则,且扫描以其他方式完成。 | | `2` | 操作未完成/失败:文件无法读取或正在更改、无效的 feed、不安全的恢复,或其他操作错误。 | | `130` | 被操作员中断。 | `0` 被刻意表述为“没有配置的规则匹配”,而不是“干净”。 ## 开发 ``` python -m pip install -e ".[dev]" python -m pytest ruff check src tests mypy src/zsec_shield python -m build ``` GitHub Actions 会在 Windows、macOS 和 Linux 上测试 Python 3.11 和 3.13,并带有一个 单独的 lint/build 作业。不包含发布工作流。 ## 许可证 Apache License 2.0。请参阅 [LICENSE](LICENSE)。
标签:Python, SHA-256, 云计算, 恶意软件扫描, 文件扫描, 无后门, 本地扫描, 规则引擎, 逆向工具