Frameworks y librerías escaneados
Probamos la cobertura mediante fixtures en estos frameworks. Se añaden nuevos patrones en cada release de reglas integradas.
Principales clases CWE detectadas
Estas clases CWE aparecen con mayor frecuencia en bases de código modernas de este lenguaje. StaticCodeAudit incluye reglas dedicadas para cada una, mapeadas a OWASP Top 10 / ISO 27001 / ASVS cuando es pertinente.
CWE-89
Inyección SQL
Concatenación o f-strings usados para construir queries SQL — típico con cursor.execute(f"SELECT ... {user_input}"), Django .raw() con concat, o SQLAlchemy .text() sin parámetros bind.
Detectado por la regla SCA: sql_injection_fstring
CWE-78
Inyección de comando OS
subprocess.run(shell=True, ...), os.system() con entrada de usuario. El flag shell=True permite abuso de metacaracteres shell.
Detectado por la regla SCA: os_system_injection
CWE-502
Deserialización insegura
pickle.loads(), yaml.load() sin SafeLoader, shelve, o marshal sobre bytes no confiables. Equivale a ejecución remota de código.
Detectado por la regla SCA: unsafe_deserialization
CWE-918
SSRF
requests.get(user_url), urllib.request.urlopen() sobre URLs controladas por usuario sin allow-list de esquema/host. Permite alcanzar servicios internos (endpoints metadata, RDS, etc.).
Detectado por la regla SCA: taint_ssrf
CWE-798
Credenciales hardcoded
API keys, secretos JWT, contraseñas de BD en archivos fuente. Detectados por entropía + patrones conocidos (AWS, Stripe, GitHub, Slack, etc.).
Detectado por la regla SCA: hardcoded_secret
CWE-94
Inyección de código vía compilación dinámica
Llamadas a los built-ins de compilación dinámica de Python sobre datos parcialmente controlados por el usuario.
Detectado por la regla SCA: dangerous_eval
Vulnerable vs. seguro — tres ejemplos rápidos
CWE-89
Detectado por la regla SCA: sql_injection_fstring
# Vulnerable — Flask + SQLAlchemy raw
@app.route('/user/<name>')
def user(name):
sql = f"SELECT * FROM users WHERE name = '{name}'"
return db.engine.execute(sql).fetchone()
# Seguro — parámetro bind
@app.route('/user/<name>')
def user(name):
sql = text("SELECT * FROM users WHERE name = :name")
return db.engine.execute(sql, {"name": name}).fetchone()
CWE-78
Detectado por la regla SCA: os_system_injection
# Vulnerable — shell=True con entrada de usuario
import subprocess
def ping(host):
return subprocess.run(f"ping -c 1 {host}", shell=True)
# Seguro — lista de argumentos, sin shell
import subprocess
def ping(host):
return subprocess.run(["ping", "-c", "1", host], check=False)
CWE-502
Detectado por la regla SCA: unsafe_deserialization
# Vulnerable — yaml.load sin SafeLoader
import yaml
def load_config(blob):
return yaml.load(blob) # Loader completo = RCE
# Seguro — yaml.safe_load
import yaml
def load_config(blob):
return yaml.safe_load(blob)
Qué detecta StaticCodeAudit (este lenguaje)
- Inyección SQL en SQL crudo, f-strings,
.format(), Django.raw(), SQLAlchemy.text()sin parámetros bind - Inyección de comando OS (
subprocessconshell=True,os.system,os.popen) - Deserialización insegura (
pickle,yaml.load,marshal,shelve) - SSRF vía
requests,urllib,aiohttpcon URLs controladas por usuario - Secretos hardcoded (AWS, Stripe, GitHub PAT, tokens Slack, secretos JWT, contraseñas BD, claves PEM)
- XXE y billion-laughs XML (
xml.etree,lxmlsin resolver deshabilitado) - Path traversal (
os.path.joincon entrada usuario,open()sin anclaje raíz) - Cookies inseguras (flags Flask/Django
Secure/HttpOnly/SameSitefaltantes) - CSRF exento (
@csrf_exempt, Flask sinflask-wtf) - Cripto insegura (MD5/SHA1 para seguridad, modo ECB, IV hardcoded, random débil)
- Modo debug activado en producción Flask / Django
- JWT inseguro (algoritmo
none, secreto hardcoded, sin expiración) - APIs deprecadas (PyCrypto, ssl.TLSv1, estilo urllib2)
- PII en logs y mensajes de excepción
- Misconfiguraciones CI/CD (.gitlab-ci.yml, GitHub Actions: checkout no confiable, secretos en logs)
Audite su código
Audite su código Python contra vulnerabilidades OWASP Top 10, misconfiguraciones específicas de frameworks y riesgos de dependencias — sin enviar una sola línea a la nube. Cubre Django, Flask, FastAPI, SQLAlchemy y la stdlib.
Descargar el binario demo Reservar una demo guiada