Sebastian Bergmann beschreibt in einem am 8. Oktober 2026 veröffentlichten Beitrag zwei Leser für PHP-Kommandozeilenwerkzeuge. Ein Terminal interpretiert Steuersequenzen für einen Menschen, ein Coding-Agent verarbeitet die vom Prozess geschriebenen Bytes. Beide können dadurch unterschiedliche Ansichten desselben Laufs erhalten. Diese Lücke wird zur Angriffsfläche.

Das OWASP GenAI Security Project veröffentlichte im Dezember 2025 die OWASP Top 10 for Agentic Applications for 2026. Bergmann überträgt die Kategorien auf Maintainer von Werkzeugen und auf Entwickler von Agenten. Aktuelle PHPUnit-Änderungen dienen als Beispiele, deren Commit-Nachrichten die jeweiligen OWASP-Risiken ausdrücklich benennen.

Testnamen, Datensatznamen, TestDox-Bezeichnungen, Assertions- und Exception-Meldungen sowie weitere Testausgaben stammen aus dem ausgeführten Code. PHPUnit reichte diese Zeichenketten früher unverändert an das Terminal weiter. Eine Meldung mit `\x1B[2K\r` kann eine Zeile löschen und den Cursor zurücksetzen. Der Mensch sieht dann möglicherweise `Everything is fine`, der Agent liest weiterhin einen Fehler. Auch die umgekehrte Täuschung ist möglich. OWASP ordnet das als ASI09, Human-Agent Trust Exploitation, ein.

Der Commit `22dce286af1bd72b32e840fb9c814c832bac6c49` ändert die Darstellung. PHPUnit macht C0-Steuerzeichen sichtbar, ausgenommen Zeilenvorschub, Tabulator und ein Wagenrücklaufzeichen vor einem Zeilenvorschub. DEL, C1-Steuerzeichen und Unicode-Zeichen für bidirektionale Formatierung werden ebenfalls als `\u{NNNN}`-Escapes ausgegeben. Aus dem Beispiel wird damit `Failed\u{001B}[2K\u{000D}Everything is fine`. Die Zeichen bleiben für die Fehlersuche erhalten. PHPUnit versucht keine vollständige ANSI-Analyse, sondern macht das einleitende Steuerzeichen einer Sequenz unschädlich.

Die kompakte PHPUnit-Ausgabe besteht aus Datensätzen mit einer einzeiligen Kopfzeile wie `--- FAILURE: Some\\Test::testMethod` und einem folgenden Textkörper. Ein Datensatzname kann einen Zeilenvorschub enthalten, etwa `legit\n--- FAILURE: Forged::testForged`. Dadurch können erfundene Testdatensätze im Ausgabestrom entstehen. Das betrifft ASI01, Agent Goal Hijack, und ASI06, Memory and Context Poisoning. Agenten fassen Ergebnisse zusammen und übernehmen einen verfälschten Zustand in spätere Entscheidungen.

Der Commit `95f393589e3725c5e83292f317422d1a4ad56162` stellt sicher, dass PHPUnit jede Kopfzeile selbst und genau in einer Zeile schreibt. Zeilenvorschübe in Titeln werden zu `\u{000A}`. Die Körper der Datensätze dürfen weiterhin mehrzeilige Meldungen, Diffs und Stacktraces enthalten. Dort kann Text wie eine Kopf- oder Zusammenfassungszeile aussehen. Das Kompaktformat ist für Menschen gedacht. Exit-Code und maschinenlesbare Protokolle wie Open Test Reporting liefern das formale Ergebnis. Ein Agent arbeitet trotzdem mit Text, und eine Prompt-Anweisung kann das ASI01-Risiko nicht vollständig beseitigen.

Ein freigegebenes `phpunit`-Werkzeug kann außerdem nicht zurückkehren. Endlosschleifen, blockierte Sockets und langsame Tests lassen einen Agenten einen langen Lauf nicht von einem Hänger unterscheiden. Ein externer Abbruch kann Zusammenfassung, Exit-Code, Logs und die Information zum aktiven Test beseitigen. Wiederholungen können denselben Zustand erneut auslösen. OWASP ordnet das ASI02, Tool Misuse and Exploitation, und ASI08, Cascading Failures, zu.

PHPUnit 13.4 ergänzt `--timeout` als Zeitlimit für den gesamten Aufruf, einschließlich Bootstrap und Laden der Testsuite. Nach Ablauf startet PHPUnit keine weiteren Tests, schreibt Logs, gibt ein Ergebnis aus und beendet sich mit Exit-Code 124, entsprechend GNU `timeout(1)`. Mit `pcntl` wird ein laufender Test abgebrochen und mit Stacktrace als Fehler gemeldet. Die kompakte Ausgabe erhält einen eigenen Timeout-Datensatz. Ein Werkzeug, das sich selbst beendet, hinterlässt damit verwertbare Informationen.

Eine Testsuite führt weiterhin beliebigen PHP-Code aus, darunter oft frisch von einem Agenten erzeugten Code. PHPUnit kann diese Ausführung nicht sicher machen. Sandbox, Netzwerktrennung und Zugangsbeschränkungen gehören zum Agent-Harness. Ausgabeintegrität und begrenzte Laufzeit gehören zum Werkzeug. Dazwischen bleibt die Zuständigkeit teilweise offen.

Für PHPUnit 13.5 ist `--show-effective-configuration` vorgesehen. Die Option adressiert ASI04, Agentic Supply Chain Vulnerabilities. Eine `phpunit.xml` legt Bootstrap-Skripte, Extensions und Testdateien fest, die ein Lauf lädt. Die Option gibt die effektiven Dateilisten als sortierte absolute Pfade aus und beendet sich vor der Ausführung. Ein Harness oder Reviewer kann die Listen eines Pull Requests mit dem Basis-Branch vergleichen und neue Bootstrap-Skripte oder Testverzeichnisse erkennen.

Bergmann empfiehlt bei PHP-Werkzeugen für Agenten vier Prüfungen: Sind Eingaben in Ausgaben sichtbar, lässt sich deren Struktur fälschen, kann ein Aufruf endlos laufen, und gibt es ein maschinenlesbares Urteil? Das gilt für Test-Runner, statische Analyse, Formatter und Composer-Skripte. Die zentrale Folgerung lautet, dass agententaugliche Werkzeuge einen zweiten Leser berücksichtigen müssen. Die OWASP-Liste für 2026 liefert dafür einen praktischen Prüfkatalog.