diff --git a/.jules/sentinel.md b/.jules/sentinel.md new file mode 100644 index 0000000..607aa4d --- /dev/null +++ b/.jules/sentinel.md @@ -0,0 +1,4 @@ +## 2024-05-24 - Fix command injection risks in shell wrappers +**Vulnerability:** Shell wrappers like `/bin/bash -c` can be vulnerable to command injection risks. In `CacheoutViewModel.swift`, the `dockerPrune` method was vulnerable to this risk. +**Learning:** Using shell wrappers like `/bin/bash -c` is a common pattern for executing shell commands, but it relies on string parsing and shell interpretation, which can lead to command injection vulnerabilities. Direct binary execution via `Process` with explicitly defined arguments is a more secure alternative. Standard output and error redirection can be replicated securely by assigning the same `Pipe()` instance to both `process.standardOutput` and `process.standardError`. +**Prevention:** Avoid executing external commands via shell wrappers like `/bin/bash -c`. Prefer direct invocation of executables using `Process` with explicitly defined arguments. Replicate shell redirections securely by assigning the same `Pipe()` instance to both `process.standardOutput` and `process.standardError`. diff --git a/Sources/Cacheout/ViewModels/CacheoutViewModel.swift b/Sources/Cacheout/ViewModels/CacheoutViewModel.swift index 13a9811..e50a217 100644 --- a/Sources/Cacheout/ViewModels/CacheoutViewModel.swift +++ b/Sources/Cacheout/ViewModels/CacheoutViewModel.swift @@ -231,8 +231,8 @@ class CacheoutViewModel: ObservableObject { let process = Process() let pipe = Pipe() - process.executableURL = URL(fileURLWithPath: "/bin/bash") - process.arguments = ["-c", "docker system prune -f 2>&1"] + process.executableURL = URL(fileURLWithPath: "/usr/bin/env") + process.arguments = ["docker", "system", "prune", "-f"] process.standardOutput = pipe process.standardError = pipe process.environment = [