Dangerous sinks by language (grep catalog)
When it applies
You're reading source and want the fastest path to bugs: grep every dangerous sink, then trace each hit's argument back to user input.
Why it works
A small set of functions cause most severe bugs (command/code exec, SQL, deserialization, file access, SSRF). Enumerating them turns review into "find the sink → prove the source".
Sinks to grep (trace the argument to a user source)
- Command exec (RCE, CWE-78): PHP
system exec shell_exec passthru proc_open· Pythonos.system subprocess.*(shell=True) os.popen· Nodechild_process.exec execSync· JavaRuntime.exec ProcessBuilder· Rubysystem exec `backticks` %x()· Goexec.Command. - Code eval (CWE-94):
eval(all), Pythonexec pickle.loads, NodeFunction() vm, PHPeval assert create_function preg_replace/e, Rubyeval send. - SQL (CWE-89): string-built queries / concatenation into
query execute(all ORMs have a raw path — grepraw,.query(,String.formatnear SQL). - Deserialization (CWE-502): Python
pickle yaml.load(!safe) marshal, JavareadObject XMLDecoder, PHPunserialize, RubyMarshal.load YAML.load, .NETBinaryFormatter. - File/path (CWE-22):
open read include require fopen readFile sendFilewith user paths; archive extractors (zip-slip). - SSRF (CWE-918): URL fetchers —
requests.get urllib curl file_get_contents http.get HttpClienttaking a user URL. - Template (SSTI):
render_template_string, Twig/Freemarker string templates. - Secrets:
password= api_key= secret token=literals; private keys.
Method
rg -n "os\.system|subprocess|shell_exec|eval\(|unserialize|pickle\.loads|readObject|render_template_string"
then for each hit trace the argument. Pair with semgrep --config auto for dataflow.
Gotchas
- Parameterized queries / allowlisted args = safe; confirm the source, don't report the grep hit.
yaml.safe_loadand framework-escaped ORMs are the safe variants — note which one is used.
References
OWASP Code Review Guide; GTFOBins (for the exec side); Semgrep registry.