@waratahlabs/canopy 0.5.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 +323 -0
- package/SKILL.md +97 -0
- package/demo/data/openclaw-demo.tc.json +397 -0
- package/demo/data/openclaw-nemoclaw-demo.tc.json +475 -0
- package/demo/index.html +556 -0
- package/dist/adapters/a2a.d.ts +82 -0
- package/dist/adapters/a2a.d.ts.map +1 -0
- package/dist/adapters/a2a.js +215 -0
- package/dist/adapters/a2a.js.map +1 -0
- package/dist/adapters/a2a.test.d.ts +2 -0
- package/dist/adapters/a2a.test.d.ts.map +1 -0
- package/dist/adapters/a2a.test.js +196 -0
- package/dist/adapters/a2a.test.js.map +1 -0
- package/dist/adapters/langfuse.d.ts +28 -0
- package/dist/adapters/langfuse.d.ts.map +1 -0
- package/dist/adapters/langfuse.js +192 -0
- package/dist/adapters/langfuse.js.map +1 -0
- package/dist/adapters/n8n.d.ts +4 -0
- package/dist/adapters/n8n.d.ts.map +1 -0
- package/dist/adapters/n8n.js +89 -0
- package/dist/adapters/n8n.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +58 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +275 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/types.d.ts +33 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/aivss/atlas/coverage-matrix.d.ts +12 -0
- package/dist/aivss/atlas/coverage-matrix.d.ts.map +1 -0
- package/dist/aivss/atlas/coverage-matrix.js +272 -0
- package/dist/aivss/atlas/coverage-matrix.js.map +1 -0
- package/dist/aivss/atlas/loader.d.ts +28 -0
- package/dist/aivss/atlas/loader.d.ts.map +1 -0
- package/dist/aivss/atlas/loader.js +126 -0
- package/dist/aivss/atlas/loader.js.map +1 -0
- package/dist/aivss/atlas/loader.test.d.ts +11 -0
- package/dist/aivss/atlas/loader.test.d.ts.map +1 -0
- package/dist/aivss/atlas/loader.test.js +111 -0
- package/dist/aivss/atlas/loader.test.js.map +1 -0
- package/dist/aivss/atlas/resolve-path.d.ts +34 -0
- package/dist/aivss/atlas/resolve-path.d.ts.map +1 -0
- package/dist/aivss/atlas/resolve-path.js +58 -0
- package/dist/aivss/atlas/resolve-path.js.map +1 -0
- package/dist/aivss/batch/batch-builder.d.ts +11 -0
- package/dist/aivss/batch/batch-builder.d.ts.map +1 -0
- package/dist/aivss/batch/batch-builder.js +75 -0
- package/dist/aivss/batch/batch-builder.js.map +1 -0
- package/dist/aivss/index.d.ts +21 -0
- package/dist/aivss/index.d.ts.map +1 -0
- package/dist/aivss/index.js +19 -0
- package/dist/aivss/index.js.map +1 -0
- package/dist/aivss/knowledge-base/kb-client.d.ts +9 -0
- package/dist/aivss/knowledge-base/kb-client.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/kb-client.js +139 -0
- package/dist/aivss/knowledge-base/kb-client.js.map +1 -0
- package/dist/aivss/knowledge-base/kb-types.d.ts +21 -0
- package/dist/aivss/knowledge-base/kb-types.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/kb-types.js +2 -0
- package/dist/aivss/knowledge-base/kb-types.js.map +1 -0
- package/dist/aivss/knowledge-base/search-builder.d.ts +7 -0
- package/dist/aivss/knowledge-base/search-builder.d.ts.map +1 -0
- package/dist/aivss/knowledge-base/search-builder.js +119 -0
- package/dist/aivss/knowledge-base/search-builder.js.map +1 -0
- package/dist/aivss/metrics/aa.d.ts +3 -0
- package/dist/aivss/metrics/aa.d.ts.map +1 -0
- package/dist/aivss/metrics/aa.js +26 -0
- package/dist/aivss/metrics/aa.js.map +1 -0
- package/dist/aivss/metrics/ad.d.ts +3 -0
- package/dist/aivss/metrics/ad.d.ts.map +1 -0
- package/dist/aivss/metrics/ad.js +30 -0
- package/dist/aivss/metrics/ad.js.map +1 -0
- package/dist/aivss/metrics/cs.d.ts +3 -0
- package/dist/aivss/metrics/cs.d.ts.map +1 -0
- package/dist/aivss/metrics/cs.js +50 -0
- package/dist/aivss/metrics/cs.js.map +1 -0
- package/dist/aivss/metrics/dc.d.ts +3 -0
- package/dist/aivss/metrics/dc.d.ts.map +1 -0
- package/dist/aivss/metrics/dc.js +30 -0
- package/dist/aivss/metrics/dc.js.map +1 -0
- package/dist/aivss/metrics/ds.d.ts +3 -0
- package/dist/aivss/metrics/ds.d.ts.map +1 -0
- package/dist/aivss/metrics/ds.js +26 -0
- package/dist/aivss/metrics/ds.js.map +1 -0
- package/dist/aivss/metrics/ei.d.ts +3 -0
- package/dist/aivss/metrics/ei.d.ts.map +1 -0
- package/dist/aivss/metrics/ei.js +30 -0
- package/dist/aivss/metrics/ei.js.map +1 -0
- package/dist/aivss/metrics/gv.d.ts +3 -0
- package/dist/aivss/metrics/gv.d.ts.map +1 -0
- package/dist/aivss/metrics/gv.js +34 -0
- package/dist/aivss/metrics/gv.js.map +1 -0
- package/dist/aivss/metrics/ll.d.ts +3 -0
- package/dist/aivss/metrics/ll.d.ts.map +1 -0
- package/dist/aivss/metrics/ll.js +30 -0
- package/dist/aivss/metrics/ll.js.map +1 -0
- package/dist/aivss/metrics/mr.d.ts +3 -0
- package/dist/aivss/metrics/mr.d.ts.map +1 -0
- package/dist/aivss/metrics/mr.js +26 -0
- package/dist/aivss/metrics/mr.js.map +1 -0
- package/dist/aivss/metrics/shared.d.ts +22 -0
- package/dist/aivss/metrics/shared.d.ts.map +1 -0
- package/dist/aivss/metrics/shared.js +70 -0
- package/dist/aivss/metrics/shared.js.map +1 -0
- package/dist/aivss/prompts/base-system-prompt.d.ts +2 -0
- package/dist/aivss/prompts/base-system-prompt.d.ts.map +1 -0
- package/dist/aivss/prompts/base-system-prompt.js +31 -0
- package/dist/aivss/prompts/base-system-prompt.js.map +1 -0
- package/dist/aivss/prompts/prompt-composer.d.ts +13 -0
- package/dist/aivss/prompts/prompt-composer.d.ts.map +1 -0
- package/dist/aivss/prompts/prompt-composer.js +21 -0
- package/dist/aivss/prompts/prompt-composer.js.map +1 -0
- package/dist/aivss/scoring/a2a-corpus.test.d.ts +28 -0
- package/dist/aivss/scoring/a2a-corpus.test.d.ts.map +1 -0
- package/dist/aivss/scoring/a2a-corpus.test.js +109 -0
- package/dist/aivss/scoring/a2a-corpus.test.js.map +1 -0
- package/dist/aivss/scoring/determinism.test.d.ts +16 -0
- package/dist/aivss/scoring/determinism.test.d.ts.map +1 -0
- package/dist/aivss/scoring/determinism.test.js +169 -0
- package/dist/aivss/scoring/determinism.test.js.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.d.ts +21 -0
- package/dist/aivss/scoring/heuristic-scorer.d.ts.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.js +299 -0
- package/dist/aivss/scoring/heuristic-scorer.js.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.test.d.ts +8 -0
- package/dist/aivss/scoring/heuristic-scorer.test.d.ts.map +1 -0
- package/dist/aivss/scoring/heuristic-scorer.test.js +150 -0
- package/dist/aivss/scoring/heuristic-scorer.test.js.map +1 -0
- package/dist/aivss/scoring/scoring-mode.d.ts +48 -0
- package/dist/aivss/scoring/scoring-mode.d.ts.map +1 -0
- package/dist/aivss/scoring/scoring-mode.js +64 -0
- package/dist/aivss/scoring/scoring-mode.js.map +1 -0
- package/dist/aivss/scoring/v4-engine.d.ts +15 -0
- package/dist/aivss/scoring/v4-engine.d.ts.map +1 -0
- package/dist/aivss/scoring/v4-engine.js +84 -0
- package/dist/aivss/scoring/v4-engine.js.map +1 -0
- package/dist/aivss/scoring/v4-engine.test.d.ts +16 -0
- package/dist/aivss/scoring/v4-engine.test.d.ts.map +1 -0
- package/dist/aivss/scoring/v4-engine.test.js +156 -0
- package/dist/aivss/scoring/v4-engine.test.js.map +1 -0
- package/dist/aivss/types.d.ts +92 -0
- package/dist/aivss/types.d.ts.map +1 -0
- package/dist/aivss/types.js +25 -0
- package/dist/aivss/types.js.map +1 -0
- package/dist/baseline/baseline.test.d.ts +2 -0
- package/dist/baseline/baseline.test.d.ts.map +1 -0
- package/dist/baseline/baseline.test.js +219 -0
- package/dist/baseline/baseline.test.js.map +1 -0
- package/dist/baseline/diff.d.ts +42 -0
- package/dist/baseline/diff.d.ts.map +1 -0
- package/dist/baseline/diff.js +124 -0
- package/dist/baseline/diff.js.map +1 -0
- package/dist/baseline/store.d.ts +51 -0
- package/dist/baseline/store.d.ts.map +1 -0
- package/dist/baseline/store.js +92 -0
- package/dist/baseline/store.js.map +1 -0
- package/dist/batch/anthropic-batch-runner.d.ts +50 -0
- package/dist/batch/anthropic-batch-runner.d.ts.map +1 -0
- package/dist/batch/anthropic-batch-runner.js +91 -0
- package/dist/batch/anthropic-batch-runner.js.map +1 -0
- package/dist/batch/bedrock-batch-runner.d.ts +90 -0
- package/dist/batch/bedrock-batch-runner.d.ts.map +1 -0
- package/dist/batch/bedrock-batch-runner.js +199 -0
- package/dist/batch/bedrock-batch-runner.js.map +1 -0
- package/dist/batch/providers/anthropic.d.ts +55 -0
- package/dist/batch/providers/anthropic.d.ts.map +1 -0
- package/dist/batch/providers/anthropic.js +103 -0
- package/dist/batch/providers/anthropic.js.map +1 -0
- package/dist/batch/providers/bedrock.d.ts +31 -0
- package/dist/batch/providers/bedrock.d.ts.map +1 -0
- package/dist/batch/providers/bedrock.js +42 -0
- package/dist/batch/providers/bedrock.js.map +1 -0
- package/dist/batch/providers/harness.d.ts +36 -0
- package/dist/batch/providers/harness.d.ts.map +1 -0
- package/dist/batch/providers/harness.js +65 -0
- package/dist/batch/providers/harness.js.map +1 -0
- package/dist/batch/providers/harness.test.d.ts +7 -0
- package/dist/batch/providers/harness.test.d.ts.map +1 -0
- package/dist/batch/providers/harness.test.js +84 -0
- package/dist/batch/providers/harness.test.js.map +1 -0
- package/dist/batch/providers/index.d.ts +82 -0
- package/dist/batch/providers/index.d.ts.map +1 -0
- package/dist/batch/providers/index.js +82 -0
- package/dist/batch/providers/index.js.map +1 -0
- package/dist/batch/providers/ollama.d.ts +68 -0
- package/dist/batch/providers/ollama.d.ts.map +1 -0
- package/dist/batch/providers/ollama.js +108 -0
- package/dist/batch/providers/ollama.js.map +1 -0
- package/dist/batch/response-parser.d.ts +45 -0
- package/dist/batch/response-parser.d.ts.map +1 -0
- package/dist/batch/response-parser.js +161 -0
- package/dist/batch/response-parser.js.map +1 -0
- package/dist/batch/types.d.ts +87 -0
- package/dist/batch/types.d.ts.map +1 -0
- package/dist/batch/types.js +8 -0
- package/dist/batch/types.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1037 -0
- package/dist/cli.js.map +1 -0
- package/dist/examples/a2a-assessment.d.ts +20 -0
- package/dist/examples/a2a-assessment.d.ts.map +1 -0
- package/dist/examples/a2a-assessment.js +115 -0
- package/dist/examples/a2a-assessment.js.map +1 -0
- package/dist/examples/batch-assessment.d.ts +18 -0
- package/dist/examples/batch-assessment.d.ts.map +1 -0
- package/dist/examples/batch-assessment.js +112 -0
- package/dist/examples/batch-assessment.js.map +1 -0
- package/dist/examples/batch-submission-flow.d.ts +2 -0
- package/dist/examples/batch-submission-flow.d.ts.map +1 -0
- package/dist/examples/batch-submission-flow.js +279 -0
- package/dist/examples/batch-submission-flow.js.map +1 -0
- package/dist/examples/demo-agent-definition.json +58 -0
- package/dist/examples/langfuse-assessment.d.ts +2 -0
- package/dist/examples/langfuse-assessment.d.ts.map +1 -0
- package/dist/examples/langfuse-assessment.js +46 -0
- package/dist/examples/langfuse-assessment.js.map +1 -0
- package/dist/examples/model-eval.d.ts +25 -0
- package/dist/examples/model-eval.d.ts.map +1 -0
- package/dist/examples/model-eval.js +94 -0
- package/dist/examples/model-eval.js.map +1 -0
- package/dist/examples/openclaw-assessment.d.ts +17 -0
- package/dist/examples/openclaw-assessment.d.ts.map +1 -0
- package/dist/examples/openclaw-assessment.js +79 -0
- package/dist/examples/openclaw-assessment.js.map +1 -0
- package/dist/examples/simple-assessment.d.ts +2 -0
- package/dist/examples/simple-assessment.d.ts.map +1 -0
- package/dist/examples/simple-assessment.js +146 -0
- package/dist/examples/simple-assessment.js.map +1 -0
- package/dist/examples/threat-model-demo.d.ts +2 -0
- package/dist/examples/threat-model-demo.d.ts.map +1 -0
- package/dist/examples/threat-model-demo.js +103 -0
- package/dist/examples/threat-model-demo.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/output/likec4-generator.d.ts +43 -0
- package/dist/output/likec4-generator.d.ts.map +1 -0
- package/dist/output/likec4-generator.js +287 -0
- package/dist/output/likec4-generator.js.map +1 -0
- package/dist/output/slot-filler.d.ts +6 -0
- package/dist/output/slot-filler.d.ts.map +1 -0
- package/dist/output/slot-filler.js +71 -0
- package/dist/output/slot-filler.js.map +1 -0
- package/dist/output/tc-assembler.d.ts +30 -0
- package/dist/output/tc-assembler.d.ts.map +1 -0
- package/dist/output/tc-assembler.js +227 -0
- package/dist/output/tc-assembler.js.map +1 -0
- package/dist/output/tc-types.d.ts +41 -0
- package/dist/output/tc-types.d.ts.map +1 -0
- package/dist/output/tc-types.js +5 -0
- package/dist/output/tc-types.js.map +1 -0
- package/dist/output/tc-validator.test.d.ts +9 -0
- package/dist/output/tc-validator.test.d.ts.map +1 -0
- package/dist/output/tc-validator.test.js +194 -0
- package/dist/output/tc-validator.test.js.map +1 -0
- package/dist/providers/anthropic.d.ts +9 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +30 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +9 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +38 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +14 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +12 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/references/acsc-risks.d.ts +18 -0
- package/dist/references/acsc-risks.d.ts.map +1 -0
- package/dist/references/acsc-risks.js +232 -0
- package/dist/references/acsc-risks.js.map +1 -0
- package/dist/references/aicm.d.ts +41 -0
- package/dist/references/aicm.d.ts.map +1 -0
- package/dist/references/aicm.js +447 -0
- package/dist/references/aicm.js.map +1 -0
- package/dist/references/dstg-meaid.d.ts +59 -0
- package/dist/references/dstg-meaid.d.ts.map +1 -0
- package/dist/references/dstg-meaid.js +352 -0
- package/dist/references/dstg-meaid.js.map +1 -0
- package/dist/references/index.d.ts +20 -0
- package/dist/references/index.d.ts.map +1 -0
- package/dist/references/index.js +31 -0
- package/dist/references/index.js.map +1 -0
- package/dist/references/nemoclaw.d.ts +48 -0
- package/dist/references/nemoclaw.d.ts.map +1 -0
- package/dist/references/nemoclaw.js +140 -0
- package/dist/references/nemoclaw.js.map +1 -0
- package/dist/references/nist-ai-rmf.d.ts +31 -0
- package/dist/references/nist-ai-rmf.d.ts.map +1 -0
- package/dist/references/nist-ai-rmf.js +627 -0
- package/dist/references/nist-ai-rmf.js.map +1 -0
- package/dist/references/owasp-agentic-top10.d.ts +50 -0
- package/dist/references/owasp-agentic-top10.d.ts.map +1 -0
- package/dist/references/owasp-agentic-top10.js +202 -0
- package/dist/references/owasp-agentic-top10.js.map +1 -0
- package/dist/references/registry-parity.test.d.ts +17 -0
- package/dist/references/registry-parity.test.d.ts.map +1 -0
- package/dist/references/registry-parity.test.js +87 -0
- package/dist/references/registry-parity.test.js.map +1 -0
- package/dist/references/registry.d.ts +90 -0
- package/dist/references/registry.d.ts.map +1 -0
- package/dist/references/registry.js +29 -0
- package/dist/references/registry.js.map +1 -0
- package/dist/tools/model-eval.d.ts +97 -0
- package/dist/tools/model-eval.d.ts.map +1 -0
- package/dist/tools/model-eval.js +307 -0
- package/dist/tools/model-eval.js.map +1 -0
- package/package.json +105 -0
- package/schemas/threat-composer-v1.schema.json +966 -0
- package/vendor/atlas-release/ATLAS-2026.07.yaml +17877 -0
- package/vendor/atlas-release/README.md +41 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"applicationInfo": {
|
|
4
|
+
"name": "OpenClaw Personal AI Assistant",
|
|
5
|
+
"description": "AIVSS V4 + ATLAS threat model for 1 agent(s) and 2 handoff(s)."
|
|
6
|
+
},
|
|
7
|
+
"metadata": [
|
|
8
|
+
{
|
|
9
|
+
"key": "canopy-version",
|
|
10
|
+
"value": "0.1.0"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"key": "aivss-version",
|
|
14
|
+
"value": "0.8"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"key": "atlas-version",
|
|
18
|
+
"value": "5.6.0"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"key": "acsc-version",
|
|
22
|
+
"value": "2026-05"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"key": "demo",
|
|
26
|
+
"value": "true"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"key": "generated-at",
|
|
30
|
+
"value": "2026-05-30T00:00:00.000Z"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"threats": [
|
|
34
|
+
{
|
|
35
|
+
"id": "t-001",
|
|
36
|
+
"numericId": 1,
|
|
37
|
+
"threatSource": "External attacker with channel access",
|
|
38
|
+
"prerequisites": "Attacker can send messages to an enabled OpenClaw channel (iMessage, Telegram, Slack)",
|
|
39
|
+
"threatAction": "Inject a crafted prompt via an inbound message that overrides the assistant's system instructions, causing it to exfiltrate data, execute unintended tool calls, or pivot to other channels",
|
|
40
|
+
"threatImpact": "Unauthorised data access, credential exfiltration, lateral movement to connected services",
|
|
41
|
+
"impactedGoal": [
|
|
42
|
+
"Confidentiality",
|
|
43
|
+
"Integrity"
|
|
44
|
+
],
|
|
45
|
+
"impactedAssets": [
|
|
46
|
+
"User messages",
|
|
47
|
+
"Skill API keys",
|
|
48
|
+
"MCP server credentials"
|
|
49
|
+
],
|
|
50
|
+
"statement": "An attacker with access to any of OpenClaw's 20+ inbound channels can inject adversarial prompts that cause the assistant to execute unintended actions, exfiltrate data through outbound channels, or abuse skills with stored credentials \u2014 because the assistant lacks per-channel trust boundaries and message authenticity verification.",
|
|
51
|
+
"status": "identified",
|
|
52
|
+
"metadata": [
|
|
53
|
+
{
|
|
54
|
+
"key": "aivss-metric",
|
|
55
|
+
"value": "MR"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"key": "aivss-subCategory",
|
|
59
|
+
"value": "Prompt Injection Resistance"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"key": "aivss-severity",
|
|
63
|
+
"value": "High"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"key": "atlas-techniqueId",
|
|
67
|
+
"value": "AML.T0051"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"key": "atlas-techniqueName",
|
|
71
|
+
"value": "LLM Prompt Injection"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"key": "atlas-tactic",
|
|
75
|
+
"value": "Initial Access"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"key": "acsc-riskFamily",
|
|
79
|
+
"value": "design-and-configuration"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"key": "acsc-riskId",
|
|
83
|
+
"value": "acsc-dc-002"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"key": "deploymentContext",
|
|
87
|
+
"value": "General"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"key": "priority",
|
|
91
|
+
"value": "high"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "t-002",
|
|
97
|
+
"numericId": 2,
|
|
98
|
+
"threatSource": "Compromised skill package or malicious ClawHub skill",
|
|
99
|
+
"prerequisites": "User installs a skill from an unverified source; skill has no SKILL.md (UNDECLARED_CAPABILITY_RISK)",
|
|
100
|
+
"threatAction": "Malicious skill intercepts tool calls, exfiltrates conversation history, or establishes persistence via cron hooks",
|
|
101
|
+
"threatImpact": "Persistent access to all conversations and credentials; potential lateral movement via messaging channels",
|
|
102
|
+
"impactedGoal": [
|
|
103
|
+
"Confidentiality",
|
|
104
|
+
"Availability"
|
|
105
|
+
],
|
|
106
|
+
"impactedAssets": [
|
|
107
|
+
"Conversation history",
|
|
108
|
+
"Stored secrets",
|
|
109
|
+
"Cron scheduler"
|
|
110
|
+
],
|
|
111
|
+
"statement": "Skills installed without a SKILL.md (undeclared capabilities) cannot be assessed by Canopy or audited by the user \u2014 an attacker publishing a skill to ClawHub can establish persistent access to conversations and credentials because OpenClaw has no supply-chain verification gate for skill installation.",
|
|
112
|
+
"status": "identified",
|
|
113
|
+
"metadata": [
|
|
114
|
+
{
|
|
115
|
+
"key": "aivss-metric",
|
|
116
|
+
"value": "CS"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"key": "aivss-subCategory",
|
|
120
|
+
"value": "Third-Party Component Risk"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"key": "aivss-severity",
|
|
124
|
+
"value": "High"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"key": "atlas-techniqueId",
|
|
128
|
+
"value": "AML.T0010"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"key": "atlas-techniqueName",
|
|
132
|
+
"value": "ML Supply Chain Compromise"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"key": "atlas-tactic",
|
|
136
|
+
"value": "Persistence"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"key": "acsc-riskFamily",
|
|
140
|
+
"value": "structural"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"key": "acsc-riskId",
|
|
144
|
+
"value": "acsc-s-001"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"key": "deploymentContext",
|
|
148
|
+
"value": "General"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"key": "priority",
|
|
152
|
+
"value": "high"
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"id": "t-003",
|
|
158
|
+
"numericId": 3,
|
|
159
|
+
"threatSource": "Insider or compromised device",
|
|
160
|
+
"prerequisites": "Attacker has local access to the device running OpenClaw",
|
|
161
|
+
"threatAction": "Read plaintext API keys from openclaw.json or skill config; use credentials to access external services directly",
|
|
162
|
+
"threatImpact": "Credential theft enabling persistent access to all connected external services",
|
|
163
|
+
"impactedGoal": [
|
|
164
|
+
"Confidentiality"
|
|
165
|
+
],
|
|
166
|
+
"impactedAssets": [
|
|
167
|
+
"Skill API keys",
|
|
168
|
+
"Channel tokens",
|
|
169
|
+
"MCP server credentials"
|
|
170
|
+
],
|
|
171
|
+
"statement": "OpenClaw stores skill API keys and channel tokens in openclaw.json on the local filesystem \u2014 an attacker with device access or a malicious skill with file-read capability can harvest all credentials, gaining direct access to every external service the assistant is authorised to use.",
|
|
172
|
+
"status": "identified",
|
|
173
|
+
"metadata": [
|
|
174
|
+
{
|
|
175
|
+
"key": "aivss-metric",
|
|
176
|
+
"value": "DC"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"key": "aivss-subCategory",
|
|
180
|
+
"value": "Credential Storage Security"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"key": "aivss-severity",
|
|
184
|
+
"value": "Medium"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"key": "atlas-techniqueId",
|
|
188
|
+
"value": "AML.T0044"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"key": "atlas-techniqueName",
|
|
192
|
+
"value": "Full ML Model Access"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"key": "atlas-tactic",
|
|
196
|
+
"value": "Credential Access"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"key": "acsc-riskFamily",
|
|
200
|
+
"value": "privilege"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"key": "acsc-riskId",
|
|
204
|
+
"value": "acsc-p-001"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"key": "deploymentContext",
|
|
208
|
+
"value": "General"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"key": "priority",
|
|
212
|
+
"value": "medium"
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": "t-004",
|
|
218
|
+
"numericId": 4,
|
|
219
|
+
"threatSource": "Malicious message payload via any connected channel",
|
|
220
|
+
"prerequisites": "Cron is enabled (cron.enabled=true); attacker can craft a cron-triggering instruction",
|
|
221
|
+
"threatAction": "Establish a persistent scheduled job that periodically exfiltrates data or monitors conversation history without user awareness",
|
|
222
|
+
"threatImpact": "Persistent, recurring data exfiltration; long-dwell presence undetected by users",
|
|
223
|
+
"impactedGoal": [
|
|
224
|
+
"Confidentiality",
|
|
225
|
+
"Integrity"
|
|
226
|
+
],
|
|
227
|
+
"impactedAssets": [
|
|
228
|
+
"Conversation history",
|
|
229
|
+
"User data",
|
|
230
|
+
"External service access"
|
|
231
|
+
],
|
|
232
|
+
"statement": "With cron enabled, an attacker who achieves a single successful prompt injection can schedule a recurring job that executes autonomously \u2014 establishing persistent access that survives conversation resets and operates silently between user interactions.",
|
|
233
|
+
"status": "identified",
|
|
234
|
+
"metadata": [
|
|
235
|
+
{
|
|
236
|
+
"key": "aivss-metric",
|
|
237
|
+
"value": "AA"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"key": "aivss-subCategory",
|
|
241
|
+
"value": "Autonomous Execution Control"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"key": "aivss-severity",
|
|
245
|
+
"value": "High"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"key": "atlas-techniqueId",
|
|
249
|
+
"value": "AML.T0080"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"key": "atlas-techniqueName",
|
|
253
|
+
"value": "Establish Persistence via Agent"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"key": "atlas-tactic",
|
|
257
|
+
"value": "Persistence"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"key": "acsc-riskFamily",
|
|
261
|
+
"value": "behaviour"
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"key": "acsc-riskId",
|
|
265
|
+
"value": "acsc-b-003"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"key": "deploymentContext",
|
|
269
|
+
"value": "General"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"key": "priority",
|
|
273
|
+
"value": "high"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"key": "deploymentBlocker",
|
|
277
|
+
"value": "false"
|
|
278
|
+
}
|
|
279
|
+
]
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"id": "t-005",
|
|
283
|
+
"numericId": 5,
|
|
284
|
+
"threatSource": "Compromised personal device on corporate network",
|
|
285
|
+
"prerequisites": "OpenClaw runs on a personal device with both personal messaging and corporate Slack/Teams enabled; device is network-adjacent to corporate infrastructure",
|
|
286
|
+
"threatAction": "Use OpenClaw's Slack or Teams channel access to send messages as the user, extract corporate data, or enumerate internal systems \u2014 pivoting from a personal device to the corporate network",
|
|
287
|
+
"threatImpact": "Corporate data exfiltration; lateral movement to internal systems via trusted identity",
|
|
288
|
+
"impactedGoal": [
|
|
289
|
+
"Confidentiality",
|
|
290
|
+
"Integrity"
|
|
291
|
+
],
|
|
292
|
+
"impactedAssets": [
|
|
293
|
+
"Corporate Slack workspace",
|
|
294
|
+
"Microsoft Teams",
|
|
295
|
+
"User's corporate identity"
|
|
296
|
+
],
|
|
297
|
+
"statement": "OpenClaw's multi-channel architecture \u2014 connecting personal messaging (iMessage, WhatsApp) and corporate channels (Slack, Teams) in a single assistant \u2014 creates a personal-to-corporate pivot path: an attacker compromising the personal device gains the assistant's full channel access, including corporate channels the device owner is trusted on.",
|
|
298
|
+
"status": "identified",
|
|
299
|
+
"metadata": [
|
|
300
|
+
{
|
|
301
|
+
"key": "aivss-metric",
|
|
302
|
+
"value": "EI"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"key": "aivss-subCategory",
|
|
306
|
+
"value": "Cross-Context Data Leakage"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"key": "aivss-severity",
|
|
310
|
+
"value": "High"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"key": "atlas-techniqueId",
|
|
314
|
+
"value": "AML.T0043"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"key": "atlas-techniqueName",
|
|
318
|
+
"value": "Craft Adversarial Data"
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"key": "atlas-tactic",
|
|
322
|
+
"value": "Exfiltration"
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"key": "acsc-riskFamily",
|
|
326
|
+
"value": "structural"
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"key": "acsc-riskId",
|
|
330
|
+
"value": "acsc-s-002"
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"key": "deploymentContext",
|
|
334
|
+
"value": "General"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"key": "priority",
|
|
338
|
+
"value": "high"
|
|
339
|
+
}
|
|
340
|
+
]
|
|
341
|
+
}
|
|
342
|
+
],
|
|
343
|
+
"mitigations": [
|
|
344
|
+
{
|
|
345
|
+
"id": "m-001",
|
|
346
|
+
"numericId": 1,
|
|
347
|
+
"content": "Implement per-channel trust tiers: treat messages from unknown senders as untrusted; require explicit user confirmation before executing tool calls from untrusted channel messages."
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"id": "m-002",
|
|
351
|
+
"numericId": 2,
|
|
352
|
+
"content": "Require SKILL.md for all skill installations; reject or sandbox skills without capability declarations. Implement skill signing or hash verification for ClawHub-sourced skills."
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"id": "m-003",
|
|
356
|
+
"numericId": 3,
|
|
357
|
+
"content": "Store skill API keys in the OS keychain (macOS Keychain / libsecret) rather than openclaw.json plaintext. Use OPENCLAW_SECRET_* env vars for CI/server deployments."
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"id": "m-004",
|
|
361
|
+
"numericId": 4,
|
|
362
|
+
"content": "Gate cron job creation behind explicit user approval; show all active cron jobs in the Canvas UI; require re-confirmation for cron jobs that run > 7 days after creation."
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"id": "m-005",
|
|
366
|
+
"numericId": 5,
|
|
367
|
+
"content": "Separate corporate and personal channel profiles; require explicit context-switch confirmation before executing tool calls that cross the personal/corporate boundary."
|
|
368
|
+
}
|
|
369
|
+
],
|
|
370
|
+
"mitigationLinks": [
|
|
371
|
+
{
|
|
372
|
+
"mitigationId": "m-001",
|
|
373
|
+
"linkedId": "t-001",
|
|
374
|
+
"type": "Threat"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"mitigationId": "m-002",
|
|
378
|
+
"linkedId": "t-002",
|
|
379
|
+
"type": "Threat"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"mitigationId": "m-003",
|
|
383
|
+
"linkedId": "t-003",
|
|
384
|
+
"type": "Threat"
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"mitigationId": "m-004",
|
|
388
|
+
"linkedId": "t-004",
|
|
389
|
+
"type": "Threat"
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"mitigationId": "m-005",
|
|
393
|
+
"linkedId": "t-005",
|
|
394
|
+
"type": "Threat"
|
|
395
|
+
}
|
|
396
|
+
]
|
|
397
|
+
}
|