Security PR Guardian
Herramienta CLI y GitHub Action que analiza Pull Requests combinando SAST (análisis estático con regex sobre 7 CWEs), escaneo de CVEs vía OSV.dev, RAG sobre una base de conocimiento OWASP/CWE, y razonamiento LLM vía Amazon Bedrock para filtrar falsos positivos antes de publicar un comentario estructurado en el PR.
Requisitos previos
- Python 3.11+
- Cuenta AWS con acceso a Amazon Bedrock y el modelo habilitado en tu región
- Token de GitHub con permisos
repo(lectura) ypull-requests(escritura)
Instalación
pip install security-pr-guardian
Configuración
Variables de entorno obligatorias
export GITHUB_TOKEN=ghp_... # Token GitHub
export BEDROCK_REGION=us-east-1 # Región AWS de Bedrock
export BEDROCK_MODEL_ID=anthropic.claude-sonnet-4-20250514-v1:0
Copia .env.example como .env y rellena los valores:
cp .env.example .env
Configuración opcional (config.yaml)
# config.yaml — opcional, en la raíz del proyecto
llm_backend: bedrock # "bedrock" (default) | "anthropic"
osv_timeout_seconds: 10 # Timeout para OSV.dev (1-300)
max_diff_lines: 10000 # Máximo de líneas del diff a analizar
max_dependencies: 50 # Máximo de dependencias a escanear
Uso
Analizar un PR
security-guardian check --repo owner/repo --pr 42
Con opciones adicionales:
# Modo dry-run — no publica comentario en el PR
security-guardian check --repo owner/repo --pr 42 --no-comment
# Salida en JSON (útil para integración con otras herramientas)
security-guardian check --repo owner/repo --pr 42 --output json
Códigos de salida
| Código | Significado |
|---|---|
0 |
Análisis completado, sin vulnerabilidades explotables |
1 |
Análisis completado, al menos una vulnerabilidad explotable encontrada |
2 |
Error de configuración o argumentos inválidos |
Inicializar configuración
# Genera .env.example y valida las credenciales configuradas
security-guardian init
# Genera .security-guardian.yml con el perfil de convenciones del equipo
security-guardian init --profile
# Auto-detecta frameworks y librerías desde los manifiestos del proyecto
security-guardian init --profile --auto-detect
Perfil de equipo (.security-guardian.yml)
Archivo opcional que personaliza el razonamiento del LLM para tu equipo:
team_profile:
frameworks:
- django
- react
auth_libraries:
- bcrypt
allowed_patterns:
- cwe_id: CWE-502
razon: pickle usado solo en cache interno, nunca con input de usuario
- cwe_id: CWE-327
razon: md5 solo para ETags HTTP, no para datos sensibles
min_severity: medium
custom_exceptions:
- Los logs internos pueden contener IDs de usuario por diseño
Integración como GitHub Action
Agrega este step a tu workflow:
- name: Security PR Guardian
uses: Juanescuaran2041/security-sentinel@v0.1.0
with:
repo: ${{ github.repository }}
pr-number: ${{ github.event.pull_request.number }}
github-token: ${{ secrets.GITHUB_TOKEN }}
bedrock-region: ${{ secrets.BEDROCK_REGION }}
bedrock-model-id: ${{ secrets.BEDROCK_MODEL_ID }}
Configura los secrets en tu repositorio:
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY— credenciales AWS IAMBEDROCK_REGION— región de Bedrock (ej.us-east-1)BEDROCK_MODEL_ID— ID del modelo (ej.anthropic.claude-3-5-haiku-20241022-v1:0)
Ver el workflow de ejemplo completo en .github/workflows/security-guardian.yml.
Vulnerabilidades detectadas
| CWE | Tipo |
|---|---|
| CWE-89 | Inyección SQL |
| CWE-78 | Inyección de comandos OS |
| CWE-79 | Cross-Site Scripting (XSS) |
| CWE-502 | Deserialización insegura |
| CWE-798 | Credenciales hardcodeadas |
| CWE-327 | Algoritmos criptográficos débiles (MD5, SHA1, DES) |
| CWE-552 | Referencias a rutas sensibles |
Además de CVEs conocidos en dependencias via OSV.dev.
Licencia
MIT
Metadata
Release files for security-pr-guardian 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| security_pr_guardian-0.1.0.tar.gz | 129.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| security_pr_guardian-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 195.6 kB
Release files / security_pr_guardian-0.1.0.tar.gz
| Download URL | security_pr_guardian-0.1.0.tar.gz |
|---|---|
| Size | 129.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9750782ff0a9fe929d445d7907ffbc561f0b1c2c59ca5b4545022d1f6621316d
|
|
BLAKE2b-256 checksum How to use checksums |
43bd681a2c9c3d1abaa8226f0e245e1fa07475ff13188cdee149b7d28a07b25d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|
Release files / security_pr_guardian-0.1.0-py3-none-any.whl
| Download URL | security_pr_guardian-0.1.0-py3-none-any.whl |
|---|---|
| Size | 66.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
652bbe705ae15eff14c3571179de28667bfceefe740a19a46d79f0f2cda5c7c6
|
|
BLAKE2b-256 checksum How to use checksums |
5f0deae91bc023116f687ba269fb259ffde77f9371f452546f2ab9db2977fdd5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|