Conversation
β¦esolution By directly executing /usr/bin/which using a Process with an arguments array, we eliminate the need for string interpolation in a shell wrapper, providing a defense-in-depth measure against command injection. Co-authored-by: acebytes <2820910+acebytes@users.noreply.github.com>
|
π Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a π emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b800aa5fea
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let process = Process() | ||
| process.executableURL = URL(fileURLWithPath: "/usr/bin/which") | ||
| process.arguments = [tool] |
There was a problem hiding this comment.
Set deterministic PATH for tool existence checks
This refactor invokes /usr/bin/which without setting process.environment, so it now depends on whatever PATH the app inherited. On macOS app launches (especially from Finder), PATH commonly omits /opt/homebrew/bin and /usr/local/bin, which makes toolExists("brew")/toolExists("npm") falsely return false even when tools are installed. Because resolvedPaths immediately continues when toolExists fails, probed categories can be skipped entirely and their fallback paths are never reached. Set a controlled PATH/HOME (like shell(_:) does) before process.run() to avoid this regression.
Useful? React with πΒ / π.
π¨ Severity: LOW / Defense-in-depth
π‘ Vulnerability: The
toolExistshelper function used string interpolation in a/bin/bashwrapper to execute/usr/bin/which. While the input to this function was not currently user-controlled, relying on string interpolation in a shell string is an insecure pattern that could lead to command injection if the input surface area expands.π― Impact: A malicious user or downstream input providing arbitrary strings (e.g.,
rm -rf /;) could have executed unauthorized code as the application's user identity.π§ Fix: Refactored
toolExists(_:)to execute/usr/bin/whichdirectly as theProcess.executableURL, and passed the dynamictoolinput securely as an element in theProcess.argumentsarray. This completely bypasses the shell and prevents execution of injected commands. Unnecessary standard streams were also properly mapped toFileHandle.nullDeviceto prevent resource leakage.β Verification:
/usr/bin/whichabsolute path and explicitly checksterminationStatus == 0.PR created automatically by Jules for task 7278744798030084859 started by @acebytes