fix: address external_directory gaps and improve symlink checks #7515
+710
−38
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Addresses gaps in the
external_directorypermission checks where symlinks inside a project could escape to read/write files outside the project boundary.Filesystem.containsResolved()that resolves symlinks before checking path containment, preventing symlink escape attacks where a link likeproject/escape -> /etc/passwdwould bypass lexical checksexternal_directorypermission check toWriteTool(was a TODO) andReadToolFile.read()andFile.list()to use dual-layer protection: fast lexical check first, then resolved check for existing filescontainsResolved()- acceptable for the threat model of protecting against malicious symlinks in user-controlled directoriesTest coverage:
containsResolved()covering symlink chains, broken symlinks, relative symlink escapes, and positive cases for internal symlinksFile.read()blocks symlink escapes while allowing valid internal symlinksValidated in practice — I had OpenCode build itself and then test via the actual filesystem as well:
resulted in: