EnerOS v0.42.0 版本说明
- 发布日期:2026-06-25
- 版本代号:Audit
- 支持状态:稳定(Stable)
- Crate 总数:50
- 测试用例数:6350+
- 贡献者:26 人
版本概述
EnerOS v0.42.0 是「成熟优化」阶段的第二个版本,聚焦安全审计能力的全面建立。在 v0.41.0 解决了「性能可度量」问题后,本版本着手解决「安全可审计」问题,构建了从漏洞扫描、依赖审计、安全报告到修复建议的完整安全闭环。
电力系统作为国家关键信息基础设施,对安全性的要求远超普通软件。NERC CIP、IEC 62443、等保 2.0 等合规框架均要求运行系统具备持续的漏洞监测能力与可追溯的安全审计记录。v0.42.0 将这些要求内建为 EnerOS 的原生能力,而非依赖外挂安全工具。
本版本新增 eneros-audit crate,提供 CVE 漏洞扫描、依赖审计、配置基线检查、密钥泄漏检测四大功能模块,并能在 CI 流水线中自动阻断存在高危漏洞的代码合并。安全报告支持 SBOM(软件物料清单)导出,满足供应链安全合规要求。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| Crate 数量 | 50 | 新增 eneros-audit 等 2 个 crate |
| 测试用例 | 6350+ | 含 280+ 安全测试 |
| CVE 规则库 | 12000+ | 同步 NVD 数据库 |
| 依赖审计覆盖 | 100% | 全部直接与间接依赖 |
| 扫描延迟(全量) | < 8s | 单节点全量审计 |
| SBOM 格式 | 3 种 | SPDX / CycloneDX / SWID |
新特性
1. CVE 漏洞扫描
新增 eneros-audit crate,内置 CVE 漏洞扫描引擎,定期同步 NVD(National Vulnerability Database)与 RustSec Advisory Database。扫描器以零拷贝方式解析依赖树,对每个 crate 版本进行 CVE 匹配,并给出严重度评级与修复建议。
扫描引擎架构
eneros-audit/
├── src/
│ ├── scanner/ # 扫描引擎
│ │ ├── cve.rs # CVE 匹配器
│ │ ├── dependency.rs # 依赖树解析
│ │ └── config.rs # 配置基线检查
│ ├── advisory/ # 漏洞公告库
│ │ ├── nvd.rs # NVD 同步
│ │ └── rustsec.rs # RustSec 同步
│ ├── report/ # 报告生成
│ │ ├── sbom.rs # SBOM 导出
│ │ └── remediation.rs# 修复建议
│ └── policy/ # 安全策略
│ ├── severity.rs # 严重度评级
│ └── gate.rs # CI 门禁
└── rules/ # 自定义规则
使用示例
use eneros_audit::{AuditScanner, AuditConfig, Severity};
use std::time::Duration;
let scanner = AuditScanner::new(AuditConfig {
cve_database: "audit-db/nvd".into(),
rustsec_database: "audit-db/rustsec".into(),
auto_update: true,
update_interval: Duration::from_secs(6 * 3600),
ignore_file: Some(".audit-ignore".into()),
});
// 扫描当前项目
let report = scanner.scan_project("./Cargo.toml").await?;
// 输出漏洞摘要
for vuln in &report.vulnerabilities {
println!(
"[{}] {} in {} {} - {}",
vuln.severity, vuln.cve_id, vuln.package, vuln.version, vuln.title
);
println!(" 修复建议: 升级至 {}", vuln.fixed_version);
}
println!("扫描完成: {} 个漏洞, {} 个警告",
report.vulnerabilities.len(),
report.warnings.len());
漏洞严重度评级
| 严重度 | CVSS 评分 | CI 行为 | 示例 |
|---|---|---|---|
| 严重(Critical) | 9.0 - 10.0 | 立即阻断 | RCE、认证绕过 |
| 高危(High) | 7.0 - 8.9 | 阻断合并 | 权限提升、SQL 注入 |
| 中危(Medium) | 4.0 - 6.9 | 警告 | 信息泄漏、DoS |
| 低危(Low) | 0.1 - 3.9 | 提示 | 轻微信息泄漏 |
| 无影响 | 0.0 | 忽略 | 仅影响未启用功能 |
2. 依赖审计
依赖审计模块对整个依赖树(含间接依赖)进行深度分析,识别过期版本、未维护 crate、许可证冲突与重复依赖。审计结果以树形结构展示,便于定位问题依赖的引入路径。
use eneros_audit::dependency::{DependencyAuditor, AuditLevel};
let auditor = DependencyAuditor::new()
.level(AuditLevel::Full) // 审计全部间接依赖
.check_license(true) // 许可证合规检查
.check_maintenance(true) // 维护状态检查
.check_duplicates(true); // 重复依赖检测
let tree = auditor.analyze("./Cargo.lock").await?;
// 输出依赖树中的问题项
for issue in &tree.issues {
println!(
"[{}] {} {} - 引入路径: {}",
issue.kind, issue.package, issue.version, issue.path
);
}
依赖审计维度
| 维度 | 检查内容 | 处置 |
|---|---|---|
| 版本过期 | 当前版本落后于最新 | 建议升级 |
| 未维护 | 超过 12 个月无提交 | 警告 |
| 许可证冲突 | GPL 等传染性许可证 | 阻断 |
| 重复依赖 | 同一 crate 多版本 | 建议对齐 |
| yanked 版本 | 已撤回的版本 | 阻断 |
| 供应链风险 | 来源非 crates.io | 警告 |
许可证合规矩阵
| 许可证 | 商用 | 修改分发 | EnerOS 兼容 |
|---|---|---|---|
| MIT | 允许 | 允许 | 兼容 |
| Apache-2.0 | 允许 | 允许 | 兼容 |
| BSD-3-Clause | 允许 | 允许 | 兼容 |
| MPL-2.0 | 允许 | 需开源修改文件 | 兼容(受控) |
| LGPL-2.1 | 允许 | 需开源修改 | 谨慎使用 |
| GPL-3.0 | 受限 | 需开源全部 | 不兼容 |
| AGPL-3.0 | 受限 | 需开源全部(含网络) | 不兼容 |
3. 安全报告生成
安全报告模块支持 SBOM(软件物料清单)导出,满足供应链安全合规要求。支持 SPDX、CycloneDX、SWID 三种国际标准格式,并支持 PDF、HTML、JSON 三种输出形式。
use eneros_audit::report::{SbomExporter, SbomFormat, SecurityReport};
let report = scanner.scan_project("./Cargo.toml").await?;
// 导出 SBOM(CycloneDX 格式)
let sbom = SbomExporter::new()
.format(SbomFormat::CycloneDX)
.version("1.5")
.include_hashes(true)
.include_licenses(true);
sbom.export(&report, "reports/sbom.cdx.json")?;
// 导出安全报告(PDF)
let security_report = SecurityReport::from(&report)
.include_vulnerabilities(true)
.include_remediation(true)
.include_compliance(true);
security_report.save_pdf("reports/security-audit.pdf")?;
报告类型一览
| 报告类型 | 格式 | 用途 | 合规对应 |
|---|---|---|---|
| SBOM (SPDX) | JSON / RDF | 供应链透明度 | EO 14028 |
| SBOM (CycloneDX) | JSON / XML | 漏洞关联 | NIST SP 800-218 |
| 漏洞报告 | PDF / HTML | 审计归档 | NERC CIP-007-6 R2 |
| 合规报告 | PDF / CSV | 合规证明 | IEC 62443 / 等保 |
| 修复建议 | Markdown | 工单指派 | 内部流程 |
4. 配置基线检查
配置基线检查模块对照安全基线策略,扫描运行时配置中的不安全项,如弱密码、明文密钥、过宽权限、未启用加密等。
use eneros_audit::config::{ConfigScanner, Baseline, Finding};
let baseline = Baseline::load("policy/security-baseline.yaml")?;
let scanner = ConfigScanner::new(baseline);
let findings = scanner.scan_config("./eneros.toml").await?;
for finding in &findings {
println!(
"[{}] {}: 当前={}, 建议={}",
finding.severity, finding.rule, finding.current, finding.expected
);
}
基线检查规则示例
| 规则 | 检查内容 | 严重度 | 修复建议 |
|---|---|---|---|
| mtls-required | 内部服务是否启用 mTLS | 高 | 启用 eneros-trust mTLS |
| audit-log-worm | 审计日志是否 WORM 存储 | 高 | 启用 append-only 模式 |
| password-min-length | 密码最小长度 >= 12 | 中 | 调整认证策略 |
| tls-min-version | TLS 最低版本 >= 1.2 | 高 | 升级 rustls 配置 |
| secret-not-plaintext | 密钥不以明文存储 | 严重 | 迁移至 HSM/Vault |
| rbac-enabled | 是否启用 RBAC | 高 | 启用 eneros-auth RBAC |
5. 修复建议引擎
修复建议引擎基于漏洞数据库与依赖关系图,自动生成最优升级路径。引擎会考虑版本兼容性约束,避免因升级引入新的破坏性变更。
use eneros_audit::remediation::{RemediationEngine, UpgradePlan};
let engine = RemediationEngine::new(&report);
let plan: UpgradePlan = engine.suggest().await?;
println!("建议升级 {} 个依赖:", plan.upgrades.len());
for step in &plan.upgrades {
println!(
" {} {} -> {} (修复 {} 个漏洞)",
step.package, step.from, step.to, step.fixes
);
}
// 验证升级计划不会引入新问题
let validation = engine.validate(&plan).await?;
if validation.has_conflicts() {
for conflict in &validation.conflicts {
eprintln!("冲突: {}", conflict);
}
}
改进优化
审计链防篡改增强
eneros-trust 的审计链引入 Merkle 树结构,每 1000 条日志生成一个 Merkle 根并写入 HSM 签名。任何历史日志的篡改都会导致 Merkle 校验失败。
密钥轮换自动化
证书与密钥的轮换周期从手动配置改为基于风险评分的动态轮换。高危密钥(如根 CA)默认 90 天轮换,低风险密钥(如内部服务证书)默认 24 小时轮换。
安全沙箱强化
Agent 工具调用的 WASM 沙箱新增 capabilities 模型,每个工具调用必须显式声明所需能力(网络访问、文件读写、系统调用),未声明的能力在运行时被拒绝。
Bug 修复
- BG-301:CVE 数据库同步在代理网络环境下失败,已增加 SOCKS5 代理支持
- BG-305:依赖审计在循环依赖场景下死循环,已引入访问标记机制
- BG-309:SBOM 导出在依赖数 > 2000 时内存溢出,已改为流式导出
- BG-313:配置基线检查在 TOML 注释行误报,已修复解析器
- BG-317:修复建议引擎给出的升级路径与 MSRV 冲突,已增加 Rust 版本约束
破坏性变更
BC-211:eneros-trust 审计日志格式变更
审计日志从行式 JSON 改为 Merkle 链式结构,旧日志需通过迁移工具转换。
eneros-cli audit migrate --from v0.41 --to v0.42
BC-212:AuditScanner::scan_project 改为异步
扫描方法从同步改为异步,以支持远程数据库查询。
// v0.41.0(旧)
let report = scanner.scan_project("./Cargo.toml")?;
// v0.42.0(新)
let report = scanner.scan_project("./Cargo.toml").await?;
依赖升级
| 依赖 | 旧版本 | 新版本 | 说明 |
|---|---|---|---|
| rustsec | 0.27 | 0.28 | 漏洞数据库更新 |
| cyclonedx-bom | 0.4 | 0.5 | CycloneDX 1.5 支持 |
| spdx | 0.10 | 0.10.4 | SPDX 解析修复 |
| ring | 0.17.7 | 0.17.8 | 安全补丁 |
| rustls | 0.21.10 | 0.21.11 | 安全补丁 |
升级指南
从 v0.41.0 升级
cargo update
cargo test --workspace
在 Cargo.toml 中添加审计依赖:
[dependencies]
eneros-audit = "0.42"
运行首次安全审计:
eneros-cli audit scan --full
eneros-cli audit sbom export --format cyclonedx
迁移审计日志格式:
eneros-cli audit migrate --from v0.41 --to v0.42 --dry-run
eneros-cli audit migrate --from v0.41 --to v0.42 --apply