Beispielgutachten: Raumbuchung für Seminarräume
- Gegenstand
- Raumbuchung für Seminarräume (fiktiv)
- Entstehung
- KI-unterstützt, ca. 85 % generiert
- Prüfstand
main @ 4e1c9a7- Umfang
- 6 AE · Repo, Testsystem, Doku
1 · Gegenstand und Umfang
Webanwendung zur Buchung von Seminarräumen durch Lehrende, entstanden in drei Monaten mit einem KI-Assistenten; ein Entwickler, kein Review. React-Frontend, Node-Backend, PostgreSQL, Docker Compose. Anmeldung über die zentrale Identität ist geplant, aktuell eigene Konten. Rund 200 Nutzende, personenbezogene Daten: Name, E-Mail, Buchungszeiten.
Geprüft: Repository (main @ 4e1c9a7), README und Betriebsnotiz, Testsystem mit zwei Testkonten, CI-Konfiguration. Nicht geprüft: Produktivsystem, Hosting-Infrastruktur, Lasttests.
Aufwand: 6 AE, davon 1 AE Prüfstrecke, 1,5 AE KI-gestützte Analyse inkl. Auswertung, 3 AE Review und Verifikation, 0,5 AE Bericht und Abschlussgespräch.
2 · Gesamturteil
Die Anwendung ist fachlich solide und übergabefähig. Kein Befund ist kritisch. Drei hohe Befunde betreffen Berechtigungsprüfung, ein Geheimnis in der Historie und die fehlende Löschung — alle sind ohne Architekturumbau in überschaubarem Aufwand behebbar. Betrieb mit Personendaten erst nach Erfüllung der Auflagen A1–A3.
3 · Risikomatrix
| Schweregrad | Anzahl |
|---|---|
| kritisch | 0 |
| hoch | 3 |
| mittel | 6 |
| niedrig | 5 |
| Hinweis | 3 |
Herkunft der 17 Befunde: 6 zuerst von der deterministischen Prüfstrecke gemeldet, 7 aus Heuristiken und KI-Analyse, 4 aus dem Expertenreview. Verworfen wurden unter anderem 41 Scanner-Treffer ohne Erreichbarkeit und 9 KI-Hypothesen, die sich am Testsystem nicht bestätigten.
4 · Befunde und Massnahmen
| ID | Grad | Domäne | Befund und Beleg | Massnahme | Frist |
|---|---|---|---|---|---|
| B-01 | hoch | Sicherheit Code | API-Endpunkt /api/buchungen/:id prüft nur die Anmeldung, nicht die Zugehörigkeit — fremde Buchungen lesbar und stornierbar.Beleg: Handler bookings.ts:88; Reproduktion mit zweitem Testkonto | Besitzprüfung serverseitig in allen Buchungs-Endpunkten; Test je Rolle | Auflage A1 |
| B-02 | hoch | Sicherheit Code | Mail-API-Schlüssel in der Git-Historie (Commit vom Prototyp, später «entfernt»). Beleg: Gitleaks-Treffer, Commit 9b2e0f1 | Schlüssel rotieren, Historie bereinigen, Geheimnisverwaltung nutzen | Auflage A2 |
| B-03 | hoch | Datenschutz | Buchungen inkl. Namen und E-Mail werden unbegrenzt gespeichert; README behauptet «Löschung nach 90 Tagen». Beleg: Kein Löschjob im Code; Doku-Code-Abgleich | Löschjob implementieren, Frist mit DSB abstimmen | Auflage A3 |
| B-04 | mittel | Abhängigkeiten | Paket react-date-pickr (Tippfehler-Variante eines bekannten Pakets), 4 Wochen alt, ein Maintainer.Beleg: Paket-Existenzprüfung | Durch das Originalpaket ersetzen, Lockfile prüfen | vor Betrieb |
| B-05 | mittel | Abhängigkeiten | Drei Abhängigkeiten mit bekannten Schwachstellen, eine davon erreichbar. Beleg: SBOM + OSV-Abgleich, Erreichbarkeit manuell | Aktualisieren; Update-Weg dokumentieren | 30 Tage |
| B-06 | mittel | Betrieb | Kein Backup der Datenbank; Container-Volume liegt auf dem Host. Beleg: Compose-Datei, Betriebsdoku fehlt | Tägliche Sicherung + einmal getesteter Restore | 30 Tage |
| B-07 | mittel | Rollen | Admin-Bereich nur über versteckte URL geschützt; Rolle wird im Browser gesetzt. Beleg: Berechtigungsmatrix, AdminRoute.tsx | Rolle aus SSO-Gruppe ableiten, serverseitig prüfen | 30 Tage |
| B-08 | mittel | Barrierefreiheit | Kalenderansicht nicht per Tastatur bedienbar, Farbe als einziges Unterscheidungsmerkmal. Beleg: axe-core + manuelle Tastaturprüfung | Tastaturbedienung, Text-Alternative zur Farbe | 60 Tage |
| B-09 | mittel | Codequalität | Buchungslogik viermal dupliziert (Web, Admin, Export, Mail) mit abweichenden Regeln. Beleg: jscpd, Review | Eine Domänenfunktion, von allen genutzt | 60 Tage |
| B-10 | niedrig | Sicherheit System | Content-Security-Policy fehlt; Cookies ohne SameSite. Beleg: Header-Prüfung | Header setzen | 60 Tage |
| B-11 | niedrig | Tests & Build | Tests decken nur die Oberfläche ab; Berechtigungen ungetestet. Beleg: Coverage-Bericht | Tests je Rolle und Endpunkt | 90 Tage |
| B-12 | niedrig | Betrieb | Logs enthalten vollständige Anfragekörper mit E-Mail-Adressen. Beleg: Log-Stichprobe Testsystem | Personendaten maskieren | 90 Tage |
| B-13 | niedrig | Datenschutz | Schriften von externem CDN geladen. Beleg: Netzwerk-Mitschnitt | Schriften lokal ausliefern | 90 Tage |
| B-14 | niedrig | Codequalität | Auskommentierter Test-Login im Anmeldeformular. Beleg: Platzhalter-Detektor | Entfernen | sofort |
| B-15 | Hinweis | Architektur | Architekturübersicht in der Doku entspricht nicht mehr dem Code (Redis erwähnt, nicht genutzt). Beleg: Doku-Code-Abgleich | Doku nachziehen | — |
| B-16 | Hinweis | KI-Risiken | Keine eigene KI-Komponente; Einordnung nach EU-KI-Verordnung entfällt. Beleg: Architektur-Review | — | — |
| B-17 | Hinweis | Betrieb | Übergabe an die zentrale IT ist mit der vorhandenen Doku möglich, wenn B-06 umgesetzt ist. Beleg: Review | — | — |
5 · Auflagen und Abnahmekriterien
Die Anwendung gilt als abgenommen, wenn die folgenden Kriterien nachweislich erfüllt sind. Der Nachweis erfolgt durch eine Nachprüfung (1 AE) mit denselben Werkzeugversionen und Testfällen.
- A1: Alle Endpunkte unter
/api/buchungenund/api/adminprüfen serverseitig Besitz bzw. Rolle; die Missbrauchsfälle SL-03-01 bis SL-03-12 aus diesem Gutachten schlagen fehl; je Rolle existiert ein automatisierter Test. - A2: Der betroffene Schlüssel ist widerrufen; Gitleaks findet über die gesamte Historie keine gültigen Geheimnisse; Geheimnisse kommen aus Umgebungsvariablen.
- A3: Ein Löschjob entfernt Buchungen nach der mit dem Datenschutz abgestimmten Frist; die README beschreibt den tatsächlichen Stand.
- Alle mittleren Befunde haben ein Ticket mit Termin.
6 · Restrisiko
Nach Erfüllung der Auflagen verbleiben die mittleren und niedrigen Befunde mit Termin. Nicht beurteilt wurden die Produktivumgebung, Lastverhalten und die geplante SSO-Anbindung; letztere sollte nach Umsetzung in einem Kurzcheck (S) nachgesehen werden. Das Gutachten bezieht sich ausschliesslich auf den genannten Commit.