Skip to content

fix(security): @tiptap 3.28.0 -> 3.31.3 (GHSA-j95f-988m-3j2f, unblocks nightly) - #133

Merged
WolfTasks merged 1 commit into
mainfrom
worktree-fix-nightly-tiptap-redos
Sep 12, 2026
Merged

WolfTasks merged 1 commit into
mainfrom
worktree-fix-nightly-tiptap-redos

Conversation

@WolfTasks

Copy link
Copy Markdown
Owner

Problem

Der Nightly Security Scan schlägt seit dem 2026-09-09 jede Nacht fehl (letzter grüner Lauf: 2026-09-08) — ohne dass sich am Repo etwas geändert hat (HEAD steht seit 2026-09-06 auf e2a8a9f).

Ursache ist kein Workflow-Defekt, sondern ein echter Fund:

Package: @tiptap/core
Installed Version: 3.28.0
Vulnerability GHSA-j95f-988m-3j2f
Severity: HIGH
Fixed Version: 3.30.5

Zwei quadratische ReDoS-Pfade in den Markdown-Attribut-Parsern von @tiptap/core. Das Advisory wurde am 2026-09-09 veröffentlicht — also genau der Fall, für den der Nightly existiert: neu offengelegte CVEs gegen unveränderte Dependencies.

Warum Dependabot das nicht selbst gefixt hat

Der Dependabot-Security-Job ist am 2026-09-09 ebenfalls fehlgeschlagen (Run 34309953621):

A patched version exists for @tiptap/core, but the available update path still resolves it to 3.28.0

@tiptap/core ist bei uns nur transitiv eingebunden, der Security-Job darf aber nur direkte Dependencies anfassen (allowed-updates: direct). Er kommt deshalb nicht an die Version heran.

Fix

Die vier direkten @tiptap/*-Pakete gemeinsam auf 3.31.3 gehoben, damit der Lockfile @tiptap/core auf 3.31.3 auflöst:

Paket vorher nachher
@tiptap/react ^3.27.3 ^3.31.3
@tiptap/starter-kit ^3.27.3 ^3.31.3
@tiptap/extension-link ^3.27.3 ^3.31.3
@tiptap/extension-placeholder ^3.27.3 ^3.31.3

Gotcha: ein einfaches npm install reicht hier nicht — npm bleibt mit ERESOLVE an der alten 3.28.0-Auflösung hängen, weil @tiptap/pm von den Peers exakt gepinnt wird und npm den Teilbaum aus dem Lockfile wiederverwendet. Der @tiptap-Teilbaum musste aus dem Lockfile entfernt und neu aufgelöst werden.

Der Diff bleibt dabei sauber begrenzt: nur die 29 @tiptap-Pakete + prosemirror-view, keine Pakete hinzugefügt oder entfernt.

Verifikation

Check Ergebnis
trivy 0.70.0 fs --severity HIGH,CRITICAL 0 Vulnerabilities, exit 0 (vorher exit 1)
npm ci sauber, Lockfile in sync
.github/scripts/audit-gate.mjs ✅ keine nicht-allowlisteten HIGH/CRITICAL
npm run build (tsc + vite) ✅ grün
npm run test:i18n ✅ 17/17
npm run lint:i18n ✅ Scanner 0 + en/de-Parität

Trivy-Report nach dem Fix:

┌────────────────────────────┬────────┬─────────────────┐
│           Target           │  Type  │ Vulnerabilities │
├────────────────────────────┼────────┼─────────────────┤
│ backend/gradle.lockfile    │ gradle │        0        │
│ frontend/package-lock.json │  npm   │        0        │
└────────────────────────────┴────────┴─────────────────┘

Risiko

@tiptap wird nur an einer Stelle verwendet: src/components/issue/RichTextEditor.tsx. Der Editor nutzt ausschließlich stabile Core-APIs (useEditor, StarterKit, Link/Placeholder.configure, chain-Commands, setContent/getHTML). Die verwundbaren Markdown-Specs (createBlockMarkdownSpec & Co.) werden nicht verwendet. Minor-Bump 3.28 → 3.31, tsc ist grün.

👉 Manueller Check empfohlen: Rich-Text-Editor im Issue-Detail (fett/kursiv/Code/Listen, Speichern beim Blur).

Hinweise

Fixes #129
Fixes #130
Fixes #131
Fixes #132

🤖 Generated with Claude Code

https://claude.ai/code/session_01UwUAJZAuHC2S7rkaEm9dgf

…s nightly)

@tiptap/core 3.28.0 ist anfaellig fuer zwei quadratische ReDoS-Pfade in den
Markdown-Attribut-Parsern (GHSA-j95f-988m-3j2f, HIGH, fixed in 3.30.5).
Das Advisory wurde am 2026-09-09 veroeffentlicht — seitdem schlaegt der
Nightly-Trivy-Gate (HIGH,CRITICAL) jede Nacht fehl, ohne dass sich am Repo
etwas geaendert hat. Genau der Fall, fuer den der Nightly gebaut wurde.

Dependabot konnte das nicht selbst beheben: @tiptap/core ist nur transitiv
eingebunden, der Security-Update-Job darf aber nur direkte Dependencies
anfassen ("A patched version exists for @tiptap/core, but the available
update path still resolves it to 3.28.0", Run 34309953621).

Daher die vier direkten @tiptap/*-Pakete gemeinsam auf 3.31.3 gehoben; damit
loest der Lockfile @tiptap/core auf 3.31.3 auf. Der Lockfile-Teilbaum musste
dafuer neu aufgeloest werden — npm blieb sonst mit ERESOLVE an der alten
3.28.0-Aufloesung haengen (@tiptap/pm ist exakt gepinnt).

Diff beschraenkt sich auf die 29 @tiptap-Pakete + prosemirror-view; keine
Pakete hinzugefuegt oder entfernt.

Verifiziert:
- trivy 0.70.0 fs --severity HIGH,CRITICAL: 0 Vulnerabilities, exit 0
  (vorher: exit 1)
- npm ci sauber, audit-gate.mjs ok
- npm run build (tsc + vite) gruen
- test:i18n 17/17, lint:i18n (scanner + en/de-parity) gruen

RichTextEditor.tsx nutzt nur stabile APIs (useEditor, StarterKit,
Link/Placeholder.configure, chain-Commands, setContent/getHTML) — die
verwundbaren Markdown-Specs werden nicht verwendet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UwUAJZAuHC2S7rkaEm9dgf
@WolfTasks
WolfTasks merged commit b1b442e into main Sep 12, 2026
11 checks passed
@WolfTasks
WolfTasks deleted the worktree-fix-nightly-tiptap-redos branch September 12, 2026 13:08
WolfTasks pushed a commit that referenced this pull request Sep 12, 2026
Ships the @tiptap ReDoS fix:
- @tiptap/core 3.28.0 -> 3.31.3 (#133), fixes GHSA-j95f-988m-3j2f (HIGH,
  two quadratic ReDoS paths in the markdown attribute parsers). The
  advisory was published on 2026-09-09 and broke the nightly Trivy gate
  every night since, against an unchanged repo.
- Dependabot could not fix this itself: @tiptap/core is only a transitive
  dependency and its security job may only touch direct ones, so the four
  direct @tiptap/* packages were raised together.

Trivy now reports 0 HIGH/CRITICAL across gradle.lockfile and
package-lock.json; the nightly runs green on main again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UwUAJZAuHC2S7rkaEm9dgf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant