37 lines
11 KiB
JSON
37 lines
11 KiB
JSON
{
|
|
"surface": "report",
|
|
"manifest": {
|
|
"version": 1,
|
|
"surface": "report",
|
|
"title": "PingCastle: Importprüfung",
|
|
"generatedAt": "2026-09-09T11:30:00Z",
|
|
"sources": [
|
|
{"id":"pair","label":"Freigegebener PingCastle-Dummy und Assessor-Import","query":{"description":"Abgleich von ad_hc_sevenkingdoms.local.html und ad_hc_sevenkingdoms.local.xml mit der unveränderten Assessor-Pipeline. Native Quellzählung, Browser-/Server-Adapter und kanonisches Modell; Prüfung am 9. September 2026. Profil 1.4.0, Extractor 2.1.0."}},
|
|
{"id":"xml","label":"ad_hc_sevenkingdoms.local.xml","query":{"language":"javascript","engine":"Node.js / JSDOM","sql":"const leafNodes = [...document.querySelectorAll('*')].filter(element => !element.children.length && !element.closest('RiskRules'));\nconst total = leafNodes.length;\nconst textLeaves = leafNodes.filter(element => element.textContent?.trim()).length;\nconst attributeOnlyLeaves = leafNodes.filter(element => !element.textContent?.trim() && element.attributes.length);\nconst attributeKinds = Object.fromEntries([...new Set(attributeOnlyLeaves.map(element => element.tagName))].map(key => [key, attributeOnlyLeaves.filter(element => element.tagName === key).length]));\nconst emptyLeaves = leafNodes.filter(element => !element.textContent?.trim() && !element.attributes.length).length;","description":"Ausgeführter Zählkern; document ist das inerte XML-DOM der Datei ad_hc_sevenkingdoms.local.xml. 758 Blattelemente außerhalb RiskRules: 664 mit nichtleerem Text, 24 ohne Text mit Attributen, 70 ohne Text und Attribute. Vergleich mit den 664 kanonischen Kontextbeobachtungen. Diagramm gruppiert HealthCheckCertificateTemplateRights separat (16), Dist und CompromiseGraphAnomalyAnalysisData gemeinsam (4 + 4). Namespace-Deklarationen der Wurzel sind nicht Teil dieser Blattzählung."}},
|
|
{"id":"html","label":"ad_hc_sevenkingdoms.local.html","query":{"description":"Unabhängige inerte DOM-Prüfung und JSON.parse ausschließlich für application/json-Blöcke. Keine Ausführung von Berichtsskripten. Vergleich mit Kandidaten, Berichtstabellen, Detailfeldern und Kontextprojektion."}},
|
|
{"id":"guards","label":"Synthetische PingCastle-Gegenproben und Quellcode","query":{"description":"Temporäre Vitest-Prüfung von leerer Rule ID, deklarierten zwei Treffern bei einer Regel und zweimal derselben Rule ID. Alle drei Fälle als complete ohne Diagnose akzeptiert. Geprüfte Funktionen: htmlCandidates, xmlCandidates, contextObservations in src/importers/pingcastle-source-extractor.ts; decodeHtmlLexically in src/importers/html-extraction.ts. Temporäre Dateien nach der Prüfung entfernt."}}
|
|
],
|
|
"blocks": [
|
|
{"id":"title","type":"markdown","body":"# PingCastle: Importprüfung"},
|
|
{"id":"summary","type":"markdown","sourceId":"pair","body":"## Befunde vollständig, Zusatzdaten nicht vollständig\n\nHTML und XML liefern jeweils **37 von 37 ausgelösten Regeln**, ohne doppelte Regel-IDs und ohne Mapping-Rückfragen. Titel, Regelpunkte, Status sowie zugeordnete Domain- und Kategoriescores stimmen für alle 37 Regeln überein. Der strukturierte Kontext ist dagegen lückenhaft beziehungsweise teilweise verunreinigt. Für die Zusage, PingCastle vollständig zu übernehmen, sind weitere Korrekturen erforderlich.\n\nGeprüft wurde die vorhandene Implementierung, nicht verändert. Bestehende Importe wurden nicht ersetzt."},
|
|
{"id":"scope","type":"markdown","sourceId":"pair","body":"## Was hier als vollständig gilt\n\nEin Befund ist eine ausgelöste RiskRule, nicht jede Regel des PingCastle-Prüfkatalogs. Das HTML nennt 10 Treffer bei Stale Objects, 7 bei Privileged Accounts, 0 bei Trusts und 20 bei Anomalies; zusammen 37. Die daneben genannten insgesamt 187 Katalogregeln dürfen nicht als 187 vorhandene Einzeltestergebnisse behandelt werden.\n\nAssessor übernimmt für beide Formate denselben Status und dieselbe abgeleitete Severity: 8 Medium, 13 Low, 16 Info. PingCastle liefert Regelpunkte, keine native Severity je Regel. Domain-Risiko 100, Stale Objects 31, Privileged Accounts 85, Trusts 0 und Anomalies 100 bleiben native Risikowerte, keine vergleichbaren ASSESSOR-Scores.\n\nKontextvollständigkeit bedeutet zusätzlich: Textwerte, Attribute, explizite Leere, Berichtsdaten und strukturierte Verknüpfungen bleiben mit Herkunft nutzbar. Die bloße Verfügbarkeit des ursprünglichen Rohdokuments erfüllt diese Bedingung nicht."},
|
|
{"id":"xml-loss","type":"markdown","sourceId":"xml","body":"## P1: XML verliert Attributwerte und explizite Leere\n\nVon 758 Kontext-Blattelementen gelangen die 664 mit nichtleerem Text als Beobachtungen in das kanonische Modell. **24 attributtragende Blattelemente ohne Text fehlen dort**: 16 CertificateTemplateRights, 4 Verteilungsdatensätze und 4 Control-Path-Analysewerte. Dazu kommen 70 ausdrücklich leere Elemente. Dadurch gehen insbesondere Berechtigungs- und Verteilungsinformationen im strukturierten Kontext verloren; eine leere Sammlung ist nicht mehr zuverlässig von einer nicht erhobenen Sammlung unterscheidbar.\n\nDie folgende Darstellung zählt XML-Blattelemente, nicht Attribute oder Findings. Alle vier Gruppen sind disjunkt und ergeben zusammen 758. Roh-XML und generische Zwischenstruktur sind hiervon zu unterscheiden: Die Lücke liegt in der kanonischen Kontextprojektion. Sicherheit der Feststellung: hoch."},
|
|
{"id":"xml-coverage","type":"chart","chartId":"xml-leaves"},
|
|
{"id":"html-loss","type":"markdown","sourceId":"html","body":"## P1: HTML-Attributreste verschmutzen Kontext und Details\n\n**47 Kontextzellen** enthalten technische Attributreste. Auch 3 Finding-Details und 16 Zellen der verknüpften Ergebnistabellen sind betroffen; letztere Zahl zählt Vorkommen, nicht eindeutige Quellzellen. Die lexikalische HTML-Verarbeitung und einfache Tag-Regulärausdrücke behandeln spitze Klammern innerhalb zitierter Attribute nicht robust genug. Eine reine Anzeigebereinigung löst die Verunreinigung gespeicherter beziehungsweise normalisierter Werte nicht.\n\nEmpfehlung: Attributgrenzen sicher berücksichtigen, sichtbaren Zelltext getrennt vom ursprünglichen Markup gewinnen und beide mit Provenienz erhalten. Dieselbe Bereinigung muss für Kontext- und Finding-Details gelten. Sicherheit: hoch."},
|
|
{"id":"graphs","type":"markdown","sourceId":"html","body":"## P2: Control-Path-Graphdaten werden nicht strukturiert übernommen\n\nDas HTML enthält 27 gültige application/json-Blöcke: **26 Graphen mit zusammen 255 Knoten- und 229 Kanten-Vorkommen** sowie ein Wörterbuch mit Beziehungserklärungen. Diese Graphstrukturen werden vom PingCastle-Extractor nicht als eigene Strukturen erhalten. Vorhandene Tabellen und Texte können Teile derselben Information enthalten, ersetzen aber keine Knoten-Kanten-Beziehungen. Die Zahlen sind keine deduplizierte Anzahl von AD-Objekten.\n\nZusätzlich bleibt ein Detailverweis auf HardenedPaths unaufgelöst. Im Quelldokument existiert kein entsprechendes Ankerziel; die vorhandene Warnung ist hier korrekt. Daraus darf kein erfundener Detailabschnitt entstehen. Sicherheit: hoch."},
|
|
{"id":"xml-mapping","type":"markdown","sourceId":"pair","body":"## P2: XML-Kontext fehlt die gemeinsame fachliche Zuordnung\n\nHTML liefert 1.513 Kontextbeobachtungen in 17 Abschnitten, XML 664 Beobachtungen in einem Sammelabschnitt. Diese Mengen haben unterschiedliche Körnung und dürfen nicht direkt als Verlustquote verglichen werden. Beim XML liegen sämtliche Werte unter generischen pingcastle.xml-Eigenschaften. Gemeinsame Eigenschaften wie domain.fqdn, risk.domain und report.engine_version fehlen. Obwohl der Export die Werte enthält, können die darauf aufbauenden Client-Info-Selektoren sie nicht gleichwertig nutzen; auch die kanonische Toolversion bleibt beim XML leer.\n\nEmpfehlung: XML und HTML auf denselben fachlichen Kontextvertrag abbilden und zugleich die unveränderten XML-Werte samt Herkunft erhalten. Fehlende Daten niemals zu Null umdeuten. Sicherheit: hoch."},
|
|
{"id":"guards","type":"markdown","sourceId":"guards","body":"## P1: Fehlende Regeln müssen als Fehler oder Teilverarbeitung auffallen\n\nDrei synthetische Gegenproben werden ohne Diagnose als vollständig akzeptiert: ein angekündigter Treffer mit leerer Rule ID wird zu 0 Kandidaten; zwei angekündigte Treffer mit nur einem Regelblock werden zu 1 Kandidaten; zwei Blöcke mit derselben ID werden still zu 1 Kandidaten. Die freigegebenen Originaldateien zeigen diese Abweichungen nicht. Die Gegenproben belegen eine fehlende Schutzprüfung für künftige oder beschädigte Exporte.\n\nEmpfehlung: deklarierte Trefferzahlen je Kategorie gegen unabhängig gezählte Einzelregeln prüfen, fehlende Identitäten explizit melden und Dubletten nicht kommentarlos verwerfen. Sicherheit: hoch."},
|
|
{"id":"verification","type":"markdown","sourceId":"pair","body":"## Prüfung und Grenzen\n\nNative Regel-IDs wurden unabhängig gezählt und mit dem Import abgeglichen. Für XML stimmen außerdem sämtliche 37 Rationale-, Points-, Category- und Model-Werte mit dem Quelltext überein. Browser- und Server-Adapter erzeugen für beide Dateien dieselben Kandidaten und Kontextbeobachtungen; beide Modelle bestehen die kanonische Strukturvalidierung. Die fokussierten vorhandenen Tests bestanden; die Gegenproben demonstrieren fehlende Guards, keine bereits implementierten Fixes.\n\nUnterschiede bei HTML-Absatztexten wurden nicht pauschal als Verlust gewertet: die geprüften Differenzen waren überwiegend Whitespace oder zusätzliche Inhalte gegenüber dem ersten DOM-Absatz. Ein tiefer DOM-Auditlauf überschritt unter Last sein Zeitlimit; daraus wird kein Performance-Benchmark abgeleitet. Keine Aussage über sämtliche PingCastle-Versionen, keine Bestandsdatenmigration, kein Reimport und keine vollständige visuelle UI-Abnahme. Es liegt ein Berichtspaar vor, daher keine Zeitreihenanalyse."},
|
|
{"id":"next","type":"markdown","body":"## Empfohlene Reihenfolge\n\n1. XML-Attribute und explizite Leere verlustfrei in den Kontext übernehmen.\n2. HTML-Zell- und Detailtext korrekt auslesen.\n3. Vollständigkeits-, Identitäts- und Dublettendiagnosen ergänzen.\n4. XML auf den gemeinsamen Kontextvertrag abbilden.\n5. Statische Control-Path-JSON-Daten samt Beziehungen erhalten.\n\nAnschließend synthetische Regressionen und denselben Dummy-Abgleich durchführen, Verarbeitung versionieren und bestehende Importe gezielt neu importieren. Vor einer Umsetzung bleibt zu entscheiden, ob Control-Path-Daten zunächst als strukturierte Evidenz genügen oder zusätzlich eine eigene Darstellung erhalten sollen. Die Parserprüfung autorisiert keine automatische Zusammenführung von HTML und XML zu einem Scan."}
|
|
],
|
|
"charts": [{"id":"xml-leaves","title":"XML-Kontext nach Quellstruktur","dataset":"xmlLeaves","sourceId":"xml","type":"bar","encodings":{"x":{"field":"group"},"y":{"field":"count"}},"options":{"orientation":"horizontal","showValueLabels":true,"showLegend":false}}]
|
|
},
|
|
"snapshot": {"version":1,"status":"ready","generatedAt":"2026-09-09T11:30:00Z","datasets":{"xmlLeaves":[
|
|
{"group":"Textwerte übernommen","count":664,"state":"retained","totalContextLeaves":758},
|
|
{"group":"Explizit leere Elemente fehlen","count":70,"state":"missing","totalContextLeaves":758},
|
|
{"group":"Berechtigungsattribute fehlen","count":16,"state":"missing","totalContextLeaves":758},
|
|
{"group":"Verteilungs-/Graphattribute fehlen","count":8,"state":"missing","totalContextLeaves":758}
|
|
]}},
|
|
"sources": []
|
|
}
|