flawopen.com/Teardowns/cve-2026-10032-a2ui-agent-button-xss
CVE-2026-10032: XSS über agentengenerierte A2UI-Buttons
In betroffenen Versionen übergab openUrl im standardmäßigen Basic Catalog eine Agenten-URL ohne Schemaeinschränkung an window.open. Für die im Advisory beschriebene Browser-Origin-Auswirkung musste eine Person den gerenderten Button anklicken; aktualisiere auf 0.10.2 oder neuer.[1]
Stell dir einen Kiosk vor, in dem ein Assistent eine Schaltfläche platziert und ihr Ziel auf eine von ihm gelieferte Karte schreibt. Der Kiosk prüft, ob eine Adresse vorhanden ist, nicht ob sie zu einer normalen Webseite führt. Eine Person muss drücken; ohne Zielregel kann der Browser die Adresse als Anweisung für den Kiosk behandeln. Die Korrektur parst die Adresse und akzeptiert nur HTTP- oder HTTPS-Ziele.[1], [2]
Kernkonzepte & Begriffe
A2UI- Open-Source-Protokoll und -Projekt für agentengenerierte Oberflächen; das Advisory betrifft die Basic-Catalog-Aktion in web_core.[1]
Basic Catalog- Integrierter A2UI-Funktionssatz für Aktionen der gerenderten Oberfläche; laut Advisory standardmäßig aktiv.[1]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-79
Ursachenanalyse
Die betroffene Basic-Catalog-Implementierung behandelte das URL-Argument als zu öffnenden String statt als nicht vertrauenswürdige Navigationseingabe mit Schemarichtlinie. Die API prüfte den String-Typ, aber der verwundbare Code begrenzte das Protokoll vor window.open(args.url, '_blank') nicht. Ein agentengesteuerter Button.functionCall konnte den Wert bis zum Sink bringen. Eine Person musste den Button anklicken; das A2UI-Advisory beschreibt Skriptausführung im Browser-Origin der Opferanwendung. Die Upstream-Korrektur parst den Wert, erlaubt nur http: und https: und öffnet die normalisierte URL mit noopener,noreferrer. Sie behebt diese Navigationsstelle, garantiert aber nicht die Sicherheit jeder agentengenerierten Oberfläche.[1], [2]
CVE-2026-10032: betroffene Versionen und Aktionsgrenze
| Deployment-Bedingung | Vom Advisory bestätigte Fakten | Schutzmaßnahme |
|---|---|---|
| @a2ui/web_core 0.9.0, 0.9.1, 0.9.2, 0.10.0 oder 0.10.1 mit Standard-Basic-Catalog. | Das Advisory nennt diese Versionen als betroffen und den Basic Catalog standardmäßig aktiviert. | Aktualisiere auf 0.10.2 oder neuer und prüfe die Version der bereitgestellten Anwendung. |
| Ein Button-Funktionsaufruf stammt aus agentengesteuerten Daten und eine Person klickt. | Das Advisory beschreibt den Klickpfad zu openUrl und die Browser-Origin-Auswirkung; es ist kein Zero-Click-Fehler. | Behandle Argumente als nicht vertrauenswürdig und validiere sie beim Öffnen der URL. |
| Die App nutzt A2UIs React-, Lit- oder Angular-Renderer. | Die Integrationen sind betroffen; die verwundbare Grenze ist Basic Catalog in web_core. | Prüfe die Paketauflösung und aktualisiere web_core. |
| Die App nutzt @a2ui/web_core 0.10.2 oder neuer. | Die Maintainer nennen 0.10.2 als korrigiert: URL-Parsing, HTTP/HTTPS und noopener,noreferrer. | Behalte Tests für erlaubte und abgelehnte Schemas bei und prüfe eigene openUrl-Implementierungen. |
Schritt-für-Schritt Angriffsablauf
Ein Agent liefert eine Button-Aktion
A2UI-Daten können einen Button mit Funktionsaufruf und Argumenten definieren. Behandle Agentenaktionen als nicht vertrauenswürdig.[1]
Basic Catalog löst openUrl auf
Der Basic Catalog stellt openUrl bereit; das Schema verlangt einen String, doch der verwundbare Code begrenzte das URL-Schema nicht.[1]
Die Aktion erreicht window.open
Vor dem Patch übergab openUrl den String ohne Protokollprüfung an window.open. Das Advisory beschreibt Skriptausführung im Browser-Origin der Opferanwendung.[1]
Quellcode: Verwundbar vs. Sicher
Der verwundbare Ausschnitt stammt aus der im A2UI-Advisory genannten Implementierung. PR #1707 parst und löst die Adresse auf, erlaubt nur HTTP/HTTPS und verhindert, dass die geöffnete Seite die Ausgangsseite steuert oder einen Referrer erhält. Typen und Imports sind ausgelassen; dies ist kein vollständiges Programm und kein Proof of Concept.[1], [2]
Quelltextauszug: basic_functions.ts — OpenUrlImplementation
export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
if (args.url && typeof window !== 'undefined' && window.open) {
window.open(args.url, '_blank');
}
});
export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
if (args.url && typeof window !== 'undefined' && window.open) {
const baseHref =
typeof window.location !== 'undefined' && window.location.href
? window.location.href
: undefined;
let url: URL;
try {
url = baseHref ? new URL(args.url, baseHref) : new URL(args.url);
} catch (e: any) {
throw new A2uiExpressionError(`Invalid URL specified: ${args.url}`, 'openUrl', e);
}
// Strenge Protokoll-Allowlist: Nur HTTP und HTTPS sind zulässig.
if (url.protocol !== 'https:' && url.protocol !== 'http:') {
throw new A2uiExpressionError(`Unsupported URL scheme: ${url.protocol}`, 'openUrl');
}
// Verwende immer noopener und noreferrer, damit die geöffnete Seite das Ursprungsfenster nicht steuern kann.
window.open(url.href, '_blank', 'noopener,noreferrer');
}
});
Checkliste für Engineering & Systemsicherheit
- ✓Aktualisiere alle direkten und transitiven Abhängigkeiten auf @a2ui/web_core 0.10.2 oder neuer; prüfe Lockfile und Produktionsbundle.[1]
- ✓Erfasse Apps mit Basic Catalog sowie React-, Lit- oder Angular-Renderern; prüfe, ob Agentendaten Button-Funktionsaufrufe festlegen können.[1]
- ✓Validiere URLs am Navigationspunkt: erst parsen und auflösen, dann nur erlaubte Schemas wie HTTP/HTTPS zulassen; keine Präfixprüfung.[2]
- ✓Öffne externe Ziele mit
noopener,noreferrerund setze die Zustimmungsrichtlinie separat um; die Kontrollen behandeln verschiedene Risiken.[2] - ✓Teste HTTP/HTTPS- und relative URL-Auflösung sowie die Zurückweisung fehlerhafter URLs und aller Nicht-HTTP(S)-Schemas vor
window.open.[2] - ✓Behandle Agentenlabels, Ziele und Funktionsargumente als nicht vertrauenswürdig; validiere jede Aktion am Sink, statt Bereinigung durch den Renderer anzunehmen.[1], [2]