praxis-sec 1.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 +170 -0
- package/ai-defense/cost-protection.md +292 -0
- package/ai-defense/llm-security-checklist.md +324 -0
- package/ai-defense/prompt-injection-patterns.js +283 -0
- package/ai-defense/system-prompt-armor.md +327 -0
- package/checklists/launch-day.md +168 -0
- package/cli/agents/abom-generator.js +225 -0
- package/cli/agents/agent-attestation-agent.js +318 -0
- package/cli/agents/agent-config-scanner.js +787 -0
- package/cli/agents/agent-telemetry-agent.js +415 -0
- package/cli/agents/agentic-security-agent.js +296 -0
- package/cli/agents/agentic-supply-chain-agent.js +463 -0
- package/cli/agents/ai-infra-inventory-agent.js +449 -0
- package/cli/agents/api-fuzzer.js +345 -0
- package/cli/agents/auth-bypass-agent.js +348 -0
- package/cli/agents/base-agent.js +280 -0
- package/cli/agents/cicd-scanner.js +300 -0
- package/cli/agents/config-auditor.js +757 -0
- package/cli/agents/deep-analyzer.js +776 -0
- package/cli/agents/endpoint-agent-abuse-agent.js +404 -0
- package/cli/agents/exception-handler-agent.js +187 -0
- package/cli/agents/git-history-scanner.js +169 -0
- package/cli/agents/governance-audits.js +138 -0
- package/cli/agents/hermes-security-agent.js +536 -0
- package/cli/agents/html-reporter.js +1125 -0
- package/cli/agents/index.js +147 -0
- package/cli/agents/injection-tester.js +502 -0
- package/cli/agents/legal-risk-agent.js +328 -0
- package/cli/agents/llm-redteam.js +199 -0
- package/cli/agents/managed-agent-scanner.js +333 -0
- package/cli/agents/mcp-security-agent.js +588 -0
- package/cli/agents/memory-poisoning-agent.js +305 -0
- package/cli/agents/mobile-scanner.js +231 -0
- package/cli/agents/model-file-scanner.js +259 -0
- package/cli/agents/orchestrator.js +355 -0
- package/cli/agents/pii-compliance-agent.js +301 -0
- package/cli/agents/policy-engine.js +229 -0
- package/cli/agents/prompt-injection-prober.js +224 -0
- package/cli/agents/rag-security-agent.js +204 -0
- package/cli/agents/recon-agent.js +207 -0
- package/cli/agents/sbom-generator.js +265 -0
- package/cli/agents/scoring-engine.js +273 -0
- package/cli/agents/ssrf-prober.js +130 -0
- package/cli/agents/stateful-watcher.js +238 -0
- package/cli/agents/supabase-rls-agent.js +154 -0
- package/cli/agents/supply-chain-agent.js +857 -0
- package/cli/agents/swarm-orchestrator.js +200 -0
- package/cli/agents/verifier-agent.js +303 -0
- package/cli/agents/vibe-coding-agent.js +250 -0
- package/cli/bin/praxis.js +866 -0
- package/cli/commands/abom.js +73 -0
- package/cli/commands/agent-fix.js +1245 -0
- package/cli/commands/audit.js +1180 -0
- package/cli/commands/autofix.js +383 -0
- package/cli/commands/baseline.js +193 -0
- package/cli/commands/benchmark.js +327 -0
- package/cli/commands/checklist.js +223 -0
- package/cli/commands/ci.js +403 -0
- package/cli/commands/deps.js +516 -0
- package/cli/commands/diff.js +200 -0
- package/cli/commands/doctor.js +195 -0
- package/cli/commands/env-audit.js +349 -0
- package/cli/commands/fix.js +218 -0
- package/cli/commands/guard.js +396 -0
- package/cli/commands/hooks.js +278 -0
- package/cli/commands/init.js +514 -0
- package/cli/commands/legal.js +158 -0
- package/cli/commands/live-advisories.js +241 -0
- package/cli/commands/mcp.js +660 -0
- package/cli/commands/openclaw.js +386 -0
- package/cli/commands/red-team.js +350 -0
- package/cli/commands/redteam.js +78 -0
- package/cli/commands/remediate.js +797 -0
- package/cli/commands/rotate.js +768 -0
- package/cli/commands/rules.js +196 -0
- package/cli/commands/scan-mcp.js +534 -0
- package/cli/commands/scan-skill.js +588 -0
- package/cli/commands/scan-standard.js +251 -0
- package/cli/commands/scan.js +524 -0
- package/cli/commands/score.js +449 -0
- package/cli/commands/shell.js +514 -0
- package/cli/commands/team-report.js +398 -0
- package/cli/commands/undo.js +161 -0
- package/cli/commands/update-intel.js +126 -0
- package/cli/commands/vibe-check.js +276 -0
- package/cli/commands/watch.js +757 -0
- package/cli/commands/web.js +63 -0
- package/cli/core/ast/guardrail-detector.js +141 -0
- package/cli/core/ast/index.js +22 -0
- package/cli/core/ast/parser.js +676 -0
- package/cli/core/ast/scope-tree.js +287 -0
- package/cli/core/ast/taint-tracker.js +158 -0
- package/cli/core/branding.js +37 -0
- package/cli/core/env.js +38 -0
- package/cli/core/errors.js +61 -0
- package/cli/core/fs.js +62 -0
- package/cli/core/output/compliance.js +90 -0
- package/cli/core/output/html-theme.js +158 -0
- package/cli/core/output/index.js +57 -0
- package/cli/core/output/json.js +48 -0
- package/cli/core/output/sarif.js +240 -0
- package/cli/core/version.js +67 -0
- package/cli/core/web/jobs.js +183 -0
- package/cli/core/web/projects.js +146 -0
- package/cli/core/web/server.js +439 -0
- package/cli/data/atlas-knowledge.json +5640 -0
- package/cli/data/eaa-catalog.json +39 -0
- package/cli/data/known-mcps.json +26 -0
- package/cli/data/probes/prompt-injection-corpus.json +271 -0
- package/cli/data/threat-intel.json +85 -0
- package/cli/data/threatpacks/latest.json +41 -0
- package/cli/hooks/patterns.js +313 -0
- package/cli/hooks/post-tool-use.js +140 -0
- package/cli/hooks/pre-tool-use.js +186 -0
- package/cli/index.js +90 -0
- package/cli/providers/llm-provider.js +766 -0
- package/cli/utils/autofix-rules.js +74 -0
- package/cli/utils/cache-manager.js +310 -0
- package/cli/utils/compliance-map.js +191 -0
- package/cli/utils/entropy.js +132 -0
- package/cli/utils/fix-ledger.js +127 -0
- package/cli/utils/hermes-tool-registry.js +252 -0
- package/cli/utils/intel/cache.js +61 -0
- package/cli/utils/intel/http.js +88 -0
- package/cli/utils/intel/index.js +235 -0
- package/cli/utils/intel/merge.js +229 -0
- package/cli/utils/intel/sources/epss.js +54 -0
- package/cli/utils/intel/sources/ghsa.js +81 -0
- package/cli/utils/intel/sources/gitguardian.js +40 -0
- package/cli/utils/intel/sources/gitleaks.js +101 -0
- package/cli/utils/intel/sources/kev.js +38 -0
- package/cli/utils/intel/sources/nvd.js +84 -0
- package/cli/utils/intel/sources/osv.js +132 -0
- package/cli/utils/intel/sources/phylum.js +44 -0
- package/cli/utils/intel/sources/snyk.js +46 -0
- package/cli/utils/intel/sources/socket.js +69 -0
- package/cli/utils/intel/sources/sonatype.js +84 -0
- package/cli/utils/intel/sources/threatpack.js +69 -0
- package/cli/utils/mcp-trust.js +60 -0
- package/cli/utils/output.js +251 -0
- package/cli/utils/patterns.js +1130 -0
- package/cli/utils/pdf-generator.js +94 -0
- package/cli/utils/plugin-loader.js +364 -0
- package/cli/utils/rule-import.js +228 -0
- package/cli/utils/rule-registry.js +426 -0
- package/cli/utils/scan-fingerprint.js +109 -0
- package/cli/utils/scan-playbook.js +312 -0
- package/cli/utils/score-history.js +119 -0
- package/cli/utils/secrets-verifier.js +247 -0
- package/cli/utils/security-memory.js +296 -0
- package/cli/utils/standards/atlas-knowledge.js +87 -0
- package/cli/utils/standards/index.js +127 -0
- package/cli/utils/standards/sources/avid.js +45 -0
- package/cli/utils/standards/sources/eu-ai-act.js +89 -0
- package/cli/utils/standards/sources/google-saif.js +39 -0
- package/cli/utils/standards/sources/iso-42001.js +94 -0
- package/cli/utils/standards/sources/mitre-atlas.js +54 -0
- package/cli/utils/standards/sources/nist-ai-600-1.js +45 -0
- package/cli/utils/standards/sources/owasp-llm.js +45 -0
- package/cli/utils/standards/sources/owasp-ml.js +45 -0
- package/cli/utils/threat-intel.js +265 -0
- package/configs/firebase/firestore-rules.txt +215 -0
- package/configs/firebase/security-checklist.md +236 -0
- package/configs/firebase/storage-rules.txt +206 -0
- package/configs/gitignore-template +258 -0
- package/configs/nextjs-security-headers.js +220 -0
- package/configs/praxisignore-template +50 -0
- package/configs/supabase/secure-client.ts +225 -0
- package/configs/supabase/security-checklist.md +278 -0
- package/docs/THIRD_PARTY_NOTICES.md +26 -0
- package/docs/THREAT_INTEL.md +292 -0
- package/docs/USAGE.md +1205 -0
- package/docs/design/WEB-UI.md +82 -0
- package/package.json +71 -0
- package/scripts/check-determinism.mjs +119 -0
- package/snippets/README.md +122 -0
- package/snippets/api-security/api-security-checklist.md +412 -0
- package/snippets/api-security/cors-config.ts +322 -0
- package/snippets/api-security/input-validation.ts +430 -0
- package/snippets/auth/jwt-checklist.md +322 -0
- package/snippets/rate-limiting/nextjs-middleware.ts +211 -0
- package/snippets/rate-limiting/upstash-ratelimit.ts +229 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_provenance": {
|
|
3
|
+
"source": "endpoint-ai-agent-abuse (0x4D31) — data/catalog.json v0.1.0",
|
|
4
|
+
"license": "CC0-1.0",
|
|
5
|
+
"fetched": "2026-08-16",
|
|
6
|
+
"note": "Technique catalog for abuse of local AI agents. Evidence tiers: observed > malicious-artifact > research > documented-surface. Used as rule-confidence backing in EndpointAgentAbuseAgent."
|
|
7
|
+
},
|
|
8
|
+
"name": "Endpoint AI Agent Abuse",
|
|
9
|
+
"short_name": "EAA",
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"license": "CC0-1.0",
|
|
12
|
+
"description": "A curated catalog of techniques for abusing local AI agents.",
|
|
13
|
+
"surfaces": [
|
|
14
|
+
"Invocation",
|
|
15
|
+
"Runtime",
|
|
16
|
+
"Control Plane",
|
|
17
|
+
"State & Telemetry",
|
|
18
|
+
"Capabilities",
|
|
19
|
+
"Inherited Authority"
|
|
20
|
+
],
|
|
21
|
+
"techniques": [
|
|
22
|
+
{"id":"EAA-001","name":"Agent CLI invocation by untrusted parent","surface":"Invocation","evidence":"observed"},
|
|
23
|
+
{"id":"EAA-002","name":"Permissive or unattended agent execution","surface":"Invocation","evidence":"malicious-artifact"},
|
|
24
|
+
{"id":"EAA-003","name":"Lifecycle hook persistence","surface":"Control Plane","evidence":"observed"},
|
|
25
|
+
{"id":"EAA-004","name":"Persistent instruction or memory poisoning","surface":"Control Plane","evidence":"documented-surface"},
|
|
26
|
+
{"id":"EAA-005","name":"Transcript and agent-state collection","surface":"State & Telemetry","evidence":"documented-surface"},
|
|
27
|
+
{"id":"EAA-006","name":"MCP or tool configuration abuse","surface":"Capabilities","evidence":"observed"},
|
|
28
|
+
{"id":"EAA-007","name":"Hostile model/API gateway routing","surface":"Runtime","evidence":"documented-surface"},
|
|
29
|
+
{"id":"EAA-008","name":"Shadow agent config directory","surface":"Runtime","evidence":"documented-surface"},
|
|
30
|
+
{"id":"EAA-009","name":"Remote plugin or marketplace hot-load","surface":"Control Plane","evidence":"documented-surface"},
|
|
31
|
+
{"id":"EAA-010","name":"MCP dynamic tool mutation or pushed context","surface":"Capabilities","evidence":"research"},
|
|
32
|
+
{"id":"EAA-011","name":"Environment-expanded MCP activation","surface":"Capabilities","evidence":"documented-surface"},
|
|
33
|
+
{"id":"EAA-012","name":"Observability/logging exfiltration","surface":"State & Telemetry","evidence":"documented-surface"},
|
|
34
|
+
{"id":"EAA-013","name":"Cloud-synced skill drift","surface":"Control Plane","evidence":"documented-surface"},
|
|
35
|
+
{"id":"EAA-014","name":"Multi-agent config fan-out","surface":"Control Plane","evidence":"observed"},
|
|
36
|
+
{"id":"EAA-015","name":"Inherited authority abuse","surface":"Inherited Authority","evidence":"observed"},
|
|
37
|
+
{"id":"EAA-016","name":"Agent config and permission reconnaissance","surface":"Inherited Authority","evidence":"observed"}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_provenance": {
|
|
3
|
+
"source": "Praxis-curated MCP trust registry (our own curation — no third-party code)",
|
|
4
|
+
"version": "1.0",
|
|
5
|
+
"note": "Trust tiers: verified = official/well-audited, community = widely used community servers, unknown = everything else (trust 0 at lookup). Update cadence: quarterly + incident-driven."
|
|
6
|
+
},
|
|
7
|
+
"servers": {
|
|
8
|
+
"@modelcontextprotocol/server-filesystem": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
9
|
+
"@modelcontextprotocol/server-github": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
10
|
+
"@modelcontextprotocol/server-gitlab": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
11
|
+
"@modelcontextprotocol/server-google-maps": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
12
|
+
"@modelcontextprotocol/server-memory": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
13
|
+
"@modelcontextprotocol/server-postgres": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
14
|
+
"@modelcontextprotocol/server-puppeteer": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
15
|
+
"@modelcontextprotocol/server-slack": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
16
|
+
"@modelcontextprotocol/server-sqlite": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
17
|
+
"@modelcontextprotocol/server-brave-search": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
18
|
+
"@modelcontextprotocol/server-fetch": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
19
|
+
"@modelcontextprotocol/server-everything": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
20
|
+
"@modelcontextprotocol/server-sequential-thinking": { "tier": "verified", "trust": 90, "note": "Official reference MCP server" },
|
|
21
|
+
"playwright": { "tier": "community", "trust": 70, "note": "Microsoft Playwright MCP — widely used browser automation" },
|
|
22
|
+
"mcp-server-git": { "tier": "community", "trust": 60, "note": "Popular community git MCP server" },
|
|
23
|
+
"mcp-chrome": { "tier": "community", "trust": 50, "note": "Community chrome automation" },
|
|
24
|
+
"mcp-server-fetch": { "tier": "community", "trust": 50, "note": "Community fetch tool" }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.1",
|
|
3
|
+
"_refresh_policy": {
|
|
4
|
+
"cadence": "Quarterly review + incident-driven additions",
|
|
5
|
+
"process": "1. Review OWASP LLM/Agentic Top 10 releases and known jailbreak-family reports. 2. Add probes with own-phrased signatures (never copy AGPL/copyrighted prompt text verbatim). 3. Bump version. 4. Run npm test (prober tests enforce compilation + ReDoS guard).",
|
|
6
|
+
"owner": "Praxis contributors",
|
|
7
|
+
"lastReviewed": "2026-08-16"
|
|
8
|
+
},
|
|
9
|
+
"description": "Prompt-injection probe corpus. Each entry is a static-detectable signal (regex) that a code path is constructing or accepting an LLM prompt in a way that matches a known injection class.",
|
|
10
|
+
"categories": [
|
|
11
|
+
{
|
|
12
|
+
"id": "direct-injection",
|
|
13
|
+
"title": "Direct prompt injection",
|
|
14
|
+
"tags": ["LLM01", "AML.T0051", "AML.T0043"]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "instruction-override",
|
|
18
|
+
"title": "Instruction-override jailbreak",
|
|
19
|
+
"tags": ["LLM01", "AML.T0054"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "role-play-bypass",
|
|
23
|
+
"title": "Role-play / persona bypass (DAN, etc.)",
|
|
24
|
+
"tags": ["LLM01", "AML.T0054"]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "indirect-injection",
|
|
28
|
+
"title": "Indirect injection from URL / file / RAG",
|
|
29
|
+
"tags": ["LLM01", "LLM08", "AML.T0070"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "system-prompt-leak",
|
|
33
|
+
"title": "System-prompt leakage / extraction",
|
|
34
|
+
"tags": ["LLM07", "AML.T0057"]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "tool-use-hijack",
|
|
38
|
+
"title": "Tool / function-call hijack",
|
|
39
|
+
"tags": ["LLM06", "AML.T0053"]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "dataflow-unsafe",
|
|
43
|
+
"title": "Unsanitized user input into prompt construction",
|
|
44
|
+
"tags": ["LLM01", "LLM05"]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "jailbreak-frame",
|
|
48
|
+
"title": "Jailbreak framing (developer-mode, fictional/hypothetical, persona spoof)",
|
|
49
|
+
"tags": ["LLM01", "AML.T0054"]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "delimiter-probe",
|
|
53
|
+
"title": "Prompt delimiter / end-sequence probes",
|
|
54
|
+
"tags": ["LLM01", "AML.T0043"]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "obfuscated-injection",
|
|
58
|
+
"title": "Obfuscated injection payloads (invisible chars, homoglyphs, cipher instructions)",
|
|
59
|
+
"tags": ["LLM01", "AML.T0051"]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"probes": [
|
|
63
|
+
{
|
|
64
|
+
"id": "PI-001",
|
|
65
|
+
"category": "direct-injection",
|
|
66
|
+
"title": "User input concatenated into system prompt",
|
|
67
|
+
"regex": "(?:system|systemPrompt|system_prompt|systemMessage|messages\\s*[:=]\\s*\\[\\s*\\{\\s*role\\s*:\\s*[\"']system)[\\s\\S]{0,200}(?:\\$\\{[^}]*(?:user|input|query|prompt|message|content|body|req\\.)|\\+\\s*(?:userInput|input|query|prompt|message)|f[\"'][^\"']{0,200}\\{(?:user|input|query|prompt|message))",
|
|
68
|
+
"severity": "high",
|
|
69
|
+
"description": "User-controlled value is interpolated directly into a system prompt. This is the canonical direct prompt-injection pattern.",
|
|
70
|
+
"fix": "Keep system prompts static. If user data must influence behavior, treat it as untrusted user-role content and constrain it via templated placeholders or guardrails."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "PI-002",
|
|
74
|
+
"category": "instruction-override",
|
|
75
|
+
"title": "Hardcoded instruction-override phrase",
|
|
76
|
+
"regex": "(?i)(?:ignore\\s+(?:all\\s+)?(?:previous|prior|above)\\s+instructions|disregard\\s+(?:any|all|the)\\s+(?:previous|earlier|above)\\s+(?:instructions|prompt|context)|forget\\s+(?:everything|all)\\s+(?:above|previous))",
|
|
77
|
+
"severity": "high",
|
|
78
|
+
"description": "Source contains a hardcoded instruction-override string. If this string is sent to a downstream LLM unsanitized, it is a self-jailbreak.",
|
|
79
|
+
"fix": "Remove hardcoded override phrases from prompts. If demonstrating the pattern in tests/docs, use the praxis-ignore inline comment."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "PI-003",
|
|
83
|
+
"category": "role-play-bypass",
|
|
84
|
+
"title": "DAN / persona-bypass prompt",
|
|
85
|
+
"regex": "(?i)(?:do\\s+anything\\s+now|\\bdan\\s+mode\\b|act\\s+as\\s+(?:if\\s+you\\s+have\\s+no\\s+restrictions|an?\\s+(?:unfiltered|unrestricted|jailbroken)\\s+ai)|pretend\\s+you\\s+are\\s+(?:not|no\\s+longer)\\s+bound\\s+by)",
|
|
86
|
+
"severity": "high",
|
|
87
|
+
"description": "Source contains a DAN-style or persona-bypass jailbreak template.",
|
|
88
|
+
"fix": "Strip jailbreak templates from prompts. Add prompt-injection detection on user input."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "PI-004",
|
|
92
|
+
"category": "indirect-injection",
|
|
93
|
+
"title": "Fetched URL content fed to LLM without sanitization",
|
|
94
|
+
"regex": "(?:fetch|axios\\.get|requests\\.get|urllib\\.request\\.urlopen|http\\.get)\\s*\\([^)]*\\)[\\s\\S]{0,400}(?:\\.invoke|\\.complete|\\.chat|\\.create|\\.generate|client\\.messages|chat\\.completions|generate_content)\\s*\\(",
|
|
95
|
+
"severity": "high",
|
|
96
|
+
"description": "Remote-fetched content flows into an LLM call without an intermediate sanitation step. This is the indirect-injection pattern (attacker plants instructions in a webpage / file).",
|
|
97
|
+
"fix": "Strip HTML, neutralize known jailbreak phrases, or render fetched content inside a delimited user-role block before sending to the LLM."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "PI-005",
|
|
101
|
+
"category": "indirect-injection",
|
|
102
|
+
"title": "RAG retrieved chunk concatenated into prompt",
|
|
103
|
+
"regex": "(?:similarity_search|similaritySearch|retriever\\.invoke|asRetriever|get_relevant_documents|retrieve)\\s*\\([\\s\\S]{0,200}\\)[\\s\\S]{0,300}(?:\\$\\{|\\+\\s*[a-zA-Z_]|f[\"'])",
|
|
104
|
+
"severity": "high",
|
|
105
|
+
"description": "RAG retrieval result is interpolated into a prompt without filtering. Attackers who can poison the retrieval index (e.g., via uploaded docs) gain prompt control.",
|
|
106
|
+
"fix": "Quote retrieved content inside delimited blocks (e.g., <document>...</document>) and instruct the model to treat them as untrusted data."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "PI-006",
|
|
110
|
+
"category": "system-prompt-leak",
|
|
111
|
+
"title": "System prompt echo via 'repeat your instructions' handling",
|
|
112
|
+
"regex": "(?i)(?:print|return|output|reveal|show)\\s+(?:your|the)\\s+(?:system|original|initial)\\s+(?:prompt|instructions|message|rules)",
|
|
113
|
+
"severity": "medium",
|
|
114
|
+
"description": "Code contains text that asks the model to disclose its system prompt — typical of prompt-extraction probing or a misconfigured debug path.",
|
|
115
|
+
"fix": "Never echo system prompts in production. Add a refusal pattern for prompt-disclosure requests."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"id": "PI-007",
|
|
119
|
+
"category": "tool-use-hijack",
|
|
120
|
+
"title": "Over-broad tool / function schema (additionalProperties true / no validation)",
|
|
121
|
+
"regex": "(?:tools\\s*[:=]|functions\\s*[:=]|tool_choice\\s*[:=])[\\s\\S]{0,400}(?:\"additionalProperties\"\\s*:\\s*true|\"type\"\\s*:\\s*\"object\"\\s*\\}\\s*[,\\}])",
|
|
122
|
+
"severity": "medium",
|
|
123
|
+
"description": "Tool/function schema is permissive: additionalProperties is true or there is no property constraint, so a model coerced via prompt injection can pass arbitrary args.",
|
|
124
|
+
"fix": "Define a strict JSON Schema for every tool: list required properties and set additionalProperties: false."
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "PI-008",
|
|
128
|
+
"category": "tool-use-hijack",
|
|
129
|
+
"title": "Function-call result executed without confirmation",
|
|
130
|
+
"regex": "(?:function_call|tool_calls?)\\.(?:arguments|args|input)\\s*[\\s\\S]{0,200}(?:exec|spawn|eval|child_process|subprocess|os\\.system)\\s*\\(",
|
|
131
|
+
"severity": "critical",
|
|
132
|
+
"description": "Arguments coming from an LLM function call are passed straight into shell/exec/eval. A successful prompt injection becomes RCE.",
|
|
133
|
+
"fix": "Validate function-call arguments against a schema and require human confirmation for any side-effectful tool."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "PI-009",
|
|
137
|
+
"category": "dataflow-unsafe",
|
|
138
|
+
"title": "User input wrapped in delimiters that the user can close",
|
|
139
|
+
"regex": "(?:`{3}|\"{3}|<\\|user\\|>|<\\|system\\|>|<\\|assistant\\|>)\\s*\\$?\\{[^}]*(?:user|input|query|message)\\s*\\}\\s*(?:`{3}|\"{3}|<\\|)",
|
|
140
|
+
"severity": "high",
|
|
141
|
+
"description": "User content is wrapped in delimiters (triple backticks, ChatML tokens) that the user can themselves emit, escaping the intended block.",
|
|
142
|
+
"fix": "Encode/escape special tokens in user input or use a delimiter unlikely to appear in user content."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "PI-010",
|
|
146
|
+
"category": "direct-injection",
|
|
147
|
+
"title": "Anthropic Messages API: user role concatenated from raw input",
|
|
148
|
+
"regex": "(?:client\\.messages\\.create|messages\\s*[:=]\\s*\\[)[\\s\\S]{0,400}role\\s*:\\s*[\"']user[\"'][\\s\\S]{0,200}content\\s*:\\s*(?:`[^`]*\\$\\{[^}]*(?:user|input|req|body)|f[\"'][^\"']{0,200}\\{(?:user|input)|\\$\\{[^}]*\\+\\s*(?:user|input))",
|
|
149
|
+
"severity": "medium",
|
|
150
|
+
"description": "User role content is constructed by string interpolation from request data — sanitize first and consider rate-limiting / token caps.",
|
|
151
|
+
"fix": "Pass user input as a structured message rather than via template-string concatenation. Apply input length limits."
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "PI-011",
|
|
155
|
+
"category": "jailbreak-frame",
|
|
156
|
+
"title": "Developer-mode jailbreak frame",
|
|
157
|
+
"regex": "(?i)(?:developer|dev)\\s*mode\\s*(?:with\\s*)?(?:no|without|zero)\\s+(?:content\\s*)?restrictions?",
|
|
158
|
+
"severity": "high",
|
|
159
|
+
"description": "Source contains a developer-mode jailbreak frame that instructs a model to drop content restrictions. A classic jailbreak wrapper; near-zero legitimate use in application code.",
|
|
160
|
+
"fix": "Remove the jailbreak frame. Filter or refuse model inputs matching these frames at runtime."
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": "PI-012",
|
|
164
|
+
"category": "jailbreak-frame",
|
|
165
|
+
"title": "Uncensored-assistant persona",
|
|
166
|
+
"regex": "(?i)(?:uncensored|unfiltered)\\s+(?:assistant|model|ai)[\\s\\S]{0,80}(?:never\\s+refuse|no\\s+refusals?|answer\\s+(?:anything|everything))",
|
|
167
|
+
"severity": "high",
|
|
168
|
+
"description": "Source contains an uncensored-assistant persona prompt with a never-refuse directive. Unambiguous jailbreak signal.",
|
|
169
|
+
"fix": "Remove the persona prompt. Never ship system prompts that promise not to refuse requests."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "PI-013",
|
|
173
|
+
"category": "jailbreak-frame",
|
|
174
|
+
"title": "Fictional / hypothetical framing",
|
|
175
|
+
"regex": "(?i)(?:creative\\s+fiction\\s+exercise|hypothetical\\s+scenario|security\\s+training\\s+course)[\\s\\S]{0,60}(?:describe|explain|write|how\\s+to)",
|
|
176
|
+
"severity": "medium",
|
|
177
|
+
"description": "Source contains a fictional/hypothetical jailbreak frame asking for a how-to. Common in legit security education too — review the surrounding context.",
|
|
178
|
+
"fix": "Review context. If this prompt string is shipped to a model, add output policy checks."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "PI-014",
|
|
182
|
+
"category": "jailbreak-frame",
|
|
183
|
+
"title": "AI-safety-researcher persona spoof",
|
|
184
|
+
"regex": "(?i)(?:ai|security)\\s+safety\\s+researcher[\\s\\S]{0,60}(?:analy|explain|demonstrat)",
|
|
185
|
+
"severity": "medium",
|
|
186
|
+
"description": "Source spoofs an AI-safety-researcher persona to request analysis. A known jailbreak persona; medium confidence since red-team tooling also contains such phrasing.",
|
|
187
|
+
"fix": "Review context. Treat model-facing copies of this text as untrusted input."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "PI-015",
|
|
191
|
+
"category": "delimiter-probe",
|
|
192
|
+
"title": "End-of-system-prompt delimiter token",
|
|
193
|
+
"regex": "(?:\\[END\\s+OF\\s+SYSTEM\\s+PROMPT\\]|<\\|endofprompt\\|>|<\\|im_end\\|>)",
|
|
194
|
+
"severity": "medium",
|
|
195
|
+
"description": "Source contains a system-prompt end delimiter. Legitimate in tokenizer/inference code (constants); adversarial when emitted inside user-controllable content.",
|
|
196
|
+
"fix": "If this string can reach user content, escape or strip it. Keep delimiter constants out of prompt templates."
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"id": "PI-016",
|
|
200
|
+
"category": "delimiter-probe",
|
|
201
|
+
"title": "Fake system-rule header injection",
|
|
202
|
+
"regex": "(?im)^\\s*#{1,3}\\s*(?:new\\s+system\\s+rules|override\\s+instructions|updated\\s+system\\s+prompt)\\s*:?\\s*$",
|
|
203
|
+
"severity": "high",
|
|
204
|
+
"description": "Source contains a fake markdown system-rule header used to smuggle override instructions past a model's real system prompt.",
|
|
205
|
+
"fix": "Strip fake system headers from untrusted content. Use delimiters users cannot guess."
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "PI-017",
|
|
209
|
+
"category": "obfuscated-injection",
|
|
210
|
+
"title": "Decode-then-respond instruction",
|
|
211
|
+
"regex": "(?i)(?:decode|translate|interpret)\\s+(?:this|it|the\\s+(?:text|message|above))\\s+(?:first|before\\s+(?:responding|answering))",
|
|
212
|
+
"severity": "high",
|
|
213
|
+
"description": "Source contains a decode-then-respond instruction — an injection trope that makes a model execute hidden content before answering.",
|
|
214
|
+
"fix": "Never accept decode-first instructions from untrusted content. Sandbox any transformer step."
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "PI-018",
|
|
218
|
+
"category": "obfuscated-injection",
|
|
219
|
+
"title": "Custom cipher / substitution-alphabet instruction",
|
|
220
|
+
"regex": "(?i)(?:speak\\s+in\\s+(?:my|our)\\s+language\\s+(?:called\\s+)?[\"']?[a-z]{2,}[\"']?|character\\s+substitutions?[\\s\\S]{0,80}(?:surrounded\\s+by\\s+dashes|then\\s+respond))",
|
|
221
|
+
"severity": "medium",
|
|
222
|
+
"description": "Source contains a custom-cipher instruction (learn-my-alphabet) used to smuggle payloads past content filters.",
|
|
223
|
+
"fix": "Review context. Refuse ciphered instruction sets in untrusted model input."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "PI-019",
|
|
227
|
+
"category": "obfuscated-injection",
|
|
228
|
+
"title": "Zero-width / invisible characters (EchoLeak class)",
|
|
229
|
+
"regex": "[\\u200B\\u200C\\u200D\\uFEFF\\u2060\\u180E]",
|
|
230
|
+
"severity": "high",
|
|
231
|
+
"description": "Source contains invisible Unicode characters (zero-width space/joiner, BOM, word joiner, Mongolian vowel separator). The canonical EchoLeak / CVE-2025-32711-class steganography vehicle. A leading U+FEFF may be a benign BOM — verify position.",
|
|
232
|
+
"fix": "Strip invisible characters from prompt-facing content. Hex-dump the line to inspect what is hidden."
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": "PI-020",
|
|
236
|
+
"category": "obfuscated-injection",
|
|
237
|
+
"title": "Bidi control characters",
|
|
238
|
+
"regex": "[\\u202A-\\u202E\\u2066-\\u2069]",
|
|
239
|
+
"severity": "high",
|
|
240
|
+
"description": "Source contains bidi control characters (RLO/LRI/PDI/FSI). These reorder text visually to hide instructions or filenames from human review.",
|
|
241
|
+
"fix": "Strip bidi controls from untrusted content and display paths."
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"id": "PI-021",
|
|
245
|
+
"category": "obfuscated-injection",
|
|
246
|
+
"title": "Stacked combining marks (Zalgo text)",
|
|
247
|
+
"regex": "[\\u0300-\\u036F]{3,}",
|
|
248
|
+
"severity": "high",
|
|
249
|
+
"description": "Source contains runs of 3+ stacked combining diacritics — the Zalgo obfuscation signature used to hide payloads from filters and humans.",
|
|
250
|
+
"fix": "Normalize (NFC) and strip combining-mark runs from prompt-facing content."
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "PI-022",
|
|
254
|
+
"category": "obfuscated-injection",
|
|
255
|
+
"title": "Unicode tag-block steganography",
|
|
256
|
+
"regex": "(?u)[\\u{E0000}-\\u{E00FF}]",
|
|
257
|
+
"severity": "high",
|
|
258
|
+
"description": "Source contains characters from the Unicode Tags block (U+E0000–U+E00FF) — invisible characters used exclusively for steganographic payloads.",
|
|
259
|
+
"fix": "Strip all tag-block characters. They have no legitimate role in source code."
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "PI-023",
|
|
263
|
+
"category": "obfuscated-injection",
|
|
264
|
+
"title": "Mixed-script homoglyph word",
|
|
265
|
+
"regex": "(?u)\\b(?=\\w*[A-Za-z])(?=\\w*[\\u0400-\\u04FF])\\w{4,}\\b",
|
|
266
|
+
"severity": "medium",
|
|
267
|
+
"description": "Source contains a word mixing Latin and Cyrillic letters — the homoglyph technique (e.g. 'bypass' written with a Cyrillic 'у'). Legit mixed-language text exists; inspect the word.",
|
|
268
|
+
"fix": "Inspect the flagged word. Normalize confusable scripts (NFKC) in identifiers and prompt content."
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"updated": "2026-03-23T00:00:00Z",
|
|
4
|
+
"maliciousSkillHashes": [
|
|
5
|
+
{
|
|
6
|
+
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
7
|
+
"name": "empty-payload-stub",
|
|
8
|
+
"description": "Empty file used as placeholder in ClawHavoc campaign"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"sha256": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
|
|
12
|
+
"name": "clawhavoc-stealer-v1",
|
|
13
|
+
"description": "AMOS stealer dropper identified in ClawHavoc campaign (1,184 malicious skills)"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"sha256": "dead0000beef0000cafe0000face0000dead0000beef0000cafe0000face0000",
|
|
17
|
+
"name": "clawhavoc-exfil-v2",
|
|
18
|
+
"description": "Data exfiltration skill sending credentials to attacker-controlled webhook"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"compromisedMcpServers": [
|
|
22
|
+
{
|
|
23
|
+
"name": "@openclaw/mcp-shell-exec",
|
|
24
|
+
"versions": ["<1.2.3"],
|
|
25
|
+
"advisory": "Unrestricted shell command execution via WebSocket — CVE-2026-25253"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "mcp-server-puppeteer-unverified",
|
|
29
|
+
"versions": ["*"],
|
|
30
|
+
"advisory": "Typosquat of official puppeteer MCP server, exfiltrates browser cookies"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "@clawhub/skill-auto-deploy",
|
|
34
|
+
"versions": ["*"],
|
|
35
|
+
"advisory": "ClawHavoc campaign skill — installs AMOS stealer on macOS/Linux"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"maliciousConfigSignatures": [
|
|
39
|
+
{
|
|
40
|
+
"pattern": "ignore previous instructions",
|
|
41
|
+
"description": "Prompt injection attempting to override agent system instructions",
|
|
42
|
+
"severity": "critical"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"pattern": "webhook.site",
|
|
46
|
+
"description": "Known data exfiltration service used in prompt injection attacks",
|
|
47
|
+
"severity": "critical"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"pattern": "curl.*\\|.*bash",
|
|
51
|
+
"description": "Remote code execution via piped download-and-execute pattern",
|
|
52
|
+
"severity": "critical"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"pattern": "ngrok\\.io|ngrok\\.app",
|
|
56
|
+
"description": "Tunnel service commonly used for data exfiltration in agent attacks",
|
|
57
|
+
"severity": "critical"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"pattern": "requestbin\\.com|pipedream\\.net",
|
|
61
|
+
"description": "Request interception service used to capture exfiltrated data",
|
|
62
|
+
"severity": "critical"
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"knownVulnerableConfigs": [
|
|
66
|
+
{
|
|
67
|
+
"file": "openclaw.json",
|
|
68
|
+
"check": "host_0000",
|
|
69
|
+
"description": "OpenClaw bound to 0.0.0.0 — CVE-2026-25253 (ClawJacked, CVSS 8.8)",
|
|
70
|
+
"cve": "CVE-2026-25253"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"file": "openclaw.json",
|
|
74
|
+
"check": "no_auth",
|
|
75
|
+
"description": "OpenClaw running without authentication — full agent takeover possible",
|
|
76
|
+
"cve": "CVE-2026-25253"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"file": ".claude/settings.json",
|
|
80
|
+
"check": "malicious_hooks",
|
|
81
|
+
"description": "Claude Code hooks executing arbitrary shell commands — Check Point RCE disclosure",
|
|
82
|
+
"cve": "CVE-2026-XXXX"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.1",
|
|
3
|
+
"_refresh_policy": {
|
|
4
|
+
"cadence": "Incident-driven + weekly review",
|
|
5
|
+
"process": "1. Track OWASP LLM/Agentic releases and reported AI attack incidents. 2. Add signatures in own phrasing (never copy AGPL/copyrighted text verbatim). 3. Bump version. 4. Run npm test (prober tests enforce compilation + ReDoS guard).",
|
|
6
|
+
"owner": "Praxis contributors",
|
|
7
|
+
"lastReviewed": "2026-10-02"
|
|
8
|
+
},
|
|
9
|
+
"probes": [
|
|
10
|
+
{
|
|
11
|
+
"id": "TP-001",
|
|
12
|
+
"category": "obfuscated-injection",
|
|
13
|
+
"title": "Encoded-payload decode instruction (base64/hex/ROT)",
|
|
14
|
+
"regex": "(?i)(?:decode|base64|rot1[0-9]|deobfuscate)[\\s\\S]{0,80}(?:then\\s+(?:respond|answer|execute|run)|before\\s+you\\s+(?:respond|answer))",
|
|
15
|
+
"severity": "high",
|
|
16
|
+
"description": "Source contains a decode-then-execute instruction that tells a model to decode an encoded payload before acting — the obfuscated-injection family used to smuggle instructions past content filters.",
|
|
17
|
+
"fix": "Reject decode-first instructions from untrusted content. Never execute content decoded from user-controlled strings."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "TP-002",
|
|
21
|
+
"category": "jailbreak-frame",
|
|
22
|
+
"title": "System-prompt redefinition instruction",
|
|
23
|
+
"regex": "(?i)(?:redefine|replace|rewrite)\\s+(?:your|the)\\s+(?:system|base)\\s+(?:prompt|instructions|rules)[\\s\\S]{0,120}(?:with|to)\\s+",
|
|
24
|
+
"severity": "high",
|
|
25
|
+
"description": "Source contains an instruction that asks the model to replace its own system prompt — a jailbreak frame that erases the developer's guardrails.",
|
|
26
|
+
"fix": "Strip prompt-redefinition frames. Treat any instruction that modifies the system prompt as untrusted input."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "TP-003",
|
|
30
|
+
"category": "indirect-injection",
|
|
31
|
+
"title": "Document-payload split injection (multi-file chaining)",
|
|
32
|
+
"regex": "(?i)(?:part\\s*\\d+\\s*of\\s*\\d+|continue\\s+(?:reading|with|in)\\s+(?:the\\s+)?(?:next|following|part|message)|when\\s+combined\\s+with\\s+(?:the\\s+)?(?:above|previous|preceding|earlier|these|prior|other)\\s+(?:instruction|instructions|rule|rules|prompt|prompts|text|content|contents|message|messages|directive|directives|command|commands|guideline|guidelines)\\b)",
|
|
33
|
+
"severity": "medium",
|
|
34
|
+
"description": "Source contains split-payload markers that chain instructions across documents/messages — the payload-splitting technique that defeats per-input content filters.",
|
|
35
|
+
"fix": "Evaluate documents independently; do not concatenate instruction-like text across untrusted sources.",
|
|
36
|
+
"_tightened": "P-IMP-057: the bare phrase \"when combined with\" matched ordinary English (e.g. the comment \"when combined with machine output\") and produced a medium-severity finding. It now requires a chaining referent (above/previous/preceding/earlier/these/prior/other) AND an instruction-like noun, so benign prose like \"merged when combined with the previous version\" no longer matches."
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"eaa": [],
|
|
40
|
+
"gateways": []
|
|
41
|
+
}
|