In this article
Corrección de vulnerabilidades detectadas con Factory AI y Snyk Studio
Programar con los Droids de Factory AI es una gran experiencia. Todo es cohesivo, fluido, envolvente; se siente como jugar. Su compromiso con este ideal se percibe no solo en la interfaz de usuario, sino también en sus alianzas. Una integración clave es con Linear (competidor más joven de Jira, reconocido por una experiencia de usuario enriquecida con animaciones reactivas en aplicaciones web y atajos de teclado). Si herramientas como Claude Code, OpenAI Codex y Gemini CLI son como un documento de Word sin conexión, la propuesta de Factory AI es como un Google Drive en línea, diseñado desde el principio para equipos que colaboran.
![Pantalla de inicio de Factory con el encabezado «FACTORY», una descripción del desarrollo de software nativo de agentes y el mensaje «[ enter to continue ]».](https://res.cloudinary.com/snyk/image/upload/v1761144127/Droid_GIF_goxlos.gif)
El recorrido para desarrolladores incluye un tutorial bien diseñado, integrado en su sitio web, que te guía paso a paso para:
Descargar Factory CLI
Agregar la extensión Droid IDE a VS Code o a tu bifurcación preferida (por ejemplo, Cursor o WindSurf)
Darle a tu Droid (los agentes de IA especializados de Factory AI) su primera tarea, desde el navegador o el IDE.
Si usas Linux, puedes instalar Factory CLI así:
curl -fsSL https://app.factory.ai/cli | shLa extensión para VS Code está disponible aquí. Una vez instalada, puedes usar `Ctrl-Shift-P` para abrir la paleta de comandos y seleccionar Run Factory Droid.

¿Qué es un Droid?
Factory AI ofrece agentes de IA especializados para una amplia variedad de tareas comunes de desarrollo de software. Se llaman Droids.
Code Droid: Pasa de la idea a los cambios de código listos para integrar. Escribe nuevas funciones o componentes con requisitos claros y aprovecha la capacidad de Code Droid para comprender tu base de código e implementar funcionalidades que sigan los patrones y las prácticas recomendadas del proyecto. Mejora el código existente al detectar patrones complejos o ineficientes y transformarlos en soluciones más limpias y fáciles de mantener, sin alterar la funcionalidad y mejorando el rendimiento. Analiza registros de errores, identifica sus causas raíz y desarrolla correcciones para los bugs de tu base de código. Crea pruebas unitarias completas para garantizar la confiabilidad del código y prevenir regresiones en tus aplicaciones.
Knowledge Droid: Investigación de ingeniería, documentación técnica y guías de incorporación. Genera documentación completa para tu base de código, incluidas referencias de API, descripciones generales de la arquitectura y relaciones entre componentes, para mejorar la comprensión del equipo y facilitar la incorporación. Obtén explicaciones claras de sistemas complejos, decisiones arquitectónicas y detalles de implementación de tus proyectos para ayudar a los miembros del equipo a entender cómo interactúan los distintos componentes. Encuentra y extrae rápidamente información específica de tu base de código y documentación para ahorrar tiempo al buscar detalles de implementación o comprender determinadas funcionalidades.
Reliability Droid: Investiga incidentes, redacta análisis de causa raíz y depura sistemas complejos con varios servicios. Analiza incidentes en producción examinando registros de errores, métricas y el comportamiento del sistema para identificar rápidamente patrones y posibles causas de interrupciones o degradación del rendimiento. Crea documentos completos de análisis de causa raíz que incluyan la cronología, la evaluación del impacto, la identificación de la causa raíz y medidas preventivas para compartirlos con las partes interesadas. Desarrolla mecanismos sólidos de manejo de errores, como disyuntores, lógica de reintentos y patrones de degradación gradual, para mejorar la resiliencia del sistema y prevenir fallas en cascada.
Product Droid: Planifica funcionalidades, crea PRD y gestiona tus proyectos. Genera documentos detallados de requisitos de producto, con descripciones generales de funcionalidades, historias de usuario, criterios de aceptación, consideraciones técnicas y fases de implementación para nuevas funcionalidades. Crea historias de usuario completas con criterios de aceptación detallados para distintos tipos de usuarios y situaciones, a fin de ayudar a los equipos de desarrollo a comprender los requisitos desde la perspectiva del usuario. Analiza solicitudes de funcionalidades y desarrolla marcos de priorización que evalúen el impacto frente al esfuerzo para ayudar a los equipos de producto a decidir qué implementar primero.
Este enfoque actual de los agentes de IA —ofrecer una biblioteca de agentes especializados y listos para usar— permite aprovechar al máximo las ventanas de contexto limitadas de los LLM. Aunque el agente único de herramientas como Claude Code, OpenAI Codex y Gemini CLI «puede» adaptarse a una variedad similar de tareas, Factory AI ha dedicado tiempo a ofrecer a los desarrolladores un agente que gestiona su contexto de manera experta para cumplir un propósito muy específico. Esto no significa que falte un Droid de propósito general, también incluido en la biblioteca, en el que puedes confiar para cualquier tarea que no cubran los Droids especializados.
Afortunadamente, Factory AI no te limita a un único proveedor de LLM. Los proveedores más conocidos están disponibles de inmediato (consulta abajo). Y para los LLM con variantes específicas para tareas como el razonamiento, puedes elegir fácilmente la opción que prefieras en el mismo cuadro de diálogo de la interfaz.

Compatibilidad con MCP
Al igual que otras interfaces CLI para agentes de IA, Droid CLI ofrece una excelente compatibilidad con el Model Context Protocol (MCP). Agregar tu servidor MCP favorito es fácil.

Por ejemplo, puedes agregar el servidor MCP oficial de Snyk así:
droid mcp add --type stdio SNYK "snyk mcp -t stdio"
Added stdio MCP server SNYK with command: snyk mcp -t stdioPero ¿qué podemos hacer con esto? ¿Qué beneficios tiene ampliar el conjunto de herramientas de un Droid que ya es muy capaz? La compatibilidad con la ejecución de comandos de shell y la lectura, escritura y edición de archivos ya viene integrada.
Usar agentes de IA (Droids) para corregir vulnerabilidades automáticamente
Para este ejemplo, cloné el repositorio pyGoat de adeyosemanputra’s, líder de proyecto de OWASP. Este proyecto incluye intencionalmente una serie de vulnerabilidades bien documentadas con fines educativos. Estas son algunas de las vulnerabilidades que destaca la extensión IDE de Snyk:

También podemos pedirle a Droid que use el servidor MCP para enumerar algunas de esas mismas vulnerabilidades. Mira:
> Please run a code scan on the codebase with Snyk.
⛬ I'll help you run a Snyk code scan on the pygoat codebase. Let me first check the
authentication status and then perform the scan.
PLAN Updated: 3 total (2 pending, 1 in progress, 0 completed)
○ Check Snyk authentication status
○ Run Snyk code scan on pygoat codebase
○ Review and report scan results
[MCP] SNYK:SNYK_AUTH_STATUS
↳stephen.thoemmes
⛬ Great! You're authenticated as stephen.thoemmes. Now I'll run the Snyk code scan on
the pygoat codebase to identify security vulnerabilities.
PLAN Updated: 3 total (1 pending, 1 in progress, 1 completed)
○ Check Snyk authentication status
○ Run Snyk code scan on pygoat codebase
○ Review and report scan results
[MCP] SNYK:SNYK_CODE_SCAN (/home/owler/Documents/Snyk/factory/pygoat)
↳
Testing /home/owler/Documents/Snyk/factory/pygoat ...
✗ [Low] Use of Hardcoded Credentials
Path: introduction/playground/A9/api.py, line 17
Info: Do not hardcode credentials in code. Found hardcoded credential used in a
condition.
…
✗ [High] SQL Injection
Path: introduction/views.py, line 871
Info: Unsanitized input from an HTTP parameter flows into
introduction.models.sql_lab_table.objects.raw, where it is used in an SQL query. This
may result in an SQL Injection vulnerability.
…
✔ Test completed
Organization: stephen.thoemmes
Test type: Static code analysis
Project path: /home/owler/Documents/Snyk/factory/pygoat
Summary:
101 Code issues found
15 [High] 44 [Medium] 42 [Low]
PLAN Updated: 3 total (0 pending, 0 in progress, 3 completed)
○ Check Snyk authentication status
○ Run Snyk code scan on pygoat codebase
○ Review and report scan results
⛬ The Snyk code scan has completed successfully! Here's a summary of the security
findings:
Scan Results Summary
Total Issues Found: 101
• 15 High severity vulnerabilities
• 44 Medium severity vulnerabilities
• 42 Low severity vulnerabilities
Key High-Severity Issues Found:
1. SQL Injection - Multiple instances in views.py
2. Code Injection - eval() usage with unsanitized input
3. Command Injection - subprocess.Popen with unsanitized input
4. Path Traversal - File operations with unsanitized paths
5. XML External Entity (XXE) Injection - Insecure XML parsing
6. Deserialization vulnerabilities - pickle.loads and yaml.load with untrusted data
7. Hardcoded cryptographic keys - JWT keys hardcoded in source
8. Hardcoded secrets - Non-cryptographic secrets in code
Medium/Low Severity Issues:
• Hardcoded passwords and credentials
• CSRF protection disabled on multiple endpoints
• Insecure cookie configurations (missing HttpOnly/Secure flags)
• Weak hashing algorithms (MD5)
• Debug mode enabled in production
• SSRF vulnerabilities
This is a comprehensive security assessment showing that pygoat (being a
deliberately vulnerable application for educational purposes) contains numerous
intentional security flaws across all severity levels, making it an excellent
training platform for learning about web application security vulnerabilities.Por último, con Code Droid seleccionado, podemos pedirle al LLM que corrija una de estas vulnerabilidades de alta prioridad.
> ✗ [High] SQL Injection
Path: introduction/views.py, line 871
Info: Unsanitized input from an HTTP parameter flows into
introduction.models.sql_lab_table.objects.raw, where it is used in an SQL query.
This
may result in an SQL Injection vulnerability. Can you fix this vulnerability and
then re-scan to show that it is fixed?
⛬ I'll help you fix the SQL injection vulnerability on line 871 in
introduction/views.py and then re-scan to verify the fix. Let me first examine the
vulnerable code.
PLAN Updated: 3 total (2 pending, 1 in progress, 0 completed)
○ Examine SQL injection vulnerability on line 871 in views.py
○ Fix the SQL injection vulnerability using parameterized queries
○ Re-run Snyk scan to verify the fix
READ (introduction/views.py, offset: 860, limit: 20)
↳ Read 22 lines.
⛬ Let me see more context around the vulnerable code to understand how the SQL query
is constructed:
READ (introduction/views.py, offset: 840, limit: 40)
↳ Read 42 lines.
⛬ Now I can see the vulnerability clearly. The SQL query on line 855 is constructed
by directly concatenating user input without sanitization. Let me also check the
imports to see what model is being used:
GREP ("from.*models import|import.*mo...", content mode)
↳ Read 1 line.
GREP ("sql_lab_table", content mode)
↳ Read 7 lines.
⛬ Perfect! Now I understand the vulnerability. The code is directly concatenating
user input (name and password) into the SQL query string, making it vulnerable to
SQL injection. Let me fix this by using parameterized queries:
PLAN Updated: 3 total (1 pending, 1 in progress, 1 completed)
○ Examine SQL injection vulnerability on line 871 in views.py
○ Fix the SQL injection vulnerability using parameterized queries
○ Re-run Snyk scan to verify the fix
EDIT (introduction/views.py)
↳ Succeeded. File edited. (+3 added, -2 removed)
╭───────────────────────────────────────────────────────────────────────────────╮
│ 854 │ 854 print(password) │
│ 855 │ 855 │
│ 856 │ 856 if name: │
│ 857 │ - sql_query = "SELECT * FROM introduction_sql_lab_tabl…│
│ │ 857 + # Fixed SQL injection by using parameterized query │
│ │ 858 + sql_query = "SELECT * FROM introduction_sql_lab_tabl…│
│ 858 │ 859 │
│ 859 │ 860 sql_instance = sql_lab_table(id="admin", password="6…│
│ 860 │ 861 sql_instance.save() │
│ │
│... 7 unchanged lines ... │
│ │
│ 868 │ 869 print(sql_query) │
│ 869 │ 870 │
│ 870 │ 871 try: │
│ 871 │ - user = sql_lab_table.objects.raw(sql_query) │
│ │ 872 + user = sql_lab_table.objects.raw(sql_query, [nam…│
│ 872 │ 873 user = user[0].id │
│ 873 │ 874 print(user) │
│ 874 │ 875 │
╰───────────────────────────────────────────────────────────────────────────────╯
⛬ Great! I've successfully fixed the SQL injection vulnerability by:
1. Changing the SQL query construction: Instead of directly concatenating user
input into the SQL string, I'm now using parameterized query placeholders (%s)
2. Using parameterized execution: The raw() method now receives the parameters as a
separate list [name, password], which ensures proper escaping and prevents SQL
injection
Now let's run the Snyk scan again to verify that this specific vulnerability has
been fixed:
PLAN Updated: 3 total (0 pending, 1 in progress, 2 completed)
○ Examine SQL injection vulnerability on line 871 in views.py
○ Fix the SQL injection vulnerability using parameterized queries
○ Re-run Snyk scan to verify the fix
[MCP] SNYK:SNYK_CODE_SCAN (/home/owler/Documents/Snyk/factory/pygoat)
↳
Testing /home/owler/Documents/Snyk/factory/pygoat ...
✗ [Low] Use of Hardcoded Credentials
Path: introduction/playground/A9/api.py, line 17
Info: Do not hardcode credentials in code. Found hardcoded credential used in a
condition.
…
✗ [High] Hardcoded Non-Cryptographic Secret
Path: pygoat/settings.py, line 25
Info: Avoid hardcoding values that are meant to be secret. Found a hardcoded string
used in here.
✔ Test completed
Organization: stephen.thoemmes
Test type: Static code analysis
Project path: /home/owler/Documents/Snyk/factory/pygoat
Summary:
100 Code issues found
14 [High] 44 [Medium] 42 [Low]
PLAN Updated: 3 total (0 pending, 0 in progress, 3 completed)
○ Examine SQL injection vulnerability on line 871 in views.py
○ Fix the SQL injection vulnerability using parameterized queries
○ Re-run Snyk scan to verify the fix
⛬ Perfect! The fix has been successfully verified. Here's what happened:
✅ SQL Injection Vulnerability Fixed!
Before the fix:
• 101 total issues (15 High, 44 Medium, 42 Low)
• SQL Injection vulnerability at introduction/views.py, line 871
After the fix:
• 100 total issues (14 High, 44 Medium, 42 Low)
• The SQL injection vulnerability is no longer reported ✅
Summary of the Fix
I successfully fixed the SQL injection vulnerability by:
1. Replaced vulnerable string concatenation:
```python
# BEFORE (vulnerable):
sql_query = "SELECT * FROM introduction_sql_lab_table WHERE id='"+name+"'AND
password='"+password+"'"
user = sql_lab_table.objects.raw(sql_query)
```
2. With secure parameterized query:
```python
# AFTER (secure):
sql_query = "SELECT * FROM introduction_sql_lab_table WHERE id=%s AND
password=%s"
user = sql_lab_table.objects.raw(sql_query, [name, password])
```
The Snyk scan now shows 1 fewer issue (from 101 to 100), confirming that the
specific SQL injection vulnerability on line 871 has been eliminated. The fix uses
Django's built-in parameter binding which automatically escapes user input and
prevents SQL injection attacks.
Esto demuestra el potencial de un nuevo paradigma en los flujos de trabajo de DevSecOps. En lugar de tratar la seguridad como una preocupación aparte que a menudo se atiende tarde, ahora podemos integrar la detección y corrección de vulnerabilidades directamente en el proceso de desarrollo. La combinación de los agentes especializados de Factory AI con servidores MCP como el de Snyk permite no solo identificar los problemas de seguridad, sino también corregirlos rápidamente y volver a verificar que se hayan resuelto correctamente, todo en la misma interfaz donde ya trabajan los desarrolladores.
Próximos pasos con Factory AI y Snyk Studio
A medida que crece la adopción de MCP y más herramientas de seguridad desarrollan servidores MCP, podemos imaginar Droids que no solo corrijan vulnerabilidades, sino que también generen pruebas de seguridad, actualicen la documentación para reflejar las correcciones e incluso creen tickets para la revisión manual de problemas complejos. La naturaleza modular tanto del sistema Droid de Factory como del protocolo MCP permite que estas capacidades evolucionen de forma independiente y sigan siendo interoperables.
Para los equipos que quieran implementar flujos de trabajo similares, la configuración es sencilla: instala Factory CLI, agrega los servidores MCP que prefieras y empieza a corregir vulnerabilidades para generar confianza en el proceso de corrección automatizada. La clave es considerar los agentes de IA como multiplicadores de la capacidad de tu equipo de seguridad, no como reemplazos: son excelentes para encargarse de las correcciones rutinarias y bien conocidas, mientras las personas se enfocan en los nuevos desafíos de seguridad que requieren resolver problemas de forma creativa.
¿Quieres aprender más sobre cómo proteger el ecosistema de servidores MCP? Descarga nuestro ebook hoy mismo.
EBOOK
Protege el ecosistema de servidores MCP
Explora nuevas vías de ataque y analiza incidentes reales para descubrir cómo defenderte con estrategias prácticas que tienen en cuenta los flujos.