Skip to content

Security-Fixes aus dem Framework-Review (lti XSS, Back-Channel-Replay, Transportfehler, DRF-Auth) - #13

Merged
rrolf merged 1 commit into
mainfrom
fix/security-review
Oct 1, 2026
Merged

rrolf merged 1 commit into
mainfrom
fix/security-review

Conversation

@rrolf

@rrolf rrolf commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Erster PR aus dem Framework-Review (2026-10-01): die als sicherheits-/betriebsrelevant eingestuften Befunde, alle im Code verifiziert.

Änderungen

Paket Befund Fix
basicbar-lti → 0.1.4 Reflected XSS: lti_login spiegelte iss/client_id (auch per GET) in 400er-Antworten mit Default-Content-Type text/html Alle Fehlerantworten text/plain via _bad_request(); Regressionstest mit <script>-Issuer über GET
basicbar-auth → 0.1.1 Back-Channel-Logout prüfte weder iat noch exp → abgefangenes Token unbegrenzt replaybar (erzwungener Logout als DoS, Spec §2.6) iat Pflicht, max. OIDC_BACKCHANNEL_MAX_AGE (neues conf-Setting, Default 300 s), exp mit 30 s Skew; 4 neue Tests
basicbar-integrations → 0.2.2 ConnectionResetError/IncompleteRead liefen als 500 durch; HTTPError-Body (echte Ursache) wurde verworfen; LibreTranslate-4xx hieß „unavailable“ Gemeinsamer _http.py (TRANSPORT_ERRORS, http_error_detail); isinstance(data, dict)-Check; 6 neue Tests
Template DRF-Default BasicAuthentication aktiv → jeder Endpunkt per HTTP-Basic gegen den Break-glass-Superuser angreifbar, ohne Rate-Limit, am CSRF vorbei DEFAULT_AUTHENTICATION_CLASSES = [SessionAuthentication] (erkennbar hatte das bereits; abstimmbar/ausleihbar sollten nachziehen — steht im Changelog)
Doku Draft-Releases: Assets erst nach manuellem Publish öffentlich — stand nirgends CLAUDE.md-Release-Abschnitt; außerdem fehlender lti/v0.1.3-Changelog-Eintrag nachgetragen, __version__ mit pyproject synchronisiert (integrations/lti waren auseinander)

Tests

Alle drei Paket-Suiten grün im Container (Django 5.1/DRF 3.15/pylti1p3 2.0): integrations 63, auth 29, lti 33.

Nach dem Merge

Tags lti/v0.1.4, auth/v0.1.1, integrations/v0.2.2 auf den Merge-Commit; dann Konsumenten-PRs (reiner Pin-Bump; für abstimmbar/ausleihbar zusätzlich die DRF-Auth-Zeile).

Nicht in diesem PR

Die übrigen Review-Befunde (TipTap im Bundle, Template-Drift, auth-Boilerplate, toter Code) folgen in eigenen PRs. Nebenbefund: Der CHANGELOG führt seit Juli alle Releases unter „[Unreleased] (→ wird …)“ statt als abgeschlossene Abschnitte — Kandidat für den Cleanup-PR.

🤖 Generated with Claude Code

- lti: Reflected XSS in lti_login — die 400er-Antworten spiegelten
  iss/client_id aus GET-Parametern als text/html; jetzt text/plain
  (lti/v0.1.4, Regressionstest mit <script>-Issuer).
- auth: Back-Channel-Logout prüft iat (Pflicht, max. OIDC_BACKCHANNEL_MAX_AGE
  = 300 s) und exp — ein abgefangenes Logout-Token war bisher unbegrenzt
  replaybar (auth/v0.1.1, vier neue Tests).
- integrations: ai/translation_service fangen alle Transportfehler
  (OSError, HTTPException) statt sie als 500 durchzulassen; HTTPError-Body
  landet in der Meldung; Nicht-Objekt-JSON ist ein TranslationError
  (integrations/v0.2.2, sechs neue Tests, gemeinsamer _http-Helfer).
- Template: DRF nur mit SessionAuthentication (BasicAuthentication öffnete
  jeden Endpunkt für Passwort-Raten gegen den Break-glass-Superuser).
- CLAUDE.md: Draft-Release-Schritt dokumentiert; CHANGELOG: Einträge plus
  nachgetragenes lti/v0.1.3; __version__ mit pyproject synchronisiert.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant