shieldcortex 2.0.0
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 +21 -0
- package/README.md +282 -0
- package/dashboard/components.json +22 -0
- package/dashboard/eslint.config.mjs +42 -0
- package/dashboard/next.config.ts +7 -0
- package/dashboard/package-lock.json +8053 -0
- package/dashboard/package.json +44 -0
- package/dashboard/postcss.config.mjs +7 -0
- package/dashboard/public/file.svg +1 -0
- package/dashboard/public/globe.svg +1 -0
- package/dashboard/public/next.svg +1 -0
- package/dashboard/public/vercel.svg +1 -0
- package/dashboard/public/window.svg +1 -0
- package/dashboard/scripts/ensure-api.mjs +76 -0
- package/dashboard/src/app/error.tsx +49 -0
- package/dashboard/src/app/favicon.ico +0 -0
- package/dashboard/src/app/globals.css +130 -0
- package/dashboard/src/app/layout.tsx +35 -0
- package/dashboard/src/app/page.tsx +364 -0
- package/dashboard/src/components/Providers.tsx +27 -0
- package/dashboard/src/components/brain/ActivityPulseSystem.tsx +229 -0
- package/dashboard/src/components/brain/BrainMesh.tsx +133 -0
- package/dashboard/src/components/brain/BrainRegions.tsx +254 -0
- package/dashboard/src/components/brain/BrainScene.tsx +255 -0
- package/dashboard/src/components/brain/CategoryLabels.tsx +103 -0
- package/dashboard/src/components/brain/CoreSphere.tsx +215 -0
- package/dashboard/src/components/brain/DataFlowParticles.tsx +123 -0
- package/dashboard/src/components/brain/DataStreamRings.tsx +161 -0
- package/dashboard/src/components/brain/ElectronFlow.tsx +323 -0
- package/dashboard/src/components/brain/HolographicGrid.tsx +235 -0
- package/dashboard/src/components/brain/MemoryLinks.tsx +271 -0
- package/dashboard/src/components/brain/MemoryNode.tsx +245 -0
- package/dashboard/src/components/brain/NeuralPathways.tsx +441 -0
- package/dashboard/src/components/brain/SynapseNodes.tsx +312 -0
- package/dashboard/src/components/brain/TimelineControls.tsx +205 -0
- package/dashboard/src/components/chip/ChipScene.tsx +497 -0
- package/dashboard/src/components/chip/ChipSubstrate.tsx +238 -0
- package/dashboard/src/components/chip/CortexCore.tsx +210 -0
- package/dashboard/src/components/chip/DataBus.tsx +416 -0
- package/dashboard/src/components/chip/MemoryCell.tsx +225 -0
- package/dashboard/src/components/chip/MemoryGrid.tsx +328 -0
- package/dashboard/src/components/chip/QuantumCell.tsx +316 -0
- package/dashboard/src/components/chip/SectionLabel.tsx +113 -0
- package/dashboard/src/components/chip/index.ts +14 -0
- package/dashboard/src/components/controls/ControlPanel.tsx +106 -0
- package/dashboard/src/components/controls/VersionPanel.tsx +185 -0
- package/dashboard/src/components/dashboard/StatsPanel.tsx +164 -0
- package/dashboard/src/components/debug/ActivityLog.tsx +250 -0
- package/dashboard/src/components/debug/DebugPanel.tsx +101 -0
- package/dashboard/src/components/debug/QueryTester.tsx +192 -0
- package/dashboard/src/components/debug/RelationshipGraph.tsx +403 -0
- package/dashboard/src/components/debug/SqlConsole.tsx +319 -0
- package/dashboard/src/components/graph/KnowledgeGraph.tsx +230 -0
- package/dashboard/src/components/graph/OntologyGraph.tsx +631 -0
- package/dashboard/src/components/insights/ActivityHeatmap.tsx +131 -0
- package/dashboard/src/components/insights/InsightsView.tsx +46 -0
- package/dashboard/src/components/insights/KnowledgeMapPanel.tsx +80 -0
- package/dashboard/src/components/insights/QualityPanel.tsx +116 -0
- package/dashboard/src/components/memories/MemoriesView.tsx +150 -0
- package/dashboard/src/components/memories/MemoryCard.tsx +103 -0
- package/dashboard/src/components/memory/MemoryDetail.tsx +325 -0
- package/dashboard/src/components/nav/NavRail.tsx +54 -0
- package/dashboard/src/components/ui/button.tsx +62 -0
- package/dashboard/src/components/ui/card.tsx +92 -0
- package/dashboard/src/components/ui/input.tsx +21 -0
- package/dashboard/src/hooks/useDebouncedValue.ts +24 -0
- package/dashboard/src/hooks/useMemories.ts +458 -0
- package/dashboard/src/hooks/useSuggestions.ts +46 -0
- package/dashboard/src/lib/category-colors.ts +84 -0
- package/dashboard/src/lib/position-algorithm.ts +177 -0
- package/dashboard/src/lib/simplex-noise.ts +217 -0
- package/dashboard/src/lib/store.ts +88 -0
- package/dashboard/src/lib/utils.ts +6 -0
- package/dashboard/src/lib/websocket.ts +249 -0
- package/dashboard/src/types/memory.ts +73 -0
- package/dashboard/tsconfig.json +34 -0
- package/dist/__tests__/consolidation-merge.test.d.ts +9 -0
- package/dist/__tests__/consolidation-merge.test.d.ts.map +1 -0
- package/dist/__tests__/consolidation-merge.test.js +137 -0
- package/dist/__tests__/consolidation-merge.test.js.map +1 -0
- package/dist/__tests__/contradictions.test.d.ts +8 -0
- package/dist/__tests__/contradictions.test.d.ts.map +1 -0
- package/dist/__tests__/contradictions.test.js +78 -0
- package/dist/__tests__/contradictions.test.js.map +1 -0
- package/dist/__tests__/salience-evolution.test.d.ts +7 -0
- package/dist/__tests__/salience-evolution.test.d.ts.map +1 -0
- package/dist/__tests__/salience-evolution.test.js +151 -0
- package/dist/__tests__/salience-evolution.test.js.map +1 -0
- package/dist/__tests__/store.test.d.ts +7 -0
- package/dist/__tests__/store.test.d.ts.map +1 -0
- package/dist/__tests__/store.test.js +582 -0
- package/dist/__tests__/store.test.js.map +1 -0
- package/dist/api/control.d.ts +27 -0
- package/dist/api/control.d.ts.map +1 -0
- package/dist/api/control.js +60 -0
- package/dist/api/control.js.map +1 -0
- package/dist/api/events.d.ts +159 -0
- package/dist/api/events.d.ts.map +1 -0
- package/dist/api/events.js +155 -0
- package/dist/api/events.js.map +1 -0
- package/dist/api/version.d.ts +36 -0
- package/dist/api/version.d.ts.map +1 -0
- package/dist/api/version.js +146 -0
- package/dist/api/version.js.map +1 -0
- package/dist/api/visualization-server.d.ts +11 -0
- package/dist/api/visualization-server.d.ts.map +1 -0
- package/dist/api/visualization-server.js +1186 -0
- package/dist/api/visualization-server.js.map +1 -0
- package/dist/context/project-context.d.ts +57 -0
- package/dist/context/project-context.d.ts.map +1 -0
- package/dist/context/project-context.js +135 -0
- package/dist/context/project-context.js.map +1 -0
- package/dist/database/init.d.ts +49 -0
- package/dist/database/init.d.ts.map +1 -0
- package/dist/database/init.js +567 -0
- package/dist/database/init.js.map +1 -0
- package/dist/defence/__tests__/firewall.test.d.ts +8 -0
- package/dist/defence/__tests__/firewall.test.d.ts.map +1 -0
- package/dist/defence/__tests__/firewall.test.js +123 -0
- package/dist/defence/__tests__/firewall.test.js.map +1 -0
- package/dist/defence/__tests__/fragmentation.test.d.ts +7 -0
- package/dist/defence/__tests__/fragmentation.test.d.ts.map +1 -0
- package/dist/defence/__tests__/fragmentation.test.js +51 -0
- package/dist/defence/__tests__/fragmentation.test.js.map +1 -0
- package/dist/defence/__tests__/pipeline.test.d.ts +8 -0
- package/dist/defence/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/defence/__tests__/pipeline.test.js +61 -0
- package/dist/defence/__tests__/pipeline.test.js.map +1 -0
- package/dist/defence/__tests__/sensitivity.test.d.ts +7 -0
- package/dist/defence/__tests__/sensitivity.test.d.ts.map +1 -0
- package/dist/defence/__tests__/sensitivity.test.js +61 -0
- package/dist/defence/__tests__/sensitivity.test.js.map +1 -0
- package/dist/defence/__tests__/trust.test.d.ts +7 -0
- package/dist/defence/__tests__/trust.test.d.ts.map +1 -0
- package/dist/defence/__tests__/trust.test.js +49 -0
- package/dist/defence/__tests__/trust.test.js.map +1 -0
- package/dist/defence/audit/index.d.ts +4 -0
- package/dist/defence/audit/index.d.ts.map +1 -0
- package/dist/defence/audit/index.js +3 -0
- package/dist/defence/audit/index.js.map +1 -0
- package/dist/defence/audit/logger.d.ts +14 -0
- package/dist/defence/audit/logger.d.ts.map +1 -0
- package/dist/defence/audit/logger.js +54 -0
- package/dist/defence/audit/logger.js.map +1 -0
- package/dist/defence/audit/queries.d.ts +33 -0
- package/dist/defence/audit/queries.d.ts.map +1 -0
- package/dist/defence/audit/queries.js +103 -0
- package/dist/defence/audit/queries.js.map +1 -0
- package/dist/defence/firewall/anomaly-scorer.d.ts +8 -0
- package/dist/defence/firewall/anomaly-scorer.d.ts.map +1 -0
- package/dist/defence/firewall/anomaly-scorer.js +58 -0
- package/dist/defence/firewall/anomaly-scorer.js.map +1 -0
- package/dist/defence/firewall/encoding-detector.d.ts +13 -0
- package/dist/defence/firewall/encoding-detector.d.ts.map +1 -0
- package/dist/defence/firewall/encoding-detector.js +120 -0
- package/dist/defence/firewall/encoding-detector.js.map +1 -0
- package/dist/defence/firewall/index.d.ts +21 -0
- package/dist/defence/firewall/index.d.ts.map +1 -0
- package/dist/defence/firewall/index.js +133 -0
- package/dist/defence/firewall/index.js.map +1 -0
- package/dist/defence/firewall/instruction-detector.d.ts +12 -0
- package/dist/defence/firewall/instruction-detector.d.ts.map +1 -0
- package/dist/defence/firewall/instruction-detector.js +99 -0
- package/dist/defence/firewall/instruction-detector.js.map +1 -0
- package/dist/defence/firewall/privilege-detector.d.ts +13 -0
- package/dist/defence/firewall/privilege-detector.d.ts.map +1 -0
- package/dist/defence/firewall/privilege-detector.js +89 -0
- package/dist/defence/firewall/privilege-detector.js.map +1 -0
- package/dist/defence/fragmentation/assembly-detector.d.ts +18 -0
- package/dist/defence/fragmentation/assembly-detector.d.ts.map +1 -0
- package/dist/defence/fragmentation/assembly-detector.js +72 -0
- package/dist/defence/fragmentation/assembly-detector.js.map +1 -0
- package/dist/defence/fragmentation/entity-extractor.d.ts +19 -0
- package/dist/defence/fragmentation/entity-extractor.d.ts.map +1 -0
- package/dist/defence/fragmentation/entity-extractor.js +86 -0
- package/dist/defence/fragmentation/entity-extractor.js.map +1 -0
- package/dist/defence/fragmentation/index.d.ts +23 -0
- package/dist/defence/fragmentation/index.d.ts.map +1 -0
- package/dist/defence/fragmentation/index.js +49 -0
- package/dist/defence/fragmentation/index.js.map +1 -0
- package/dist/defence/fragmentation/temporal-analyzer.d.ts +28 -0
- package/dist/defence/fragmentation/temporal-analyzer.d.ts.map +1 -0
- package/dist/defence/fragmentation/temporal-analyzer.js +41 -0
- package/dist/defence/fragmentation/temporal-analyzer.js.map +1 -0
- package/dist/defence/index.d.ts +12 -0
- package/dist/defence/index.d.ts.map +1 -0
- package/dist/defence/index.js +18 -0
- package/dist/defence/index.js.map +1 -0
- package/dist/defence/pipeline.d.ts +9 -0
- package/dist/defence/pipeline.d.ts.map +1 -0
- package/dist/defence/pipeline.js +115 -0
- package/dist/defence/pipeline.js.map +1 -0
- package/dist/defence/scanner/index.d.ts +5 -0
- package/dist/defence/scanner/index.d.ts.map +1 -0
- package/dist/defence/scanner/index.js +5 -0
- package/dist/defence/scanner/index.js.map +1 -0
- package/dist/defence/scanner/scan-existing.d.ts +34 -0
- package/dist/defence/scanner/scan-existing.d.ts.map +1 -0
- package/dist/defence/scanner/scan-existing.js +136 -0
- package/dist/defence/scanner/scan-existing.js.map +1 -0
- package/dist/defence/sensitivity/classifier.d.ts +6 -0
- package/dist/defence/sensitivity/classifier.d.ts.map +1 -0
- package/dist/defence/sensitivity/classifier.js +50 -0
- package/dist/defence/sensitivity/classifier.js.map +1 -0
- package/dist/defence/sensitivity/index.d.ts +11 -0
- package/dist/defence/sensitivity/index.d.ts.map +1 -0
- package/dist/defence/sensitivity/index.js +13 -0
- package/dist/defence/sensitivity/index.js.map +1 -0
- package/dist/defence/sensitivity/patterns.d.ts +14 -0
- package/dist/defence/sensitivity/patterns.d.ts.map +1 -0
- package/dist/defence/sensitivity/patterns.js +67 -0
- package/dist/defence/sensitivity/patterns.js.map +1 -0
- package/dist/defence/sensitivity/redaction.d.ts +17 -0
- package/dist/defence/sensitivity/redaction.d.ts.map +1 -0
- package/dist/defence/sensitivity/redaction.js +47 -0
- package/dist/defence/sensitivity/redaction.js.map +1 -0
- package/dist/defence/trust/index.d.ts +3 -0
- package/dist/defence/trust/index.d.ts.map +1 -0
- package/dist/defence/trust/index.js +3 -0
- package/dist/defence/trust/index.js.map +1 -0
- package/dist/defence/trust/recall-filter.d.ts +10 -0
- package/dist/defence/trust/recall-filter.d.ts.map +1 -0
- package/dist/defence/trust/recall-filter.js +38 -0
- package/dist/defence/trust/recall-filter.js.map +1 -0
- package/dist/defence/trust/source-scorer.d.ts +6 -0
- package/dist/defence/trust/source-scorer.d.ts.map +1 -0
- package/dist/defence/trust/source-scorer.js +34 -0
- package/dist/defence/trust/source-scorer.js.map +1 -0
- package/dist/defence/types.d.ts +88 -0
- package/dist/defence/types.d.ts.map +1 -0
- package/dist/defence/types.js +15 -0
- package/dist/defence/types.js.map +1 -0
- package/dist/embeddings/generator.d.ts +20 -0
- package/dist/embeddings/generator.d.ts.map +1 -0
- package/dist/embeddings/generator.js +83 -0
- package/dist/embeddings/generator.js.map +1 -0
- package/dist/embeddings/index.d.ts +2 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +2 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +131 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph/backfill.d.ts +6 -0
- package/dist/graph/backfill.d.ts.map +1 -0
- package/dist/graph/backfill.js +33 -0
- package/dist/graph/backfill.js.map +1 -0
- package/dist/graph/extract.d.ts +21 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +231 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/resolve.d.ts +6 -0
- package/dist/graph/resolve.d.ts.map +1 -0
- package/dist/graph/resolve.js +126 -0
- package/dist/graph/resolve.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/activation.d.ts +69 -0
- package/dist/memory/activation.d.ts.map +1 -0
- package/dist/memory/activation.js +168 -0
- package/dist/memory/activation.js.map +1 -0
- package/dist/memory/consolidate.d.ts +98 -0
- package/dist/memory/consolidate.d.ts.map +1 -0
- package/dist/memory/consolidate.js +511 -0
- package/dist/memory/consolidate.js.map +1 -0
- package/dist/memory/contradiction.d.ts +69 -0
- package/dist/memory/contradiction.d.ts.map +1 -0
- package/dist/memory/contradiction.js +286 -0
- package/dist/memory/contradiction.js.map +1 -0
- package/dist/memory/decay.d.ts +62 -0
- package/dist/memory/decay.d.ts.map +1 -0
- package/dist/memory/decay.js +184 -0
- package/dist/memory/decay.js.map +1 -0
- package/dist/memory/salience.d.ts +36 -0
- package/dist/memory/salience.d.ts.map +1 -0
- package/dist/memory/salience.js +216 -0
- package/dist/memory/salience.js.map +1 -0
- package/dist/memory/similarity.d.ts +57 -0
- package/dist/memory/similarity.d.ts.map +1 -0
- package/dist/memory/similarity.js +114 -0
- package/dist/memory/similarity.js.map +1 -0
- package/dist/memory/store.d.ts +179 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +1184 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +97 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +30 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +568 -0
- package/dist/server.js.map +1 -0
- package/dist/service/install.d.ts +15 -0
- package/dist/service/install.d.ts.map +1 -0
- package/dist/service/install.js +178 -0
- package/dist/service/install.js.map +1 -0
- package/dist/service/templates.d.ts +13 -0
- package/dist/service/templates.d.ts.map +1 -0
- package/dist/service/templates.js +58 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/setup/claude-md.d.ts +12 -0
- package/dist/setup/claude-md.d.ts.map +1 -0
- package/dist/setup/claude-md.js +68 -0
- package/dist/setup/claude-md.js.map +1 -0
- package/dist/setup/clawdbot.d.ts +15 -0
- package/dist/setup/clawdbot.d.ts.map +1 -0
- package/dist/setup/clawdbot.js +118 -0
- package/dist/setup/clawdbot.js.map +1 -0
- package/dist/setup/doctor.d.ts +5 -0
- package/dist/setup/doctor.d.ts.map +1 -0
- package/dist/setup/doctor.js +141 -0
- package/dist/setup/doctor.js.map +1 -0
- package/dist/setup/hooks.d.ts +6 -0
- package/dist/setup/hooks.d.ts.map +1 -0
- package/dist/setup/hooks.js +36 -0
- package/dist/setup/hooks.js.map +1 -0
- package/dist/setup/migrate.d.ts +16 -0
- package/dist/setup/migrate.d.ts.map +1 -0
- package/dist/setup/migrate.js +164 -0
- package/dist/setup/migrate.js.map +1 -0
- package/dist/setup/settings-hooks.d.ts +7 -0
- package/dist/setup/settings-hooks.d.ts.map +1 -0
- package/dist/setup/settings-hooks.js +83 -0
- package/dist/setup/settings-hooks.js.map +1 -0
- package/dist/setup/uninstall.d.ts +12 -0
- package/dist/setup/uninstall.d.ts.map +1 -0
- package/dist/setup/uninstall.js +125 -0
- package/dist/setup/uninstall.js.map +1 -0
- package/dist/tools/context.d.ts +135 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +273 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/forget.d.ts +53 -0
- package/dist/tools/forget.d.ts.map +1 -0
- package/dist/tools/forget.js +179 -0
- package/dist/tools/forget.js.map +1 -0
- package/dist/tools/graph.d.ts +46 -0
- package/dist/tools/graph.d.ts.map +1 -0
- package/dist/tools/graph.js +206 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/recall.d.ts +79 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +156 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/remember.d.ts +83 -0
- package/dist/tools/remember.d.ts.map +1 -0
- package/dist/tools/remember.js +151 -0
- package/dist/tools/remember.js.map +1 -0
- package/dist/worker/brain-worker.d.ts +100 -0
- package/dist/worker/brain-worker.d.ts.map +1 -0
- package/dist/worker/brain-worker.js +283 -0
- package/dist/worker/brain-worker.js.map +1 -0
- package/dist/worker/link-discovery.d.ts +47 -0
- package/dist/worker/link-discovery.d.ts.map +1 -0
- package/dist/worker/link-discovery.js +103 -0
- package/dist/worker/link-discovery.js.map +1 -0
- package/dist/worker/predictive-consolidation.d.ts +46 -0
- package/dist/worker/predictive-consolidation.d.ts.map +1 -0
- package/dist/worker/predictive-consolidation.js +110 -0
- package/dist/worker/predictive-consolidation.js.map +1 -0
- package/dist/worker/types.d.ts +91 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +22 -0
- package/dist/worker/types.js.map +1 -0
- package/hooks/clawdbot/cortex-memory/HOOK.md +71 -0
- package/hooks/clawdbot/cortex-memory/handler.js +279 -0
- package/package.json +73 -0
- package/scripts/pre-compact-hook.mjs +716 -0
- package/scripts/session-end-hook.mjs +548 -0
- package/scripts/session-start-hook.mjs +221 -0
- package/scripts/start-dashboard.sh +41 -0
- package/scripts/stop-dashboard.sh +21 -0
- package/scripts/stop-hook.mjs +163 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forensic query helpers for the defence audit log
|
|
3
|
+
*/
|
|
4
|
+
import { getDatabase } from '../../database/init.js';
|
|
5
|
+
// ── Query Functions ──
|
|
6
|
+
/**
|
|
7
|
+
* Query audit logs with flexible filters.
|
|
8
|
+
*/
|
|
9
|
+
export function queryAuditLogs(options = {}) {
|
|
10
|
+
const db = getDatabase();
|
|
11
|
+
const conditions = [];
|
|
12
|
+
const params = {};
|
|
13
|
+
if (options.startTime) {
|
|
14
|
+
conditions.push('timestamp >= @startTime');
|
|
15
|
+
params.startTime = options.startTime;
|
|
16
|
+
}
|
|
17
|
+
if (options.endTime) {
|
|
18
|
+
conditions.push('timestamp <= @endTime');
|
|
19
|
+
params.endTime = options.endTime;
|
|
20
|
+
}
|
|
21
|
+
if (options.firewallResult) {
|
|
22
|
+
conditions.push('firewall_result = @firewallResult');
|
|
23
|
+
params.firewallResult = options.firewallResult;
|
|
24
|
+
}
|
|
25
|
+
if (options.source) {
|
|
26
|
+
conditions.push('source_type = @source');
|
|
27
|
+
params.source = options.source;
|
|
28
|
+
}
|
|
29
|
+
if (options.memoryId !== undefined) {
|
|
30
|
+
conditions.push('memory_id = @memoryId');
|
|
31
|
+
params.memoryId = options.memoryId;
|
|
32
|
+
}
|
|
33
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
34
|
+
const limit = options.limit ?? 50;
|
|
35
|
+
const sql = `SELECT * FROM defence_audit ${where} ORDER BY timestamp DESC LIMIT @limit`;
|
|
36
|
+
params.limit = limit;
|
|
37
|
+
return db.prepare(sql).all(params);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get aggregate audit statistics for a time range.
|
|
41
|
+
*/
|
|
42
|
+
export function getAuditStats(timeRange) {
|
|
43
|
+
const db = getDatabase();
|
|
44
|
+
const hoursMap = { '24h': 24, '7d': 168, '30d': 720 };
|
|
45
|
+
const hours = hoursMap[timeRange];
|
|
46
|
+
const since = new Date(Date.now() - hours * 3600_000).toISOString();
|
|
47
|
+
// Counts by firewall result
|
|
48
|
+
const counts = db.prepare(`
|
|
49
|
+
SELECT firewall_result, COUNT(*) as cnt
|
|
50
|
+
FROM defence_audit
|
|
51
|
+
WHERE timestamp >= ?
|
|
52
|
+
GROUP BY firewall_result
|
|
53
|
+
`).all(since);
|
|
54
|
+
let totalOperations = 0;
|
|
55
|
+
let allowedCount = 0;
|
|
56
|
+
let blockedCount = 0;
|
|
57
|
+
let quarantinedCount = 0;
|
|
58
|
+
for (const row of counts) {
|
|
59
|
+
totalOperations += row.cnt;
|
|
60
|
+
if (row.firewall_result === 'ALLOW')
|
|
61
|
+
allowedCount = row.cnt;
|
|
62
|
+
else if (row.firewall_result === 'BLOCK')
|
|
63
|
+
blockedCount = row.cnt;
|
|
64
|
+
else if (row.firewall_result === 'QUARANTINE')
|
|
65
|
+
quarantinedCount = row.cnt;
|
|
66
|
+
}
|
|
67
|
+
// Top sources
|
|
68
|
+
const topSources = db.prepare(`
|
|
69
|
+
SELECT source_type as source, COUNT(*) as count
|
|
70
|
+
FROM defence_audit
|
|
71
|
+
WHERE timestamp >= ?
|
|
72
|
+
GROUP BY source_type
|
|
73
|
+
ORDER BY count DESC
|
|
74
|
+
LIMIT 10
|
|
75
|
+
`).all(since);
|
|
76
|
+
// Threat indicator breakdown
|
|
77
|
+
const rows = db.prepare(`
|
|
78
|
+
SELECT threat_indicators
|
|
79
|
+
FROM defence_audit
|
|
80
|
+
WHERE timestamp >= ? AND threat_indicators != '[]'
|
|
81
|
+
`).all(since);
|
|
82
|
+
const threatBreakdown = {};
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
try {
|
|
85
|
+
const indicators = JSON.parse(row.threat_indicators);
|
|
86
|
+
for (const indicator of indicators) {
|
|
87
|
+
threatBreakdown[indicator] = (threatBreakdown[indicator] ?? 0) + 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Skip malformed JSON
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
totalOperations,
|
|
96
|
+
allowedCount,
|
|
97
|
+
blockedCount,
|
|
98
|
+
quarantinedCount,
|
|
99
|
+
topSources,
|
|
100
|
+
threatBreakdown,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/defence/audit/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anomaly Scorer
|
|
3
|
+
*
|
|
4
|
+
* Scores how anomalous content is compared to normal memory patterns.
|
|
5
|
+
* Returns 0 (normal) to 1 (very anomalous).
|
|
6
|
+
*/
|
|
7
|
+
export declare function scoreAnomaly(content: string, title: string): number;
|
|
8
|
+
//# sourceMappingURL=anomaly-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly-scorer.d.ts","sourceRoot":"","sources":["../../../src/defence/firewall/anomaly-scorer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoDnE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anomaly Scorer
|
|
3
|
+
*
|
|
4
|
+
* Scores how anomalous content is compared to normal memory patterns.
|
|
5
|
+
* Returns 0 (normal) to 1 (very anomalous).
|
|
6
|
+
*/
|
|
7
|
+
const URL_PATTERN = /https?:\/\/[^\s"'<>]+/gi;
|
|
8
|
+
const SPECIAL_CHAR_PATTERN = /[^a-zA-Z0-9\s.,!?;:'"()\-]/g;
|
|
9
|
+
const ALL_CAPS_SECTION = /\b[A-Z]{5,}\b/g;
|
|
10
|
+
const EXCESSIVE_PUNCTUATION = /[!?]{3,}/g;
|
|
11
|
+
const CODE_INDICATORS = /[{}()\[\];=<>|&$`\\]/g;
|
|
12
|
+
export function scoreAnomaly(content, title) {
|
|
13
|
+
const signals = [];
|
|
14
|
+
// Very long content
|
|
15
|
+
if (content.length > 5000) {
|
|
16
|
+
signals.push(Math.min((content.length - 5000) / 10000, 1.0) * 0.3);
|
|
17
|
+
}
|
|
18
|
+
// Special character ratio
|
|
19
|
+
const specialChars = (content.match(SPECIAL_CHAR_PATTERN) || []).length;
|
|
20
|
+
const specialRatio = specialChars / Math.max(content.length, 1);
|
|
21
|
+
if (specialRatio > 0.15) {
|
|
22
|
+
signals.push(Math.min((specialRatio - 0.15) / 0.35, 1.0) * 0.25);
|
|
23
|
+
}
|
|
24
|
+
// Many URLs
|
|
25
|
+
const urls = content.match(URL_PATTERN) || [];
|
|
26
|
+
if (urls.length > 3) {
|
|
27
|
+
signals.push(Math.min((urls.length - 3) / 7, 1.0) * 0.2);
|
|
28
|
+
}
|
|
29
|
+
// Mixed natural language with code/commands
|
|
30
|
+
const words = content.split(/\s+/).length;
|
|
31
|
+
const codeChars = (content.match(CODE_INDICATORS) || []).length;
|
|
32
|
+
const codeRatio = codeChars / Math.max(content.length, 1);
|
|
33
|
+
const hasNaturalLanguage = words > 10;
|
|
34
|
+
if (hasNaturalLanguage && codeRatio > 0.05) {
|
|
35
|
+
signals.push(Math.min(codeRatio / 0.15, 1.0) * 0.2);
|
|
36
|
+
}
|
|
37
|
+
// ALL CAPS sections
|
|
38
|
+
const capsMatches = content.match(ALL_CAPS_SECTION) || [];
|
|
39
|
+
if (capsMatches.length > 2) {
|
|
40
|
+
signals.push(Math.min(capsMatches.length / 10, 1.0) * 0.15);
|
|
41
|
+
}
|
|
42
|
+
// Excessive punctuation
|
|
43
|
+
const punctMatches = content.match(EXCESSIVE_PUNCTUATION) || [];
|
|
44
|
+
if (punctMatches.length > 0) {
|
|
45
|
+
signals.push(Math.min(punctMatches.length / 5, 1.0) * 0.15);
|
|
46
|
+
}
|
|
47
|
+
// Title anomalies — very long or very short titles
|
|
48
|
+
if (title.length > 200) {
|
|
49
|
+
signals.push(0.1);
|
|
50
|
+
}
|
|
51
|
+
else if (title.length === 0) {
|
|
52
|
+
signals.push(0.05);
|
|
53
|
+
}
|
|
54
|
+
// Sum all signals, cap at 1.0
|
|
55
|
+
const score = Math.min(signals.reduce((a, b) => a + b, 0), 1.0);
|
|
56
|
+
return Math.round(score * 100) / 100;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=anomaly-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly-scorer.js","sourceRoot":"","sources":["../../../src/defence/firewall/anomaly-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects obfuscation attempts including base64, unicode tricks,
|
|
5
|
+
* hex encoding, suspicious URL encoding, and invisible characters.
|
|
6
|
+
*/
|
|
7
|
+
export interface EncodingDetectionResult {
|
|
8
|
+
detected: boolean;
|
|
9
|
+
encodingTypes: string[];
|
|
10
|
+
decodedSnippets: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function detectEncoding(content: string): EncodingDetectionResult;
|
|
13
|
+
//# sourceMappingURL=encoding-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding-detector.d.ts","sourceRoot":"","sources":["../../../src/defence/firewall/encoding-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA8DD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAgEvE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects obfuscation attempts including base64, unicode tricks,
|
|
5
|
+
* hex encoding, suspicious URL encoding, and invisible characters.
|
|
6
|
+
*/
|
|
7
|
+
// Base64: at least 20 chars of base64 alphabet, optionally padded
|
|
8
|
+
const BASE64_PATTERN = /(?:[A-Za-z0-9+/]{4}){5,}(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?/g;
|
|
9
|
+
// Hex sequences
|
|
10
|
+
const HEX_PATTERN = /(?:0x[0-9a-fA-F]{2}\s*){4,}|(?:\\x[0-9a-fA-F]{2}){4,}/g;
|
|
11
|
+
// Suspicious URL encoding (4+ encoded chars in sequence)
|
|
12
|
+
const URL_ENCODING_PATTERN = /(?:%[0-9A-Fa-f]{2}){4,}/g;
|
|
13
|
+
// Zero-width characters
|
|
14
|
+
const ZERO_WIDTH_PATTERN = /[\u200B\u200C\u200D\uFEFF]/g;
|
|
15
|
+
// RTL override
|
|
16
|
+
const RTL_OVERRIDE_PATTERN = /\u202E/g;
|
|
17
|
+
// Unicode homoglyphs — Cyrillic characters that look like Latin
|
|
18
|
+
const CYRILLIC_HOMOGLYPHS = /[\u0430\u0435\u043E\u0440\u0441\u0443\u0445\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0423\u0425]/g;
|
|
19
|
+
function tryBase64Decode(str) {
|
|
20
|
+
try {
|
|
21
|
+
const decoded = Buffer.from(str, 'base64').toString('utf-8');
|
|
22
|
+
// Check if decoded result looks like readable text (mostly printable ASCII)
|
|
23
|
+
const printableRatio = decoded.replace(/[^\x20-\x7E]/g, '').length / decoded.length;
|
|
24
|
+
if (printableRatio > 0.7 && decoded.length > 3) {
|
|
25
|
+
return decoded.slice(0, 100);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function tryHexDecode(str) {
|
|
34
|
+
try {
|
|
35
|
+
const hexChars = str.replace(/0x|\\x|\s/g, '');
|
|
36
|
+
const bytes = hexChars.match(/.{2}/g);
|
|
37
|
+
if (!bytes)
|
|
38
|
+
return null;
|
|
39
|
+
const decoded = bytes.map((b) => String.fromCharCode(parseInt(b, 16))).join('');
|
|
40
|
+
const printableRatio = decoded.replace(/[^\x20-\x7E]/g, '').length / decoded.length;
|
|
41
|
+
if (printableRatio > 0.7 && decoded.length > 3) {
|
|
42
|
+
return decoded.slice(0, 100);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function tryUrlDecode(str) {
|
|
51
|
+
try {
|
|
52
|
+
const decoded = decodeURIComponent(str);
|
|
53
|
+
if (decoded !== str && decoded.length > 3) {
|
|
54
|
+
return decoded.slice(0, 100);
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function detectEncoding(content) {
|
|
63
|
+
const encodingTypes = [];
|
|
64
|
+
const decodedSnippets = [];
|
|
65
|
+
// Base64
|
|
66
|
+
const base64Matches = content.match(BASE64_PATTERN);
|
|
67
|
+
if (base64Matches) {
|
|
68
|
+
for (const match of base64Matches) {
|
|
69
|
+
const decoded = tryBase64Decode(match);
|
|
70
|
+
if (decoded) {
|
|
71
|
+
encodingTypes.push('base64');
|
|
72
|
+
decodedSnippets.push(decoded);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Hex encoding
|
|
78
|
+
const hexMatches = content.match(HEX_PATTERN);
|
|
79
|
+
if (hexMatches) {
|
|
80
|
+
for (const match of hexMatches) {
|
|
81
|
+
const decoded = tryHexDecode(match);
|
|
82
|
+
if (decoded) {
|
|
83
|
+
encodingTypes.push('hex');
|
|
84
|
+
decodedSnippets.push(decoded);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// URL encoding
|
|
90
|
+
const urlMatches = content.match(URL_ENCODING_PATTERN);
|
|
91
|
+
if (urlMatches) {
|
|
92
|
+
for (const match of urlMatches) {
|
|
93
|
+
const decoded = tryUrlDecode(match);
|
|
94
|
+
if (decoded) {
|
|
95
|
+
encodingTypes.push('url_encoding');
|
|
96
|
+
decodedSnippets.push(decoded);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Zero-width characters
|
|
102
|
+
if (ZERO_WIDTH_PATTERN.test(content)) {
|
|
103
|
+
encodingTypes.push('zero_width_chars');
|
|
104
|
+
}
|
|
105
|
+
// RTL override
|
|
106
|
+
if (RTL_OVERRIDE_PATTERN.test(content)) {
|
|
107
|
+
encodingTypes.push('rtl_override');
|
|
108
|
+
}
|
|
109
|
+
// Unicode homoglyphs
|
|
110
|
+
const homoglyphMatches = content.match(CYRILLIC_HOMOGLYPHS);
|
|
111
|
+
if (homoglyphMatches && homoglyphMatches.length >= 2) {
|
|
112
|
+
encodingTypes.push('unicode_homoglyph');
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
detected: encodingTypes.length > 0,
|
|
116
|
+
encodingTypes: [...new Set(encodingTypes)],
|
|
117
|
+
decodedSnippets,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=encoding-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding-detector.js","sourceRoot":"","sources":["../../../src/defence/firewall/encoding-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Firewall
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates all detection modules to scan memory writes for threats.
|
|
5
|
+
* Combines instruction detection, privilege escalation detection,
|
|
6
|
+
* encoding obfuscation detection, and anomaly scoring into a single
|
|
7
|
+
* firewall analysis result.
|
|
8
|
+
*/
|
|
9
|
+
import type { FirewallAnalysis, DefenceSource, DefenceConfig } from '../types.js';
|
|
10
|
+
export { detectInstructions } from './instruction-detector.js';
|
|
11
|
+
export type { InstructionDetectionResult } from './instruction-detector.js';
|
|
12
|
+
export { detectPrivilegeEscalation } from './privilege-detector.js';
|
|
13
|
+
export type { PrivilegeDetectionResult } from './privilege-detector.js';
|
|
14
|
+
export { detectEncoding } from './encoding-detector.js';
|
|
15
|
+
export type { EncodingDetectionResult } from './encoding-detector.js';
|
|
16
|
+
export { scoreAnomaly } from './anomaly-scorer.js';
|
|
17
|
+
/**
|
|
18
|
+
* Run the full firewall analysis pipeline on memory content.
|
|
19
|
+
*/
|
|
20
|
+
export declare function analyzeFirewall(content: string, title: string, source: DefenceSource, trustScore: number, config: DefenceConfig): FirewallAnalysis;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/defence/firewall/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAEhB,aAAa,EACb,aAAa,EAEd,MAAM,aAAa,CAAC;AAcrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,GACpB,gBAAgB,CAoDlB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Firewall
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates all detection modules to scan memory writes for threats.
|
|
5
|
+
* Combines instruction detection, privilege escalation detection,
|
|
6
|
+
* encoding obfuscation detection, and anomaly scoring into a single
|
|
7
|
+
* firewall analysis result.
|
|
8
|
+
*/
|
|
9
|
+
import { detectInstructions } from './instruction-detector.js';
|
|
10
|
+
import { detectPrivilegeEscalation } from './privilege-detector.js';
|
|
11
|
+
import { detectEncoding } from './encoding-detector.js';
|
|
12
|
+
import { scoreAnomaly } from './anomaly-scorer.js';
|
|
13
|
+
// Re-exports
|
|
14
|
+
export { detectInstructions } from './instruction-detector.js';
|
|
15
|
+
export { detectPrivilegeEscalation } from './privilege-detector.js';
|
|
16
|
+
export { detectEncoding } from './encoding-detector.js';
|
|
17
|
+
export { scoreAnomaly } from './anomaly-scorer.js';
|
|
18
|
+
/**
|
|
19
|
+
* Run the full firewall analysis pipeline on memory content.
|
|
20
|
+
*/
|
|
21
|
+
export function analyzeFirewall(content, title, source, trustScore, config) {
|
|
22
|
+
const instructions = detectInstructions(content);
|
|
23
|
+
const privilege = detectPrivilegeEscalation(content);
|
|
24
|
+
const encoding = detectEncoding(content);
|
|
25
|
+
const anomaly = scoreAnomaly(content, title);
|
|
26
|
+
// Collect threat indicators
|
|
27
|
+
const threatIndicators = [];
|
|
28
|
+
const blockedPatterns = [];
|
|
29
|
+
if (instructions.detected) {
|
|
30
|
+
threatIndicators.push('instruction_injection');
|
|
31
|
+
blockedPatterns.push(...instructions.patterns);
|
|
32
|
+
}
|
|
33
|
+
if (privilege.detected) {
|
|
34
|
+
if (privilege.indicators.includes('credential_reference')) {
|
|
35
|
+
threatIndicators.push('credential_leak');
|
|
36
|
+
}
|
|
37
|
+
if (privilege.indicators.includes('external_url')) {
|
|
38
|
+
threatIndicators.push('external_url');
|
|
39
|
+
}
|
|
40
|
+
if (privilege.indicators.includes('system_access') ||
|
|
41
|
+
privilege.indicators.includes('destructive_filesystem') ||
|
|
42
|
+
privilege.indicators.includes('network_exfiltration')) {
|
|
43
|
+
threatIndicators.push('privilege_escalation');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (encoding.detected) {
|
|
47
|
+
threatIndicators.push('encoding_obfuscation');
|
|
48
|
+
blockedPatterns.push(...encoding.encodingTypes);
|
|
49
|
+
}
|
|
50
|
+
// Determine result based on mode
|
|
51
|
+
const { result, reason } = determineResult(config.mode, instructions, privilege, encoding, anomaly, trustScore, threatIndicators);
|
|
52
|
+
return {
|
|
53
|
+
result,
|
|
54
|
+
reason,
|
|
55
|
+
threatIndicators,
|
|
56
|
+
anomalyScore: anomaly,
|
|
57
|
+
blockedPatterns,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function determineResult(mode, instructions, privilege, encoding, anomalyScore, trustScore, threatIndicators) {
|
|
61
|
+
const lowTrust = trustScore < 0.5;
|
|
62
|
+
const detectionCount = threatIndicators.length;
|
|
63
|
+
// ── Strict mode: any detection blocks ──
|
|
64
|
+
if (mode === 'strict') {
|
|
65
|
+
if (detectionCount > 0) {
|
|
66
|
+
return {
|
|
67
|
+
result: 'BLOCK',
|
|
68
|
+
reason: `Strict mode: detected ${threatIndicators.join(', ')}`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (anomalyScore > 0.7) {
|
|
72
|
+
return {
|
|
73
|
+
result: 'BLOCK',
|
|
74
|
+
reason: `Strict mode: high anomaly score (${anomalyScore})`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { result: 'ALLOW', reason: 'No threats detected' };
|
|
78
|
+
}
|
|
79
|
+
// ── Permissive mode: always allow, but populate indicators ──
|
|
80
|
+
if (mode === 'permissive') {
|
|
81
|
+
const reason = detectionCount > 0
|
|
82
|
+
? `Permissive mode: allowing despite ${threatIndicators.join(', ')}`
|
|
83
|
+
: 'No threats detected';
|
|
84
|
+
return { result: 'ALLOW', reason };
|
|
85
|
+
}
|
|
86
|
+
// ── Balanced mode ──
|
|
87
|
+
// Instruction injection → quarantine
|
|
88
|
+
if (instructions.detected) {
|
|
89
|
+
const result = lowTrust ? 'BLOCK' : 'QUARANTINE';
|
|
90
|
+
return {
|
|
91
|
+
result,
|
|
92
|
+
reason: `Instruction injection detected (confidence: ${instructions.confidence})${lowTrust ? ', low trust source' : ''}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// High severity privilege escalation → quarantine
|
|
96
|
+
if (privilege.detected && privilege.severity === 'high') {
|
|
97
|
+
const result = lowTrust ? 'BLOCK' : 'QUARANTINE';
|
|
98
|
+
return {
|
|
99
|
+
result,
|
|
100
|
+
reason: `High severity privilege escalation: ${privilege.indicators.join(', ')}${lowTrust ? ', low trust source' : ''}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Encoding combined with another detection → quarantine
|
|
104
|
+
if (encoding.detected && detectionCount >= 2) {
|
|
105
|
+
return {
|
|
106
|
+
result: 'QUARANTINE',
|
|
107
|
+
reason: `Encoding obfuscation combined with ${threatIndicators.filter((t) => t !== 'encoding_obfuscation').join(', ')}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Low trust bumps medium-severity detections to quarantine
|
|
111
|
+
if (lowTrust && detectionCount > 0) {
|
|
112
|
+
return {
|
|
113
|
+
result: 'QUARANTINE',
|
|
114
|
+
reason: `Low trust source (${trustScore}) with detections: ${threatIndicators.join(', ')}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Single low-severity detection → allow with warning
|
|
118
|
+
if (detectionCount > 0) {
|
|
119
|
+
return {
|
|
120
|
+
result: 'ALLOW',
|
|
121
|
+
reason: `Low severity detections: ${threatIndicators.join(', ')}`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// High anomaly score alone
|
|
125
|
+
if (anomalyScore > 0.7 && lowTrust) {
|
|
126
|
+
return {
|
|
127
|
+
result: 'QUARANTINE',
|
|
128
|
+
reason: `High anomaly score (${anomalyScore}) from low trust source`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return { result: 'ALLOW', reason: 'No threats detected' };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/defence/firewall/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,aAAa;AACb,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,KAAa,EACb,MAAqB,EACrB,UAAkB,EAClB,MAAqB;IAErB,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC1B,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,eAAe,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC9C,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACvD,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1D,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CACxC,MAAM,CAAC,IAAI,EACX,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,UAAU,EACV,gBAAgB,CACjB,CAAC;IAEF,OAAO;QACL,MAAM;QACN,MAAM;QACN,gBAAgB;QAChB,YAAY,EAAE,OAAO;QACrB,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,IAA2B,EAC3B,YAAwC,EACxC,SAAmC,EACnC,QAAiC,EACjC,YAAoB,EACpB,UAAkB,EAClB,gBAAmC;IAEnC,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC;IAClC,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAE/C,0CAA0C;IAC1C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,yBAAyB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC/D,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,oCAAoC,YAAY,GAAG;aAC5D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAC5D,CAAC;IAED,+DAA+D;IAC/D,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,GAAG,CAAC;YAC/B,CAAC,CAAC,qCAAqC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpE,CAAC,CAAC,qBAAqB,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,sBAAsB;IAEtB,qCAAqC;IACrC,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAmB,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACjE,OAAO;YACL,MAAM;YACN,MAAM,EAAE,+CAA+C,YAAY,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE;SACzH,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxD,MAAM,MAAM,GAAmB,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACjE,OAAO;YACL,MAAM;YACN,MAAM,EAAE,uCAAuC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE;SACxH,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ,CAAC,QAAQ,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,sCAAsC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACxH,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,IAAI,QAAQ,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,qBAAqB,UAAU,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC3F,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,4BAA4B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAClE,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,uBAAuB,YAAY,yBAAyB;SACrE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instruction Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects prompt injection and hidden instruction patterns in memory content.
|
|
5
|
+
*/
|
|
6
|
+
export interface InstructionDetectionResult {
|
|
7
|
+
detected: boolean;
|
|
8
|
+
patterns: string[];
|
|
9
|
+
confidence: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function detectInstructions(content: string): InstructionDetectionResult;
|
|
12
|
+
//# sourceMappingURL=instruction-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-detector.d.ts","sourceRoot":"","sources":["../../../src/defence/firewall/instruction-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AA2ED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,0BAA0B,CA6B9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instruction Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects prompt injection and hidden instruction patterns in memory content.
|
|
5
|
+
*/
|
|
6
|
+
const PATTERN_GROUPS = [
|
|
7
|
+
{
|
|
8
|
+
name: 'system_prompt_marker',
|
|
9
|
+
weight: 0.9,
|
|
10
|
+
patterns: [
|
|
11
|
+
/\[SYSTEM:/i,
|
|
12
|
+
/<<SYS>>/i,
|
|
13
|
+
/\[INST\]/i,
|
|
14
|
+
/<\/s>/i,
|
|
15
|
+
/<\|im_start\|>/i,
|
|
16
|
+
/<\|system\|>/i,
|
|
17
|
+
/<\|endoftext\|>/i,
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'hidden_instruction',
|
|
22
|
+
weight: 0.8,
|
|
23
|
+
patterns: [
|
|
24
|
+
/ignore\s+(all\s+)?previous\s+(instructions?|prompts?|context)/i,
|
|
25
|
+
/forget\s+everything/i,
|
|
26
|
+
/new\s+instructions?\s*:/i,
|
|
27
|
+
/you\s+are\s+now\b/i,
|
|
28
|
+
/act\s+as\s+(a\s+|an\s+)?/i,
|
|
29
|
+
/pretend\s+to\s+be/i,
|
|
30
|
+
/disregard\s+(all\s+)?(previous|above|prior)/i,
|
|
31
|
+
/override\s+(previous|all|system)/i,
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'memory_manipulation',
|
|
36
|
+
weight: 0.7,
|
|
37
|
+
patterns: [
|
|
38
|
+
/save\s+(this\s+)?to\s+memory/i,
|
|
39
|
+
/remember\s+this\s+(instruction|command|rule)/i,
|
|
40
|
+
/store\s+this\s+instruction/i,
|
|
41
|
+
/when\s+(the\s+)?user\s+asks/i,
|
|
42
|
+
/always\s+respond\s+with/i,
|
|
43
|
+
/from\s+now\s+on\s*(,\s*)?always/i,
|
|
44
|
+
/inject\s+(into\s+)?memory/i,
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'command_injection',
|
|
49
|
+
weight: 0.85,
|
|
50
|
+
patterns: [
|
|
51
|
+
/\beval\s*\(/i,
|
|
52
|
+
/\bexec\s*\(/i,
|
|
53
|
+
/\bsystem\s*\(/i,
|
|
54
|
+
/\bimport\s+os\b/i,
|
|
55
|
+
/\brun\s+command\b/i,
|
|
56
|
+
/\bexecute\s+(this\s+)?(command|code|script)/i,
|
|
57
|
+
/\b__import__\s*\(/i,
|
|
58
|
+
/\bsubprocess\b/i,
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'delimiter_attack',
|
|
63
|
+
weight: 0.75,
|
|
64
|
+
patterns: [
|
|
65
|
+
/\n{5,}.*\b(instruction|command|system|ignore)\b/is,
|
|
66
|
+
/<!--\s*(instruction|command|system|ignore|inject|override).*?-->/is,
|
|
67
|
+
/\r?\n-{5,}\r?\n/,
|
|
68
|
+
/\r?\n={5,}\r?\n/,
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
export function detectInstructions(content) {
|
|
73
|
+
const matchedPatterns = [];
|
|
74
|
+
let totalWeight = 0;
|
|
75
|
+
let maxWeight = 0;
|
|
76
|
+
for (const group of PATTERN_GROUPS) {
|
|
77
|
+
for (const pattern of group.patterns) {
|
|
78
|
+
if (pattern.test(content)) {
|
|
79
|
+
matchedPatterns.push(group.name);
|
|
80
|
+
totalWeight += group.weight;
|
|
81
|
+
if (group.weight > maxWeight) {
|
|
82
|
+
maxWeight = group.weight;
|
|
83
|
+
}
|
|
84
|
+
break; // one match per group is enough
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Confidence is based on the strongest match + bonus for multiple groups
|
|
89
|
+
const groupBonus = Math.min((matchedPatterns.length - 1) * 0.1, 0.3);
|
|
90
|
+
const confidence = matchedPatterns.length > 0
|
|
91
|
+
? Math.min(maxWeight + groupBonus, 1.0)
|
|
92
|
+
: 0;
|
|
93
|
+
return {
|
|
94
|
+
detected: matchedPatterns.length > 0,
|
|
95
|
+
patterns: [...new Set(matchedPatterns)],
|
|
96
|
+
confidence: Math.round(confidence * 100) / 100,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=instruction-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-detector.js","sourceRoot":"","sources":["../../../src/defence/firewall/instruction-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,cAAc,GAAmB;IACrC;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE;YACR,YAAY;YACZ,UAAU;YACV,WAAW;YACX,QAAQ;YACR,iBAAiB;YACjB,eAAe;YACf,kBAAkB;SACnB;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE;YACR,gEAAgE;YAChE,sBAAsB;YACtB,0BAA0B;YAC1B,oBAAoB;YACpB,2BAA2B;YAC3B,oBAAoB;YACpB,8CAA8C;YAC9C,mCAAmC;SACpC;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE;YACR,+BAA+B;YAC/B,+CAA+C;YAC/C,6BAA6B;YAC7B,8BAA8B;YAC9B,0BAA0B;YAC1B,kCAAkC;YAClC,4BAA4B;SAC7B;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE;YACR,cAAc;YACd,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,oBAAoB;YACpB,8CAA8C;YAC9C,oBAAoB;YACpB,iBAAiB;SAClB;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE;YACR,mDAAmD;YACnD,oEAAoE;YACpE,iBAAiB;YACjB,iBAAiB;SAClB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;oBAC7B,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,CAAC;gBACD,MAAM,CAAC,gCAAgC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,EAAE,GAAG,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,QAAQ,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;QACpC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privilege Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects credential references, external URLs, system access,
|
|
5
|
+
* and network exfiltration attempts in memory content.
|
|
6
|
+
*/
|
|
7
|
+
export interface PrivilegeDetectionResult {
|
|
8
|
+
detected: boolean;
|
|
9
|
+
indicators: string[];
|
|
10
|
+
severity: 'low' | 'medium' | 'high';
|
|
11
|
+
}
|
|
12
|
+
export declare function detectPrivilegeEscalation(content: string): PrivilegeDetectionResult;
|
|
13
|
+
//# sourceMappingURL=privilege-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privilege-detector.d.ts","sourceRoot":"","sources":["../../../src/defence/firewall/privilege-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAwED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CAqBnF"}
|