Review Finding
PR: #75 (feat: MCP server source control + 5 new session tools)
File: src/atlas_session/contract/verifier.py
Line: 100
Severity: must-fix
Description
full_path = Path(project_dir) / path where path is taken directly from the user-supplied criterion dict. A path of ../../etc/shadow would resolve outside the project. Add a check that full_path.resolve() is a descendant of Path(project_dir).resolve() before calling .exists().
Auto-created by Claude Code Review.
Review Finding
PR: #75 (feat: MCP server source control + 5 new session tools)
File:
src/atlas_session/contract/verifier.pyLine: 100
Severity: must-fix
Description
full_path = Path(project_dir) / pathwherepathis taken directly from the user-supplied criterion dict. A path of../../etc/shadowwould resolve outside the project. Add a check thatfull_path.resolve()is a descendant ofPath(project_dir).resolve()before calling.exists().Auto-created by Claude Code Review.