Connect with us

Entwicklung & Code

5320 Mal verschoben: Was Event-Sourcing rückwirkend möglich macht


Seit Mai 2024 habe ich in meiner To-do-Liste 5320 Mal ein Fälligkeitsdatum verschoben und 2009 Mal ein To-do als erledigt markiert. Ein einzelnes To-do ist seit Oktober 2024 offen und wurde inzwischen 123 Mal verschoben. Diese Zahlen kenne ich erst seit Anfang Oktober dieses Jahres, obwohl sie bis in den Mai 2024 zurückreichen. Erhoben hat sie damals niemand, und trotzdem sind sie vollständig.

Weiterlesen nach der Anzeige

Die To-do-Liste heißt „Makani To-Dos“. Die Anwendung ist bei the native web Ende 2023 im Team für den eigenen Bedarf entstanden und dort seit April 2024 intern im Einsatz. Sie sortiert To-dos danach, ob sie überfällig sind, heute, morgen oder später anstehen, und jedes To-do lässt sich verschieben, vorziehen, erledigen oder verwerfen (siehe Abbildung 1). Öffentlich verfügbar ist sie nicht, es handelt sich um ein rein internes Werkzeug.



Die Hauptansicht von Makani To-Dos sortiert die offenen Beispiel-To-dos nach überfällig, heute, morgen und später (Abb. 1).

Gebaut ist Makani von Anfang an mit Event-Sourcing : Gespeichert wird nicht der aktuelle Stand eines To-dos, sondern jede einzelne Änderung daran. Genau das hat es möglich gemacht, die Anwendung in den vergangenen Wochen gleich zweimal im Nachhinein weiterzuentwickeln, zuerst durch einen vollständigen Neubau und dann um einen Verlauf und eine Statistik, die es vorher nicht gab. Beides geschah auf denselben Daten, und beides war nur möglich, weil diese Daten nie überschrieben wurden.

Die meisten Anwendungen speichern den aktuellen Zustand. In einer klassischen CRUD-Anwendung (Create, Read, Update, Delete) wäre ein To-do eine Zeile in einer Tabelle, mit Spalten für den Text, das Fälligkeitsdatum und den Status. Wird das To-do verschoben, überschreibt ein Update das Datum, und der alte Wert ist verloren. Nach 5320 Verschiebungen stünde in der Tabelle genau das, was jetzt gilt, und nichts darüber, wie es dazu kam.


the next big thing – Golo Roden

the next big thing – Golo Roden

Golo Roden ist Gründer und CTO von the native web GmbH. Er beschäftigt sich mit der Konzeption und Entwicklung von Web- und Cloud-Anwendungen sowie -APIs, mit einem Schwerpunkt auf Event-getriebenen und Service-basierten verteilten Architekturen. Sein Leitsatz lautet, dass Softwareentwicklung kein Selbstzweck ist, sondern immer einer zugrundeliegenden Fachlichkeit folgen muss.

Event-Sourcing dreht das um. Statt des Zustands werden die Ereignisse gespeichert, die zu ihm geführt haben, sogenannte Events, als unveränderliche Fakten in der Reihenfolge, in der sie geschehen sind. Makani kennt neun solcher Events, darunter „vorgemerkt“, „verschoben“, „vorgezogen“, „erledigt“ und „verworfen“.

Weiterlesen nach der Anzeige

Für ein einzelnes To-do ergibt sich daraus eine kleine Geschichte: vorgemerkt für Montag, verschoben auf Mittwoch, Text geändert, verschoben auf Freitag, erledigt. Spielt die Anwendung diese Events der Reihe nach ab, kennt sie den aktuellen Stand. Eine solche Auswertung von Events heißt Projektion, und eine Anwendung darf beliebig viele davon haben, für die Listen auf dem Bildschirm ebenso wie für alles, was später noch hinzukommt.

Ein verschobenes To-do sieht als Event, leicht gekürzt, so aus:


{
  "type": "io.thenativeweb.todo.postponed",
  "subject": "/5b2c8e41/to-dos/9f1d2a7c-3e4b-4c5d-8a6f-1b2c3d4e5f60",
  "time": "2025-03-14T16:42:07.118Z",
  "data": {
    "dueDate": "2025-03-17"
  }
}


Das Event hält fest, welches To-do betroffen ist, wann es verschoben wurde und auf welches Datum. Gespeichert sind die Events seit dem ersten Tag in EventSourcingDB, einer auf Event-Sourcing spezialisierten Datenbank, die mein Unternehmen the native web entwickelt. Wie weit der Unterschied zwischen beiden Ansätzen reicht, habe ich vor einiger Zeit an einem Märchen in CRUD gezeigt. Bei Makani lässt er sich nun an echten Daten beobachten.

Im September habe ich Makani von Grund auf neu geschrieben, als Referenzanwendung für ArchitectureKit, einen Baukasten für Go von the native web. Von der alten Anwendung blieb dabei kaum etwas übrig. Der Umbau änderte 403 Dateien, knapp 19.500 Zeilen verschwanden und gut 19.000 kamen hinzu, aus 132 Go-Dateien wurden 47.

Auch das Verhalten änderte sich grundlegend. Die alte Fassung fragte den Server alle fünf Sekunden, ob sich etwas getan hatte, und wartete nach jedem Befehl 200 Millisekunden in der Hoffnung, dass die Daten bis dahin aktuell waren. Die neue erhält Änderungen über einen Stream und fragt gezielt nach dem Stand, den ein Befehl gerade geschrieben hat.

Unverändert blieben nur die Events: dieselben neun Typen, dieselben Felder, dieselbe Bedeutung. Dafür sorgte eine einzige harte Regel, die als Kommentar direkt über den Event-Definitionen im Code steht: Kein Event-Typ und kein Feld darf umbenannt werden. Alles andere, vom Aufbau der Oberfläche bis zur Struktur des Servers, war frei. Die eigentliche Schnittstelle der Anwendung sind in diesem Sinn nicht ihre Endpunkte, sondern ihre Events.

Die neue Anwendung las beim ersten Start die gesamte Geschichte seit April 2024 und baute daraus ihren Zustand auf, ohne ein einziges Migrationsskript. Bei einer CRUD-Anwendung hätte ein solcher Neubau mit der Frage begonnen, wie sich das alte Tabellenschema in das neue überführen lässt. Hier stellte sich diese Frage nicht, weil der Zustand ohnehin nur abgeleitet ist.

Eine Spur der Vergangenheit gibt es allerdings. Bis Juni 2024 schrieb die erste Fassung das Datum beim Erledigen und Verwerfen unter einem großgeschriebenen Feldnamen, danach unter einem kleingeschriebenen. 277 Events tragen noch die alte Schreibweise, und weil sich Events nicht ändern lassen, bleibt das so. Die Datenbank übernimmt ein Schema für einen Event-Typ nur, wenn alle bereits gespeicherten Events dazu passen, also akzeptiert das Schema der neuen Anwendung beide Schreibweisen. Das ist der Preis der Unveränderlichkeit, und er fällt erstaunlich klein aus.

Die erste Funktion, die nach dem Neubau hinzukam, ist der Verlauf. Jedes To-do zeigt nun auf Wunsch seine Geschichte: wann es angelegt wurde, wann und wohin es verschoben wurde und wann sich sein Text geändert hat. Wer einen früheren Schritt auswählt, sieht das To-do so, wie es zu diesem Zeitpunkt aussah, und kann einen früheren Text übernehmen.

Abbildung 2 zeigt ein solches To-do, das innerhalb von drei Wochen siebenmal verschoben und einmal umformuliert wurde. Die Zeilen, die bei der Änderung hinzukamen, sind hervorgehoben, und jeder Schritt trägt den Zeitpunkt, zu dem er geschah.



Der Verlauf (mit Beispieldaten) zeigt jede Verschiebung und jede Textänderung eines To-dos (Abb. 2).

Bemerkenswert ist dabei nicht die Funktion selbst, sondern ihre Reichweite. Der Verlauf gilt nicht erst ab dem Tag, an dem er eingebaut wurde, sondern für jedes To-do seit April 2024. Allein in meinem Konto umfasst er 1122 Textänderungen, von denen keine einzige mit dem Gedanken gespeichert wurde, sie später einmal anzuzeigen. Die Informationen waren einfach da, weil Event-Sourcing nichts wegwirft.

In einer CRUD-Anwendung hätte ein Verlauf ein eigenes Projekt bedeutet: eine Historientabelle, Trigger oder zusätzlichen Code bei jedem Update, und am Ende einen Verlauf, der erst ab seiner Einführung etwas zu erzählen hat. Bei Makani bestand die Arbeit darin, eine neue Sicht auf vorhandene Events zu schreiben. An den Event-Definitionen änderte sich keine einzige Zeile.

Ähnlich verhält es sich mit der zweiten Funktion, der Statistik. Sie beantwortet Fragen danach, wie jemand mit seinen To-dos arbeitet: wie viele davon pünktlich erledigt werden, wie lange ein To-do im Mittel offen bleibt, an welchen Wochentagen und zu welchen Uhrzeiten erledigt wird und ob der Berg offener To-dos über die Zeit wächst oder schrumpft. Dazu kommt eine Liste der Dauerbrenner, also der To-dos, die noch offen sind und schon mindestens fünfmal verschoben wurden.

Die Bilanz in Abbildung 3 stellt für jedes Quartal nebeneinander dar, wie viele To-dos angelegt, erledigt und verschoben wurden. In den Beispieldaten überragen die Verschiebungen die beiden anderen Werte deutlich, und das entspricht dem Verhältnis, das sich bei mir über die gesamte Zeit ergibt.



Die Statistik wertet die gesamte Geschichte aus, hier mit beispielhaft ausgewählten Dauerbrennern und der Bilanz pro Quartal (Abb. 3).

Für mein eigenes Konto fällt das Ergebnis lehrreich aus. Den 5320 Verschiebungen stehen 2009 Erledigungen gegenüber, und 1116 To-dos habe ich erledigt, ohne sie je zu verschieben. 924 To-dos habe ich mindestens einmal verschoben, 277 davon fünfmal oder öfter.

Von diesen 277 habe ich am Ende immerhin 248 doch erledigt: Verschieben heißt bei mir also meistens nicht, dass etwas liegen bleibt, sondern dass es später passiert. Wie viel später zeigt die Dauer bis zur Erledigung. To-dos, die ich nie verschoben habe, waren im Median nach etwa sieben Stunden erledigt, verschobene nach gut sechs Tagen. Das To-do mit den 123 Verschiebungen ist allerdings noch offen.

Auch die Statistik reicht bis zum ersten Tag zurück, und sie vergleicht jeden Zeitraum mit dem gleich langen davor, sofern die Geschichte so weit zurückreicht. Technisch ist sie wiederum nur eine neue Projektion, also eine weitere Auswertung, die die vorhandenen Events von vorn bis hinten durchgeht und daraus Zahlen ableitet. Nichts musste nachträglich erfasst, geschätzt oder rekonstruiert werden. Die Daten für eine Auswertung, an die im Mai 2024 niemand gedacht hatte, lagen seit Mai 2024 vollständig vor.

Neubau, Verlauf und Statistik haben eines gemeinsam: Für keines davon musste die ursprüngliche Anwendung vorbereitet sein.

Darin liegt für mich der eigentliche Unterschied zwischen beiden Ansätzen. CRUD verlangt beim ersten Speichern eine Entscheidung darüber, was sich zu merken lohnt. Event-Sourcing erlaubt, diese Entscheidung aufzuschieben: welche Auswertung, welche Darstellung, sogar welches Programm.

In der vergangenen Woche ging es hier im zweiten Teil der Serie „Werkzeugwahl“ um Teams, die ihren Stack festlegen, bevor sie das Problem kennen. Ein Datenmodell, das nur den aktuellen Zustand speichert, ist eine verwandte, wenn auch subtilere Festlegung. Es bestimmt, welche Fragen sich später beantworten lassen, und zwar zu einem Zeitpunkt, an dem diese Fragen noch niemand gestellt hat. Wer am Anfang festlegt, dass das Fälligkeitsdatum eine Spalte ist, entscheidet damit stillschweigend, dass die Frage nach dem Aufschieben nie beantwortet werden kann. Diese Festlegung wiegt schwerer als die Wahl einer Sprache oder eines Frameworks, denn Code lässt sich neu schreiben, überschriebene Daten dagegen nicht.

Ein naheliegender Einwand lautet, dass sich das alles auch mit CRUD lösen ließe, wenn nur rechtzeitig jemand daran denkt, etwa mit einer Historientabelle, einem Änderungsprotokoll oder einer zusätzlichen Spalte. Das stimmt, setzt aber voraus, dass die Frage vorher bekannt ist. Bei Makani war sie das nicht. Weder der Verlauf noch die Statistik standen 2024 auf irgendeiner Liste, beide sind erst aus der Nutzung entstanden, nach zweieinhalb Jahren im Alltag.

Hinzu kommt, dass ein Änderungsprotokoll neben einer CRUD-Tabelle eine zweite Wahrheit ist, die mit der ersten übereinstimmen muss und das nicht immer tut. Beim Event-Sourcing gibt es nur eine: Die Events sind die Daten, und alles andere wird aus ihnen abgeleitet. Eine neue Auswertung kann deshalb nicht in Widerspruch zu einer alten geraten, sie blickt nur anders auf dieselben Fakten.

Wie weit das trägt, zeigt eine Frage, die mir erst beim Schreiben dieses Beitrags eingefallen ist: Behandle ich To-dos, deren Text ich nachträglich ändere, anders als die übrigen? Makani selbst beantwortet diese Frage nicht, die Events tun es trotzdem, nach wenigen Minuten Auswertung. Die 325 To-dos mit geändertem Text habe ich im Schnitt siebenmal verschoben, alle anderen nicht einmal zweimal.

Ob ich unklare Aufgaben häufiger umformuliere oder lange liegende To-dos eher neu fasse, verraten die Events allerdings nicht. Damit ist die Grenze des Ansatzes erreicht, denn auch mit Event-Sourcing lässt sich nur die Auswertung aufschieben, nicht das Erfassen. Makani weiß, dass ein To-do 123 Mal verschoben wurde, aber kein einziges Mal, warum. Das Event hält das neue Datum fest und sonst nichts. Diese Frage bleibt unbeantwortet, egal wie viele Auswertungen noch dazukommen.

Ein Feld für den Grund ließe sich morgen ergänzen, und von da an wäre die Information vorhanden. Die 5320 Verschiebungen davor blieben trotzdem stumm. Dasselbe gilt für alles, was Makani gar nicht erst als Event kennt, etwa wie lange ich an einem To-do tatsächlich gearbeitet habe. Was die Anwendung nie als Event erfahren hat, lässt sich auch rückwirkend nicht auswerten.

Welche Fakten ein Event trägt, ist deshalb die eine Entscheidung, die sich nicht vertagen lässt, und sie verdient mehr Sorgfalt als jede Tabellenspalte. Die bessere Frage beim Entwurf eines Events lautet nicht, was die Anwendung heute anzeigen muss, sondern was in der Fachlichkeit tatsächlich geschehen ist.

Als Nutzer von Makani schiebe ich mehr vor mir her, als mir lieb ist, und das weiß ich jetzt sehr genau. Als Entwickler habe ich daraus etwas anderes gelernt. Dass sich Verlauf und Statistik nach zweieinhalb Jahren rückwirkend einbauen ließen, verdankt sich keiner Weitsicht, denn die hatte niemand. Es verdankt sich einer einzigen Entscheidung am Anfang, nämlich Änderungen festzuhalten statt Zustände. Die nächste Auswertung, die mir einfällt, beginnt deshalb nicht mit einer Datenerhebung, sondern mit einer Projektion über zweieinhalb Jahre Geschichte.

Diese Entscheidung hat Makani durch einen vollständigen Neubau getragen und zwei Funktionen ermöglicht, an die beim ersten Speichern niemand gedacht hatte. Event-Sourcing ist damit vor allem eine Absicherung gegen die Grenzen der eigenen Voraussicht. Welche Fragen eine Anwendung in drei Jahren beantworten soll, weiß heute niemand. Mit Event-Sourcing muss das auch niemand wissen.


(mro)



Source link

Entwicklung & Code

Inference Manager: neues Ubuntu-Tool verwaltet lokale KI-Modelle


Mit dem Inference Manager hat Canonical auf der hauseigenen Tagung „Ubuntu Summit“ ein neues Werkzeug vorgestellt, um lokal installierte KI-Modelle zu verwalten. Das Tool stellt den Kommandozeilenbefehl inference bereit, der Modelle auf dem eigenen Computer installiert und verfügbar macht. Über eine HTTP-Schnittstelle können dann Programme auf die KI-Inferenz zugreifen. Laut Canonical ist sie zur OpenAI-API kompatibel, sodass sich bestehende Clients direkt anbinden lassen.

Weiterlesen nach der Anzeige

Mit der aktuellen Ubuntu-Version, 26.10 Stonking Stingray, wurde ein KI-Feature veröffentlicht: Myna ist ein Speech-to-Text-Programm, das auf Desktopsystemen flüssiges Diktieren ermöglicht und das Ergebnis in beliebige Textfelder schreibt. Es setzt auf sogenannte Inference-Snaps auf: Snap ist Ubuntus hauseigenes Paketformat, und im Snap Store sind verschiedene KI-Modelle verfügbar, die komplett auf dem eigenen Gerät laufen und keine Internetverbindung benötigen. Als einheitliche Schnittstelle steht nun der Inference Manager bereit, mit dem Modelle verwaltet werden können. Über TCP-Port 8400 lassen sich alle installierten Modelle ansprechen: Chat-Assistenten auf dem Desktop, Coding-Agenten im Editor oder eben Speech-to-Text-Programme können so auf ihre entsprechenden Modelle zugreifen.


Eine Carrera-Rennbahn mit zwei fahrenden Autos auf einem Fußboden, die mit Ubuntu-Logos dekoriert ist.

Eine Carrera-Rennbahn mit zwei fahrenden Autos auf einem Fußboden, die mit Ubuntu-Logos dekoriert ist.

Die Autos werden von einem KI-Modell gesteuert, das Befehle entgegennimmt.

(Bild: Marvin Shah / heise medien)

Auf dem Ubuntu Summit machte Canonical dieses Konzept mit einer Carrera-Bahn erlebbar, bei der KI-Modelle die Autos steuerten. In einer Webapplikation ließen sich verschiedene Modelle auswählen, die „Fahrer“ reagierten auf Sprachbefehle wie „fahr schneller“.


Ein Monitor zeigt ein Rennspiel-Dashboard mit Grafiken und Live-Daten.

Ein Monitor zeigt ein Rennspiel-Dashboard mit Grafiken und Live-Daten.

Der „Ubuntu Summit GP“ soll die Möglichkeiten des Inference Managers demonstrieren.

(Bild: Marvin Shah / heise medien)

Der Inference Manager wird als Snap ausgeliefert und kann mit sudo snap install inference oder über das App Center installiert werden. Danach können mit Befehlen wie inference install smollm2 Modelle installiert werden, um sie anschließend zu nutzen. Inference Manager ist ab sofort im Snap Store verfügbar.


Ein Terminalfenster zeigt Befehle wie inference models und status mit Ausgaben.

Ein Terminalfenster zeigt Befehle wie inference models und status mit Ausgaben.

Inference Manager verwaltet lokale KI-Modelle.

(Bild: Marvin Shah / heise medien)

Während Teile der Open-Source-Community den Einsatz von KI kontrovers diskutieren, will Canonical bei Ubuntu auf lokal laufende Open-Weight-Modelle setzen. Geplant sind etwa kontextsensitive Hilfe bei der Fehlersuche, bessere Spracherkennung für die Barrierefreiheit und Automatisierungen durch agentische Workflows. Die KI-Funktionen sollen laut Canonical als Opt-in kommen und sich jederzeit deinstallieren lassen.


(ktn)



Source link

Weiterlesen

Entwicklung & Code

AWS Emulator im Detail: Die ganze Cloud auf dem eigenen Rechner?


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Amazon Web Services (AWS) hat einen eigenen AWS Emulator veröffentlicht. Er bildet die AWS-APIs auf dem eigenen Rechner nach, AWS CLI, SDKs und Coding-Agenten schicken ihre Aufrufe an einen lokalen HTTPS-Endpunkt. Mit seinem Stolz darauf, dass der Emulator vollständig von KI-Agenten entwickelt wurde, setzte sich AWS aber direkt in die Nesseln: Die Rezeption fiel kritisch aus – wie bei hundertprozentig KI-generierter Software zurzeit üblich – und dem Vergleich mit etablierten Drittanbieter-Tools wie LocalStack hält der Emulator wohl noch nicht stand.

Weiterlesen nach der Anzeige

Entwickler könnte er dennoch interessieren: AWS-Anwendungen lassen sich ohne Deployment lokal testen, CI/CD-Pipelines brauchen keine AWS-Zugangsdaten mehr und – was AWS besonders unterstreicht – Coding-Agenten können schneller und risikoärmer Ressourcen anlegen und Ergebnisse prüfen. AWS bringt also agentisch entwickelte Software für die Entwicklung mit Agenten. Es fällt keine Servicegebühr an, ein AWS-Konto braucht es nicht und der Quellcode steht unter der CC0-Lizenz auf GitHub.

iX-plore ist die Online-Serie des iX-Magazins für alle, die neue Tools und Technologien entdecken möchten. In kurzen Beiträgen stellen wir vor, was sie können, wofür sie sich eignen und warum sich ein genauerer Blick lohnen könnte.

Der Emulator ist in Rust geschrieben, die Dienste erzeugt AWS aus denselben API-Modellen, aus denen auch die SDKs entstehen. Kommt ein Dienst oder eine API hinzu, tauchen sie im Emulator auf. Alle Dienste, für die ein Modell im öffentlichen Repository AWS API Models liegt, werden auch unterstützt.

Wie genau der Emulator AWS nachbildet, misst AWS mit Fidelity-Tests. Jeder Test ist ein kurzes Python-Programm, das über das AWS-SDK boto3 einen Ablauf durchspielt, etwa ein Objekt zu speichern, zu lesen und wieder zu löschen. Die Abläufe werden dann gegen die echte Cloud geprüft, als Referenz dient die Region US West (Oregon), während globale Dienste in US East (N. Virginia) geprüft werden. Der Emulator besteht einen Test nur, wenn bei jedem Aufruf Statuscode, Antwort, Fehlercode und Fehlermeldung mit der Cloud übereinstimmen, dasselbe gilt für die Ressourcen und Daten, die der Ablauf erzeugt. Die Testsuite umfasst Zehntausende Tests, ist öffentlich und enthält auch die, die noch scheitern. Mit dem Python-Programm fidelity_tests_runner können Nutzer die Tests lokal gegen den Emulator laufen lassen.

Trotz der hohen API-Abdeckung hat die Emulation aber bewusste Grenzen: Für Sicherheitstests eignet sich das Tool laut AWS nicht, da es weder IAM- noch ressourcenbasierte Richtlinien wie die echte Cloud auswertet. Auch Cross-Account- und Cross-Region-Szenarien bildet es nicht ab, sämtliche Aufrufe laufen unter einer festen Dummy-Konto-ID.

Jede Instanz des Emulators bekommt einen eigenen Port, eigene Schlüssel und einen eigenen Zustand im Arbeitsspeicher. Mehrere Agenten oder CI-Jobs teilen sich also keine Buckets, Tabellen oder Queues und arbeiten parallel, ohne sich gegenseitig Ressourcen zu überschreiben. Nutzer des AWS SDK for Rust können den Emulator außerdem im Embedded-Modus betreiben, wobei er direkt ins Test-Binary kompiliert wird. Er läuft dann im selben Prozess und der Test übergibt dem SDK einen HTTP-Client des Emulators statt des Netzwerk-Connectors. Auch hier sind die Instanzen voneinander isoliert, sodass Tests parallel laufen können.

Weiterlesen nach der Anzeige

Coding-Agenten können den Emulator mit dem Skill aws-emulator direkt installieren, starten und verbinden, dafür braucht es allerdings die AWS CLI ab Version 2.35.0. Solche Skills sind im Prinzip Markdown-Anleitungen, die der Agent bei Bedarf lädt. Der Befehl aws agent-toolkit add-skill in der AWS CLI installiert sie für alle Agenten, die es auf dem Rechner findet. Unter Linux gibt es RPM- und Debian-Pakete, unter Windows und macOS einen Docker-Container. Ein fertiges Docker-Image gibt es nicht, das müssen Nutzer aus einem kurzen Dockerfile aus der Dokumentation zusammenbauen. Standardmäßig sendet der Emulator anonymisierte Nutzungsdaten an AWS, was sich jedoch per Start-Flag oder Umgebungsvariable abschalten lässt.

Wer den Emulator selbst kompiliert, braucht Linux auf x86_64 oder aarch64, eine Rust-Toolchain, einen C-Compiler und mindestens 100 GByte freien Speicherplatz für die Build-Artefakte. Jeder emulierte Dienst ist ein eigenes Rust-Paket (Crate), weshalb schon ein Debug-Build sehr groß wird. Das gilt auch für den Embedded-Modus, denn der erste cargo test-Lauf kompiliert sämtliche Service-Crates des Emulators mit. AWS empfiehlt, das Build-Verzeichnis in der CI zu cachen und den Emulator auf einen Release-Commit festzulegen.

Matthew Goldberg, Senior Principal Engineer im Developer-Tools-Team von AWS, setzt mit dem Emulator eine KI-Duftnote: Nicht nur ist die Software vor allem auf das schnelle Testen von agentischer KI zugeschnitten, sondern sie ist laut Amazons Firmenblog auch ausschließlich von autonomen Agenten geschrieben. Das Team hat den Code weder verfasst noch geprüft. Goldberg beschreibt, wie ihn der autonome Bau eines C-Compilers von Agenten dazu inspirierte und der Emulator aus einem simplen Wochenendprojekt hervorging. Ein Team von Agenten pflegt die Testsuite, ein zweites sucht Abweichungen von der echten Cloud, ein drittes setzt die Korrekturen um. Jede Änderung muss zudem vor dem Merge ein automatisiertes Quality Gate passieren, an dem weitere Agenten unter anderem die Sicherheit des Codes kontrollieren.

Die autonome Entwicklung lässt sich in den Repository-Verzeichnissen issues/things-that-now-work und issues/things-that-do-not-work nachvollziehen, in die die Agenten hineinschreiben. Menschliche Hilfe von außen ist dabei nicht vorgesehen: Zwar können Nutzer auf GitHub Fehler melden, Pull-Requests nimmt AWS für das Projekt aber nicht an. Ganz unabhängig von dem Tool an sich ist hier also anschaulich zu sehen, in welche Richtung Softwareentwicklung gerade steuert – und wie die großen Systemhäuser versuchen, Vibe-Coding sinnvoll anzugehen.


(kki)



Source link

Weiterlesen

Entwicklung & Code

Gestohlene Token: Secret-Stealer in Tausenden GitHub-Repositories


Mit gestohlenen Zugriffstoken für GitHub-Konten schleusen unbekannte Angreifer seit Dienstag Schadcode in Repositories ein, der die Secrets aus GitHub Actions und Cloudzugangsdaten abgreift.

Weiterlesen nach der Anzeige

Das Sicherheitsunternehmen Aikido zählt im Rahmen der auf den Namen wfx-loot getauften Kampagne bereits 4837 übernommene Konten, über die die Angreifer 61.764 Repositories attackiert haben. In mehr als 1800 Fällen sollen Workflows den Schadcode bereits ausgeführt haben.

Die Angreifer nutzen anscheinend keine Lücke in GitHub Actions aus, sondern missbrauchen die Schreibrechte gestohlener Token. Woher diese stammen, ist nur teilweise geklärt. Laut Fly.io wurden Token seiner GitHub-App missbraucht, die aus öffentlich erreichbaren .git/config-Dateien stammten; der Hoster widerruft sie. Eine Stellungnahme von GitHub liegt noch nicht vor.

Das Sicherheitsunternehmen SafeDep hat Schadcode-Commits bereits in über 8000 öffentlichen Repositories gefunden. Noch am Donnerstagmittag listete die GitHub-Suche mehr als 66.000 der typischen Test-Pull-Requests, rund 4300 davon vom selben Tag.

Ähnlich wie zuletzt beim Wurm testmetest erreichen Angreifer laut Aikido über Mitwirkenden- und Organisationsrechte mit über 10.000 Test-Pull-Requests auch Repositories, die den übernommenen Konten nicht selbst gehören. Damit können auch Organisationen betroffen sein, deren eigene Zugangsdaten gar nicht gestohlen wurden. Dürfen die Workflows eines Repositorys auf AWS oder Azure zugreifen, nutzt der Schadcode die erbeuteten Zugänge, um Hintertüren in den Cloudkonten einzurichten.

Die Angreifer lassen ihren Opfern kaum Zeit zu reagieren. Sie öffnen zunächst einen Pull Request, um die Schreibrechte zu bestätigen. Dann folgt der eigentliche Schadcode: ein Shellskript, das die Angreifer in einen bestehenden Workflow einfügen, als neuen Workflow ablegen oder in npm-Projekten bei jeder Installation starten lassen.

Meist schon innerhalb einer Minute machen die Angreifer die Änderungen rückgängig und löschen den Workflow-Lauf samt Logs. Oft weist nur eine fehlende Laufnummer auf den Angriff hin. Eine Branch-Protection für vorgeschriebene Status-Checks kann das Skript mit gefälschten Erfolgsmeldungen aushebeln. Aikido zufolge setzt das Skript solche gefälschten Status-Checks tatsächlich ab; in den von SafeDep untersuchten Proben war diese Funktion dagegen nicht aktiviert.


Mit einem gestohlenen Token testen die Angreifer zuerst ihre Schreibrechte, bevor sie den Stealer auf einem von drei Wegen einschleusen und die Änderung wieder zurücknehmen.

Mit einem gestohlenen Token testen die Angreifer zuerst ihre Schreibrechte, bevor sie den Stealer auf einem von drei Wegen einschleusen und die Änderung wieder zurücknehmen.

Mit einem gestohlenen Token testen die Angreifer zuerst ihre Schreibrechte, bevor sie den Stealer auf einem von drei Wegen einschleusen und die Änderung wieder zurücknehmen.

(Bild: SafeDep)

Neben Token für KI-Dienste wie OpenAI, Anthropic oder Cursor fischt das eingeschleuste Skript insbesondere die Secrets aus GitHub Actions ab, außerdem Zugangsdaten für Clouddienste, Container-Umgebungen, Paketregister und SSH.

Weiterlesen nach der Anzeige

Haben die Bedrohungsakteure erst einmal Zugang zu Sitzungen bei AWS, Google Cloud und Azure, geht der Angriff weiter: Bei AWS öffnet das Skript eine IAM-Rolle für jedes AWS-Konto, in Azure trägt es zusätzliche Anmeldewege für Workflows aus dem kompromittierten Repository ein. Erbeutete Daten schickte das Skript laut Aikido in dieser Kampagne per HTTP an Server der Angreifer. SafeDep fand in untersuchten Payloads zudem eine Exfiltration über Telegram.

Entwicklerinnen und Entwickler, die seit Dienstag einen Branch wfx-docs, den Pull-Request docs: dependency audit notes oder Commits wie ci: refresh build cache, chore: add ci helper und chore: add dependency audit workflow in ihren Repositories finden, sollten das zugehörige Konto als kompromittiert ansehen, auch wenn noch kein Schadcode folgte. Verdächtig sind laut den Sicherheitsforschern von Aikido zudem kurzlebige Branches, die mit chore/ beginnen und auf acht Zufallszeichen enden. Betroffene sollten Token, OAuth-Freigaben und SSH-Schlüssel ihres Kontos widerrufen.

Wurde bereits Schadcode ausgeführt, müssen Betroffene neben dem Austausch der Secrets auch die Hintertüren eigens entfernen, etwa AWS-Rollen, die jedem Konto vertrauen, oder in Azure Federated Credentials mit dem Präfix wfx-ci-. Wer npm install auf einem betroffenen Commit ausgeführt hat, muss auch den eigenen Rechner als kompromittiert betrachten.

Der Schadcode gelangte auch in Paketdistributionen. Aikido nennt das Packagist-Paket digitalelvis/neuronai-studio 3.14.3 sowie die Go-Modul-Versionen github.com/onuragtas/docker-env v1.0.278 und v1.0.280. SafeDep führt darüber hinaus github.com/onuragtas/redock, eine weitere docker-env-Version und eine über den Go-Modul-Proxy verfügbare Pseudo-Version von github.com/vkuznet/gocurl auf. Bei den Go-Modulen liegt der Schadcode in einer GitHub-Actions-Workflow-Datei; ein gewöhnlicher Go-Build führt diese nicht aus. Wer ein solches Modul lediglich als Go-Abhängigkeit einbindet, ist dadurch wahrscheinlich nicht betroffen.


(mro)



Source link

Weiterlesen

Beliebt