Skip to main content

What is Taint Analysis?

Taint analysis tracks untrusted data from where it enters your application to where it could cause harm. Skylos uses this to detect SQL injection, command injection, SSRF, and XSS vulnerabilities.


The Core Concept​

TermDefinitionExample
SourceWhere untrusted data entersrequest.args.get("id")
SinkDangerous operationcursor.execute(query)
PropagationHow taint spreadsquery = f"SELECT * FROM users WHERE id = {user_id}"

What Skylos Detects​

SQL Injection​

user_id = request.args.get("id")  # ← Source: tainted
query = f"SELECT * FROM users WHERE id = {user_id}" # Propagation
cursor.execute(query) # ← Sink: SQL injection

Command Injection​

filename = request.form["file"]  # Source: tainted
os.system(f"cat {filename}") # Sink: command injection

SSRF (Server-Side Request Forgery)​

url = request.args.get("url")  # Source: tainted
requests.get(url) # Sink: SSRF!

XSS (Cross-Site Scripting)​

name = request.args.get("name")  # Source: tainted
return f"<h1>Hello {name}</h1>" # Sink: XSS

How Skylos Tracks Taint​

  1. Identify sources: User input, file reads, environment variables
  2. Track propagation: Variable assignments, string operations, function returns
  3. Flag sinks: Database queries, shell commands, HTTP requests, HTML output
# Skylos traces this entire flow:
user_input = request.get_json()["query"] # Source
processed = user_input.strip() # Still tainted
final_query = f"SELECT * FROM t WHERE x = '{processed}'" # Still tainted
db.execute(final_query) # Sink -> ALERT!

Safe vs Unsafe Patterns​

PatternSafe?Why
cursor.execute(query, (param,))✅Parameterized query
cursor.execute(f"... {param}")❌String interpolation
subprocess.run(["ls", filename])✅List form, no shell
os.system(f"ls {filename}")❌Shell injection
escape(user_input)✅Sanitized
f"<div>{user_input}</div>"❌Raw HTML

Running Taint Analysis​

# Enable security scanning
skylos . --danger

# Output includes:
# - SQL injection vulnerabilities
# - Command injection vulnerabilities
# - SSRF vulnerabilities
# - XSS vulnerabilities

Limitations​

Taint analysis is conservative. It may flag code that is actually safe:

  • Can't always detect sanitization functions
  • May miss taint through complex control flow
  • Runtime-only sanitization not visible