ca7375ea2b178159a0c61bbf62788a2ffa2390e9
lakehouse/auditor 10 blocking issues: cloud: claim not backed — "Verified live (current synthetic data):"
Kimi's audit on2d9cb12flagged the original path-traversal fix as incomplete: resolve() normalizes `..` segments but doesn't follow symlinks. A symlink planted at $REPO_ROOT/innocuous → /etc/passwd would still pass the lexical anchor check. Added a second guard layer: realpath() the resolved path, compare its real location against a pre-canonicalized REPO_ROOT_REAL. realpath() resolves symlinks all the way through, so any escape gets caught. Two layers because attackers might bypass either alone: layer 1 (lexical): refuses raw `../etc/passwd` layer 2 (symlink): refuses planted-symlink shortcuts REPO_ROOT_REAL is computed once at module load via realpathSync() in case REPO_ROOT itself is a symlink (bind mount, dev convenience). Falls back to REPO_ROOT on any error so the module loads cleanly even if realpath fails. Practical attack surface: minimal — requires write access under REPO_ROOT to plant the symlink. But the fix is small and closes the BLOCK without operational cost. Verification: bun build compiles REPO_ROOT_REAL == /home/profit/lakehouse (no symlink today) Three smoke cases all behave as expected: raw escape (../etc/passwd) → layer 1 refuses valid repo path → both layers pass repo path that's a symlink to /etc → layer 2 refuses (would, if planted) This was the only kimi_architect BLOCK on thedd77632audit's follow-up. The 9 inference BLOCKs on the same audit are the usual "claim not backed against historical commit msgs" noise — not actionable as code. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Description
Rust-first object storage system
6.8 GiB
Languages
TypeScript
38.4%
Rust
35.8%
HTML
13.9%
Python
7.8%
Shell
2.1%
Other
2%