diff --git a/.jules/sentinel.md b/.jules/sentinel.md new file mode 100644 index 0000000..bc311e6 --- /dev/null +++ b/.jules/sentinel.md @@ -0,0 +1,4 @@ +## 2024-05-24 - Prevent Command Injection in dockerPrune +**Vulnerability:** Execution of a hardcoded shell command `docker system prune -f 2>&1` via `/bin/bash -c` wrapper. +**Learning:** Using `/bin/bash -c` is unnecessary when a command and its arguments are known. Shell features like `2>&1` can be implemented securely in Swift by assigning the same `Pipe()` instance to both `process.standardOutput` and `process.standardError`. Furthermore, replacing absolute paths like `/bin/bash` with `/usr/bin/env bash` does not prevent command injection and relies on `PATH`, which is less secure than an absolute path to a trusted binary. +**Prevention:** Use direct execution via `/usr/bin/env` with explicitly defined arguments (e.g., `["docker", "system", "prune", "-f"]`) to avoid shell wrappers entirely. When shell-specific features like pipelines or redirections are truly necessary, continue using `/bin/bash` with the absolute path rather than `/usr/bin/env bash`. 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 = [