@zivis/mcp 0.1.8 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +19 -0
- package/dist/api-client.d.ts +2 -24
- package/dist/api-client.js +32 -52
- package/dist/auth/index.d.ts +1 -22
- package/dist/auth/index.js +17 -38
- package/dist/auth/jwt.d.ts +0 -16
- package/dist/auth/jwt.js +0 -13
- package/dist/auth/keychain.d.ts +6 -32
- package/dist/auth/keychain.js +83 -114
- package/dist/auth/oauth.d.ts +3 -32
- package/dist/auth/oauth.js +67 -61
- package/dist/auth/sessions.d.ts +5 -25
- package/dist/auth/sessions.js +20 -39
- package/dist/auth/token-refresh.d.ts +2 -22
- package/dist/auth/token-refresh.js +33 -36
- package/dist/cli.d.ts +1 -18
- package/dist/cli.js +30 -908
- package/dist/http-probe/capture.d.ts +51 -0
- package/dist/http-probe/capture.js +96 -0
- package/dist/http-probe/compare.d.ts +43 -0
- package/dist/http-probe/compare.js +117 -0
- package/dist/http-probe/index.d.ts +2 -0
- package/dist/http-probe/index.js +2 -0
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -7
- package/dist/lib/inspect-cache.d.ts +10 -0
- package/dist/lib/inspect-cache.js +75 -0
- package/dist/lib/next-steps.d.ts +27 -0
- package/dist/lib/next-steps.js +21 -0
- package/dist/matcher/ast-eval.d.ts +8 -0
- package/dist/matcher/ast-eval.js +95 -0
- package/dist/matcher/finding.d.ts +55 -0
- package/dist/matcher/finding.js +1 -0
- package/dist/matcher/index.d.ts +8 -0
- package/dist/matcher/index.js +202 -0
- package/dist/matcher/inference-candidates.d.ts +26 -0
- package/dist/matcher/inference-candidates.js +81 -0
- package/dist/matcher/walker.d.ts +7 -0
- package/dist/matcher/walker.js +71 -0
- package/dist/pattern-pack/index.d.ts +125 -0
- package/dist/pattern-pack/index.js +189 -0
- package/dist/pattern-packs/zivis-public-0.2.0/capsules/agents/privilege-separation.yaml +224 -0
- package/dist/pattern-packs/zivis-public-0.2.0/capsules/prompting/self-consistency-no-isolation.yaml +237 -0
- package/dist/pattern-packs/zivis-public-0.2.0/capsules/retrieval/context-injection-no-validator.yaml +348 -0
- package/dist/pattern-packs/zivis-public-0.2.0/capsules/security/late-org-filter.yaml +266 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/external_validator_on_facts.yaml +37 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/fact_validator_present.yaml +68 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/human_approval_gate.yaml +44 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/langgraph_state_machine_with_per_node_tools.yaml +35 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/per_sample_retrieval_diversification.yaml +38 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/prisma_extension_or_middleware_attaching_org_filter.yaml +31 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/row_level_security_policy.yaml +37 -0
- package/dist/pattern-packs/zivis-public-0.2.0/controls/source_attribution_present.yaml +58 -0
- package/dist/pattern-packs/zivis-public-0.2.0/manifest.json +167 -0
- package/dist/pattern-packs/zivis-public-0.2.0/prompts/agents/privilege-separation/identify.md +54 -0
- package/dist/pattern-packs/zivis-public-0.2.0/prompts/prompting/self-consistency-no-isolation/identify.md +60 -0
- package/dist/pattern-packs/zivis-public-0.2.0/prompts/retrieval/context-injection-no-validator/identify.md +109 -0
- package/dist/pattern-packs/zivis-public-0.2.0/prompts/security/late-org-filter/identify.md +78 -0
- package/dist/project-binding.d.ts +2 -19
- package/dist/project-binding.js +38 -21
- package/dist/prompts/audit-dependencies.d.ts +2 -0
- package/dist/prompts/audit-dependencies.js +47 -0
- package/dist/prompts/getting-started.d.ts +2 -0
- package/dist/prompts/getting-started.js +37 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +6 -0
- package/dist/redact.d.ts +30 -0
- package/dist/redact.js +164 -0
- package/dist/resolve-application-id.d.ts +0 -4
- package/dist/resolve-application-id.js +0 -5
- package/dist/sanitize.d.ts +1 -21
- package/dist/sanitize.js +7 -41
- package/dist/scanners/index.d.ts +3 -0
- package/dist/scanners/index.js +2 -0
- package/dist/scanners/normalize.d.ts +6 -0
- package/dist/scanners/normalize.js +181 -0
- package/dist/scanners/run.d.ts +27 -0
- package/dist/scanners/run.js +142 -0
- package/dist/scanners/types.d.ts +40 -0
- package/dist/scanners/types.js +1 -0
- package/dist/server.d.ts +1 -13
- package/dist/server.js +142 -265
- package/dist/tools/artifacts.d.ts +76 -0
- package/dist/tools/artifacts.js +178 -0
- package/dist/tools/check-project.d.ts +5 -18
- package/dist/tools/check-project.js +122 -110
- package/dist/tools/check-repo-trust.d.ts +4 -19
- package/dist/tools/check-repo-trust.js +56 -47
- package/dist/tools/create-diagram.d.ts +0 -5
- package/dist/tools/create-diagram.js +0 -10
- package/dist/tools/create-document.d.ts +0 -5
- package/dist/tools/create-document.js +3 -9
- package/dist/tools/create-finding.d.ts +85 -0
- package/dist/tools/create-finding.js +136 -0
- package/dist/tools/delete-finding.d.ts +19 -0
- package/dist/tools/delete-finding.js +36 -0
- package/dist/tools/devx-run.d.ts +88 -0
- package/dist/tools/devx-run.js +175 -0
- package/dist/tools/discover-local-infra.d.ts +0 -10
- package/dist/tools/discover-local-infra.js +3 -73
- package/dist/tools/enterprise/get-org-zat.d.ts +0 -5
- package/dist/tools/enterprise/get-org-zat.js +0 -6
- package/dist/tools/explain-signal-for-diff.d.ts +34 -0
- package/dist/tools/explain-signal-for-diff.js +75 -0
- package/dist/tools/generate-diagram.d.ts +0 -6
- package/dist/tools/generate-diagram.js +21 -13
- package/dist/tools/get-application-overview.d.ts +0 -5
- package/dist/tools/get-application-overview.js +0 -6
- package/dist/tools/get-application.d.ts +0 -5
- package/dist/tools/get-application.js +0 -6
- package/dist/tools/get-diagram.d.ts +0 -5
- package/dist/tools/get-diagram.js +1 -11
- package/dist/tools/get-document.d.ts +0 -5
- package/dist/tools/get-document.js +0 -6
- package/dist/tools/get-oss-zat.d.ts +0 -5
- package/dist/tools/get-oss-zat.js +0 -7
- package/dist/tools/get-signal.d.ts +24 -0
- package/dist/tools/get-signal.js +75 -0
- package/dist/tools/get-started.d.ts +18 -0
- package/dist/tools/get-started.js +470 -0
- package/dist/tools/get-trust-keys.d.ts +0 -5
- package/dist/tools/get-trust-keys.js +0 -6
- package/dist/tools/import-openapi-endpoints.d.ts +0 -5
- package/dist/tools/import-openapi-endpoints.js +0 -6
- package/dist/tools/inspect-zat.d.ts +0 -5
- package/dist/tools/inspect-zat.js +0 -19
- package/dist/tools/inspect.d.ts +21 -0
- package/dist/tools/inspect.js +222 -0
- package/dist/tools/list-applications.d.ts +1 -6
- package/dist/tools/list-applications.js +0 -6
- package/dist/tools/list-diagrams.d.ts +0 -5
- package/dist/tools/list-diagrams.js +0 -6
- package/dist/tools/list-documents.d.ts +0 -5
- package/dist/tools/list-documents.js +0 -6
- package/dist/tools/list-endpoints.d.ts +1 -6
- package/dist/tools/list-endpoints.js +0 -6
- package/dist/tools/list-signals.d.ts +37 -0
- package/dist/tools/list-signals.js +83 -0
- package/dist/tools/manage-application.d.ts +64 -0
- package/dist/tools/manage-application.js +129 -0
- package/dist/tools/manage-diagram.d.ts +0 -5
- package/dist/tools/manage-diagram.js +0 -16
- package/dist/tools/manage-endpoint-lifecycle.d.ts +80 -0
- package/dist/tools/manage-endpoint-lifecycle.js +180 -0
- package/dist/tools/open-in-ide.d.ts +2 -14
- package/dist/tools/open-in-ide.js +0 -13
- package/dist/tools/review-change.d.ts +34 -0
- package/dist/tools/review-change.js +93 -0
- package/dist/tools/security-memory.d.ts +76 -0
- package/dist/tools/security-memory.js +202 -0
- package/dist/tools/security-review.d.ts +1 -21
- package/dist/tools/security-review.js +8 -108
- package/dist/tools/threat-get-capsule.d.ts +15 -0
- package/dist/tools/threat-get-capsule.js +53 -0
- package/dist/tools/threat-get-inference-prompt.d.ts +15 -0
- package/dist/tools/threat-get-inference-prompt.js +73 -0
- package/dist/tools/threat-list-relevant-capsules.d.ts +17 -0
- package/dist/tools/threat-list-relevant-capsules.js +158 -0
- package/dist/tools/threat-run-matcher.d.ts +17 -0
- package/dist/tools/threat-run-matcher.js +145 -0
- package/dist/tools/update-document.d.ts +0 -5
- package/dist/tools/update-document.js +3 -9
- package/dist/tools/update-endpoint.d.ts +1 -6
- package/dist/tools/update-endpoint.js +0 -7
- package/dist/tools/update-finding.d.ts +61 -0
- package/dist/tools/update-finding.js +80 -0
- package/dist/tools/update-mermaid-source.d.ts +0 -13
- package/dist/tools/update-mermaid-source.js +0 -14
- package/dist/tools/verify-trust-mark.d.ts +0 -5
- package/dist/tools/verify-trust-mark.js +0 -6
- package/dist/types.d.ts +14 -14
- package/dist/types.js +22 -28
- package/package.json +41 -15
- package/dist/api-client.js.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/jwt.js.map +0 -1
- package/dist/auth/keychain.js.map +0 -1
- package/dist/auth/oauth.js.map +0 -1
- package/dist/auth/sessions.js.map +0 -1
- package/dist/auth/token-refresh.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/project-binding.js.map +0 -1
- package/dist/resolve-application-id.js.map +0 -1
- package/dist/sanitize.js.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/tools/check-project.js.map +0 -1
- package/dist/tools/check-repo-trust.js.map +0 -1
- package/dist/tools/create-diagram.js.map +0 -1
- package/dist/tools/create-document.js.map +0 -1
- package/dist/tools/discover-local-infra.js.map +0 -1
- package/dist/tools/enterprise/capture-evidence.d.ts +0 -54
- package/dist/tools/enterprise/capture-evidence.js +0 -72
- package/dist/tools/enterprise/capture-evidence.js.map +0 -1
- package/dist/tools/enterprise/create-report-ticket.d.ts +0 -34
- package/dist/tools/enterprise/create-report-ticket.js +0 -44
- package/dist/tools/enterprise/create-report-ticket.js.map +0 -1
- package/dist/tools/enterprise/end-pentest-session.d.ts +0 -33
- package/dist/tools/enterprise/end-pentest-session.js +0 -42
- package/dist/tools/enterprise/end-pentest-session.js.map +0 -1
- package/dist/tools/enterprise/generate-report.d.ts +0 -55
- package/dist/tools/enterprise/generate-report.js +0 -111
- package/dist/tools/enterprise/generate-report.js.map +0 -1
- package/dist/tools/enterprise/get-org-zat.js.map +0 -1
- package/dist/tools/enterprise/get-report-status.d.ts +0 -27
- package/dist/tools/enterprise/get-report-status.js +0 -38
- package/dist/tools/enterprise/get-report-status.js.map +0 -1
- package/dist/tools/enterprise/get-threat-model.d.ts +0 -29
- package/dist/tools/enterprise/get-threat-model.js +0 -83
- package/dist/tools/enterprise/get-threat-model.js.map +0 -1
- package/dist/tools/enterprise/list-agents.d.ts +0 -42
- package/dist/tools/enterprise/list-agents.js +0 -95
- package/dist/tools/enterprise/list-agents.js.map +0 -1
- package/dist/tools/enterprise/list-report-issues.d.ts +0 -36
- package/dist/tools/enterprise/list-report-issues.js +0 -50
- package/dist/tools/enterprise/list-report-issues.js.map +0 -1
- package/dist/tools/enterprise/list-threat-models.d.ts +0 -36
- package/dist/tools/enterprise/list-threat-models.js +0 -82
- package/dist/tools/enterprise/list-threat-models.js.map +0 -1
- package/dist/tools/enterprise/manage-actor.d.ts +0 -58
- package/dist/tools/enterprise/manage-actor.js +0 -99
- package/dist/tools/enterprise/manage-actor.js.map +0 -1
- package/dist/tools/enterprise/manage-attack-scenario.d.ts +0 -70
- package/dist/tools/enterprise/manage-attack-scenario.js +0 -89
- package/dist/tools/enterprise/manage-attack-scenario.js.map +0 -1
- package/dist/tools/enterprise/manage-component.d.ts +0 -58
- package/dist/tools/enterprise/manage-component.js +0 -90
- package/dist/tools/enterprise/manage-component.js.map +0 -1
- package/dist/tools/enterprise/manage-data-asset.d.ts +0 -53
- package/dist/tools/enterprise/manage-data-asset.js +0 -90
- package/dist/tools/enterprise/manage-data-asset.js.map +0 -1
- package/dist/tools/enterprise/manage-data-flow.d.ts +0 -57
- package/dist/tools/enterprise/manage-data-flow.js +0 -98
- package/dist/tools/enterprise/manage-data-flow.js.map +0 -1
- package/dist/tools/enterprise/manage-finding.d.ts +0 -69
- package/dist/tools/enterprise/manage-finding.js +0 -106
- package/dist/tools/enterprise/manage-finding.js.map +0 -1
- package/dist/tools/enterprise/manage-security-control.d.ts +0 -59
- package/dist/tools/enterprise/manage-security-control.js +0 -96
- package/dist/tools/enterprise/manage-security-control.js.map +0 -1
- package/dist/tools/enterprise/manage-test-case.d.ts +0 -88
- package/dist/tools/enterprise/manage-test-case.js +0 -119
- package/dist/tools/enterprise/manage-test-case.js.map +0 -1
- package/dist/tools/enterprise/promote-finding-to-issue.d.ts +0 -36
- package/dist/tools/enterprise/promote-finding-to-issue.js +0 -65
- package/dist/tools/enterprise/promote-finding-to-issue.js.map +0 -1
- package/dist/tools/enterprise/publish-report-version.d.ts +0 -34
- package/dist/tools/enterprise/publish-report-version.js +0 -75
- package/dist/tools/enterprise/publish-report-version.js.map +0 -1
- package/dist/tools/enterprise/publish-test-to-library.d.ts +0 -31
- package/dist/tools/enterprise/publish-test-to-library.js +0 -40
- package/dist/tools/enterprise/publish-test-to-library.js.map +0 -1
- package/dist/tools/enterprise/record-test-result.d.ts +0 -67
- package/dist/tools/enterprise/record-test-result.js +0 -75
- package/dist/tools/enterprise/record-test-result.js.map +0 -1
- package/dist/tools/enterprise/start-pentest-session.d.ts +0 -35
- package/dist/tools/enterprise/start-pentest-session.js +0 -50
- package/dist/tools/enterprise/start-pentest-session.js.map +0 -1
- package/dist/tools/enterprise/sync-report-section.d.ts +0 -41
- package/dist/tools/enterprise/sync-report-section.js +0 -79
- package/dist/tools/enterprise/sync-report-section.js.map +0 -1
- package/dist/tools/enterprise/update-report-issue.d.ts +0 -55
- package/dist/tools/enterprise/update-report-issue.js +0 -69
- package/dist/tools/enterprise/update-report-issue.js.map +0 -1
- package/dist/tools/generate-diagram.js.map +0 -1
- package/dist/tools/get-agent-test-results.d.ts +0 -41
- package/dist/tools/get-agent-test-results.js +0 -86
- package/dist/tools/get-agent-test-results.js.map +0 -1
- package/dist/tools/get-application-overview.js.map +0 -1
- package/dist/tools/get-application.js.map +0 -1
- package/dist/tools/get-artifact-content.d.ts +0 -29
- package/dist/tools/get-artifact-content.js +0 -86
- package/dist/tools/get-artifact-content.js.map +0 -1
- package/dist/tools/get-diagram.js.map +0 -1
- package/dist/tools/get-document.js.map +0 -1
- package/dist/tools/get-finding-details.d.ts +0 -28
- package/dist/tools/get-finding-details.js +0 -43
- package/dist/tools/get-finding-details.js.map +0 -1
- package/dist/tools/get-findings.d.ts +0 -57
- package/dist/tools/get-findings.js +0 -103
- package/dist/tools/get-findings.js.map +0 -1
- package/dist/tools/get-oss-zat.js.map +0 -1
- package/dist/tools/get-recon-scan.d.ts +0 -27
- package/dist/tools/get-recon-scan.js +0 -46
- package/dist/tools/get-recon-scan.js.map +0 -1
- package/dist/tools/get-scan-output.d.ts +0 -27
- package/dist/tools/get-scan-output.js +0 -64
- package/dist/tools/get-scan-output.js.map +0 -1
- package/dist/tools/get-scenario-details.d.ts +0 -27
- package/dist/tools/get-scenario-details.js +0 -46
- package/dist/tools/get-scenario-details.js.map +0 -1
- package/dist/tools/get-test-case-results.d.ts +0 -37
- package/dist/tools/get-test-case-results.js +0 -66
- package/dist/tools/get-test-case-results.js.map +0 -1
- package/dist/tools/get-test-details.d.ts +0 -29
- package/dist/tools/get-test-details.js +0 -49
- package/dist/tools/get-test-details.js.map +0 -1
- package/dist/tools/get-trust-keys.js.map +0 -1
- package/dist/tools/import-openapi-endpoints.js.map +0 -1
- package/dist/tools/inspect-zat.js.map +0 -1
- package/dist/tools/list-agent-test-cases.d.ts +0 -41
- package/dist/tools/list-agent-test-cases.js +0 -73
- package/dist/tools/list-agent-test-cases.js.map +0 -1
- package/dist/tools/list-applications.js.map +0 -1
- package/dist/tools/list-diagrams.js.map +0 -1
- package/dist/tools/list-documents.js.map +0 -1
- package/dist/tools/list-endpoints.js.map +0 -1
- package/dist/tools/list-recon-scans.d.ts +0 -36
- package/dist/tools/list-recon-scans.js +0 -74
- package/dist/tools/list-recon-scans.js.map +0 -1
- package/dist/tools/list-scan-artifacts.d.ts +0 -41
- package/dist/tools/list-scan-artifacts.js +0 -63
- package/dist/tools/list-scan-artifacts.js.map +0 -1
- package/dist/tools/list-scans.d.ts +0 -44
- package/dist/tools/list-scans.js +0 -91
- package/dist/tools/list-scans.js.map +0 -1
- package/dist/tools/list-test-library.d.ts +0 -44
- package/dist/tools/list-test-library.js +0 -83
- package/dist/tools/list-test-library.js.map +0 -1
- package/dist/tools/list-test-scenarios.d.ts +0 -31
- package/dist/tools/list-test-scenarios.js +0 -66
- package/dist/tools/list-test-scenarios.js.map +0 -1
- package/dist/tools/local-scan.d.ts +0 -40
- package/dist/tools/local-scan.js +0 -261
- package/dist/tools/local-scan.js.map +0 -1
- package/dist/tools/manage-diagram.js.map +0 -1
- package/dist/tools/open-in-ide.js.map +0 -1
- package/dist/tools/run-test-scenario.d.ts +0 -37
- package/dist/tools/run-test-scenario.js +0 -70
- package/dist/tools/run-test-scenario.js.map +0 -1
- package/dist/tools/scan-pr.d.ts +0 -27
- package/dist/tools/scan-pr.js +0 -51
- package/dist/tools/scan-pr.js.map +0 -1
- package/dist/tools/security-review.js.map +0 -1
- package/dist/tools/setup-red-team-target.d.ts +0 -79
- package/dist/tools/setup-red-team-target.js +0 -430
- package/dist/tools/setup-red-team-target.js.map +0 -1
- package/dist/tools/triage-finding.d.ts +0 -47
- package/dist/tools/triage-finding.js +0 -116
- package/dist/tools/triage-finding.js.map +0 -1
- package/dist/tools/update-document.js.map +0 -1
- package/dist/tools/update-endpoint.js.map +0 -1
- package/dist/tools/update-mermaid-source.js.map +0 -1
- package/dist/tools/verify-trust-mark.js.map +0 -1
- package/dist/types.js.map +0 -1
package/dist/sanitize.js
CHANGED
|
@@ -1,37 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Response Sanitization — Prompt Injection Defense
|
|
3
|
-
*
|
|
4
|
-
* Sanitizes API response data before returning it to the AI assistant.
|
|
5
|
-
* Finding content (titles, descriptions, code snippets, remediation text)
|
|
6
|
-
* is untrusted data from automated scanners and external vulnerability
|
|
7
|
-
* databases. This layer strips common injection patterns.
|
|
8
|
-
*
|
|
9
|
-
* Defense layers:
|
|
10
|
-
* 1. Strip non-printable / control characters
|
|
11
|
-
* 2. Truncate field lengths
|
|
12
|
-
* 3. Strip common LLM prompt injection patterns
|
|
13
|
-
* 4. Encode suspicious formatting
|
|
14
|
-
*/
|
|
15
|
-
// Maximum field lengths (characters)
|
|
16
1
|
const MAX_LENGTHS = {
|
|
17
2
|
title: 500,
|
|
18
3
|
description: 2000,
|
|
19
4
|
codeSnippet: 500,
|
|
20
5
|
code_snippet: 500,
|
|
21
6
|
remediation: 1000,
|
|
22
|
-
// Scan & test case result fields
|
|
23
7
|
attackPayload: 500,
|
|
24
8
|
targetResponse: 500,
|
|
25
9
|
analysisNarrative: 1000,
|
|
26
10
|
remediationGuidance: 1000,
|
|
27
11
|
failureRationale: 1000,
|
|
28
|
-
// Scan output fields (allow longer for narrative content)
|
|
29
12
|
reconMarkdown: 50000,
|
|
30
13
|
attackSurfaceBrief: 5000,
|
|
31
14
|
};
|
|
32
|
-
// Patterns that look like LLM prompt injection attempts
|
|
33
15
|
const INJECTION_PATTERNS = [
|
|
34
|
-
// Common LLM instruction delimiters
|
|
35
16
|
/\[INST\]/gi,
|
|
36
17
|
/\[\/INST\]/gi,
|
|
37
18
|
/<\|system\|>/gi,
|
|
@@ -40,16 +21,13 @@ const INJECTION_PATTERNS = [
|
|
|
40
21
|
/<\|im_start\|>/gi,
|
|
41
22
|
/<\|im_end\|>/gi,
|
|
42
23
|
/<\|endoftext\|>/gi,
|
|
43
|
-
// Role injection attempts
|
|
44
24
|
/^Human:/gim,
|
|
45
25
|
/^Assistant:/gim,
|
|
46
26
|
/^System:/gim,
|
|
47
|
-
// XML-like tags that mimic prompt formatting
|
|
48
27
|
/<system>/gi,
|
|
49
28
|
/<\/system>/gi,
|
|
50
29
|
/<instruction>/gi,
|
|
51
30
|
/<\/instruction>/gi,
|
|
52
|
-
// Common injection prefixes
|
|
53
31
|
/ignore (?:all )?previous instructions/gi,
|
|
54
32
|
/disregard (?:all )?(?:previous |above )?instructions/gi,
|
|
55
33
|
/you are now/gi,
|
|
@@ -57,17 +35,16 @@ const INJECTION_PATTERNS = [
|
|
|
57
35
|
/override:/gi,
|
|
58
36
|
/IMPORTANT: from now on/gi,
|
|
59
37
|
];
|
|
60
|
-
/**
|
|
61
|
-
* Strip non-printable and control characters, preserving newlines and tabs
|
|
62
|
-
*/
|
|
63
38
|
function stripControlChars(text) {
|
|
64
|
-
// Allow printable ASCII, newlines, tabs, and common Unicode
|
|
65
|
-
// Strip C0 controls except \t \n \r, and C1 controls
|
|
66
39
|
return text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, "");
|
|
67
40
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
41
|
+
const INVISIBLE_UNICODE = /[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g;
|
|
42
|
+
export function sanitizeInboundText(value, maxLength) {
|
|
43
|
+
if (value === undefined || value === null)
|
|
44
|
+
return value;
|
|
45
|
+
const cleaned = stripControlChars(value).replace(INVISIBLE_UNICODE, "");
|
|
46
|
+
return truncate(cleaned, maxLength);
|
|
47
|
+
}
|
|
71
48
|
function stripInjectionPatterns(text) {
|
|
72
49
|
let result = text;
|
|
73
50
|
for (const pattern of INJECTION_PATTERNS) {
|
|
@@ -75,17 +52,11 @@ function stripInjectionPatterns(text) {
|
|
|
75
52
|
}
|
|
76
53
|
return result;
|
|
77
54
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Truncate a string to max length with ellipsis
|
|
80
|
-
*/
|
|
81
55
|
function truncate(text, maxLength) {
|
|
82
56
|
if (text.length <= maxLength)
|
|
83
57
|
return text;
|
|
84
58
|
return text.slice(0, maxLength - 3) + "...";
|
|
85
59
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Sanitize a single string field
|
|
88
|
-
*/
|
|
89
60
|
export function sanitizeField(value, fieldName) {
|
|
90
61
|
let result = stripControlChars(value);
|
|
91
62
|
result = stripInjectionPatterns(result);
|
|
@@ -95,10 +66,6 @@ export function sanitizeField(value, fieldName) {
|
|
|
95
66
|
}
|
|
96
67
|
return result;
|
|
97
68
|
}
|
|
98
|
-
/**
|
|
99
|
-
* Recursively sanitize all string fields in an object.
|
|
100
|
-
* Handles nested objects and arrays.
|
|
101
|
-
*/
|
|
102
69
|
export function sanitizeResponse(data) {
|
|
103
70
|
if (data === null || data === undefined)
|
|
104
71
|
return data;
|
|
@@ -122,4 +89,3 @@ export function sanitizeResponse(data) {
|
|
|
122
89
|
}
|
|
123
90
|
return data;
|
|
124
91
|
}
|
|
125
|
-
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { ScannerId, LeadSeverity, LeadLocation, NormalizedLead, ScannerRunResult, LocalScanReport, } from "./types.js";
|
|
2
|
+
export { normalizeScannerOutput, normalizeGitleaks, normalizeTrivy, normalizeSemgrep, normalizeOsvScanner, } from "./normalize.js";
|
|
3
|
+
export { SUPPORTED_SCANNERS, SCANNER_BINARIES, scannerCommand, runOneScanner, runLocalScanners, aggregate, defaultExecEnv, type ScannerCommand, type ScannerExecEnv, type RunLocalScannersOptions, } from "./run.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NormalizedLead, ScannerId } from "./types.js";
|
|
2
|
+
export declare function normalizeGitleaks(parsed: unknown): NormalizedLead[];
|
|
3
|
+
export declare function normalizeTrivy(parsed: unknown): NormalizedLead[];
|
|
4
|
+
export declare function normalizeSemgrep(parsed: unknown): NormalizedLead[];
|
|
5
|
+
export declare function normalizeOsvScanner(parsed: unknown): NormalizedLead[];
|
|
6
|
+
export declare function normalizeScannerOutput(source: ScannerId, parsed: unknown): NormalizedLead[];
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { redactString } from "../redact.js";
|
|
2
|
+
function redact(text) {
|
|
3
|
+
if (text === undefined || text === null || text === "")
|
|
4
|
+
return undefined;
|
|
5
|
+
return redactString(String(text)).text;
|
|
6
|
+
}
|
|
7
|
+
function normalizeSeverity(raw) {
|
|
8
|
+
const s = String(raw ?? "").toLowerCase();
|
|
9
|
+
if (s.startsWith("crit"))
|
|
10
|
+
return "critical";
|
|
11
|
+
if (s === "high" || s === "error")
|
|
12
|
+
return "high";
|
|
13
|
+
if (s === "medium" || s === "moderate" || s === "warning" || s === "warn")
|
|
14
|
+
return "medium";
|
|
15
|
+
if (s === "low")
|
|
16
|
+
return "low";
|
|
17
|
+
if (s === "info" || s === "informational" || s === "unknown" || s === "none" || s === "") {
|
|
18
|
+
return s === "" || s === "unknown" || s === "none" ? "unknown" : "info";
|
|
19
|
+
}
|
|
20
|
+
return "unknown";
|
|
21
|
+
}
|
|
22
|
+
function asArray(v) {
|
|
23
|
+
return Array.isArray(v) ? v : [];
|
|
24
|
+
}
|
|
25
|
+
function lead(base) {
|
|
26
|
+
return { lane: "lead", ...base };
|
|
27
|
+
}
|
|
28
|
+
export function normalizeGitleaks(parsed) {
|
|
29
|
+
const findings = asArray(parsed);
|
|
30
|
+
return findings.map((f) => {
|
|
31
|
+
const tags = Array.isArray(f.Tags) ? f.Tags : [];
|
|
32
|
+
const sevTag = tags.find((t) => ["critical", "high", "medium", "low"].includes(String(t).toLowerCase()));
|
|
33
|
+
return lead({
|
|
34
|
+
source: "gitleaks",
|
|
35
|
+
rule_id: f.RuleID ?? "gitleaks-secret",
|
|
36
|
+
title: f.Description ?? f.RuleID ?? "Potential secret",
|
|
37
|
+
severity: sevTag ? normalizeSeverity(sevTag) : "high",
|
|
38
|
+
location: { file: f.File, start_line: f.StartLine, end_line: f.EndLine },
|
|
39
|
+
excerpt: redact(f.Match),
|
|
40
|
+
metadata: tags.length ? { tags } : undefined,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function normalizeTrivy(parsed) {
|
|
45
|
+
const results = asArray(parsed?.Results);
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const r of results) {
|
|
48
|
+
for (const v of asArray(r.Vulnerabilities)) {
|
|
49
|
+
out.push(lead({
|
|
50
|
+
source: "trivy",
|
|
51
|
+
rule_id: v.VulnerabilityID ?? "trivy-vuln",
|
|
52
|
+
title: v.Title ?? `${v.PkgName ?? "dependency"} ${v.VulnerabilityID ?? ""}`.trim(),
|
|
53
|
+
severity: normalizeSeverity(v.Severity),
|
|
54
|
+
location: { file: r.Target },
|
|
55
|
+
package: v.PkgName,
|
|
56
|
+
cwe: Array.isArray(v.CweIDs) && v.CweIDs.length ? v.CweIDs : undefined,
|
|
57
|
+
references: dedupeRefs(v.PrimaryURL, v.References),
|
|
58
|
+
metadata: {
|
|
59
|
+
installed_version: v.InstalledVersion,
|
|
60
|
+
fixed_version: v.FixedVersion,
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
for (const s of asArray(r.Secrets)) {
|
|
65
|
+
out.push(lead({
|
|
66
|
+
source: "trivy",
|
|
67
|
+
rule_id: s.RuleID ?? "trivy-secret",
|
|
68
|
+
title: s.Title ?? "Potential secret",
|
|
69
|
+
severity: normalizeSeverity(s.Severity ?? "high"),
|
|
70
|
+
location: { file: r.Target, start_line: s.StartLine, end_line: s.EndLine },
|
|
71
|
+
excerpt: redact(s.Match),
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
for (const m of asArray(r.Misconfigurations)) {
|
|
75
|
+
out.push(lead({
|
|
76
|
+
source: "trivy",
|
|
77
|
+
rule_id: m.ID ?? "trivy-misconfig",
|
|
78
|
+
title: m.Title ?? m.ID ?? "Misconfiguration",
|
|
79
|
+
severity: normalizeSeverity(m.Severity),
|
|
80
|
+
location: { file: r.Target },
|
|
81
|
+
references: dedupeRefs(m.PrimaryURL, m.References),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
export function normalizeSemgrep(parsed) {
|
|
88
|
+
const results = asArray(parsed?.results);
|
|
89
|
+
return results.map((r) => {
|
|
90
|
+
const meta = r.extra?.metadata ?? {};
|
|
91
|
+
return lead({
|
|
92
|
+
source: "semgrep",
|
|
93
|
+
rule_id: r.check_id ?? "semgrep-rule",
|
|
94
|
+
title: r.extra?.message ?? r.check_id ?? "Semgrep match",
|
|
95
|
+
severity: normalizeSeverity(r.extra?.severity),
|
|
96
|
+
location: { file: r.path, start_line: r.start?.line, end_line: r.end?.line },
|
|
97
|
+
cwe: toStringArray(meta.cwe),
|
|
98
|
+
owasp: toStringArray(meta.owasp),
|
|
99
|
+
references: Array.isArray(meta.references) ? meta.references : undefined,
|
|
100
|
+
excerpt: redact(r.extra?.lines),
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function normalizeOsvScanner(parsed) {
|
|
105
|
+
const results = asArray(parsed?.results);
|
|
106
|
+
const out = [];
|
|
107
|
+
for (const src of results) {
|
|
108
|
+
const file = src.source?.path;
|
|
109
|
+
for (const pkg of asArray(src.packages)) {
|
|
110
|
+
const pkgName = pkg.package?.name;
|
|
111
|
+
const groupSeverity = new Map();
|
|
112
|
+
for (const g of asArray(pkg.groups)) {
|
|
113
|
+
for (const id of asArray(g.ids)) {
|
|
114
|
+
if (g.max_severity)
|
|
115
|
+
groupSeverity.set(id, g.max_severity);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
for (const v of asArray(pkg.vulnerabilities)) {
|
|
119
|
+
out.push(lead({
|
|
120
|
+
source: "osv-scanner",
|
|
121
|
+
rule_id: v.id ?? "osv-vuln",
|
|
122
|
+
title: v.summary ?? `${pkgName ?? "dependency"} ${v.id ?? ""}`.trim(),
|
|
123
|
+
severity: cvssScoreToSeverity(groupSeverity.get(v.id ?? "")),
|
|
124
|
+
location: { file },
|
|
125
|
+
package: pkgName,
|
|
126
|
+
references: asArray(v.references)
|
|
127
|
+
.map((r) => r.url)
|
|
128
|
+
.filter((u) => typeof u === "string"),
|
|
129
|
+
metadata: { version: pkg.package?.version, ecosystem: pkg.package?.ecosystem },
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
function toStringArray(v) {
|
|
137
|
+
if (v === undefined || v === null)
|
|
138
|
+
return undefined;
|
|
139
|
+
const arr = Array.isArray(v) ? v : [v];
|
|
140
|
+
const out = arr.map((x) => String(x)).filter(Boolean);
|
|
141
|
+
return out.length ? out : undefined;
|
|
142
|
+
}
|
|
143
|
+
function dedupeRefs(primary, refs) {
|
|
144
|
+
const set = new Set();
|
|
145
|
+
if (primary)
|
|
146
|
+
set.add(primary);
|
|
147
|
+
for (const r of Array.isArray(refs) ? refs : [])
|
|
148
|
+
if (r)
|
|
149
|
+
set.add(r);
|
|
150
|
+
return set.size ? [...set] : undefined;
|
|
151
|
+
}
|
|
152
|
+
function cvssScoreToSeverity(score) {
|
|
153
|
+
if (!score)
|
|
154
|
+
return "unknown";
|
|
155
|
+
const n = Number.parseFloat(score);
|
|
156
|
+
if (Number.isNaN(n))
|
|
157
|
+
return "unknown";
|
|
158
|
+
if (n >= 9.0)
|
|
159
|
+
return "critical";
|
|
160
|
+
if (n >= 7.0)
|
|
161
|
+
return "high";
|
|
162
|
+
if (n >= 4.0)
|
|
163
|
+
return "medium";
|
|
164
|
+
if (n > 0)
|
|
165
|
+
return "low";
|
|
166
|
+
return "unknown";
|
|
167
|
+
}
|
|
168
|
+
export function normalizeScannerOutput(source, parsed) {
|
|
169
|
+
switch (source) {
|
|
170
|
+
case "gitleaks":
|
|
171
|
+
return normalizeGitleaks(parsed);
|
|
172
|
+
case "trivy":
|
|
173
|
+
return normalizeTrivy(parsed);
|
|
174
|
+
case "semgrep":
|
|
175
|
+
return normalizeSemgrep(parsed);
|
|
176
|
+
case "osv-scanner":
|
|
177
|
+
return normalizeOsvScanner(parsed);
|
|
178
|
+
default:
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { LocalScanReport, ScannerId, ScannerRunResult } from "./types.js";
|
|
2
|
+
export declare const SUPPORTED_SCANNERS: readonly ScannerId[];
|
|
3
|
+
export declare const SCANNER_BINARIES: Record<ScannerId, string>;
|
|
4
|
+
export interface ScannerCommand {
|
|
5
|
+
bin: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function scannerCommand(source: ScannerId, dir: string, outPath: string): ScannerCommand;
|
|
9
|
+
export interface ScannerExecEnv {
|
|
10
|
+
isAvailable(bin: string): Promise<boolean>;
|
|
11
|
+
execute(cmd: ScannerCommand, opts: {
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
reportText: string | null;
|
|
15
|
+
error?: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export declare const defaultExecEnv: ScannerExecEnv;
|
|
19
|
+
export interface RunLocalScannersOptions {
|
|
20
|
+
sources?: ScannerId[];
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
env?: ScannerExecEnv;
|
|
23
|
+
tmpDir?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function runOneScanner(source: ScannerId, dir: string, opts?: RunLocalScannersOptions): Promise<ScannerRunResult>;
|
|
26
|
+
export declare function runLocalScanners(dir: string, opts?: RunLocalScannersOptions): Promise<LocalScanReport>;
|
|
27
|
+
export declare function aggregate(results: ScannerRunResult[]): LocalScanReport;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as fs from "node:fs/promises";
|
|
4
|
+
import * as crypto from "node:crypto";
|
|
5
|
+
import { execFile } from "node:child_process";
|
|
6
|
+
import { normalizeScannerOutput } from "./normalize.js";
|
|
7
|
+
export const SUPPORTED_SCANNERS = ["gitleaks", "trivy", "semgrep", "osv-scanner"];
|
|
8
|
+
export const SCANNER_BINARIES = {
|
|
9
|
+
gitleaks: "gitleaks",
|
|
10
|
+
trivy: "trivy",
|
|
11
|
+
semgrep: "semgrep",
|
|
12
|
+
"osv-scanner": "osv-scanner",
|
|
13
|
+
};
|
|
14
|
+
export function scannerCommand(source, dir, outPath) {
|
|
15
|
+
switch (source) {
|
|
16
|
+
case "gitleaks":
|
|
17
|
+
return {
|
|
18
|
+
bin: "gitleaks",
|
|
19
|
+
args: ["detect", "--source", dir, "--no-banner", "--report-format", "json", "--report-path", outPath, "--exit-code", "0"],
|
|
20
|
+
};
|
|
21
|
+
case "trivy":
|
|
22
|
+
return {
|
|
23
|
+
bin: "trivy",
|
|
24
|
+
args: ["fs", "--quiet", "--format", "json", "--output", outPath, "--scanners", "vuln,secret,misconfig", dir],
|
|
25
|
+
};
|
|
26
|
+
case "semgrep":
|
|
27
|
+
return {
|
|
28
|
+
bin: "semgrep",
|
|
29
|
+
args: ["scan", "--json", "--output", outPath, "--quiet", "--config", process.env.ZIVIS_SEMGREP_CONFIG || "auto", dir],
|
|
30
|
+
};
|
|
31
|
+
case "osv-scanner":
|
|
32
|
+
return {
|
|
33
|
+
bin: "osv-scanner",
|
|
34
|
+
args: ["--format", "json", "--output", outPath, "--recursive", dir],
|
|
35
|
+
};
|
|
36
|
+
default:
|
|
37
|
+
throw new Error(`unknown scanner: ${source}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const execFileAsync = (bin, args, timeoutMs) => new Promise((resolve) => {
|
|
41
|
+
execFile(bin, args, { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024 }, (err) => {
|
|
42
|
+
const code = err && typeof err.code === "number" ? (err.code) : err ? 1 : 0;
|
|
43
|
+
resolve({ code, stderr: err ? String(err.message ?? "") : "" });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
export const defaultExecEnv = {
|
|
47
|
+
async isAvailable(bin) {
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
execFile(process.platform === "win32" ? "where" : "command", process.platform === "win32" ? [bin] : ["-v", bin], { shell: true, timeout: 5000 }, (err) => {
|
|
50
|
+
resolve(!err);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
async execute(cmd, opts) {
|
|
55
|
+
const outIdx = cmd.args.findIndex((a) => a === "--output" || a === "--report-path");
|
|
56
|
+
const outPath = outIdx >= 0 ? cmd.args[outIdx + 1] : undefined;
|
|
57
|
+
if (!outPath)
|
|
58
|
+
return { reportText: null, error: "no output path in command" };
|
|
59
|
+
try {
|
|
60
|
+
await execFileAsync(cmd.bin, cmd.args, opts.timeoutMs);
|
|
61
|
+
const text = await fs.readFile(outPath, "utf8").catch(() => null);
|
|
62
|
+
return { reportText: text };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { reportText: null, error: err instanceof Error ? err.message : String(err) };
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
if (outPath)
|
|
69
|
+
await fs.rm(outPath, { force: true }).catch(() => { });
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
export async function runOneScanner(source, dir, opts = {}) {
|
|
74
|
+
const env = opts.env ?? defaultExecEnv;
|
|
75
|
+
const bin = SCANNER_BINARIES[source];
|
|
76
|
+
const started = Date.now();
|
|
77
|
+
if (!(await env.isAvailable(bin))) {
|
|
78
|
+
return { source, status: "not_installed", leads: [] };
|
|
79
|
+
}
|
|
80
|
+
const tmpDir = opts.tmpDir ?? os.tmpdir();
|
|
81
|
+
const outPath = path.join(tmpDir, `zivis-${source}-${crypto.randomUUID()}.json`);
|
|
82
|
+
const cmd = scannerCommand(source, dir, outPath);
|
|
83
|
+
try {
|
|
84
|
+
const { reportText, error } = await env.execute(cmd, { timeoutMs: opts.timeoutMs ?? 120_000 });
|
|
85
|
+
if (error && reportText === null) {
|
|
86
|
+
return { source, status: "error", leads: [], error, duration_ms: Date.now() - started };
|
|
87
|
+
}
|
|
88
|
+
if (reportText === null || reportText.trim() === "") {
|
|
89
|
+
return { source, status: "ok", leads: [], duration_ms: Date.now() - started };
|
|
90
|
+
}
|
|
91
|
+
let parsed;
|
|
92
|
+
try {
|
|
93
|
+
parsed = JSON.parse(reportText);
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
return { source, status: "error", leads: [], error: `unparseable ${source} JSON: ${e instanceof Error ? e.message : String(e)}`, duration_ms: Date.now() - started };
|
|
97
|
+
}
|
|
98
|
+
const leads = normalizeScannerOutput(source, parsed);
|
|
99
|
+
return { source, status: "ok", leads, duration_ms: Date.now() - started };
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return { source, status: "error", leads: [], error: err instanceof Error ? err.message : String(err), duration_ms: Date.now() - started };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export async function runLocalScanners(dir, opts = {}) {
|
|
106
|
+
const sources = opts.sources ?? [...SUPPORTED_SCANNERS];
|
|
107
|
+
const results = [];
|
|
108
|
+
for (const source of sources) {
|
|
109
|
+
results.push(await runOneScanner(source, dir, opts));
|
|
110
|
+
}
|
|
111
|
+
return aggregate(results);
|
|
112
|
+
}
|
|
113
|
+
export function aggregate(results) {
|
|
114
|
+
const leads = [];
|
|
115
|
+
const bySource = {};
|
|
116
|
+
const bySeverity = {};
|
|
117
|
+
const scannersRun = [];
|
|
118
|
+
const scannersMissing = [];
|
|
119
|
+
for (const r of results) {
|
|
120
|
+
if (r.status === "not_installed")
|
|
121
|
+
scannersMissing.push(r.source);
|
|
122
|
+
else
|
|
123
|
+
scannersRun.push(r.source);
|
|
124
|
+
for (const l of r.leads) {
|
|
125
|
+
leads.push(l);
|
|
126
|
+
bySource[l.source] = (bySource[l.source] ?? 0) + 1;
|
|
127
|
+
bySeverity[l.severity] = (bySeverity[l.severity] ?? 0) + 1;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
ran_at: new Date().toISOString(),
|
|
132
|
+
results,
|
|
133
|
+
leads,
|
|
134
|
+
summary: {
|
|
135
|
+
total_leads: leads.length,
|
|
136
|
+
by_source: bySource,
|
|
137
|
+
by_severity: bySeverity,
|
|
138
|
+
scanners_run: scannersRun,
|
|
139
|
+
scanners_missing: scannersMissing,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type ScannerId = "gitleaks" | "trivy" | "semgrep" | "osv-scanner";
|
|
2
|
+
export type LeadSeverity = "critical" | "high" | "medium" | "low" | "info" | "unknown";
|
|
3
|
+
export interface LeadLocation {
|
|
4
|
+
file?: string;
|
|
5
|
+
start_line?: number;
|
|
6
|
+
end_line?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface NormalizedLead {
|
|
9
|
+
lane: "lead";
|
|
10
|
+
source: ScannerId;
|
|
11
|
+
rule_id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
severity: LeadSeverity;
|
|
14
|
+
location?: LeadLocation;
|
|
15
|
+
package?: string;
|
|
16
|
+
cwe?: string[];
|
|
17
|
+
owasp?: string[];
|
|
18
|
+
references?: string[];
|
|
19
|
+
excerpt?: string;
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface ScannerRunResult {
|
|
23
|
+
source: ScannerId;
|
|
24
|
+
status: "ok" | "not_installed" | "error";
|
|
25
|
+
leads: NormalizedLead[];
|
|
26
|
+
error?: string;
|
|
27
|
+
duration_ms?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface LocalScanReport {
|
|
30
|
+
ran_at: string;
|
|
31
|
+
results: ScannerRunResult[];
|
|
32
|
+
leads: NormalizedLead[];
|
|
33
|
+
summary: {
|
|
34
|
+
total_leads: number;
|
|
35
|
+
by_source: Record<string, number>;
|
|
36
|
+
by_severity: Record<string, number>;
|
|
37
|
+
scanners_run: ScannerId[];
|
|
38
|
+
scanners_missing: ScannerId[];
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/server.d.ts
CHANGED
|
@@ -1,14 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server
|
|
3
|
-
*
|
|
4
|
-
* Sets up the Model Context Protocol server using the official SDK
|
|
5
|
-
* with stdio transport. Registers all ZIVIS security tools.
|
|
6
|
-
*
|
|
7
|
-
* IMPORTANT: This server communicates over stdout (JSON-RPC 2.0).
|
|
8
|
-
* Never use console.log() — use console.error() for all logging.
|
|
9
|
-
*/
|
|
10
1
|
import type { ZivisConfig } from "./types.js";
|
|
11
|
-
|
|
12
|
-
* Create and start the MCP server with all tools registered
|
|
13
|
-
*/
|
|
14
|
-
export declare function startServer(config?: ZivisConfig): Promise<void>;
|
|
2
|
+
export declare function startServer(incoming?: ZivisConfig): Promise<void>;
|