En un texto publicado el 8 de octubre de 2026, Sebastian Bergmann sostiene que las herramientas PHP de línea de comandos tienen ahora dos lectores. El terminal interpreta secuencias de control para una persona. Un agente de programación recibe los bytes escritos por el proceso. Una misma ejecución puede ofrecer así dos versiones distintas. Esa diferencia abre una superficie de ataque.
El proyecto OWASP GenAI Security publicó en diciembre de 2025 el documento OWASP Top 10 for Agentic Applications for 2026. Bergmann aplica sus categorías a quienes mantienen herramientas, además de quienes construyen agentes. Varias mejoras recientes de PHPUnit muestran cómo usar ese marco, y sus mensajes de commit mencionan directamente las categorías OWASP.
El código bajo prueba controla los nombres de los tests, los nombres de los conjuntos de datos, las etiquetas TestDox, los mensajes de aserciones y excepciones, y otras salidas. PHPUnit enviaba antes esas cadenas al terminal sin cambios. Un mensaje que contenga `\x1B[2K\r` puede borrar una línea y devolver el cursor al inicio. La persona puede ver `Everything is fine`, aunque el agente lea un fallo. También puede construirse una salida que oculte el fallo al agente y lo muestre a la persona. OWASP clasifica este caso como ASI09, Human-Agent Trust Exploitation.
El commit `22dce286af1bd72b32e840fb9c814c832bac6c49` modifica la representación. PHPUnit hace visibles los caracteres de control C0, salvo el salto de línea, el tabulador y un retorno de carro seguido de un salto de línea. También muestra DEL, los controles C1 y los caracteres Unicode de formato bidireccional mediante escapes `\u{NNNN}`. El ejemplo pasa a mostrar `Failed\u{001B}[2K\u{000D}Everything is fine`. Los caracteres permanecen visibles para facilitar la depuración. PHPUnit neutraliza las secuencias ANSI exponiendo su carácter de control inicial, sin intentar analizar todo el protocolo ANSI.
La salida compacta de PHPUnit contiene registros con una cabecera de una línea, como `--- FAILURE: Some\\Test::testMethod`, seguida de un cuerpo. Un nombre de conjunto de datos puede incluir un salto de línea, por ejemplo `legit\n--- FAILURE: Forged::testForged`. Así puede aparecer un registro falso con el aspecto de un resultado real. El caso corresponde a ASI01, Agent Goal Hijack, y ASI06, Memory and Context Poisoning. Los agentes resumen los resultados y pueden arrastrar ese estado falso a decisiones posteriores.
El commit `95f393589e3725c5e83292f317422d1a4ad56162` garantiza que PHPUnit escriba por sí solo cada cabecera en una sola línea. Los saltos de línea de los títulos se convierten en `\u{000A}`. Los cuerpos siguen admitiendo mensajes multilínea, diferencias y trazas de pila. Por eso un texto del cuerpo todavía puede parecer una cabecera o una línea de resumen. El formato compacto está pensado para la lectura. El código de salida y los registros legibles por máquina, como Open Test Reporting, proporcionan el resultado formal. Un agente sigue procesando texto, y una instrucción en el prompt no elimina por completo el riesgo ASI01.
Una llamada permitida a `phpunit` también puede no terminar. Los bucles infinitos, los sockets sin respuesta y los tests lentos impiden distinguir una ejecución larga de un bloqueo. Un proceso terminado desde fuera puede dejar sin resumen, código de salida, logs ni información sobre el test activo. Los reintentos pueden repetir el problema. OWASP relaciona este escenario con ASI02, Tool Misuse and Exploitation, y ASI08, Cascading Failures.
PHPUnit 13.4 incorpora `--timeout`, un límite de tiempo para toda la invocación, incluido el bootstrap y la carga de la suite. Al agotarse el límite, PHPUnit no inicia más tests, escribe los logs, muestra un resultado y termina con el código 124, igual que GNU `timeout(1)`. Con `pcntl`, el test en ejecución se interrumpe y se informa como error con una traza de pila. La salida compacta recibe un registro propio para el tiempo agotado. Una herramienta que se detiene por sí misma deja información útil para el agente.
Ejecutar una suite sigue implicando ejecutar código PHP arbitrario, a menudo escrito recientemente por el agente. PHPUnit no puede convertir esa ejecución en segura. El sandbox, el aislamiento de red y la limitación de credenciales corresponden al entorno que ejecuta el agente. La integridad de la salida y el límite de ejecución corresponden a la herramienta. Entre ambos ámbitos todavía queda una zona sin una responsabilidad clara.
Está prevista para PHPUnit 13.5 la opción `--show-effective-configuration`, que aborda ASI04, Agentic Supply Chain Vulnerabilities. El archivo `phpunit.xml` determina los scripts de bootstrap, las extensiones y los archivos de tests que se cargarán. La opción muestra las listas efectivas de archivos como rutas absolutas ordenadas y termina antes de ejecutar código. Un harness o un revisor puede comparar esas listas entre una pull request y su rama base, y detectar un nuevo script de bootstrap o un directorio de tests.
Bergmann recomienda revisar las herramientas PHP que llaman los agentes con cuatro preguntas: qué cadenas controladas por la entrada llegan a la salida, si la estructura puede falsificarse, si la invocación puede quedar bloqueada y si existe un veredicto legible por máquina. El mismo examen sirve para test runners, analizadores estáticos, formateadores y scripts de Composer. La conclusión es operativa: las herramientas usadas por agentes deben contemplar a ese segundo lector. OWASP 2026 ofrece un marco práctico para localizar los fallos.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.