OS Command Injection detection in shell execution, subprocess calls, and process spawning
Scanned 9/12/2026
Install to Claude Code
npx -y skills add aibot88/sec_skill_store --skill sc-cmdi --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Sc Cmdi?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aibot88-sc-cmdi)More formats (shields.io, HTML) on the badges page.
---
name: sc-cmdi
description: OS Command Injection detection in shell execution, subprocess calls, and process spawning
license: MIT
metadata:
category: security
version: "1.0.0"
---
# SC: Command Injection
## Purpose
Detects OS command injection vulnerabilities where user-controlled input is passed to system shell commands, subprocess execution, or process spawning functions without proper sanitization. Distinguishes between full command injection (attacker controls the command) and argument injection (attacker controls arguments to a fixed command).
## Activation
Called by sc-orchestrator during Phase 2. Runs against all detected languages.
## Phase 1: Discovery
### File Patterns to Search
```
**/*.py, **/*.js, **/*.ts, **/*.go, **/*.php, **/*.java, **/*.kt,
**/*.cs, **/*.rb, **/scripts/*, **/*exec*, **/*shell*, **/*command*,
**/*process*, **/*system*, **/*spawn*
```
### Keyword Patterns to Search
```
# Python
"os.system(", "os.popen(", "subprocess.call(", "subprocess.run(",
"subprocess.Popen(", "subprocess.check_output(", "commands.getoutput(",
"shell=True"
# JavaScript/Node.js
"child_process.exec(", "child_process.execSync(",
"child_process.spawn(", "execFile(", "require('child_process')",
"shelljs", "execa"
# Go
"exec.Command(", "exec.CommandContext(", "os/exec"
# PHP
"exec(", "system(", "passthru(", "shell_exec(", "popen(",
"proc_open(", "pcntl_exec(", "backtick"
# Java
"Runtime.getRuntime().exec(", "ProcessBuilder(",
"new ProcessBuilder("
# C#
"Process.Start(", "ProcessStartInfo(",
"System.Diagnostics.Process"
# Ruby
"system(", "exec(", "IO.popen(", "`"
```
### Data Flow Tracing
**Sources:** HTTP request parameters, file names from uploads, environment variables from user-controlled sources, database values originally from user input.
**Sinks:** All command execution functions listed above.
## Phase 2: Verification
### Command Injection vs Argument Injection
**Command injection** — attacker controls the full command or can inject shell operators:
```python
# VULNERABLE: Full command injection
os.system(f"echo {user_input}") # user_input = "; rm -rf /"
```
**Argument injection** — attacker controls arguments to a known-safe binary:
```python
# VULNERABLE: Argument injection
subprocess.run(["git", "clone", user_url]) # user_url = "--upload-pack=evil"
```
### Shell Metacharacters
Watch for user input reaching shell with these metacharacters unescaped:
`;`, `|`, `&`, `&&`, `||`, `$()`, `` ` ` ``, `>`, `<`, `\n`
### Language-Specific Examples
```python
# VULNERABLE: shell=True with user input
subprocess.run(f"convert {filename} output.png", shell=True)
# SAFE: Array form without shell
subprocess.run(["convert", filename, "output.png"])
```
```javascript
// VULNERABLE: exec uses shell
const { exec } = require('child_process');
exec(`ls ${userDir}`, callback);
// SAFE: execFile does not use shell
const { execFile } = require('child_process');
execFile('ls', [userDir], callback);
```
```go
// VULNERABLE: User input in shell command via sh -c
cmd := exec.Command("sh", "-c", "echo " + userInput)
// SAFE: Direct execution without shell
cmd := exec.Command("echo", userInput)
```
```java
// VULNERABLE: String command to Runtime.exec
Runtime.getRuntime().exec("cmd /c dir " + userInput);
// SAFE: Array form
new ProcessBuilder("cmd", "/c", "dir", userInput).start();
// Note: Still risky if userInput contains shell metacharacters and cmd.exe interprets them
```
```php
// VULNERABLE: User input in system call
system("ping -c 4 " . $_GET['host']);
// SAFE: escapeshellarg
system("ping -c 4 " . escapeshellarg($_GET['host']));
```
## Severity Classification
- **Critical:** Direct command injection from HTTP parameter with shell=True/exec(), no sanitization
- **High:** Argument injection allowing arbitrary file read/write or network access
- **Medium:** Command injection requiring specific conditions, or in admin-only endpoints
- **Low:** Command injection in CLI tools processing local input, or with strong input validation
## Output Format
### Finding: CMDI-{NNN}
- **Title:** {Command|Argument} Injection in {function/endpoint}
- **Severity:** Critical | High | Medium | Low
- **Confidence:** 0-100
- **File:** file/path:line
- **Vulnerability Type:** CWE-78 (OS Command Injection)
- **Description:** User input from {source} reaches {sink} allowing {command|argument} injection.
- **Proof of Concept:** Supplying `; id` or `$(whoami)` as the {parameter} would execute additional commands.
- **Impact:** Full server compromise, data exfiltration, lateral movement, denial of service.
- **Remediation:** Use array-form command execution. Avoid shell=True. Apply allowlist validation or escapeshellarg().
- **References:** https://cwe.mitre.org/data/definitions/78.html
## Common False Positives
1. **Constants in command strings** — commands built entirely from hardcoded values
2. **Internal helper scripts** — commands using internally-generated values, not user input
3. **Build scripts/CI** — command execution in build tooling, not runtime code
4. **execFile with static binary** — `execFile('git', ['status'])` with no user input
5. **Docker/container commands** — orchestration scripts that don't handle user input
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!