fix(quick-261009-p0m): Abhaengigkeiten innerhalb der Hauptversionen aktualisiert, zwei unbenutzte entfernt

- Next.js 15.5.27, NestJS 11.2.7 (multer 2.4.0), nodemailer 9.1.1, undici 7.30.0 exakt, adm-zip 0.6.1, csv-parse 7.0.3, vitest (web) 4.1.11
- 15 pnpm-Overrides fuer mittelbare Bausteine, nur innerhalb derselben Hauptversion
- @nestjs-modules/mailer und ews-javascript-api entfernt (kein Import), Kommentare berichtigt
- Desktop: rustls 0.23.45 (mit rustls-webpki 0.103.15)
- pnpm audit --prod: 151 (5 kritisch, 73 hoch) -> 12 (0 kritisch, 9 hoch)
- Sicherheitsprotokoll, Entwicklungsanleitung und CHANGELOG nachgefuehrt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-09 20:11:09 +02:00
parent 13571df994
commit cf982e9ac2
10 changed files with 347 additions and 3292 deletions
+1
View File
@@ -34,6 +34,7 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
### Behoben ### Behoben
- Sicherheit: Die Bausteine anderer Hersteller, auf denen Tessera aufbaut, wurden innerhalb ihrer bisherigen Versionslinien auf bereinigte Fassungen gebracht, darunter das Webframework (Next.js 15.5.27), das Server-Framework mit dem Datei-Upload, der Mailversand, das Netzwerk-Paket, das ZIP- und das CSV-Lesen. Zwei Bausteine, die kein Modul mehr benutzte, sind entfernt. Damit fiel die Zahl der bekannten Schwachstellen in den ausgelieferten Bausteinen von 151 auf 12, die Zahl der kritischen von 5 auf 0; auch die Desktop-App bekam eine bereinigte Fassung ihres Verbindungs-Bausteins. Was bleibt, ist im Sicherheitsprotokoll mit Grund aufgeführt.
- Willkommensmail: Der Hinweis über den Platzhaltern sprach von „vier Feldern“; die Platzhalter funktionieren in allen sechs Feldern, und so steht es jetzt auch da. - Willkommensmail: Der Hinweis über den Platzhaltern sprach von „vier Feldern“; die Platzhalter funktionieren in allen sechs Feldern, und so steht es jetzt auch da.
- Sicherheit: Der Schutz davor, dass Tessera interne Adressen abruft (Favoriten-Symbole, Logos in Nextcloud-Status und das neue „Fehlendes Zertifikat holen“), erkennt jetzt auch versteckte Schreibweisen interner IPv6-Adressen, zum Beispiel die gemappte Form ::ffff:7f00:1, NAT64 und 6to4. Beim neuen Abruf prüft Tessera die Adresse außerdem noch einmal im Moment des Verbindens. Der Zertifikatsmanager ist zudem gegen präparierte Dateien abgesichert, die ihn verlangsamen oder zum Absturz bringen könnten: ZIP-Dateien, die sich zu riesigen Datenmengen entpacken (sogenannte ZIP-Bomben), Dateien aus tausenden unvollständigen Zertifikatsblöcken und Passwortschutz mit übermäßig vielen Rechenschritten werden abgewiesen oder übersprungen, und Uploads über der Gesamtgrenze bricht Tessera schon beim Empfang ab. Auch IPv6-Adressen in eckigen Klammern (zum Beispiel für öffentliche Server) werden dabei jetzt richtig beurteilt. - Sicherheit: Der Schutz davor, dass Tessera interne Adressen abruft (Favoriten-Symbole, Logos in Nextcloud-Status und das neue „Fehlendes Zertifikat holen“), erkennt jetzt auch versteckte Schreibweisen interner IPv6-Adressen, zum Beispiel die gemappte Form ::ffff:7f00:1, NAT64 und 6to4. Beim neuen Abruf prüft Tessera die Adresse außerdem noch einmal im Moment des Verbindens. Der Zertifikatsmanager ist zudem gegen präparierte Dateien abgesichert, die ihn verlangsamen oder zum Absturz bringen könnten: ZIP-Dateien, die sich zu riesigen Datenmengen entpacken (sogenannte ZIP-Bomben), Dateien aus tausenden unvollständigen Zertifikatsblöcken und Passwortschutz mit übermäßig vielen Rechenschritten werden abgewiesen oder übersprungen, und Uploads über der Gesamtgrenze bricht Tessera schon beim Empfang ab. Auch IPv6-Adressen in eckigen Klammern (zum Beispiel für öffentliche Server) werden dabei jetzt richtig beurteilt.
- Zertifikatsmanager: Beim Zusammenführen ersetzte eine zweite Datei die erste; jetzt bleiben alle Dateien in der Liste. Zertifikate und Schlüssel mit elliptischen Kurven (EC) wurden bisher nicht erkannt; jetzt funktionieren sie in allen Reitern. - Zertifikatsmanager: Beim Zusammenführen ersetzte eine zweite Datei die erste; jetzt bleiben alle Dateien in der Liste. Zertifikate und Schlüssel mit elliptischen Kurven (EC) wurden bisher nicht erkannt; jetzt funktionieren sie in allen Reitern.
+7 -9
View File
@@ -14,33 +14,31 @@
}, },
"dependencies": { "dependencies": {
"@microsoft/microsoft-graph-client": "3.0.7", "@microsoft/microsoft-graph-client": "3.0.7",
"@nestjs-modules/mailer": "^2.3.7", "@nestjs/common": "^11.2.7",
"@nestjs/common": "^11.0.0",
"@nestjs/config": "^4.0.0", "@nestjs/config": "^4.0.0",
"@nestjs/core": "^11.0.0", "@nestjs/core": "^11.2.7",
"@nestjs/jwt": "^11.0.2", "@nestjs/jwt": "^11.0.2",
"@nestjs/mapped-types": "^2.1.1", "@nestjs/mapped-types": "^2.1.1",
"@nestjs/passport": "^11.0.5", "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.0.0", "@nestjs/platform-express": "^11.2.7",
"@nestjs/schedule": "^6.1.3", "@nestjs/schedule": "^6.1.3",
"@prisma/client": "^6.0.0", "@prisma/client": "^6.0.0",
"@tessera/shared": "workspace:*", "@tessera/shared": "workspace:*",
"adm-zip": "^0.6.0", "adm-zip": "^0.6.1",
"argon2": "^0.44.0", "argon2": "^0.44.0",
"cheerio": "^1.2.0", "cheerio": "^1.2.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.15.1", "class-validator": "^0.15.1",
"cookie-parser": "^1.4.7", "cookie-parser": "^1.4.7",
"cron": "4.4.0", "cron": "4.4.0",
"csv-parse": "^7.0.1", "csv-parse": "^7.0.3",
"ews-javascript-api": "0.15.3",
"fast-xml-parser": "^5.10.1", "fast-xml-parser": "^5.10.1",
"httpntlm": "^1.8.13", "httpntlm": "^1.8.13",
"imapflow": "^1.4.3", "imapflow": "^1.4.3",
"ldapts": "^8.1.8", "ldapts": "^8.1.8",
"node-forge": "^1.4.0", "node-forge": "^1.4.0",
"node-ical": "0.26.1", "node-ical": "0.26.1",
"nodemailer": "^9.0.1", "nodemailer": "^9.1.1",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
@@ -49,7 +47,7 @@
"reflect-metadata": "^0.2.0", "reflect-metadata": "^0.2.0",
"rxjs": "^7.0.0", "rxjs": "^7.0.0",
"tsdav": "2.2.2", "tsdav": "2.2.2",
"undici": "7.28.0", "undici": "7.30.0",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
@@ -110,7 +110,7 @@ function ntlmPost(opts: NtlmOptions): Promise<{ statusCode: number; body: string
* Exchange calendar provider — dispatches on exchangeMode ('graph' vs 'ews'). * Exchange calendar provider — dispatches on exchangeMode ('graph' vs 'ews').
* *
* - 'graph': Uses @microsoft/microsoft-graph-client for Exchange Online / M365 * - 'graph': Uses @microsoft/microsoft-graph-client for Exchange Online / M365
* - 'ews': Uses ews-javascript-api for on-premise Exchange Server * - 'ews': Uses raw SOAP over NTLM (httpntlm) for on-premise Exchange Server
* *
* Both modes gracefully degrade: on auth failure, returns empty array and * Both modes gracefully degrade: on auth failure, returns empty array and
* surfaces a generic error (no credential details — Security V7 / T-05-13). * surfaces a generic error (no credential details — Security V7 / T-05-13).
+2 -2
View File
@@ -21,8 +21,8 @@ import { MailService } from './mail.service';
* 4. Final hardcoded fallback: localhost:1025 (Mailhog / dev default) * 4. Final hardcoded fallback: localhost:1025 (Mailhog / dev default)
* *
* No circular import risk: MailModule -> SettingsModule -> CalendarModule * No circular import risk: MailModule -> SettingsModule -> CalendarModule
* (no reverse edges). `@nestjs-modules/mailer` bleibt als Paket installiert, * (no reverse edges). Das fruehere Paket `@nestjs-modules/mailer` ist entfernt
* wird aber von keinem Modul mehr benutzt. * (quick-261009-p0m); versendet wird ausschliesslich ueber nodemailer.
*/ */
@Module({ @Module({
imports: [SettingsModule], imports: [SettingsModule],
+4 -4
View File
@@ -3149,9 +3149,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.41" version = "0.23.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"ring", "ring",
@@ -3211,9 +3211,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
version = "0.103.13" version = "0.103.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2"
dependencies = [ dependencies = [
"ring", "ring",
"rustls-pki-types", "rustls-pki-types",
+2 -2
View File
@@ -16,7 +16,7 @@
"fflate": "^0.8.3", "fflate": "^0.8.3",
"html-to-image": "1.11.13", "html-to-image": "1.11.13",
"jose": "^6.2.3", "jose": "^6.2.3",
"next": "^15.3.0", "next": "^15.5.27",
"next-intl": "^4.13.0", "next-intl": "^4.13.0",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"react": "^19.0.0", "react": "^19.0.0",
@@ -40,6 +40,6 @@
"postcss": "^8.0.0", "postcss": "^8.0.0",
"tailwindcss": "^4.0.0", "tailwindcss": "^4.0.0",
"typescript": "^5.5.0", "typescript": "^5.5.0",
"vitest": "^4.1.9" "vitest": "^4.1.11"
} }
} }
+29
View File
@@ -907,6 +907,35 @@ Code-Analyse). Die Regeln:
- Jeder Eintrag in `.gitleaks.toml` trägt eine deutsche `description`, die sagt, warum es ein Fehlalarm ist. - Jeder Eintrag in `.gitleaks.toml` trägt eine deutsche `description`, die sagt, warum es ein Fehlalarm ist.
- Nie ganze Verzeichnisse außerhalb der Ordner mit Testdaten freigeben. - Nie ganze Verzeichnisse außerhalb der Ordner mit Testdaten freigeben.
### Abhängigkeiten aktualisieren
Die Prüfung der Pipeline (`pnpm audit --prod`, osv-scanner, Trivy) meldet bekannte Schwachstellen in Bausteinen anderer
Hersteller. So gehen Sie damit um:
1. **Nur innerhalb der Hauptversion.** Patch- und Nebenstände werden angehoben, ein Sprung auf eine neue Hauptversion nie
nebenbei. Zurzeit gelten: Next.js 15, NestJS 11, React 19, Prisma exakt 6.19.3. Eine Meldung, deren Korrektur erst in einer
neuen Hauptversion liegt (heute zum Beispiel nodemailer 10 oder sharp 0.35), wird im Sicherheitsprotokoll als „offen“ mit
Grund geführt und nicht umgangen.
2. **Direkte Abhängigkeiten werden angehoben, nicht überschrieben.** Steht der Baustein in einer `package.json`, ändern Sie
dort die Version (`pnpm --filter @tessera/api add paket@^x.y.z`). `undici` bleibt dabei **exakt** gepinnt, ohne `^`
(siehe die Dispatcher-Falle im Kapitel Konventionen).
3. **Mittelbare Abhängigkeiten werden über `pnpm.overrides` angehoben.** Steckt der verwundbare Baustein tief in einem anderen
Paket, tragen Sie im Wurzel-`package.json` unter `pnpm` → `overrides` einen Eintrag der Form
`"name@>=4 <5": "^4.28.7"` ein: links die Versionslinie, die verwundbar ist, rechts die kleinste bereinigte Fassung.
Ein Eintrag gilt **nur innerhalb derselben Hauptversion** (bei Fassungen unter 1.0 derselben Nebenversion) und hebt nur die
verwundbare Linie an. Danach `pnpm install` und mit `pnpm why name` prüfen, dass nur noch bereinigte Fassungen übrig sind.
4. **Jeder Override wird im Protokoll vermerkt** (Abschnitt „Verlauf“, Eintrag zur Aktualisierung) und **entfernt**, sobald das
übergeordnete Paket die bereinigte Fassung selbst mitbringt. Ein Override ist eine Überbrückung, kein Dauerzustand.
5. **Neue Paketnamen brauchen einen bekannten Vater.** Vergleichen Sie die Paketnamen vor und nach der Aktualisierung in
`pnpm-lock.yaml`. Taucht ein Name auf, der vorher nicht da war, muss ein aktualisiertes Paket ihn selbst deklarieren
(`npm view paket@version dependencies optionalDependencies`). Ein Name ohne solchen Vater deutet auf einen unterschobenen
oder vertippten Baustein; die Aktualisierung, die ihn mitbrachte, wird zurückgenommen.
6. **Prüfen Sie danach** `pnpm audit --prod` (vorher und nachher notieren), Typprüfung, Lint, beide Testläufe, den neu gebauten
lokalen Stack und die Rauchtests. Macht ein einzelner Baustein Probleme, nehmen Sie nur ihn zurück und führen ihn als
„offen“ mit Grund.
7. **Die Desktop-App** hat eine eigene Paketliste (`apps/desktop/src-tauri/Cargo.lock`). Dort heben Sie einen Baustein mit
`cargo update -p name --precise x.y.z` innerhalb seiner Versionslinie an und prüfen mit `cargo check` und `cargo clippy`.
### Prüfung von außen (ZAP) ### Prüfung von außen (ZAP)
Vor einer Freigabe wird alpha mit dem OWASP-ZAP-Abbild von außen angesehen (Ablauf: Betriebsanleitung, Kapitel 9, „Eine Vor einer Freigabe wird alpha mit dem OWASP-ZAP-Abbild von außen angesehen (Ablauf: Betriebsanleitung, Kapitel 9, „Eine
+20 -11
View File
@@ -11,12 +11,12 @@ Das Protokoll enthält bewusst keine Passwörter, keine Zugangsdaten und keine A
## Auf einen Blick ## Auf einen Blick
- **Zugangsdaten im Quelltext:** Es wurden keine echten Passwörter oder Schlüssel gefunden. Die gesamte Änderungsgeschichte des Projekts wurde durchsucht; alle 20 Treffer waren Fehlalarme, nämlich Testschlüssel, Beschriftungen und Beispiele in Notizen. - **Zugangsdaten im Quelltext:** Es wurden keine echten Passwörter oder Schlüssel gefunden. Die gesamte Änderungsgeschichte des Projekts wurde durchsucht; alle 20 Treffer waren Fehlalarme, nämlich Testschlüssel, Beschriftungen und Beispiele in Notizen.
- **Fremde Bausteine:** In den Bausteinen anderer Hersteller, die Tessera im Betrieb verwendet, sind 151 bekannte Schwachstellen verzeichnet, davon 5 kritische und 73 hohe. Für die allermeisten gibt es eine bereinigte Fassung innerhalb der aktuell verwendeten Versionslinie. Für zwei Bausteine (xlsx und node-forge) gibt es noch keine bereinigte Fassung; sie sind unter „Einordnung der Befunde“ eingeordnet. - **Fremde Bausteine:** Die erste Prüfung verzeichnete 151 bekannte Schwachstellen in den Bausteinen anderer Hersteller, die Tessera im Betrieb verwendet, davon 5 kritische und 73 hohe. Am 9. Oktober 2026 wurden die Bausteine innerhalb ihrer bisherigen Versionslinien aktualisiert und zwei ungenutzte Bausteine entfernt; danach sind es 12 (0 kritische, 9 hohe, 3 mittlere). Die übrigen 12 haben keine bereinigte Fassung in der verwendeten Versionslinie (xlsx, node-forge) oder werden erst in einer neuen Hauptversion behoben (nodemailer, sharp, deepmerge-ts); sie sind unter „Einordnung der Befunde“ mit Grund eingeordnet.
- **Eigener Quelltext:** Ein einziger echter Härtungspunkt wurde gefunden (die Längenprüfung bei der Entschlüsselung gespeicherter Geheimnisse, Schweregrad niedrig). Alles andere sind Fehlalarme oder bewusste, dokumentierte Entscheidungen. - **Eigener Quelltext:** Ein einziger echter Härtungspunkt wurde gefunden (die Längenprüfung bei der Entschlüsselung gespeicherter Geheimnisse, Schweregrad niedrig). Alles andere sind Fehlalarme oder bewusste, dokumentierte Entscheidungen.
- **Automatische Prüfung:** Seit dem 9. Oktober 2026 läuft nach jedem Bau der Plattform automatisch eine Sicherheitsprüfung. Sie meldet nur und hält den Bau nie an. - **Automatische Prüfung:** Seit dem 9. Oktober 2026 läuft nach jedem Bau der Plattform automatisch eine Sicherheitsprüfung. Sie meldet nur und hält den Bau nie an.
- **Prüfung von außen:** Vor jeder Freigabe wird der Testserver alpha wie ein Besucher ohne Konto angesehen, rein passiv und ohne Angriffe. Der erste Lauf am 9. Oktober 2026 (direkt gegen die Anwendung, ohne den vorgeschalteten Proxy) fand nichts Hohes, 2 mittlere und 6 niedrige Hinweise sowie 3 reine Informationen; alle betreffen fehlende Schutz-Kopfzeilen der Weboberfläche. Der Lauf über die öffentliche Adresse steht noch aus. - **Prüfung von außen:** Vor jeder Freigabe wird der Testserver alpha wie ein Besucher ohne Konto angesehen, rein passiv und ohne Angriffe. Der erste Lauf am 9. Oktober 2026 (direkt gegen die Anwendung, ohne den vorgeschalteten Proxy) fand nichts Hohes, 2 mittlere und 6 niedrige Hinweise sowie 3 reine Informationen; alle betreffen fehlende Schutz-Kopfzeilen der Weboberfläche. Der Lauf über die öffentliche Adresse steht noch aus.
- **Bisherige Prüfungen:** Acht Code-Prüfungen größerer Änderungen mit zusammen 89 Befunden; 76 davon sind behoben, die übrigen 13 sind Hinweise der niedrigsten Stufe. Alle kritischen Befunde und alle Warnungen sind behoben. - **Bisherige Prüfungen:** Acht Code-Prüfungen größerer Änderungen mit zusammen 89 Befunden; 76 davon sind behoben, die übrigen 13 sind Hinweise der niedrigsten Stufe. Alle kritischen Befunde und alle Warnungen sind behoben.
- **Was noch zu tun ist:** Die Bausteine mit bereinigter Fassung werden aktualisiert, und die fertigen Abbilder sollen keine Entwicklungswerkzeuge mehr enthalten. Der Stand jedes einzelnen Punkts steht in der Tabelle „Einordnung der Befunde“. - **Was noch zu tun ist:** Die fertigen Abbilder sollen keine Entwicklungswerkzeuge mehr enthalten, die Härtung der Längenprüfung bei der Entschlüsselung steht aus, und die offenen Bausteine werden bei neuen Fassungen der Hersteller erneut angesehen. Der Stand jedes einzelnen Punkts steht in der Tabelle „Einordnung der Befunde“.
## So lesen Sie dieses Protokoll ## So lesen Sie dieses Protokoll
@@ -183,20 +183,21 @@ Die Tabelle beurteilt jeden Befund der ersten vollständigen Prüfung. Sie wird
| Befund | Wo | Bewertung | Stand | Begründung | | Befund | Wo | Bewertung | Stand | Begründung |
|--------|----|-----------|-------|------------| |--------|----|-----------|-------|------------|
| Webframework Next.js, Fassung 15.5.19 | Weboberfläche | Kritisch (2 kritisch, 3 hoch, 7 mittel) | offen | Eine bereinigte Fassung derselben Hauptversion (15.5.27) liegt vor. Die Weboberfläche ist über den vorgeschalteten Proxy erreichbar, daher hat dieser Punkt die höchste Dringlichkeit. Er wird innerhalb der Hauptversion 15 behoben, ohne den Sprung auf eine neue Hauptversion | | Webframework Next.js, Fassung 15.5.19 | Weboberfläche | Kritisch (2 kritisch, 3 hoch, 7 mittel) | behoben (9. Oktober 2026) | Auf die bereinigte Fassung 15.5.27 derselben Hauptversion angehoben, ohne den Sprung auf eine neue Hauptversion. Die Weboberfläche ist über den vorgeschalteten Proxy erreichbar, daher hatte dieser Punkt die höchste Dringlichkeit |
| Express-Baustein proxy-addr 2.0.7 (Absenderadresse hinter einem vorgeschalteten Server) | Server | Kritisch (1) | offen | Der Fehler wirkt nur, wenn der Server den Adressangaben eines vorgeschalteten Servers vertraut. Tessera schaltet diese Einstellung nicht ein (im Quelltext geprüft), das tatsächliche Risiko ist deshalb gering. Eine bereinigte Fassung (2.0.8) lässt sich erzwingen | | Express-Baustein proxy-addr 2.0.7 (Absenderadresse hinter einem vorgeschalteten Server) | Server | Kritisch (1) | behoben (9. Oktober 2026) | Der Fehler wirkt nur, wenn der Server den Adressangaben eines vorgeschalteten Servers vertraut. Tessera schaltet diese Einstellung nicht ein (im Quelltext geprüft), das tatsächliche Risiko war deshalb gering. Die bereinigte Fassung 2.0.8 ist über eine Überschreibung in der Paketverwaltung erzwungen |
| Mail-Vorlagenpaket handlebars 4.7.9 | Server (ungenutztes Paket) | Kritisch (2 kritisch, 1 mittel) | offen | Das Paket gehört zu einem Mail-Baustein, den kein Modul mehr benutzt. Ein Angriff bräuchte eine eingeschleuste Vorlage; Vorlagen pflegt nur ein Administrator. Der ungenutzte Baustein soll entfernt werden | | Mail-Vorlagenpaket handlebars 4.7.9 | Server (ungenutztes Paket) | Kritisch (2 kritisch, 1 mittel) | behoben (9. Oktober 2026) | Das Paket gehörte zu einem Mail-Baustein, den kein Modul mehr benutzte. Der Baustein ist samt seiner Unterpakete aus dem Projekt entfernt; versendet wird ausschließlich über nodemailer. Mit ihm entfielen auch der zweite ungenutzte Baustein für die Anbindung von Exchange (die Anbindung läuft über eigene Abfragen mit NTLM-Anmeldung) und rund 230 mitgezogene Pakete |
| Mailversand nodemailer 9.0.x (und 8.0.11 in einem Nebenpaket) | Server | Hoch (3 hoch, 5 mittel) | offen | Fassung 9.1.x behebt die Meldungen. Mailadressen kommen von Administratoren und Benutzern, daher wird der Baustein aktualisiert | | Mailversand nodemailer 9.1.1 (vorher 9.0.x und 8.0.11 in einem Nebenpaket) | Server | Hoch (2 hoch, 3 mittel nach der Aktualisierung; vorher 3 hoch, 5 mittel) | offen | Auf die Fassung 9.1.1 angehoben (behoben am 9. Oktober 2026); das ältere Nebenpaket 8.0.11 ist mit dem ungenutzten Mail-Baustein entfernt, und die Fassung des Postfach-Bausteins ist per Überschreibung auf 9.1.1 gehoben. Die verbleibenden Meldungen betreffen das Lesen präparierter Mailanschriften (Überlastung) und eine Eigenheit des Zwischenspeichers bei der Namensauflösung; sie werden erst in der nächsten Hauptversion 10 behoben. Ein Wechsel dorthin gehört nicht zu einer Aktualisierung innerhalb der Hauptversion und ist hier bewusst nicht vorgenommen. Mailadressen und Anschriften kommen von Administratoren und angemeldeten Benutzern; die Hauptversion 10 wird als eigener Schritt geprüft |
| Netzwerkbaustein undici 7.28.0 und 6.27.0 | Server | Hoch (4 hoch, 13 mittel, 4 niedrig) | offen | Fassung 7.29.1 oder neuer derselben Hauptversion behebt die Meldungen. Die abgerufenen Adressen laufen zusätzlich durch den Adressschutz; das Anheben ist trotzdem sinnvoll | | Netzwerkbaustein undici 7.28.0 und 6.27.0 | Server | Hoch (4 hoch, 13 mittel, 4 niedrig) | behoben (9. Oktober 2026) | Auf Fassung 7.30.0 angehoben und exakt festgelegt (nicht als Bereich), weil mehrere Kopien des Bausteins zu schwer zu findenden Fehlern führen; die Fassung 6.27.0 verschwand mit dem ungenutzten Mail-Baustein. Alle Kopien im Projekt sind jetzt 7.30.0 |
| Datei-Upload multer 2.1.1 | Server | Hoch (3 hoch, 1 mittel, 1 niedrig) | offen | Fassung 2.4.0 gehört zum nächsten Nebenstand des Server-Frameworks. Hochladen können nur angemeldete Benutzer mit Modulfreigabe | | Datei-Upload multer 2.1.1 | Server | Hoch (3 hoch, 1 mittel, 1 niedrig) | behoben (9. Oktober 2026) | Mit dem Server-Framework auf 11.2.7 gehoben; es bringt multer 2.4.0 mit. Hochladen können nur angemeldete Benutzer mit Modulfreigabe |
| ZIP-Baustein adm-zip 0.6.0 | Server (Zertifikatsmanager) | Hoch (4 hoch, 3 mittel) | offen | Fassung 0.6.1 behebt die Meldungen mit Korrektur. Tessera begrenzt das Entpacken zusätzlich mit eigenem Code | | ZIP-Baustein adm-zip 0.6.0 | Server (Zertifikatsmanager) | Hoch (4 hoch, 3 mittel) | behoben (9. Oktober 2026) | Auf Fassung 0.6.1 angehoben, die die Meldungen mit Korrektur behebt. Tessera begrenzt das Entpacken zusätzlich mit eigenem Code |
| Hinweis zu adm-zip ohne Korrektur (Verknüpfungen in ZIP-Dateien) | Server (Zertifikatsmanager) | Mittel | bewusst akzeptiert | Nicht betroffen: Tessera liest ZIP-Einträge nur im Arbeitsspeicher, mit eigenen Grenzen für Größe, Verhältnis und Anzahl, und schreibt nie Einträge auf die Platte. Die angezeigte Gefahr entsteht erst beim Schreiben von Verknüpfungen | | Hinweis zu adm-zip ohne Korrektur (Verknüpfungen in ZIP-Dateien) | Server (Zertifikatsmanager) | Mittel | bewusst akzeptiert | Nicht betroffen: Tessera liest ZIP-Einträge nur im Arbeitsspeicher, mit eigenen Grenzen für Größe, Verhältnis und Anzahl, und schreibt nie Einträge auf die Platte. Die angezeigte Gefahr entsteht erst beim Schreiben von Verknüpfungen |
| Übrige Bausteine mit bereinigter Fassung innerhalb der Version: axios, @xmldom/xmldom, brace-expansion, ip-address, js-yaml, liquidjs, postcss, sharp, svgo, nanoid, browserslist, source-map-js, qs, uuid, moment, csv-parse, deepmerge-ts, linkify-it, underscore und weitere | Server und Weboberfläche, überwiegend mittelbar eingebunden | Hoch bis Mittel | offen | Es sind überwiegend Meldungen, bei denen eine präparierte Eingabe den Dienst überlasten kann. Für alle gibt es eine Korrektur in derselben Hauptversion; ein Teil davon steckt in ungenutzten Paketen, die entfernt werden | | Übrige Bausteine mit bereinigter Fassung innerhalb der Version: brace-expansion, ip-address, js-yaml, postcss, nanoid, browserslist, source-map-js, qs, fast-uri, underscore, baseline-browser-mapping, csv-parse und weitere (axios, @xmldom/xmldom, liquidjs, svgo, uuid, moment, linkify-it entfielen mit den ungenutzten Bausteinen) | Server und Weboberfläche, überwiegend mittelbar eingebunden | Hoch bis Mittel | behoben (9. Oktober 2026) | Es waren überwiegend Meldungen, bei denen eine präparierte Eingabe den Dienst überlasten kann. Die tief eingebundenen Bausteine sind über Überschreibungen (`pnpm.overrides` im Wurzel-`package.json`) auf die bereinigte Fassung derselben Hauptversion gehoben; csv-parse wurde direkt angehoben. Keine Überschreibung springt über eine Hauptversion |
| Zwei mittelbare Bausteine ohne bereinigte Fassung in der Versionslinie: Bildbaustein sharp 0.34.5 (im Webframework) und deepmerge-ts 7.1.5 (in der Datenbank-Werkzeugkette) | Weboberfläche, Server | Hoch (3 und 1) | offen | Die Korrektur liegt bei sharp erst in 0.35 (eine neue Nebenversion der Null-Linie, die wie eine Hauptversion behandelt wird), bei deepmerge-ts in Version 8. Die Meldungen zu sharp betreffen das Dekodieren präparierter Bilddateien (libvips, libheif, librsvg); sharp gehört zur Bild-Optimierung des Webframeworks, und in der Konfiguration sind keine fremden Bildquellen freigegeben, sodass nur eigene Dateien verarbeitet werden. deepmerge-ts steckt im Werkzeug der Datenbank-Anbindung, das mit der Datenbank-Hauptversion (Prisma 6.19.3 bleibt exakt festgelegt) mitgeführt wird. Beide werden mit der jeweils nächsten Hauptversion ihres Elternpakets behoben |
| Tabellenbaustein xlsx 0.18.5 | Server (Import Handelsware, Export DKV) | Hoch (2 hoch) | offen | Die beiden Meldungen betreffen das Verändern von Objekteigenschaften und die Überlastung durch präparierte Dateien. Auf dem öffentlichen Paketverzeichnis gibt es keine bereinigte Fassung. Der Baustein liest hochgeladene Tabellen angemeldeter Benutzer mit Modulfreigabe und schreibt DKV-Exporte. Er muss durch einen anderen Baustein ersetzt werden; bis dahin begrenzt die Modulfreigabe den Kreis möglicher Angreifer | | Tabellenbaustein xlsx 0.18.5 | Server (Import Handelsware, Export DKV) | Hoch (2 hoch) | offen | Die beiden Meldungen betreffen das Verändern von Objekteigenschaften und die Überlastung durch präparierte Dateien. Auf dem öffentlichen Paketverzeichnis gibt es keine bereinigte Fassung. Der Baustein liest hochgeladene Tabellen angemeldeter Benutzer mit Modulfreigabe und schreibt DKV-Exporte. Er muss durch einen anderen Baustein ersetzt werden; bis dahin begrenzt die Modulfreigabe den Kreis möglicher Angreifer |
| Zertifikatsbaustein node-forge 1.4.0 | Server (Zertifikatsmanager) | Hoch (1 hoch) | offen | Es ist keine bereinigte Fassung verzeichnet. Der Fehler betrifft das Prüfen von Unterschriften; im Zertifikatsmanager dient diese Prüfung dem Ordnen und Anzeigen der Kette, eine Zugriffsentscheidung hängt nicht daran. Der Baustein liest nur Dateien, die angemeldete Benutzer mit Modulfreigabe selbst hochladen; Größe, Anzahl und Rechenaufwand sind begrenzt. Er wird beobachtet und bei Erscheinen einer Korrektur aktualisiert | | Zertifikatsbaustein node-forge 1.4.0 | Server (Zertifikatsmanager) | Hoch (1 hoch) | offen | Es ist keine bereinigte Fassung verzeichnet. Der Fehler betrifft das Prüfen von Unterschriften; im Zertifikatsmanager dient diese Prüfung dem Ordnen und Anzeigen der Kette, eine Zugriffsentscheidung hängt nicht daran. Der Baustein liest nur Dateien, die angemeldete Benutzer mit Modulfreigabe selbst hochladen; Größe, Anzahl und Rechenaufwand sind begrenzt. Er wird beobachtet und bei Erscheinen einer Korrektur aktualisiert |
| Entwicklungswerkzeuge im Server-Abbild (tinypool, tar, pnpm) | Abbild `api` | Hoch (6 kritisch, 116 hoch im Abbild insgesamt) | offen | Das Abbild enthält Werkzeuge zum Testen und Bauen, die im Betrieb nichts tun, aber Schwachstellen mitbringen. Das fertige Abbild soll nur noch enthalten, was zum Laufen nötig ist | | Entwicklungswerkzeuge im Server-Abbild (tinypool, tar, pnpm) | Abbild `api` | Hoch (6 kritisch, 116 hoch im Abbild insgesamt) | offen | Das Abbild enthält Werkzeuge zum Testen und Bauen, die im Betrieb nichts tun, aber Schwachstellen mitbringen. Das fertige Abbild soll nur noch enthalten, was zum Laufen nötig ist |
| Paketverwalter npm im Node-Grundabbild | Abbild `web` | Hoch (Teil von 2 kritisch, 19 hoch) | offen | Das Grundabbild bringt einen Paketverwalter mit eigenen Bausteinen mit, der im Betrieb nicht gebraucht wird. Er soll aus dem fertigen Abbild entfernt werden | | Paketverwalter npm im Node-Grundabbild | Abbild `web` | Hoch (Teil von 2 kritisch, 19 hoch) | offen | Das Grundabbild bringt einen Paketverwalter mit eigenen Bausteinen mit, der im Betrieb nicht gebraucht wird. Er soll aus dem fertigen Abbild entfernt werden |
| Desktop-App: Baustein rustls 0.23.41 (Verschlüsselung der Verbindung) | Desktop-App | Mittel | offen | Eine bereinigte Fassung (0.23.45) liegt in derselben Versionslinie vor und lässt sich ohne Umbau einspielen | | Desktop-App: Baustein rustls 0.23.41 (Verschlüsselung der Verbindung) | Desktop-App | Mittel | behoben (9. Oktober 2026) | Auf 0.23.45 derselben Versionslinie angehoben (dabei zog der Paketverwalter den Begleitbaustein rustls-webpki von 0.103.13 auf 0.103.15 mit). Übersetzen und Codeprüfung der Desktop-App laufen fehlerfrei. Die nächste Fassung der Desktop-App muss neu gebaut werden, damit die Korrektur ausgeliefert wird |
| Desktop-App: Baustein glib 0.18.5 | Desktop-App (Linux-Oberfläche) | Mittel | offen | Die Korrektur liegt erst in Version 0.20, die zur Oberflächen-Bibliothek des Desktop-Frameworks gehört. Ein Wechsel ist nur mit deren Aktualisierung möglich | | Desktop-App: Baustein glib 0.18.5 | Desktop-App (Linux-Oberfläche) | Mittel | offen | Die Korrektur liegt erst in Version 0.20, die zur Oberflächen-Bibliothek des Desktop-Frameworks gehört. Ein Wechsel ist nur mit deren Aktualisierung möglich |
| Länge der Echtheitsprüfung bei AES-GCM (Entschlüsselung gespeicherter Geheimnisse) | Server, `crypto.service.ts` | Niedrig | offen | Beim Entschlüsseln wird die Länge des Echtheits-Codes nicht erzwungen. Ein Angreifer bräuchte dafür schreibenden Zugriff auf die Datenbank. Alle bisher gespeicherten Werte nutzen die volle Länge, die Härtung ist ohne Datenverlust möglich | | Länge der Echtheitsprüfung bei AES-GCM (Entschlüsselung gespeicherter Geheimnisse) | Server, `crypto.service.ts` | Niedrig | offen | Beim Entschlüsseln wird die Länge des Echtheits-Codes nicht erzwungen. Ein Angreifer bräuchte dafür schreibenden Zugriff auf die Datenbank. Alle bisher gespeicherten Werte nutzen die volle Länge, die Härtung ist ohne Datenverlust möglich |
| Vier abschaltbare Zertifikatsprüfungen (Verzeichnisdienst, Proxmox-Anmeldung, Proxmox-Abfragen, Symbolsuche) | Server | Mittel laut Werkzeug | bewusst akzeptiert | Die Prüfung entfällt nur, wenn ein Administrator das für genau eine Verbindung ausdrücklich erlaubt, etwa bei internen Servern mit selbst ausgestellten Zertifikaten. Standard ist die volle Prüfung. Die Entscheidung ist in Kommentaren des Quelltexts mit Verweis auf den Beschluss festgehalten | | Vier abschaltbare Zertifikatsprüfungen (Verzeichnisdienst, Proxmox-Anmeldung, Proxmox-Abfragen, Symbolsuche) | Server | Mittel laut Werkzeug | bewusst akzeptiert | Die Prüfung entfällt nur, wenn ein Administrator das für genau eine Verbindung ausdrücklich erlaubt, etwa bei internen Servern mit selbst ausgestellten Zertifikaten. Standard ist die volle Prüfung. Die Entscheidung ist in Kommentaren des Quelltexts mit Verweis auf den Beschluss festgehalten |
@@ -239,6 +240,14 @@ Die Beurteilung jeder Meldung steht in der Tabelle „Einordnung der Befunde“.
Der neueste Eintrag steht oben. Der neueste Eintrag steht oben.
### 2026-10-09 — Bausteine von Fremdherstellern aktualisiert
Alle Bausteine mit bereinigter Fassung innerhalb ihrer bisherigen Versionslinie wurden angehoben: das Webframework Next.js (15.5.19 auf 15.5.27), das Server-Framework (11.2.7, damit multer 2.4.0), der Mailversand (nodemailer 9.1.1), das Netzwerk-Paket undici (7.30.0), adm-zip (0.6.1) und csv-parse (7.0.3). Dazu kommen 15 Überschreibungen für tief eingebundene Bausteine (`pnpm.overrides`, jeweils innerhalb derselben Hauptversion) und die Entfernung der beiden ungenutzten Pakete für Mailvorlagen und die frühere Exchange-Anbindung. In der Desktop-App wurde rustls auf 0.23.45 gehoben. Prisma blieb exakt auf 6.19.3, Next.js auf der Linie 15, NestJS auf 11.
**Messung `pnpm audit --prod` (Bausteine im Betrieb):** vorher 151 Schwachstellen (5 kritisch, 73 hoch, 68 mittel, 5 niedrig), nachher 12 (0 kritisch, 9 hoch, 3 mittel, 0 niedrig). **Messung `pnpm audit` (alle Bausteine einschließlich Entwicklungswerkzeuge):** vorher 171 (7 kritisch, 85 hoch, 74 mittel, 5 niedrig), nachher 16 (2 kritisch, 9 hoch, 5 mittel, 0 niedrig); die 2 kritischen und 2 der mittleren gehören zu den Testwerkzeugen (tinypool und vitest 3), die nur im Entwicklungsbetrieb laufen und deren Korrektur in einer neuen Hauptversion liegt. Das Lockfile gewann keinen einzigen neuen Paketnamen; 232 Namen entfielen. Alle Testläufe, Typprüfung, Codeprüfung, der neu gebaute lokale Stack und die Rauchtests (einschließlich eines Mailversands an das lokale Postfach) liefen fehlerfrei.
**Offen:** xlsx und node-forge (keine bereinigte Fassung), nodemailer, sharp und deepmerge-ts (Korrektur erst in einer neuen Hauptversion) sowie glib in der Desktop-App. Der Stand jeder Zeile steht in „Einordnung der Befunde“.
### 2026-10-09 — Erste Prüfung von außen gegen alpha (OWASP ZAP) ### 2026-10-09 — Erste Prüfung von außen gegen alpha (OWASP ZAP)
Passiver Erstlauf gegen alpha in der Fassung v1.10.1-80-gd15a470 (Beta), direkt gegen die Anwendung und ohne den vorgeschalteten Proxy, weil die öffentliche Adresse vom Prüfrechner nicht erreichbar war. Ergebnis: 0 hoch, 2 mittel, 6 niedrig, 3 Informationen; alle Meldungen betreffen fehlende Schutz-Kopfzeilen der Weboberfläche oder beschreiben Zwischenspeicherung. Vor dem Lauf bewies ein Probelauf gegen eine Testseite, dass das Skript keine Formulare absendet. Beurteilung: siehe „Prüfung von außen gegen alpha“ und „Einordnung der Befunde“. **Offen:** der Lauf über die öffentliche Adresse; dort werden auch die Kopfzeilen und die Verschlüsselung des Proxys sichtbar. Passiver Erstlauf gegen alpha in der Fassung v1.10.1-80-gd15a470 (Beta), direkt gegen die Anwendung und ohne den vorgeschalteten Proxy, weil die öffentliche Adresse vom Prüfrechner nicht erreichbar war. Ergebnis: 0 hoch, 2 mittel, 6 niedrig, 3 Informationen; alle Meldungen betreffen fehlende Schutz-Kopfzeilen der Weboberfläche oder beschreiben Zwischenspeicherung. Vor dem Lauf bewies ein Probelauf gegen eine Testseite, dass das Skript keine Formulare absendet. Beurteilung: siehe „Prüfung von außen gegen alpha“ und „Einordnung der Befunde“. **Offen:** der Lauf über die öffentliche Adresse; dort werden auch die Kopfzeilen und die Verschlüsselung des Proxys sichtbar.
+19
View File
@@ -13,5 +13,24 @@
"turbo": "^2.9.18", "turbo": "^2.9.18",
"@biomejs/biome": "^2.5.0", "@biomejs/biome": "^2.5.0",
"typescript": "^5.5.0" "typescript": "^5.5.0"
},
"pnpm": {
"overrides": {
"baseline-browser-mapping@<2.11.0": "^2.11.0",
"brace-expansion@<2": "^1.1.21",
"brace-expansion@>=5 <6": "^5.0.12",
"browserslist@>=4 <5": "^4.28.7",
"fast-uri@>=3 <4": "^3.1.8",
"ip-address@>=10 <11": "^10.7.1",
"js-yaml@>=4 <5": "^4.3.2",
"nanoid@>=3 <4": "^3.3.18",
"nodemailer@>=9 <10": "^9.1.1",
"postcss@>=8 <9": "^8.5.23",
"proxy-addr@>=2 <3": "^2.0.8",
"qs@>=6 <7": "^6.16.0",
"source-map-js@>=1 <2": "^1.2.2",
"underscore@>=1 <2": "^1.13.8",
"undici@>=7 <8": "7.30.0"
}
} }
} }
+262 -3263
View File
File diff suppressed because it is too large Load Diff