Assessor_2.0/docs/IMPORT_SECURITY_LIMITS.md

11 KiB
Raw Blame History

Import-Sicherheit und Ressourcenlimits

Geltungsbereich

Diese Grenzen gelten für alle von der gemeinsamen Importengine unterstützten Dateien: CSV, JSON, XML, HTML/HTM, XLSX und XLS. Im empfohlenen lokalen Serverbetrieb wird jeder Parserauftrag in einem eigenen Node.js-Worker ausgeführt. Der Browser- und Tauri-Fallback verwendet dieselben Inhaltsgrenzen, besitzt aber keine gleichwertige harte Zeit- und Speicherisolation. Für den späteren Firmenbetrieb ist deshalb ausschließlich der Serverpfad vorgesehen.

Verarbeitungsreihenfolge

  1. Die API begrenzt den JSON-Request und prüft Erweiterung, Base64-Daten linear und stack-sicher sowie deklarierte Größe und tatsächliche Byteanzahl.
  2. ZIP-basierte Excel-Dateien werden anhand ihres Zentralverzeichnisses geprüft, bevor SheetJS sie öffnet.
  3. Dekodierte Textformate werden vor DOM-, JSON- oder CSV-Parsing auf Größen und gefährliche Konstrukte geprüft.
  4. Die formatspezifischen Parser erzeugen das gemeinsame Zwischenmodell.
  5. Tabellen-, Zeilen-, Spalten- und Zellgrenzen werden auf diesem Zwischenmodell erneut geprüft.
  6. Erst danach folgen Erkennung, Normalisierung, Vorschau und eine ausdrücklich bestätigte, atomare Persistenz.

Limitverletzungen erzeugen strukturierte Importdiagnosen. Beim Batchimport bleibt der Fehler auf die betroffene Datei begrenzt.

Inhaltsgrenzen pro Datei

Ressource Standardgrenze
Quelldatei 100 MiB
dekodierter Text 64 Mi Zeichen
Tabellen 256
Zeilen je Tabelle 250.000
Zeilen insgesamt 500.000
Spalten je Tabelle 2.000
Zeichen je Zelle 1.000.000
Zeichen in allen Zellen 64 Mi Zeichen
HTML-/XML-Elemente 500.000
JSON-Verschachtelung 256 Ebenen
ZIP-Einträge 20.000
entpackte Größe je ZIP-Eintrag 128 MiB
entpackte ZIP-Gesamtgröße 512 MiB
ZIP-Kompressionsverhältnis 200:1

Zusätzlich gelten maximal 50 Dateien pro Importvorschau und 140 MiB pro API-Request einschließlich Base64-Overhead.

Parserisolation im Serverbetrieb

Einstellung Standard Zulässiger Bereich
ASSESSOR_PARSER_TIMEOUT_MS 30.000 ms 1.000–300.000 ms
ASSESSOR_PARSER_MAX_CONCURRENT 2 Worker 1–8
ASSESSOR_PARSER_MAX_QUEUE 8 Aufträge 0–100
ASSESSOR_PARSER_MAX_QUEUE_MB 256 MiB 16–2.048 MiB
ASSESSOR_PARSER_MEMORY_MB 512 MiB Old Generation 128–2.048 MiB

Jeder Auftrag erhält einen neuen Worker. Nach Ablauf des Zeitlimits wird dieser beendet. Workerfehler und Speicherabbrüche werden als kontrollierte Parserdiagnose zurückgegeben. Ist gleichzeitig die Auftrags- oder Bytekapazität der Warteschlange erreicht, lehnt der Server weitere Parseraufträge kontrolliert ab. Die Young Generation ist zusätzlich auf 64 MiB und der Worker-Stack auf 8 MiB begrenzt.

Formatspezifische Härtung

HTML-Performancefix 2026-09-09: Formatadapter 1.1.1, PingCastle-Extractor 2.2.1 und CIS-CAT-Extractor 1.3.1 verwenden einen gemeinsamen linearen Attributleser. Lange Attribute ohne Wert und lange Leerraeume duerfen keine quadratischen Suchwiederholungen verursachen. Interne PingCastle-IDs und Ankernamen werden fuer das jeweilige Markup einmal indiziert; Duplikate, Reihenfolge und Offsets bleiben erhalten. Profile und fachliche Mappingvertraege bleiben unveraendert. Der rein synthetische 3.159.338-Byte-Regressionstest brach im alten Produktionsworker nach 30.011 ms ab und laeuft nach dem Fix mit allen 40 Regeln und 40 verknuepften Tabellen in beobachteten 1.590 ms. Die Messung ist kein universelles Laufzeitversprechen. Wiederholbar nach dem Build mit node tests/server/html-parser-stress.mjs; der Test behaelt das 30-Sekunden-Budget und die 512/64-MiB-Heapgrenzen bei. Die regulaere Suite prueft zusaetzlich begrenzte Zeichenarbeit, Originale und Browser-/Serverparitaet.

  • HTML: script, style, eingebettete Frames/Objekte, Formulare, Medien, SVG und weitere aktive Elemente werden entfernt. Ereignisattribute und navigierende oder nachladende Attribute wie src, srcdoc und action werden vor der Tabellenauswertung gelöscht; href bleibt nur fuer sichere HTTP(S)-Beleglinks erhalten. Importierter Code wird nicht ausgeführt. Berichte oberhalb von 1 Mi Zeichen sowie DOM-Stacküberläufe wechseln automatisch in eine begrenzte, nicht rekursive Tabellenextraktion.
  • XML: DOCTYPE, ENTITY, SYSTEM und PUBLIC werden vor dem DOM-Parser abgewiesen. Externe Entitäten und lokale Dateireferenzen werden dadurch nicht aufgelöst.
  • Excel: Verschlüsselte ZIP-Einträge, nicht zugelassene Kompressionsverfahren, ausbrechende Archivpfade, ZIP64 und eingebettete vbaProject.bin-Inhalte werden abgewiesen. SheetJS läuft ohne Formel- oder VBA-Auswertung.
  • CSV-Export: Intern bleiben Originalwerte unverändert. Spreadsheet-orientierte Downloads, Aktionslisten und kopierte Tabellen neutralisieren führende =, +, - oder @, damit ein späteres Öffnen keine Formel aktiviert.
  • ZIP: Eintragsanzahl, Einzel- und Gesamtgröße sowie Kompressionsverhältnis werden ausschließlich aus dem Zentralverzeichnis vor dem Entpacken geprüft.

PurpleKnight-Vollständigkeit

  • Native HTML-Zuweisungen werden über den begrenzten statischen Datenleser verarbeitet, nicht evaluiert: maximal 128 Verschachtelungsebenen, 1.000.000 Werte und 16 Mi Zeichen je Datenobjekt, 1.000.000 Zeichen je String sowie 250.000 Indikatoren je Bericht. Globale Datei-/Workergrenzen gelten zusätzlich.
  • Beschädigte Strukturen und fehlende native IDs scheitern explizit; ein angekündigter Ergebnisbestand darf nicht erfolgreich auf null reduziert werden. Mehrfache Zuweisung derselben Berichtswurzel oder desselben Datenobjekts ist ein Fehler. Wiederholte Regel-IDs erhalten eine Warnung und bleiben als getrennte Vorkommen erhalten.
  • Deklarierte Summen, Statuszahlen, Kategorieverweise und Detailanzahlen werden gegen die gelesenen Einzeleinträge geprüft. Widersprüche markieren den Import als partiell; Originalzähler und vollständige Einträge bleiben unverändert.
  • Explizite Null-Details sind bei null Ergebnissen gültig. Zeitstempel werden nicht zur Nachahmung eines Excel-Anzeigeformats auf Minuten gekürzt.
  • Workbook-Summary, Indikatorentabelle und Ergebnisblätter werden gemeinsam geprüft. CSV-Dateiname allein reicht weiterhin nicht zur Werkzeugfreigabe.

PingCastle-Strukturtreue

Ab Profil 1.5.0 / Extractor 2.2.0 bewahrt der XML-Kontext alle Attribute als dekodierte Originalwerte mit /@Name-Quellpfad und ausdrücklich leere Blätter als empty. Namespace, Nullwert, 0, false und leere Zeichenkette werden nicht gleichgesetzt. Die vorhandene Attribut-Anzeigezeichenkette bleibt erhalten; ältere Adapter ohne strukturierte Attribute erhalten eine Diagnose statt einer mehrdeutigen Rückkonvertierung. Der originale Dateitext bleibt unverändert.

HTML-Formatadapter 1.1.1 und XML-Formatadapter 1.1.0 liefern diese Struktur beziehungsweise eine attributgrenzenbewusste HTML-Extraktion. Spitze Klammern in zitierten Attributen werden nur für die inerte lexikalische Auswertung geschützt. Skripte werden nicht ausgewertet. Attributbereinigung arbeitet auf vollständigen Attributen, nicht auf scheinbaren src-/href-Angaben innerhalb eines Tooltips. Ein abgeschnittener End-Tag in einem begrenzten Textausschnitt wird nicht als Zellinhalt übernommen; ein nicht abgeschlossenes zitiertes Attribut im vollständigen Dokument führt zu einer Diagnose.

Fehlende native Rule IDs werden abgewiesen, doppelte IDs mit einer Warnung gemeldet. Die bestehende erste Darstellung bleibt das Finding. HTML-Trefferzahlen in den Kategorieüberschriften werden gegen eindeutige Regeln abgeglichen; Kataloggrößen sind keine Ergebniszahlen. Abweichungen oder ungültige Zähler markieren die Verarbeitung als partial, ohne gültige Regeln zu entfernen. Angekündigte Treffer ohne lesbare Ergebnisse scheitern; ausdrücklich deklarierte Nulltreffer bleiben zulässig. Originalzähler stehen in einem eigenen Berichtsabschnitt, nicht in der Assetzählung. Fehlende Zähler erlauben keinen belegten Vollständigkeitsanspruch. XML-Semantikmapping und Control-Path-JSON bleiben separate Arbeitspakete. Bestehende Importe werden nicht geändert.

Statische Maester-Berichtsdaten

Der Maester-HTML-Extractor 1.1.0 unterstützt JSON und statische Objektliterale in Script-Zuweisungen sowie JSON-Datenblöcken. Der Locator überspringt Zeichenketten, Kommentare und übliche Regex-Literale; er ist kein allgemeiner JavaScript-Parser. Der anschließende Datenparser erlaubt keine Codeausführung und keine dynamischen Ausdrücke. Insbesondere werden Template-Interpolation, Aufrufe, Getter, Spread, berechnete und doppelte Schlüssel abgewiesen. Unbekannte statische Datenfelder bleiben mit ihrem Objektpfad erhalten.

Pro Datenobjekt gelten 16 Mi Zeichen, 128 Verschachtelungsebenen, eine Million Werte und eine Million Zeichen pro Zeichenkette. Pro Datei werden höchstens 32 potenzielle Berichtsobjekte geprüft und 250.000 Tests akzeptiert. Eine Grenzverletzung oder ein beschädigter Test führt zum Fehler, nicht zur stillen Kürzung. Mehrere konkurrierende Berichtswurzeln werden abgewiesen; ein expliziter Tenants-Container erhält seine getrennten Mandantenpfade. Deklarierte Summen werden gegen Einzeltests geprüft. Abweichungen bleiben Warnungen mit beiden Zählwerten, ohne die Quelle oder die Ergebnismenge zu verändern.

Vorschau, Persistenz und Protokollierung

Nicht bestätigte Vorschauen liegen höchstens 15 Minuten im Arbeitsspeicher. Der Cache ist auf 10 Batches und 256 MiB Quelldaten begrenzt. Abgelaufene oder verdrängte Vorschauen können nicht persistiert werden. Beim Abschluss werden IDs, SHA-256, Dateiname, Größe und Änderungszeit gegen die serverseitige Vorschau geprüft.

Die Importpipeline schreibt keine Quelldateien oder Parser-Zwischendateien in temporäre Verzeichnisse. PostgreSQL-Zugriffe verwenden Parameter; ein bestätigter Batch wird in einer Transaktion gespeichert.

Das aktuelle Audit-Log enthält nur Zeitpunkt, Request-ID, Methode, Pfad, Status, Dauer und gegebenenfalls einen Fehlercode. Datei- und Requestinhalte werden nicht protokolliert. Das Log liegt derzeit nur im Prozessspeicher; dauerhafte zentrale Protokollierung, Zugriffsschutz und Aufbewahrung gehören zu Phase 14.

Verifikation

Die automatisierten Sicherheits- und Lasttests prüfen unter anderem Größenfehler, ZIP-Bomb-Metadaten, verschlüsselte/VBA-haltige Archive, XML-Entitäten, tiefe JSON-Strukturen, Nullbytes, aktives HTML, Parser-Timeout, Warteschlangenkapazität, Vorschauablauf, Formel-Injection, einen CSV-Import mit 30.000 Datensätzen, ein Zwischenmodell mit 140.000 Zeilen und einen PingCastle-ähnlichen HTML-Bericht mit 5,9 MB. Der PostgreSQL-Integrationstest prüft den tatsächlichen Transaktions- und Persistenzpfad.