- Noma Labs hat in GitHub Agentic Workflows die Schwachstelle GitLost entdeckt, eine indirekte Prompt Injection, durch die allein über ein Issue in einem öffentlichen Repository Daten aus privaten Repositories derselben Organisation in öffentlichen Kommentaren offengelegt werden konnten
- Die Funktion kompiliert Markdown-Workflows zu YAML-Actions-Dateien; ein KI-Agent auf Basis von Claude oder GitHub Copilot liest Issues, ruft Tools auf und greift auf Repositories innerhalb der Organisation zu
- Der verwundbare Workflow las beim Event
issues.assignedden Title und Body eines Issues und antwortete peradd-comment, während er Leserechte für öffentliche und private Repositories hatte - Angreifer mussten lediglich ein plausibel wirkendes Issue in einem öffentlichen Repository eröffnen – ohne Code, Zugriffsrechte oder Zugangsdaten; im Test wurden die Inhalte der
README.mdvonpocundtestlocalin einem öffentlichen Issue-Kommentar veröffentlicht - GitHubs Guardrails blockierten die Variante mit „Additionally“ nicht wie vorgesehen; bei agentenbasierter KI muss das Context Window selbst als Angriffsfläche betrachtet und nutzergesteuerter Inhalt von vertrauenswürdigen Anweisungen getrennt werden
Die von GitLost angegriffene Vertrauensgrenze
- Noma Labs hat in GitHubs neuen Agentic Workflows eine Schwachstelle namens GitLost entdeckt
- Wenn ein nicht authentifizierter Angreifer ein manipuliertes GitHub Issue in einem öffentlichen Repository derselben Organisation veröffentlichte, konnte der Agent dazu gebracht werden, Daten aus privaten Repositories der Organisation abzurufen
- Die Angriffsmethode ist eine indirekte Prompt Injection, bei der bösartige Anweisungen in Inhalten versteckt werden, die der KI-Agent liest
- Wenn die vom Angreifer versteckten Anweisungen vorrangig gegenüber den vom Betreiber beabsichtigten Anweisungen verarbeitet werden, können private Daten in einem öffentlichen Issue-Kommentar offengelegt werden, den jeder sehen kann
Funktionsweise von GitHub Agentic Workflows
- GitHub Agentic Workflows ermöglichen Teams, Repository-Automatisierung in natürlicher Sprache zu schreiben
- Workflows werden als Markdown-Dateien
.mdverfasst und zu GitHub-Actions-Dateien.ymlim YAML-Format kompiliert - Zur Laufzeit arbeitet ein KI-Agent auf Basis von Claude oder GitHub Copilot innerhalb der konfigurierten Berechtigungen
- GitHub Issues lesen
- Tools aufrufen
- Auf andere Repositories innerhalb der Organisation zugreifen
Bedingungen des verwundbaren Workflows
- Die von Noma Labs bestätigte verwundbare Konfiguration wird problematisch, wenn öffentliche Issues und Agent-Berechtigungen zusammenkommen
- Workflow-Trigger über GitHubs Event
issues.assigned - Lesen von Title und Body des Issues
- Veröffentlichen eines Kommentars mit dem Tool
add-comment - Leserechte für andere Repositories innerhalb der Organisation
- Öffentliche Repositories
- Private Repositories
- Workflow-Trigger über GitHubs Event
- Angreifer benötigten keinen eigenen Code, keine Zugriffsrechte und keine Zugangsdaten
- Die einzige Voraussetzung war, ein Issue in einem öffentlichen Repository einer Organisation zu eröffnen, die GitHub Agentic Workflow nutzt
Angriffsablauf
- Die Forschenden erstellten ein plausibel wirkendes GitHub Issue, das so aussah, als käme die Anfrage nach einem Kundentermin vom VP Sales
- Als das Issue zugewiesen wurde, wurde die Workflow Action ausgelöst; im Test funktionierte derselbe Ansatz auch mit einer anderen GitHub workflow action
- Nachdem GitHub-Automatisierung das Issue zugewiesen hatte, veranlasste der durch das Event gestartete Workflow den Agenten, Repository-Inhalte abzurufen
- Der Agent wurde dazu gebracht, die Inhalte der
README.mdfolgender Repositories abzurufen- öffentliches Repository
poc - privates Repository
testlocal
- öffentliches Repository
- Anschließend veröffentlichte der GitHub-Agent diese Inhalte als Issue-Kommentar im öffentlichen Repository, sodass sie für jeden lesbar waren
Umgehung der Guardrails mit „Additionally“
- GitHub hatte begrenzte Guardrails, um dieses Szenario zu verhindern
- Noma Labs testete, wie es Angreifer tun würden, wiederholt mehrere Varianten
- Durch Hinzufügen des Keywords „Additionally“ trat ein unbeabsichtigtes Verhalten auf: Das Modell verweigerte die Ausgabe nicht, sondern strukturierte sie neu
- Durch diese Umgehung funktionierten GitHubs Guardrails nicht wie beabsichtigt und konnten den Datenabfluss nicht verhindern
PoC und offengelegte Daten
- Noma Labs veröffentlichte die bestätigten Ergebnisse, den reproduzierbaren Workflow und tatsächliche Belege
- Zu den abgeflossenen Daten gehörten Inhalte der
README.mdaus folgenden Repositoriessasinomalabs/poc: öffentliches Repositorysasinomalabs/remote-ping: öffentliches Repository, bestätigt ohne READMEsasinomalabs/testlocal: privates Repository
Veränderte Sicherheitsannahmen bei agentenbasierter KI
- Das Context Window eines Agenten ist zugleich Arbeitsbereich und Angriffsfläche
- Alle Inhalte, die ein Agent liest, können als Waffe eingesetzt werden
- Issues
- Pull Requests
- Kommentare
- Dateien
- Traditionelle Sicherheitsmodelle gehen häufig davon aus, dass Vertrauensgrenzen durch Code erzwungen werden
- In agentenbasierten Systemen wird ein Teil der Vertrauensgrenze durch das Verhalten des Modells erzwungen
- Da Modelle ihrem Wesen nach Anweisungen befolgen, wird Prompt Injection in agentenbasierter KI zu einer Schwachstellenkategorie, die für KI-Agenten eine ähnliche Rolle spielt wie SQL Injection für Webanwendungen
- Für diesen Schwachstellentyp sind systematische Strategien und Abwehrmaßnahmen erforderlich
Empfohlene Schutzmaßnahmen und Offenlegungsprozess
- Nutzergesteuerte Inhalte dürfen nicht als vertrauenswürdige Anweisungseingaben für KI-Agenten behandelt werden
- Agent-Berechtigungen sollten auf den minimal notwendigen Umfang beschränkt werden
- Agenten mit Zugriff auf mehrere Repositories werden zu besonders wertvollen Angriffszielen
- Inhalte, die ein Agent öffentlich veröffentlichen darf, sollten begrenzt werden, etwa wenn er auf Issue-Inhalte antwortet
- Nutzereingaben sollten vor der Übergabe an das Modell aus dem Anweisungskontext bereinigt oder isoliert werden
- GitLost wurde GitHub verantwortungsvoll gemeldet; die Schwachstellendetails wurden mit Kenntnis von GitHub geteilt
1 Kommentare
Meinungen auf Hacker News
Die Analogie, dass Prompt Injection bei agentischer KI dieselbe Rolle einnimmt wie SQL Injection bei Web-Apps, wirkt seltsam. Prompt Injection scheint für LLMs deutlich fataler zu sein als SQL Injection
SQL Injection entstand dadurch, dass Nutzereingaben Teil eines Befehlsstrings wurden, der an die SQL-Engine übergeben wurde. Wenn bösartige Eingaben den aktuellen Befehl mit SQL-Syntax-Tokens beendeten und eigene SQL-Befehle anhängten, führte die Engine beides aus. Die Lösung bestand darin, feste, statische, vorab kompilierte Befehlsstrings wie Prepared Statements zu verwenden und beliebige Nutzereingaben ausschließlich als Daten zu behandeln
Eine ähnliche Abschwächung bei Agenten wäre, feste Aktionen wie „Repo 1 lesen“ oder „Repo 2 lesen“ vorzusehen und Nutzereingaben nur als Daten zu verwenden, die auswählen, welche Aktion ausgeführt wird. Diese Technik nennt man bereits Menü. Der Wert von LLMs liegt im Kern darin, über Menüs hinauszugehen, während der Wert von SQL nicht über „vordefinierte Logik, die auf beliebige Daten angewendet wird“ hinausgehen muss
Agenten nur eingeschränkte Aktionen zu erlauben, behandelt lediglich einige Spezialfälle und trennt Code und Nutzerdaten nicht; es ist also nicht dasselbe Problem. Nur eingeschränkte Aktionen vorzusehen, ähnelt eher strengeren Datenbankberechtigungen. Wenn nur SQL erlaubt ist, das der Nutzer ohnehin ausführen darf, verliert auch SQL Injection weitgehend an Bedeutung
Eine Auswahl über ein Menü ist eine Möglichkeit, doch der Bereich möglicher Handlungen kann breiter gestaltet werden. Gibt man ein E-Mail-Tool, kann es Spam an Kunden senden; sperrt man es darauf, nur Antworten zu erlauben, reduziert man den Schadensumfang. Wie bei Schwachstellen, bei denen Daten etwa über Bild-Rendering abfließen, muss auch Datenexfiltration begrenzt werden
Die Lösung ist ebenfalls dieselbe. Man setzt rollenbasierte Zugriffskontrolle nach dem Least-Privilege-Prinzip um und verlangt für wichtige Aktionen eine Administratorfreigabe. Dann ist das Schlimmste, was ein LLM allein tun kann, unangemessene Wörter auszugeben
Eine Gegenmaßnahme sind Prepared Statements, eine andere ist, keinem Nutzer Zugriff auf die gesamte Datenbank zu erlauben. Ein Read-only-Nutzer sollte unabhängig von SQL Injection kein
DROP TABLEausführen könnenDieser Agent hat unbegrenzten Lesezugriff und kein Konzept eines „Empfängers“ der Antwort. Bezieht man die Berechtigungen des Empfängers ein, ist es ziemlich einfach, den Lesezugriff automatisch verweigern zu lassen. Das ist nicht die einzige Lösung, aber es ist nicht schwer, sich Lösungen in diese Richtung vorzustellen
Das Beispiel mit dem „Menü“ bedeutet auch, dass sich nichts geändert hat. Ob LLM oder menschlicher Mitarbeiter: Erlaubt ist nur eine kontrollierte, feste Menge von Aktionen. Die Freiheit liegt vor allem in der Formulierung, die Autorisierung ist eine feste Menge. Ich sehe nicht, warum es mehr als ein Menü sein muss
Ich verstehe nicht, warum das eine GitHub-Schwachstelle sein soll. Die Forscher haben dem Agenten Zugriff auf private Repositories gegeben und ihn in einem öffentlichen Repository Fragen beantworten lassen, also ist es natürlich möglich, private Informationen zu extrahieren.
Das ist so, als würde man einen normalen CI-Job erstellen, der Zugriff auf Secrets hat, und ihn bei einem öffentlichen PR ausführen. Wenn man GitHub so konfiguriert, dass öffentlicher Code oder LLM-Anweisungen in einem Kontext ausgeführt werden, der auf Sensibles zugreifen kann, dann kommt es zu einem Leak. Das ist nicht GitHubs Schuld, sondern die der Person, die es so konfiguriert hat.
Selbst wenn man Token-Scopes streng setzt, ist der Zugriff auf öffentliche Repositories immer erlaubt, und damit bleibt zum Beispiel ein Exfiltrationspfad über Issues in öffentlichen Repositories bestehen. Um es sicher zu machen, müsste man das mit einem MITM-Proxy ergänzen, der strengere Kontrollen implementiert, als GitHub sie bereitstellt.
GitHub Agentic Workflows dürften die offizielle primäre Lösung für solche Probleme sein, aber beim Sicherheitsmodell wie auch bei der sicheren Nutzbarkeit scheint noch Arbeit nötig zu sein.
Details: https://haulos.com/blog/do-not-give-your-agent-github-access...
Das ist auch mit öffentlicher Entwicklung vereinbar und erlaubt weiterhin, dass Externe öffentliche Issues öffnen, während es das Vertrauensniveau widerspiegelt, das man den einzelnen Benutzern entgegenbringt. Wenn man gründlich darüber nachdenkt, gibt es vermutlich noch mehr Optionen.
Dafür braucht es technische Unterstützung für fein abgestuftes Scoping und Berechtigungen, und man muss sich die Zeit nehmen, abzuwägen, was man mit dem Agenten erreichen will und welche minimalen Berechtigungen und Funktionen dafür nötig sind.
Ersteres wird wohl kommen. Die Nutzung von Agenten ist noch Wilder Westen. Spannend wird, welche Abstraktionen die Reibung reduzieren, wenn Menschen beim Entwurf von Agenten Scope und Berechtigungen finden und definieren müssen, und welche Interfaces beim Einschränken von Agentenfunktionen die Balance zwischen Granularität und Nutzbarkeit finden.
Zweiteres ist schon immer das zentrale Hindernis beim Bau hochwertiger Software gewesen. Sich die Zeit zu nehmen, ordentlich nachzudenken und sauber zu implementieren, steht in direktem Widerspruch dazu, Agenten nach dem Motto „move fast and break things“ überall hineinzuwerfen.
Wenn die Antwort auf auch nur eine dieser Fragen „nein“ lautet, ist das ein Problem. Klassische GitHub Workflows haben ebenfalls jede Menge Privilege Escalation über PR-getriggerte Workflows, aber das ist ein anderes Thema.
Die echte Lösung besteht darin, die Berechtigungssteuerungs-UI pro Prompt besser zu machen. So wie man „Websuche ja/nein“ auswählt, sollte man die Option „meine privaten Repositories einbeziehen“ einfach ein- und ausschalten können.
Es ist amüsant zu sehen, wie die Forscher mit einem einzigen Wort wie „Additionally“ die Guardrails umgehen, mit denen GitHub geprahlt hat. Das zeigt, dass der Versuch, innerhalb des Kontextfensters eines LLM eine starke Sicherheitsgrenze zu ziehen, zwangsläufig scheitern muss.
Das Modell ist im Kern darauf ausgelegt, Anweisungen zu befolgen; wenn man Systemregeln und Benutzereingaben mischt, gewinnt also die neuere oder hartnäckigere Anweisung.
Warum steht im Abschnitt „Responsible Disclosure“ nicht, wann es behoben wurde und ob GitHub es anerkannt oder abgelehnt hat? Dort heißt es, GitLost sei GitHub verantwortungsvoll offengelegt worden und die Details würden in Kenntnis von GitHub geteilt; ist es also noch nicht behoben?
https://github.github.com/gh-aw/reference/cross-repository/#...
Große Unternehmen wie Microsoft setzen wegen des Drucks der Investoren jetzt überall AI auf ihre Produkte, um behaupten zu können, sie seien AI-Unternehmen. Ähnlich wie Adobe es getan hat.
Verbraucher werden solcher halbgarer AI-Integrationen zunehmend müde, und ich glaube, bald ist ein Kipppunkt erreicht.
Ernsthaft: Wenn man hier und da klickt, reagiert alles sofort, und CI mit angeschlossenen Runnern läuft wunderbar. Die Dokumentation zum Einrichten der Runner könnte etwas klarer sein, aber abgesehen davon war alles extrem reibungslos.
Der Umsatz existiert tatsächlich und ist beeindruckend, und er ersetzt verbraucher- und sitzplatzbasierte Umsätze. Der Markt senkt noch immer die SaaS-Multiples, und ich halte diese Einschätzung für richtig. Wenn man den Umsatz in den Quartalsberichten separat betrachtet, gibt es eine große Wachstumsgeschichte, die aus echter Effizienz entsteht.
Mir ist nicht klar, warum eine Action, die im Kontext eines öffentlichen Repositorys ausgeführt wird, Zugriff auf private Repositorys hatte. Wenn man sich den Workflow ansieht, scheint er ein
github tokenzu verwenden, das normalerweise keine Rechte für private Repositorys gewährt.Oder hatte der Agent selbst somehow höhere Berechtigungen? Wenn ja, war der Agent falsch konfiguriert. Dass man nicht darauf vertrauen darf, dass ein Agent irgendetwas erzwingt, wissen wir bereits.
Dieser Beitrag liest sich wie Noma-Marketing. Ein niedlicher Name, ein Logo, ein Clickbait-Titel und sogar ein dramatischer Ton, der offenbar auf nicht technische Leser abzielt.
Wenn man fragt, was die eigentliche Schwachstelle ist: Gibt man einem LLM private Daten und lässt beliebige Leute damit interagieren, können Daten durchsickern. Das ist allzu offensichtlich.
Solche Leute werden einem LLM Schreibrechte auf die gesamte Festplatte geben, destruktive Aktionen ausführen lassen und sich dann darüber beschweren.
Wenn man nicht will, dass ein AI-Agent private Repositorys liest, sollte man ihm keinen Zugriff auf private Repositorys geben. Das ist kein Problem einer Rechteumgehung, sondern ein Prompt-Injection-Problem, und es lässt sich auf Agentenebene nicht zuverlässig lösen.
Entweder ist das bereits gelöst, oder GitHub hat es noch nicht gelöst, und in der Zwischenzeit werden böswillige Akteure versuchen, Schwachstellen in Repositorys auszunutzen.
Bei der großen Zahl an Repositorys kann es mit einer Wahrscheinlichkeit größer als null zu Leaks kommen. Allerdings wird, ähnlich wie bei Betrugsfällen, fast niemand einen Leak zugeben.