写 ref="/tag/2030/" style="color:#8B0506;font-weight:bold;">Rust 项目时,大家都会用到 Cargo 管理依赖。但你有没有想过,某个被引入的 crate(库)其实藏着安全漏洞?就像你网购了一台二手路由器,表面看着没问题,结果出厂默认开了远程管理,内网就可能被悄悄渗透。
为什么需要关注依赖安全?
一个中等规模的 Rust 项目,依赖树往往能延伸出上百个间接依赖。比如你引入了一个 HTTP 客户端库,它又依赖 JSON 解析、TLS 实现、URL 处理等多个子库。只要其中一个存在内存安全问题或已知 CVE 漏洞,整个应用都可能中招。
去年就有案例:某个广泛使用的日志格式化 crate 被发现存在格式化字符串漏洞,影响了大量服务端程序。虽然修复很快,但如果没人主动检查,很多项目可能一直带着隐患跑。
cargo-audit:你的本地安全哨兵
好在社区提供了 cargo-audit 这样的工具。它能扫描 Cargo.lock 文件,比对 crates.io 上公开的安全通告数据库(RUSTSEC),找出有问题的版本。
安装很简单:
cargo install cargo-audit
进到项目目录运行:
cargo audit
如果发现风险,会直接列出漏洞 ID、影响范围和建议升级版本。比如:
error: Vulnerable crate found!
Crate: serde_json
Version: 1.0.30
Title: Incomplete input validation in serde_json
Solution: Upgrade to >= 1.0.87
自动化集成:别等上线才翻车
光手动查一次不够。建议把 cargo audit 加到 CI 流程里。GitHub Actions 配置示例:
jobs:
security-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- run: cargo install cargo-audit
- run: cargo audit
这样每次提交代码,CI 都会自动检查。发现问题立刻提醒,避免带病合并。
更进一步:锁定和清理依赖
有时候你会发现某个深层依赖始终清不掉。这时候可以用 cargo tree 查清楚是谁引入的:
cargo tree -i serde_json@1.0.30
输出会展示完整的引用链。如果上游库没及时更新,可以考虑提 issue,或者临时用 [patch] 替换为修复版:
[patch.crates-io]
serde_json = { git = "https://github.com/serde-rs/json", branch = "fix-issue-123" }
等官方发布新版后再切回去。
其他实用工具补充
除了 cargo-audit,还可以试试 cargo-deny。它功能更强,支持配置策略,能检查许可证合规、重复依赖、废弃 crate 等问题。
安装后创建 deny.toml 配置文件:
[advisories]
ignore = [
"RUSTSEC-0000-0000", # 已知无害的警告
]
db-path = "/path/to/advisory-db"
然后运行:
cargo deny check advisories
适合对合规要求更高的团队使用。
工具再强也得人用。建议每周花十分钟跑一遍审计命令,就像定期查看路由器后台一样,早发现早处理,别让小隐患变成大问题。