Security: constrain local volume removal - #657
Conversation
|
PR Title: Security: constrain local volume removal Commit: 本次变更为 LocalDriver.Remove 增加路径越界防护:将 record.Path 与受管根 DataRoot/volumes/local 都经 filepath.Abs 规范化后,用 EvalSymlinks 解析真实路径,再通过新增的 pathWithinRoot 校验待删路径必须位于受管根内,防止删除受管目录之外的任意路径;同时把“是否删除 volume 数据父目录”的判断从字符串比较改为符号链接解析后的等值比较。测试新增了外部路径拒绝用例,并调整两个既有用例使 record.Path 落在受管根内。 安全方向正确,但实现引入两个问题:(1) EvalSymlinks 要求路径必须存在,破坏了原 os.RemoveAll 对不存在路径幂等成功的语义,当 volume 数据目录已被删除或 DataRoot/volumes/local 尚未创建时,driver.Remove 返回错误,导致 Manager.Remove 跳过 store.DeleteVolume,留下无法清理的僵尸记录;(2) 符号链接解析后的等值比较会把删除范围从 volume 目录提升到整个受管根 volumes/local,存在删除范围放大为清空全部 volume 的风险。 |
|
已按最新评论修订卷删除逻辑:
本地新增及相关测试通过: |
|
PR Title: Security: constrain local volume removal Commit: 本次改动针对 pkg/volumes/driver.go 中 LocalDriver.Remove 的两个已确认历史问题做安全加固,并新增两个回归测试。 改动要点:
评估结论:
总体判断:改动目标明确、实现与威胁模型匹配,未发现本改动引入的新增可操作问题,因此不提交新 finding。 |
问题
Local volume removal accepted the persisted
record.Pathand passed it toos.RemoveAll. A path outside the daemon-managed volume tree could therefore be deleted when a volume was removed. Symlink and path normalization checks were also incomplete.影响
如果恶意或被篡改的 volume metadata 包含宿主机敏感目录,调用 volume remove/prune 可能删除项目根目录之外的数据。涉及 CWE-22、CWE-61。
修复内容
DATA_ROOT/volumes/local内,拒绝 root 本身和所有越界路径。验证
go test ./pkg/volumes -run 'TestLocalDriverRemoveRejectsPathOutsideManagedRoot|TestManagerRemoveForce' -count=1git diff --check说明:完整
pkg/volumes测试当前在 macOS 上仍有基线中的/var与/private/var路径断言失败,本 PR 未改变该路径规范化行为。