Saltcorn: Die Feldansicht as_link uebernimmt jedes URL-Schema in das href

Der HTML-Filter entschaerft ein gefaehrliches Schema nur innerhalb eines Tags; eine blosse URL-Zeichenkette passiert ihn unveraendert.

Advisory-ID: TP-2026-094
Produkt: Saltcorn (Baukasten fuer Datenbankanwendungen ohne Programmierung, Node.js)
Schwachstellentyp: Stored Cross-Site-Scripting (CWE-79)
CVE: beantragt (GitHub CNA), Vergabe ausstehend
CVSS 3.1: 9.3 (Kritisch) · CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
Betroffene Versionen: <= 1.6.0
Hersteller-Advisory: GHSA-j86v-82rx-c23w
Behoben in: 1.6.1 und 1.5.9
Gemeldet: 27. Juni 2026

Zusammenfassung

Saltcorn stellt fuer Textfelder die Feldansicht as_link bereit, die den gespeicherten Wert als Verweis anzeigt. Der Wert wandert dabei ohne jede Pruefung des URL-Schemas in das Attribut href. Wer das Feld beschreiben darf, hinterlegt javascript: samt Nutzlast, und sobald ein anderer Nutzer eine Ansicht oeffnet, die das Feld so darstellt, enthaelt die Seite einen entsprechenden Verweis. Ein Klick fuehrt das Skript in der Herkunft von Saltcorn aus, und die Anwendung sendet keine Content-Security-Policy. Schreibzugriff kann anonym sein, denn ein oeffentliches Eingabeformular auf einer Tabelle mit entsprechend gesetzter Schreibrolle nimmt Einsendungen ohne Anmeldung an.

Ursache

Die Feldansicht as_link baut aus dem gespeicherten Wert a({ href: text(s || "") }, ...), wobei die Zuweisung des href in Zeile 1062 steht (packages/saltcorn-data/base-plugin/types.ts:1058-1067). Die dort verwendete Funktion text() ist der Filter js-xss (packages/saltcorn-markup/extra_tags.ts:47), der ein gefaehrliches URL-Schema nur dann entfernt, wenn es innerhalb eines erkannten HTML-Tag-Attributs auftaucht. Eine blosse URL-Zeichenkette traegt kein Tag, weshalb der Filter sie unveraendert zurueckgibt. Der Serialisierer fuer Attribute maskiert anschliessend nur ", < und >, nicht aber das Schema. Keine Stelle auf diesem Weg prueft, ob das Schema zulaessig ist, und die Anwendung sendet in der Voreinstellung keine Content-Security-Policy.

Proof of Concept

# 1. Tabelle mit einem Textfeld, min_role_write auf die oeffentliche Rolle,
#    dazu eine Edit-Ansicht und eine Show- oder List-Ansicht,
#    die das Feld mit der Feldansicht as_link darstellt.

# 2. Anonym einsenden, als Feldwert:
javascript:fetch('/useradmin/set-random-password/1')

# 3. Die Ansicht rendert:
<a href="javascript:fetch('/useradmin/set-random-password/1')">...</a>

# Ein Klick der Administration fuehrt das Skript in deren Sitzung aus.

Nicht betroffen sind Felder in der voreingestellten Feldansicht as_text, die den Wert HTML-maskiert ausgibt.

Auswirkung

  • Skriptausfuehrung in der Herkunft von Saltcorn in der Sitzung des klickenden Nutzers, ohne dass der Angreifer ein Konto besitzt.
  • Kontouebernahme ueber die Endpunkte der Nutzerverwaltung, sobald das Opfer die Administration ist.
  • Dauerhafte Ablage, da der Wert in der Datenbank steht und bei jedem Aufruf der Ansicht erneut gerendert wird.
  • Typische betroffene Anwendungen sind oeffentliche Einsendeformulare, Linkverzeichnisse und ein Profilfeld fuer die eigene Website.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.