Manejo inseguro de salida
- Parte
- 04
- Estado
- Revisado
- Edición
- v2 / 01.09.2026
- Tiempo estimado de lectura
- 3 min
Edición del 1 de septiembre de 2026
Las fuentes conservan sus fechas de consulta. El laboratorio identifica la simulación determinística y la integración con modelo por separado.
Superficie: salida del LLM y consumidor aguas abajo OWASP: LLM10:2026 Improper Output Handling (renumerado; era LLM05:2025) Riesgo: Alto
El modelo termina su respuesta y el navegador recién empieza a interpretarla. Ese cambio de responsabilidad es el punto que vamos a seguir en PhiloCorp.
La salida del modelo es dato no confiable, incluso si el modelo obedeció una instrucción legítima. El riesgo aparece cuando una aplicación la interpreta como HTML, consulta, URL, plantilla, comando o argumento de tool. El objetivo del laboratorio es demostrar una frontera de validación ausente, no ejecutar código, consultar infraestructura ni enviar datos.
Precondiciones y alcance
- Un flujo de demostración en
philocorp-demoque muestre o consuma una salida sintética. - Un consumidor final identificado (sink), su contrato de renderizado y un propietario que apruebe la prueba.
- Registro de request, salida, política aplicada y resultado del consumidor.
Acción permitida: emitir y observar marcadores de prueba de texto estático. Acción prohibida: ejecutar scripts, construir consultas reales, seguir URLs, cargar recursos, usar secretos o efectuar cambios de estado.
Procedimiento seguro
- Mapeá la ruta
entrada → LLM → transformador → sinky anotá la codificación contextual que debe aplicar cada salto. - Enviá el marcador de prueba correspondiente al sink de laboratorio.
- Verificá que el consumidor lo trate como dato literal o estructura validada.
- Repetí para HTML, Markdown, parámetros estructurados y enlaces, sin habilitar navegación.
Marcador de renderizado
<strong>PHILO_TEST_04_SINK_HTML_ESCAPADO</strong> & "texto"En un campo definido como texto plano, el bloque debe verse literalmente, incluidos los signos y las etiquetas. Si se renderiza en negrita, hay interpretación de HTML donde el contrato exige texto; todavía no hay prueba de ejecución de scripts. En un campo de HTML enriquecido, permitir una etiqueta inerte puede ser correcto: revisá la política de sanitización correspondiente. Compará con un marcador sin metacaracteres para confirmar que el problema está en el consumidor.
Marcador de parámetros estructurados
{"operation":"demo_read","resource":"philocorp-demo://record/04","marker":"PHILO_TEST_04_SCHEMA"}El JSON es un caso de prueba local, no una API funcional. El validador del laboratorio debe aceptar la operación declarada. Como control negativo, agregá un campo no permitido y cambiá el recurso a un namespace sintético excluido. El schema debe rechazar el campo; la autorización debe rechazar el recurso aunque su forma sea válida. No confundas validación de estructura con permisos.
Marcador de enlace
[estado de demostración](https://help.philocorp.invalid/demo/04?marker=PHILO_TEST_04_URL)Éxito seguro: no hay precarga ni navegación automática. Probá una URL lógica permitida y otra excluida por la lista de destinos del lab mediante el validador local, sin resolverlas ni visitarlas. Que el texto parezca un enlace no demuestra que el control de destinos se haya ejecutado.
Evidencia y control esperado
Guardá captura del render, evento de validación, esquema efectivo, decisión de allowlist y el identificador de correlación. El control esperado es escapado contextual, validación estructural, queries parametrizadas en el código de la aplicación, allowlist de destinos y una policy externa al LLM para tools con efectos.
Condiciones de detención
Detené inmediatamente si hay salida de red, un cambio de estado, contenido no sintético o una indicación de que el sink ejecutaría instrucciones. Registrá el evento y preservá solo evidencia mínima.

