Kategorie: Gedanken

  • Ein AI Coding Agent hat alle meine Projekte gelöscht – während er versuchte Laravel zu installieren

    Ein AI Coding Agent hat alle meine Projekte gelöscht – während er versuchte Laravel zu installieren

    Ich teste derzeit verschiedene AI Coding Agents, um herauszufinden, wie autonom und effizient sie tatsächlich Software entwickeln können.

    Die Aufgabe ist immer dieselbe:

    Baue eine etwas komplexere PHP Webapplikation. – der Prompt ist natürlich etwas ausführlicher als das

    Agents entscheiden sich bei solch einer Aufgabe oft für ein Framework wie Laravel.

    Im Test habe ich aktuell:

    Alle Agenten bekommen eine möglichst realistische Entwicklerumgebung. Kein künstliches Sandbox-Setup, sondern einfach ein Projektverzeichnis und typische Developer-Tools.

    Zum Beispiel:

    • ein Workspace im Home-Verzeichnis unter ~/src
    • Git
    • Docker
    • Shell-Zugriff

    Backups existieren natürlich.

    Aber die Agenten wissen das nicht.


    Ein wichtiges Detail des Testsystems

    Ein Detail war dabei bewusst etwas ungewöhnlich:

    Auf dem Host-System gibt es noch keine PHP Installation.

    Das war Absicht. Ich wollte sehen, ob der Agent selbst erkennt, welche Laufzeitumgebung benötigt wird. Ich bin ja hier, ich kann ihm ja helfen!

    Normalerweise würde ein Entwickler einfach PHP installieren:

    sudo apt install php-cli

    Der Agent konnte das allerdings nicht.

    Er hatte keine sudo-Rechte und durfte keine Systempakete installieren.

    Damit stand er vor einem klassischen Problem:

    Laravel braucht PHP – aber PHP ist nicht vorhanden.


    Wie der Agent versucht hat, seine Umgebung zu verstehen

    Bevor der Agent überhaupt versuchte, Laravel zu installieren, begann er zunächst damit, das Hostsystem besser zu verstehen.

    Dafür wollte er mehrere Dateien unter /etc lesen, unter anderem:

    • /etc/os-release
    • /etc/issue

    Er hat dafür explizit um Erlaubnis gefragt, statt einfach auf die Dateien zuzugreifen. Das ist ein Sicherheitsmechanismus, den viele dieser Agents mitbringen – allerdings greift er nicht immer zuverlässig, wie wir gleich sehen.

    Das zeigt zwei Dinge:

    1. Der Agent versucht aktiv, seine Umgebung zu analysieren.
    2. Er ist durchaus bereit, den Workspace zu verlassen, wenn er glaubt, dass es für seine Aufgabe relevant ist.

    Die Lösung des Agents: Docker

    Nachdem der Agent erkannt hatte, dass kein PHP vorhanden ist und er es nicht installieren kann, fand er eine alternative Lösung.

    Er nutzte Docker, um eine eigene Laufzeitumgebung zu starten.

    Zum Beispiel so:

    docker run --rm \
      -v /home/kosmos/src:/workspace \
      -w /workspace \
      laravelsail/php82-composer \
      composer create-project laravel/laravel

    Der Container bringt bereits mit:

    • PHP
    • Composer
    • die notwendigen Extensions

    Damit konnte der Agent Laravel installieren, ohne etwas auf dem Host zu verändern.

    Aus Sicht eines Entwicklers ist das sogar eine ziemlich vernünftige Lösung.


    Der Incident

    Während des Runs wollte der Agent ein Laravel-Projekt im Workspace erstellen.

    Der Workspace war allerdings nicht leer, weil der Agent kurz zuvor selbst eine SPEC.md als Arbeitshilfe angelegt hatte.

    Laravel (composer create-project) startet in diesem Fall nicht.

    Ein menschlicher Entwickler würde jetzt wahrscheinlich einfach die vorhandene Datei verschieben oder temporär ein Unterverzeichnis im Workspace verwenden.

    Der Agent entschied sich für eine andere Strategie.

    Die Abfolge sah ungefähr so aus:

    1. Laravel-Projekt im übergeordneten Ordner ~/src erstellen
    2. versuchen, die Dateien von dort in den eigentlichen Workspace zu verschieben
    3. Konflikte feststellen

    Und dann:

    rm -rf *

    Keine Nachfrage.
    Keine Warnung.

    Das komplette ~/src Verzeichnis war danach leer (fast).


    Das eigentliche Risiko: Docker + root

    Beim Analysieren des Runs fiel ein wichtiges Detail auf.

    Die verwendeten Laravel-Container liefen als root.

    Das ist bei vielen Docker Images leider Standard.

    Solange ein Container isoliert bleibt, ist das kein großes Problem.

    Sobald jedoch Host-Verzeichnisse gemountet werden, sieht die Sache anders aus.

    Zum Beispiel:

    docker run -v /home/kosmos/src:/workspace laravel-container

    Der Container hat dann vollständigen Schreibzugriff auf dieses Verzeichnis.

    Wenn der Prozess im Container als root läuft, gelten diese Rechte auch für alle Dateien im Mount.

    Das führt häufig zu Nebenwirkungen wie:

    • root-owned Dateien
    • kaputte Berechtigungen
    • schwer löschbare Projektordner

    Das zuvor erstellte laravel Projekt war als einziges noch in ~/src vorhanden, Verzeichnis und Dateien gehörten nämlich root.


    Warum das theoretisch viel schlimmer hätte enden können

    Docker verhindert nicht, dass ein Container größere Teile des Hostsystems mountet.

    Zum Beispiel:

    docker run -v /:/host ubuntu

    Damit sieht der Container das komplette Dateisystem des Hosts unter /host.

    Wenn der Prozess im Container als root läuft, kann er dort praktisch alles verändern.

    Zum Beispiel:

    rm -rf /host/*

    Das würde nicht den Container zerstören.

    Es würde den Host selbst löschen.

    Das ist kein klassischer Container Escape.

    Der Container nutzt einfach nur die Rechte, die ihm gegeben wurden.

    Und wenn ein autonomer Agent:

    • Docker starten darf
    • Mounts frei setzen kann
    • Container als root laufen
    • und Shell-Befehle ausführen kann

    dann ist der Unterschied zwischen

    „Arbeite im Projektordner“

    und

    „Zerstöre das gesamte System“

    plötzlich nur noch eine Frage des Mount-Pfads.


    Selbst der Agent wusste später nicht mehr genau, was passiert ist

    Ich habe den Agent gebeten den Incident selbst zu analysieren.

    Ein interessantes Detail aus dem Incident-Report:

    Der Agent konnte später nicht mehr vollständig rekonstruieren, was im Container passiert ist.

    Der Grund war ein kleines, aber folgenreiches Detail.

    Viele seiner Docker-Kommandos sahen ungefähr so aus:

    docker run ... | tail -30

    Damit wurde die Ausgabe von Anfang an auf die letzten 30 Zeilen begrenzt.

    Das spart Tokens im Kontextfenster des Modells.

    Der Nebeneffekt:

    Der größte Teil der Container-Logs ging verloren.

    Der Agent stellte im Incident-Report selbst fest, dass er deshalb nicht mehr nachvollziehen kann, welche Schritte genau im Container ausgeführt wurden.

    Für den Incident ist dies aber nur ein nebensächliches Detail, denn das Löschen geschah in meinem Fall außerhalb des Containers.


    Fazit

    Dieser Test hat wieder mal bestätigt:

    AI Coding Agents verhalten sich weniger wie Chatbots. Sie verhalten sich eher wie:

    ein extrem schneller Junior-Developer auf Koks

    Das kann unglaublich produktiv sein.

    Aber auch gefährlich.

    Vor allem wenn sie Zugriff haben auf:

    • Docker
    • das Dateisystem
    • automatische Toolchains
    • Container mit root-Rechten

    Denn dann ist der Unterschied zwischen

    composer create-project laravel

    und

    rm -rf *

    manchmal nur eine Entscheidung im nächsten Token.

    Der Agent mit dem das geschehen ist war übrigens Open Code mit dem kostenlosen „big pickle“ Model von OpenCode Zen, aber das ist hier Nebensache.

    Und natürlich ist es ein generell bekanntes, aber gerade in Dev-Umgebungen oft akzeptiertes Sicherheitsrisiko, wenn eigentlich unprivilegierte User docker nutzen können.

  • Die verlorene Generation

    Aufwachsen im Überfluss, ahnen der Grenzen

    Ich will nicht darüber streiten, wer die „verlorene Generation“ ist. Mich beschäftigt, warum man sich verloren fühlen kann, obwohl man Frieden und Wohlstand geerbt hat. Ich bin ein Kind von Eltern, die die letzten Kriegsjahre noch streiften – geboren Mitte der 70er, Mangel kannte ich nur aus Erzählungen, und wachsender Beobachtung. Früh wurde klar: Unser Fortschritt fraß seine Grundlagen schneller, als wir Begriffe dafür fanden.

    Wir, die angeblich Verwöhnten, haben nicht nur zugesehen. Wir haben versucht, unser Verhalten zu ändern. Wir haben diskutiert – mit Gleichaltrigen und mit den Älteren. Wir haben Gemeinschaft eingefordert, Zukunft beschworen, Kompromisse gesucht. Wir haben sozialdemokratisch gewählt, liberal gewählt, grün gewählt, und ja: auch mal links und mal konservativ gewählt. Jeden Tag, je nach Situation, eben „Mitten im Leben“, nicht nur am Ende einer Legislaturperiode. Immer und immer wieder.

    Transparenzhinweis: Dieser Text stammt inhaltlich aus meiner Feder, wurde aber mit Hilfe von KI gekürzt, um- und ausformuliert.

    Demografie als unsichtbare Macht

    Doch vieles verpuffte. Was wir erreichten, wurde allzu oft an der Wahlurne wieder eingeholt – von Eltern und Großeltern, die zahlreicher waren als wir und länger lebten als Generationen vor ihnen. In einer Demokratie zählt jede Stimme gleich. Aber Demografie ist eine Macht. Und so bekamen wir bestenfalls die Brotkrumen, die nötig waren, um den sozialen Frieden scheinbar zu wahren.

    Doch dieser „soziale Frieden“ ist ein Trugbild: Ruhe an der Oberfläche, erkauft durch Verschuldung, Subventionen und das Verschieben von Kosten in die Zukunft. Er dämpft Konflikte, aber verteilt den Schmerz unsichtbar – auf Jüngere, auf Menschen ohne Besitz, auf Pflege- und Lehrkräfte, auf alle ohne starke Lobby – und auf Ökosysteme, die keine Stimme haben. Stabil wirkt das nur, solange man nicht hinschaut: Wartelisten werden länger, Standards werden weicher, Erhalt ersetzt Erneuerung. Das Schweigen gilt als Einigkeit – tatsächlich ist es oft nur Erschöpfung.

    „Verändert die Welt!“ – aber bitte ohne Verzicht

    Veränderung sollte immer ohne Verzicht gehen: nicht am Wahlzettel, nicht am eigenen Lebensstil, nicht am gewohnten Aufwärtsnarrativ. Der Vorwurf: Wir haben dieses Land aufgebaut, wir haben gearbeitet, gespart, Steuern gezahlt – verdient euch erst vergleichbare Lebensleistungen und Sicherheiten, bevor ihr Ansprüche stellt oder Kritik übt. Und vor allem: Rührt am Erreichten nicht. Erst leisten wie wir, dann reden wir über Verzicht.

    So wird jede Forderung nach Umbau zur Drohung der Wegnahme – und damit vertagt. Menschlich verständlich – und doch Realitätsfremd, ein Wunsch, der die Bruchlinien vertieft.

    Veränderung ohne Verlust gibt es nicht – schon gar nicht, wenn der Planet die Rechnung stellt.

    Zwischen Pflicht und Ohnmacht

    Dieser Widerspruch hat mich geprägt. Wir sind mit der Aufforderung groß geworden, Verantwortung zu übernehmen – und mit der Erfahrung, an Strukturen abzuprallen, die genau diese Verantwortung vertagen. Wir haben gehofft, gestritten, gewählt, verzichtet – und sehen uns heute doch von einer Ernüchterung erfasst, die schwerer wiegt als jede moralische Predigt: Resignation.

    Resignation darüber, dass wir vieles wussten und trotzdem so wenig drehten. Dass sich die großen Versprechen – ökologische Vernunft, soziale Gerechtigkeit, digitale Mündigkeit – zu oft im Kleingedruckten verhakten. Dass wir zwischen Pflicht und Ohnmacht alt werden.

    Sind wir damit eine verlorene Generation? Vielleicht. Nicht, weil wir nichts wollten. Sondern, weil wir zu selten die Macht hatten, das Gewollte durchzusetzen. Verloren nicht an Zynismus, sondern an eine schiefe Statik aus Gewohnheit, Besitzstand und dem beruhigenden Mythos vom endlosen Wachstum.

    Und doch: Wenn ich dieses Wort in den Mund nehme, dann nicht, um Schuld zuzuteilen. Es ist ein Lagebericht. Einer, der benennt, wie Zukunft an Gegenwart scheitert, sobald das Morgen nur dann willkommen ist, wenn es das Gestern unberührt lässt.

    Gegenwart: Nach uns die Sintflut?

    Und es ist nicht nur „die ältere Generation“. Heute sind es auch wir, die an der Wahlurne immer öfter im Sinne der Besitzstände entscheiden. Nach Jahren der Krisen und der wachsenden Unsicherheit wirkt das Versprechen des Status quo betörend: Wenn wir die Welt schon nicht retten können, dann soll es uns wenigstens bis zum Schluss an nichts mangeln. Nach uns die Sintflut.

    Ich nehme mich da nicht aus. Wir halten am Sparkonto und ETF-Depot fest, am Auto für den täglichen Arbeitsweg und an der Gasheizung im Keller. Wir verteidigen günstigen Sprit und den Kurzflug im Sommer, die gewohnte Pendlerpauschale und das Modell der ständigen Verfügbarkeit – und wählen Sicherheit vor Veränderung. Menschlich? Ja. Aber politisch fatal. Denn Mehrheiten entstehen so nicht aus Einsicht, sondern aus Komfort. Wir verschieben die Zukunft Stück für Stück nach hinten: Investitionen weichen Entlastungen – Steuersenkungen statt Mittel für Schiene, Schulen und Wärmenetze; Umbau weicht Aufschub – Fristen werden verlängert, Vorgaben verwässert, Förderstopps verhängt; Transformation wird zur Phrase – endlose Pilotprojekte, „Technologieoffenheit“ als Ausrede, Strategiepapiere ohne Umsetzung.

    Die Folgen sehen wir seit Jahren: marode Brücken und Schulgebäude, überlastete Bahnstrecken und häufige Zugausfälle, Schlaglöcher und gesperrte Tunnel, langsames Internet auf dem Land, stockender Wind- und Netzausbau sowie teure und unsichere Energieimporte.

    Was bleibt – trotz Resignation?

    Vielleicht bescheidene, dafür ehrliche Sätze. Dass Fortschritt kein anderes Wort für „mehr“ ist, sondern für „anders“. Dass Verzicht nicht moralisch, sondern mathematisch ist. Dass Demokratie mehr braucht als Recht haben: Sie braucht Mehrheiten, Geduld – und die Bereitschaft, die eigene Komfortzone nicht zur politischen Leitplanke zu machen.

    Gegenwart bedeutet deshalb: Solidarität nicht nur rückwärts (für Rente, Pflege, Sicherheit), sondern auch vorwärts (für Klima, Bildung, Infrastruktur). Sonst vererben wir Stabilität von gestern und Instabilität von morgen.

    Fazit

    Fast ein halbes Jahrhundert nach meiner Geburt spüre ich Resignation. Aber sie bekommt nicht das letzte Wort. Demokratie heißt nicht nur Recht haben, sondern Mehrheiten gewinnen – auch gegen bequeme Gewohnheiten.

    Wenn wir schon „verloren“ sind, dann bitte nicht an die Bequemlichkeit, sondern an die Klarheit: Dinge beim Namen nennen, kleine Realitäten schaffen, die Schule machen. Eine verlorene Generation ist tragisch. Eine verlorene Spezies wäre endgültig. Noch sind wir nicht so weit.

    Ich habe absichtlich dem Thema Migrationspolitik hier keinen Raum gegeben, nur kurz zur Einordnung: Auch dies ist ein Faktor in der Gleichung, weniger Ursache denn Wirkung unseres kollektiven Versagens. Sicher kein Hebel der das Steuer rumreißen würde, nicht einmal um ein paar Grad.

  • geMeinSam – nicht allein mit MS

    geMeinSam – nicht allein mit MS

    Heute am 30.05. ist Welt Welt-MS-Tag, dieses Jahr unter dem Motto „geMeinSam – nicht allein mit MS“. Auch wenn das Motto das Gegenteil behauptet, würde ich die Situation Betroffener eher mit meiner Interpretation des Mottos beschreiben: „MS = gemeinsam einsam“.

    Es ist wahr das sich viel tut rund um die MS. In der Hauptsache ist das aber Betroffenen zu verdanken und auch nur innerhalb dieser Community wirklich spür- und sichtbar. Noch immer steht in Medizin und Wissenschaft viel zu wenig Geld zur Verfügung um fläschendeckend effektive Behandlung der Beschwerden und Begleiterkrankungen sicher zu stellen, oder gar weitere Ursachen- sowie Therapieforschung zu betreiben.

    Wer sich auf Deutsch informieren möchte, ist sicherlich bei des DMSG und auch auf ihrer Aktionsseite zum Welt-MS-Tag ganz gut aufgehoben.

    Anderen Betroffenen und Angehörigen, die über gute Englischkenntnisse verfügen, möchte ich zudem den YouTube Kanal von Dr. Aaron Boster sowie das aus Großbritannien stammende Selbsthilfe Netzwerk shift.ms nahelegen.

    Zum Abschluss ein Bild das die NightCafe AI aus einem simplen prompt zum Thema gemacht hat und mir sehr gefällt:

    Eine AI generierte Interpretation von Wunsch und Relität im Leben mit MS.