Improper Neutralization of Special Elements used in an OS Command
User input is passed unsanitized to system shell commands, allowing attackers to execute arbitrary commands on the server.
Jak naprawić tę podatność
Strategie zapobiegania dla OS Command Injection oparte na 3 regułach detekcji Shoulder.
Use exec.Command with explicit arguments, never shell invocation
package main import ( "net/http" "os/exec" - ) - - func handler(w http.ResponseWriter, r *http.Request) { - cmd := r.URL.Query().Get("cmd") - // Vulnerable: shell invocation with user input - output, _ := exec.Command("sh", "-c", cmd).Output() + "regexp" + ) + + var safePattern = regexp.MustCompile(`^[a-zA-Z0-9._-]+$`) + + func handler(w http.ResponseWriter, r *http.Request) { + filename := r.URL.Query().Get("file") + // Validate input + if !safePattern.MatchString(filename) { + http.Error(w, "Invalid filename", http.StatusBadRequest) + return + } + // Safe: explicit command with validated argument + output, _ := exec.Command("cat", filename).Output() w.Write(output) }
Use execFile/spawn with array arguments instead of exec with string commands
- const { exec } = require('child_process'); - - app.get('/convert', (req, res) => { - const filename = req.query.file; - exec(`convert ${filename} output.png`, (err, stdout) => { + const { execFile } = require('child_process'); + + app.get('/convert', (req, res) => { + const filename = req.query.file; + execFile('convert', [filename, 'output.png'], (err, stdout) => { res.send('Converted'); }); });
Use subprocess.run with list arguments and shell=False
import subprocess from flask import request @app.route('/convert') def convert(): filename = request.args.get('file') - subprocess.run(f'convert {filename} output.png', shell=True) + subprocess.run(['convert', filename, 'output.png'], check=True) return 'Done'
Znajdz podatnosci w swoim kodzie
Uzyj Shoulder do skanowania kodu w poszukiwaniu wzorcow Command Injection. 3 reguly.
# Scan with Shoulder CLI npx @shoulderdev/cli trust --cwe=78 # Or scan entire project npx @shoulderdev/cli trust .
Reguly Wykrywania (3)
Na co zwracac uwage podczas przegladu kodu
Te wzorce wskazuja na potencjalne podatnosci Command Injection. Szukaj ich podczas przegladow kodu i audytow bezpieczenstwa.
Wzorce do ręcznego przeglądu
Podczas ręcznego przeglądu kodu szukaj tych niebezpiecznych wzorców.
query = + konkatenacja łańcuchówexecute(f"... or execute("..." +raw_query, rawQuery, executeRaw${ or #{ wewnątrz łańcuchów SQLJak myślą eksperci ds. bezpieczeństwa
Model myślowy, którego specjaliści ds. bezpieczeństwa używają podczas przeglądu tej podatności.
Zmapuj punkty wejścia
Parametry URL, ciała POST, nagłówki, cookies, przesyłanie plików.
Śledź przepływ danych
Śledź wejście przez kod. Czy jest sanitizowane?
Zidentyfikuj punkty końcowe (sinks)
Where queries are executed: execute(), query()
Sprawdź granice zaufania
Uważaj na przechowywane dane używane w zapytaniach.
Przeskanuj swój kod w poszukiwaniu Command Injection
Shoulder CLI znajduje podatne wzorce w całym Twoim kodzie.