FlawOpen

flawopen.com/Teardowns/cve-2026-10032-a2ui-agent-button-xss

● CVE-2026-10032 · CVSS 9.3[1] · Kritisch
Sicherheitsforschung · FlawOpen

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]

CVSS-VektorCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N[1]
💡 Einfache Erklärung (ELI5)

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]
Funktionsaufruf-Aktion
Deklarative UI-Aktion mit Funktion und Argumenten; ein Button konnte openUrl mit einer Agenten-URL aufrufen.[1], [2]
CWE-79
Klassifizierung unzureichender Eingabeneutralisierung bei der Webseitenerzeugung; das Advisory ordnet diesem Problem CWE-79 zu.[1], [4]

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-BedingungVom Advisory bestätigte FaktenSchutzmaß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

Schritt 1

Ein Agent liefert eine Button-Aktion

A2UI-Daten können einen Button mit Funktionsaufruf und Argumenten definieren. Behandle Agentenaktionen als nicht vertrauenswürdig.[1]

Schritt 2

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]

Schritt 3

Eine Person klickt den gerenderten Button

Der Ablauf erfordert einen Benutzerklick. Bezeichne ihn nicht als klicklos.[1], [2]

Schritt 4

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]

Schritt 5

Die korrigierte Aktion begrenzt Navigation

Die Korrektur löst die URL auf, weist andere Protokolle als HTTP/HTTPS zurück und nutzt noopener,noreferrer. Aktualisiere auf @a2ui/web_core 0.10.2 oder neuer.[1], [2]

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

VERWUNDBARE IMPLEMENTIERUNG
export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
  if (args.url && typeof window !== 'undefined' && window.open) {
    window.open(args.url, '_blank');
  }
});
GEHÄRTETER SICHERHEITS-PATCH
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

Quellen