Konektory (§4.1) łączą Orchestrator ze źródłami dowodów: skanery podatności, DAST, SIEM, CTI, SBOM/SAST i sekrety. Wynik zewnętrznego narzędzia staje się dowodem w warstwie Evidence — z hashem, źródłem i chain-of-custody. Konektor importuje ustalenia, nie uruchamia testu. Każdy format w tabeli niżej ma realny parser, test jednostkowy i zamontowany endpoint (dowód w tabeli niżej); ticketing dwukierunkowy, BAS i część threat-intel pozostają ROADMAP.
/api/ip3/v1/imports/* (uruchamialne dziś, patrz kolumna „Dowód"). Osobno: 3 konektory mają gotowy kod + test, ale endpoint jest fail-safe wyłączony domyślnie (501, wymaga flagi env) — oznaczone jawnie. Dwukierunkowy push do ticketingu (Jira/ServiceNow zapis zwrotny), BAS i część threat-intel = ROADMAP.
Granica działania: system nie wykonuje nieautoryzowanych testów, eksploitacji ani hack-back poza pisemnym RoE. Zero payloadów. Import wyniku ≠ wykonanie testu.
Konektor przyjmuje plik lub payload JSON z narzędzia, które już wykonało skan/analizę po stronie klienta. K0NSULT normalizuje ten wynik do wspólnego modelu dowodu — nie inicjuje skanu, nie wysyła pakietów do celu, nie posiada exploitów. Każde źródło dostaje status pewności (MEDIA_SIGNAL / TENTATIVE) i ślad pochodzenia (sha256, timestamp, operator).
Wszystkie poniższe pozycje są zamontowane pod POST /api/ip3/v1/imports/<slug> w routes/ip3-api-pro.js (montaż globalny: server.js → app.use('/api/ip3/v1', createIp3ProRouter(pool))). Import = MEDIA_SIGNAL (sygnał narzędzia, NIE dowód naprawy — doktryna claim ≤ proof). Kolumna „Dowód" = plik parsera + plik testu jednostkowego, oba do samodzielnej weryfikacji (node tests/<plik>).
| Konektor | Format wejścia | Status | Dowód (parser + test) | Endpoint |
|---|---|---|---|---|
| Burp Suite | XML | LIVE | routes/ip3-parsers.js (parseBurpXml) · tests/ip3-parsers.unit.js | POST /imports/burp |
| OWASP ZAP | JSON / XML | LIVE | routes/ip3-parsers.js (parseZapJson, parseZapXml) · tests/ip3-parsers.unit.js | POST /imports/zap |
| Nessus / Tenable | CSV | LIVE | routes/ip3-parsers.js (parseNessusCsv) · tests/ip3-parsers.unit.js | POST /imports/nessus |
| Qualys VMDR | CSV / XML | LIVE | routes/ip3-parsers-ext.js (parseQualysCsv, parseQualysXml) · tests/ip3-parsers-ext.unit.js | POST /imports/qualys |
| OpenVAS / Greenbone (GVM) | XML / CSV | LIVE | routes/ip3-parsers-ext.js (parseOpenVasCsv, parseOpenVasXml) · tests/ip3-openvas.unit.js | POST /imports/openvas |
| Reverse / malware (YARA, radare2) | JSON | LIVE | routes/ip3-re.js (parseRe) · tests/ip3-re.unit.js | POST /imports/re |
| DefectDojo | JSON | LIVE | routes/ip3-defectdojo.js (parseDefectDojo) · tests/ip3-defectdojo.unit.js | POST /imports/defectdojo |
| SARIF 2.1 (CodeQL / Semgrep / GHAS) | JSON | LIVE | routes/ip3-sarif.js (parseSarif) · tests/ip3-sarif.unit.js | POST /imports/sarif |
| SBOM (CycloneDX / SPDX) | JSON | LIVE | routes/ip3-sbom.js (parseCycloneDx, parseSpdx) · tests/ip3-sbom.unit.js | POST /imports/sbom |
| Secret scanning (Gitleaks / TruffleHog / GH secret-scanning) | JSON / NDJSON | LIVE | routes/ip3-secrets.js (parseGitleaks, parseTruffleHog) · tests/ip3-secrets-intake.unit.js | POST /imports/secrets |
| Cloud posture (Prowler / ScoutSuite / Checkov / Trivy config) | JSON | LIVE | routes/ip3-cloud-posture.js (parseCloudPosture) · tests/ip3-cloud-posture.unit.js | POST /imports/cloud |
| Splunk (Search / HEC eksport) | JSON | LIVE | routes/ip3-splunk.js (parseSplunk) · tests/ip3-splunk.unit.js | POST /imports/splunk |
| Microsoft Sentinel (incident/alert eksport) | JSON | LIVE | routes/ip3-sentinel.js (parseSentinel) · tests/ip3-sentinel.unit.js | POST /imports/sentinel |
| MISP (Event eksport) | JSON | LIVE | routes/ip3-misp.js (parseMispEvent, parseStixLite) · tests/ip3-misp.unit.js | POST /imports/misp |
| Generic SIEM webhook (payload wklejony ręcznie/API) | JSON | LIVE | routes/ip3-siem-webhook.js (parseSiemWebhook) · tests/ip3-siem-webhook.unit.js | POST /imports/siem-webhook |
| Generic CSV | CSV | LIVE | routes/ip3-parsers.js (parseGenericCsv) · tests/ip3-parsers.unit.js | POST /imports/csv |
| Generic JSON | JSON | LIVE | brak dedykowanego parsera — findingi przyjmowane wprost {source_tool, findings:[...]}, walidacja pól + cap w routes/ip3-api-pro.js | POST /imports/generic |
Weryfikacja niezależna: node tests/ip3-parsers.unit.js, node tests/ip3-sarif.unit.js, node tests/ip3-sbom.unit.js, node tests/ip3-defectdojo.unit.js, node tests/ip3-secrets-intake.unit.js, node tests/ip3-cloud-posture.unit.js, node tests/ip3-splunk.unit.js, node tests/ip3-sentinel.unit.js, node tests/ip3-misp.unit.js, node tests/ip3-siem-webhook.unit.js, node tests/ip3-openvas.unit.js, node tests/ip3-parsers-ext.unit.js, node tests/ip3-re.unit.js — każdy zwraca 0 FAIL na tym repozytorium (offline, bez DB).
Parser i testy istnieją i przechodzą, ale endpoint zwraca 501 dopóki operator nie ustawi flagi środowiskowej — celowy fail-closed (RoE/uprawnienia), nie ukryty brak.
| Konektor | Format | Status | Dowód (kod + test) | Endpoint | Jak włączyć |
|---|---|---|---|---|---|
| GitHub — code scanning / dependabot / secret alerts (pull live) | API (pull) | MVP — fail-safe OFF | routes/ip3-scm-ingest.js (ingestFromGitHub) · tests/ip3-scm-ingest.unit.js (49 PASS / 0 FAIL) | POST /imports/github/:owner/:repo | IP3_SCM_INGEST=on + IP3_GITHUB_TOKEN (bez tokenu: fallback na lokalny gh api) |
| STIX 2.1 bundle / TAXII 2.1 (CTI) | JSON | MVP — fail-safe OFF | routes/ip3-stix.js · tests/ip3-stix.unit.js, tests/ip3-stix-demo.unit.js | POST /imports/stix | IP3_STIX=on (parser offline działa zawsze; klient TAXII wymaga też adresu serwera) |
| SIEM webhook z weryfikacją HMAC (receiver, dedup+replay) | JSON + podpis X-Signature | MVP — fail-safe OFF | routes/ip3-siem-guard.js · tests/ip3-siem-guard.unit.js | POST /siem/webhook | IP3_SIEM_GUARD=on + IP3_SIEM_GUARD_SECRET |
Brak natywnego, nazwanego konektora „Syft". Output Syfta to standardowy CycloneDX lub SPDX JSON, więc trafia generycznie przez POST /imports/sbom (routes/ip3-sbom.js) — działa, ale bez rozpoznania metadanych specyficznych dla Syfta (np. pochodzenie warstwy obrazu, scope distro).
Istnieje jednokierunkowy eksport zadania remediacji (GET /api/ip3/v1/incidents/{id}/ticket, payload Jira/GitHub Issues, LIVE) oraz natywny lifecycle ticketu wewnątrz ipIII (routes/ip3-ticket-sync.js, IP3_TICKET_SYNC). Realny push do zewnętrznego Jira/ServiceNow (utworzenie + odczyt statusu w systemie klienta) pozostaje ROADMAP — pushToExternalTicketSystem() zwraca jawnie {ok:false, reason:'not_implemented'}, nigdy fałszywy sukces.
Uwaga techniczna (nie osobny konektor): routes/ip3-gitleaks.js i routes/ip3-trufflehog.js mają własne, przechodzące testy (tests/ip3-gitleaks.unit.js, tests/ip3-trufflehog.unit.js), ale nie są podpięte pod żaden endpoint — te same formaty obsługuje aktywnie routes/ip3-secrets.js pod /imports/secrets. Traktować jako kod zapasowy/martwy, nie jako oddzielny, brakujący konektor.
Threat-intel jako żywy feed (subskrypcja, nie jednorazowy eksport), BAS (Breach & Attack Simulation) i automatyczna walidacja ekspozycji. Żaden plik parsera/testu dla tych pozycji nie istnieje w repozytorium.
| Konektor | Klasa | Formaty / transport | Rola | Prio | Status |
|---|---|---|---|---|---|
| MISP — subskrypcja żywego feedu | Threat intel | TAXII, push | IoC w czasie rzeczywistym | P1 | ROADMAP (jednorazowy import Event JSON = LIVE, patrz wyżej) |
| OpenCTI | Threat intel | GraphQL | korelacja zagrożeń | P1 | ROADMAP |
| SafeBreach / AttackIQ / Picus | BAS | API | walidacja kontroli | P1 | ROADMAP |
| Pentera / XM Cyber / NodeZero | Auto-pentest | API | ekspozycja / ścieżki ataku | P1 | ROADMAP |
| Dependency-Track | SCA / SBOM | REST API | ryzyko komponentów (integracja platformy, nie format) | P1 | ROADMAP (SBOM CycloneDX/SPDX generyczny = LIVE, patrz wyżej) |
| Jira / ServiceNow — zapis zwrotny | Ticketing | REST | dwukierunkowo | P0 | ROADMAP |
Dla źródeł bez dedykowanego konektora: operator mapuje kolumny/pola wejścia na kanoniczny model dowodu przez interfejs (UI). Ten interfejs (kreator klikany, nie API) jest specyfikacją — POST /imports/generic i /imports/csv już dziś przyjmują dowolne pola bez UI, patrz tabela LIVE wyżej.
WEJŚCIE (Generic JSON, przyklad demo) MODEL DOWODU (kanoniczny)
{ {
"host": "10.20.0.14", ──map──► "asset": "10.20.0.14",
"plugin": "CVE-2024-XXULT", ──map──► "finding_ref": "CVE-2024-XXULT",
"risk": "High", ──map──► "severity": "high",
"evidence": "banner grab...", ──map──► "proof_blob": "<hash SHA-256>",
"tool": "nessus" ──map──► "source": "nessus",
} "confidence": 0..100,
"chain": [import, ts, operator]
}
Liczby policzone z plików repozytorium w tej sesji (parsery + testy + montaż endpointu), nie deklaracja marketingowa.
grep -oE "r.post\('/imports/[a-z0-9-]+" routes/ip3-api-pro.js oraz grep -oE "importParser\('[a-z0-9-]+" routes/ip3-api-pro.js