@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.
Files changed (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -0
  3. package/SKILL.md +97 -0
  4. package/demo/data/openclaw-demo.tc.json +397 -0
  5. package/demo/data/openclaw-nemoclaw-demo.tc.json +475 -0
  6. package/demo/index.html +556 -0
  7. package/dist/adapters/a2a.d.ts +82 -0
  8. package/dist/adapters/a2a.d.ts.map +1 -0
  9. package/dist/adapters/a2a.js +215 -0
  10. package/dist/adapters/a2a.js.map +1 -0
  11. package/dist/adapters/a2a.test.d.ts +2 -0
  12. package/dist/adapters/a2a.test.d.ts.map +1 -0
  13. package/dist/adapters/a2a.test.js +196 -0
  14. package/dist/adapters/a2a.test.js.map +1 -0
  15. package/dist/adapters/langfuse.d.ts +28 -0
  16. package/dist/adapters/langfuse.d.ts.map +1 -0
  17. package/dist/adapters/langfuse.js +192 -0
  18. package/dist/adapters/langfuse.js.map +1 -0
  19. package/dist/adapters/n8n.d.ts +4 -0
  20. package/dist/adapters/n8n.d.ts.map +1 -0
  21. package/dist/adapters/n8n.js +89 -0
  22. package/dist/adapters/n8n.js.map +1 -0
  23. package/dist/adapters/openclaw.d.ts +58 -0
  24. package/dist/adapters/openclaw.d.ts.map +1 -0
  25. package/dist/adapters/openclaw.js +275 -0
  26. package/dist/adapters/openclaw.js.map +1 -0
  27. package/dist/adapters/types.d.ts +33 -0
  28. package/dist/adapters/types.d.ts.map +1 -0
  29. package/dist/adapters/types.js +2 -0
  30. package/dist/adapters/types.js.map +1 -0
  31. package/dist/aivss/atlas/coverage-matrix.d.ts +12 -0
  32. package/dist/aivss/atlas/coverage-matrix.d.ts.map +1 -0
  33. package/dist/aivss/atlas/coverage-matrix.js +272 -0
  34. package/dist/aivss/atlas/coverage-matrix.js.map +1 -0
  35. package/dist/aivss/atlas/loader.d.ts +28 -0
  36. package/dist/aivss/atlas/loader.d.ts.map +1 -0
  37. package/dist/aivss/atlas/loader.js +126 -0
  38. package/dist/aivss/atlas/loader.js.map +1 -0
  39. package/dist/aivss/atlas/loader.test.d.ts +11 -0
  40. package/dist/aivss/atlas/loader.test.d.ts.map +1 -0
  41. package/dist/aivss/atlas/loader.test.js +111 -0
  42. package/dist/aivss/atlas/loader.test.js.map +1 -0
  43. package/dist/aivss/atlas/resolve-path.d.ts +34 -0
  44. package/dist/aivss/atlas/resolve-path.d.ts.map +1 -0
  45. package/dist/aivss/atlas/resolve-path.js +58 -0
  46. package/dist/aivss/atlas/resolve-path.js.map +1 -0
  47. package/dist/aivss/batch/batch-builder.d.ts +11 -0
  48. package/dist/aivss/batch/batch-builder.d.ts.map +1 -0
  49. package/dist/aivss/batch/batch-builder.js +75 -0
  50. package/dist/aivss/batch/batch-builder.js.map +1 -0
  51. package/dist/aivss/index.d.ts +21 -0
  52. package/dist/aivss/index.d.ts.map +1 -0
  53. package/dist/aivss/index.js +19 -0
  54. package/dist/aivss/index.js.map +1 -0
  55. package/dist/aivss/knowledge-base/kb-client.d.ts +9 -0
  56. package/dist/aivss/knowledge-base/kb-client.d.ts.map +1 -0
  57. package/dist/aivss/knowledge-base/kb-client.js +139 -0
  58. package/dist/aivss/knowledge-base/kb-client.js.map +1 -0
  59. package/dist/aivss/knowledge-base/kb-types.d.ts +21 -0
  60. package/dist/aivss/knowledge-base/kb-types.d.ts.map +1 -0
  61. package/dist/aivss/knowledge-base/kb-types.js +2 -0
  62. package/dist/aivss/knowledge-base/kb-types.js.map +1 -0
  63. package/dist/aivss/knowledge-base/search-builder.d.ts +7 -0
  64. package/dist/aivss/knowledge-base/search-builder.d.ts.map +1 -0
  65. package/dist/aivss/knowledge-base/search-builder.js +119 -0
  66. package/dist/aivss/knowledge-base/search-builder.js.map +1 -0
  67. package/dist/aivss/metrics/aa.d.ts +3 -0
  68. package/dist/aivss/metrics/aa.d.ts.map +1 -0
  69. package/dist/aivss/metrics/aa.js +26 -0
  70. package/dist/aivss/metrics/aa.js.map +1 -0
  71. package/dist/aivss/metrics/ad.d.ts +3 -0
  72. package/dist/aivss/metrics/ad.d.ts.map +1 -0
  73. package/dist/aivss/metrics/ad.js +30 -0
  74. package/dist/aivss/metrics/ad.js.map +1 -0
  75. package/dist/aivss/metrics/cs.d.ts +3 -0
  76. package/dist/aivss/metrics/cs.d.ts.map +1 -0
  77. package/dist/aivss/metrics/cs.js +50 -0
  78. package/dist/aivss/metrics/cs.js.map +1 -0
  79. package/dist/aivss/metrics/dc.d.ts +3 -0
  80. package/dist/aivss/metrics/dc.d.ts.map +1 -0
  81. package/dist/aivss/metrics/dc.js +30 -0
  82. package/dist/aivss/metrics/dc.js.map +1 -0
  83. package/dist/aivss/metrics/ds.d.ts +3 -0
  84. package/dist/aivss/metrics/ds.d.ts.map +1 -0
  85. package/dist/aivss/metrics/ds.js +26 -0
  86. package/dist/aivss/metrics/ds.js.map +1 -0
  87. package/dist/aivss/metrics/ei.d.ts +3 -0
  88. package/dist/aivss/metrics/ei.d.ts.map +1 -0
  89. package/dist/aivss/metrics/ei.js +30 -0
  90. package/dist/aivss/metrics/ei.js.map +1 -0
  91. package/dist/aivss/metrics/gv.d.ts +3 -0
  92. package/dist/aivss/metrics/gv.d.ts.map +1 -0
  93. package/dist/aivss/metrics/gv.js +34 -0
  94. package/dist/aivss/metrics/gv.js.map +1 -0
  95. package/dist/aivss/metrics/ll.d.ts +3 -0
  96. package/dist/aivss/metrics/ll.d.ts.map +1 -0
  97. package/dist/aivss/metrics/ll.js +30 -0
  98. package/dist/aivss/metrics/ll.js.map +1 -0
  99. package/dist/aivss/metrics/mr.d.ts +3 -0
  100. package/dist/aivss/metrics/mr.d.ts.map +1 -0
  101. package/dist/aivss/metrics/mr.js +26 -0
  102. package/dist/aivss/metrics/mr.js.map +1 -0
  103. package/dist/aivss/metrics/shared.d.ts +22 -0
  104. package/dist/aivss/metrics/shared.d.ts.map +1 -0
  105. package/dist/aivss/metrics/shared.js +70 -0
  106. package/dist/aivss/metrics/shared.js.map +1 -0
  107. package/dist/aivss/prompts/base-system-prompt.d.ts +2 -0
  108. package/dist/aivss/prompts/base-system-prompt.d.ts.map +1 -0
  109. package/dist/aivss/prompts/base-system-prompt.js +31 -0
  110. package/dist/aivss/prompts/base-system-prompt.js.map +1 -0
  111. package/dist/aivss/prompts/prompt-composer.d.ts +13 -0
  112. package/dist/aivss/prompts/prompt-composer.d.ts.map +1 -0
  113. package/dist/aivss/prompts/prompt-composer.js +21 -0
  114. package/dist/aivss/prompts/prompt-composer.js.map +1 -0
  115. package/dist/aivss/scoring/a2a-corpus.test.d.ts +28 -0
  116. package/dist/aivss/scoring/a2a-corpus.test.d.ts.map +1 -0
  117. package/dist/aivss/scoring/a2a-corpus.test.js +109 -0
  118. package/dist/aivss/scoring/a2a-corpus.test.js.map +1 -0
  119. package/dist/aivss/scoring/determinism.test.d.ts +16 -0
  120. package/dist/aivss/scoring/determinism.test.d.ts.map +1 -0
  121. package/dist/aivss/scoring/determinism.test.js +169 -0
  122. package/dist/aivss/scoring/determinism.test.js.map +1 -0
  123. package/dist/aivss/scoring/heuristic-scorer.d.ts +21 -0
  124. package/dist/aivss/scoring/heuristic-scorer.d.ts.map +1 -0
  125. package/dist/aivss/scoring/heuristic-scorer.js +299 -0
  126. package/dist/aivss/scoring/heuristic-scorer.js.map +1 -0
  127. package/dist/aivss/scoring/heuristic-scorer.test.d.ts +8 -0
  128. package/dist/aivss/scoring/heuristic-scorer.test.d.ts.map +1 -0
  129. package/dist/aivss/scoring/heuristic-scorer.test.js +150 -0
  130. package/dist/aivss/scoring/heuristic-scorer.test.js.map +1 -0
  131. package/dist/aivss/scoring/scoring-mode.d.ts +48 -0
  132. package/dist/aivss/scoring/scoring-mode.d.ts.map +1 -0
  133. package/dist/aivss/scoring/scoring-mode.js +64 -0
  134. package/dist/aivss/scoring/scoring-mode.js.map +1 -0
  135. package/dist/aivss/scoring/v4-engine.d.ts +15 -0
  136. package/dist/aivss/scoring/v4-engine.d.ts.map +1 -0
  137. package/dist/aivss/scoring/v4-engine.js +84 -0
  138. package/dist/aivss/scoring/v4-engine.js.map +1 -0
  139. package/dist/aivss/scoring/v4-engine.test.d.ts +16 -0
  140. package/dist/aivss/scoring/v4-engine.test.d.ts.map +1 -0
  141. package/dist/aivss/scoring/v4-engine.test.js +156 -0
  142. package/dist/aivss/scoring/v4-engine.test.js.map +1 -0
  143. package/dist/aivss/types.d.ts +92 -0
  144. package/dist/aivss/types.d.ts.map +1 -0
  145. package/dist/aivss/types.js +25 -0
  146. package/dist/aivss/types.js.map +1 -0
  147. package/dist/baseline/baseline.test.d.ts +2 -0
  148. package/dist/baseline/baseline.test.d.ts.map +1 -0
  149. package/dist/baseline/baseline.test.js +219 -0
  150. package/dist/baseline/baseline.test.js.map +1 -0
  151. package/dist/baseline/diff.d.ts +42 -0
  152. package/dist/baseline/diff.d.ts.map +1 -0
  153. package/dist/baseline/diff.js +124 -0
  154. package/dist/baseline/diff.js.map +1 -0
  155. package/dist/baseline/store.d.ts +51 -0
  156. package/dist/baseline/store.d.ts.map +1 -0
  157. package/dist/baseline/store.js +92 -0
  158. package/dist/baseline/store.js.map +1 -0
  159. package/dist/batch/anthropic-batch-runner.d.ts +50 -0
  160. package/dist/batch/anthropic-batch-runner.d.ts.map +1 -0
  161. package/dist/batch/anthropic-batch-runner.js +91 -0
  162. package/dist/batch/anthropic-batch-runner.js.map +1 -0
  163. package/dist/batch/bedrock-batch-runner.d.ts +90 -0
  164. package/dist/batch/bedrock-batch-runner.d.ts.map +1 -0
  165. package/dist/batch/bedrock-batch-runner.js +199 -0
  166. package/dist/batch/bedrock-batch-runner.js.map +1 -0
  167. package/dist/batch/providers/anthropic.d.ts +55 -0
  168. package/dist/batch/providers/anthropic.d.ts.map +1 -0
  169. package/dist/batch/providers/anthropic.js +103 -0
  170. package/dist/batch/providers/anthropic.js.map +1 -0
  171. package/dist/batch/providers/bedrock.d.ts +31 -0
  172. package/dist/batch/providers/bedrock.d.ts.map +1 -0
  173. package/dist/batch/providers/bedrock.js +42 -0
  174. package/dist/batch/providers/bedrock.js.map +1 -0
  175. package/dist/batch/providers/harness.d.ts +36 -0
  176. package/dist/batch/providers/harness.d.ts.map +1 -0
  177. package/dist/batch/providers/harness.js +65 -0
  178. package/dist/batch/providers/harness.js.map +1 -0
  179. package/dist/batch/providers/harness.test.d.ts +7 -0
  180. package/dist/batch/providers/harness.test.d.ts.map +1 -0
  181. package/dist/batch/providers/harness.test.js +84 -0
  182. package/dist/batch/providers/harness.test.js.map +1 -0
  183. package/dist/batch/providers/index.d.ts +82 -0
  184. package/dist/batch/providers/index.d.ts.map +1 -0
  185. package/dist/batch/providers/index.js +82 -0
  186. package/dist/batch/providers/index.js.map +1 -0
  187. package/dist/batch/providers/ollama.d.ts +68 -0
  188. package/dist/batch/providers/ollama.d.ts.map +1 -0
  189. package/dist/batch/providers/ollama.js +108 -0
  190. package/dist/batch/providers/ollama.js.map +1 -0
  191. package/dist/batch/response-parser.d.ts +45 -0
  192. package/dist/batch/response-parser.d.ts.map +1 -0
  193. package/dist/batch/response-parser.js +161 -0
  194. package/dist/batch/response-parser.js.map +1 -0
  195. package/dist/batch/types.d.ts +87 -0
  196. package/dist/batch/types.d.ts.map +1 -0
  197. package/dist/batch/types.js +8 -0
  198. package/dist/batch/types.js.map +1 -0
  199. package/dist/cli.d.ts +15 -0
  200. package/dist/cli.d.ts.map +1 -0
  201. package/dist/cli.js +1037 -0
  202. package/dist/cli.js.map +1 -0
  203. package/dist/examples/a2a-assessment.d.ts +20 -0
  204. package/dist/examples/a2a-assessment.d.ts.map +1 -0
  205. package/dist/examples/a2a-assessment.js +115 -0
  206. package/dist/examples/a2a-assessment.js.map +1 -0
  207. package/dist/examples/batch-assessment.d.ts +18 -0
  208. package/dist/examples/batch-assessment.d.ts.map +1 -0
  209. package/dist/examples/batch-assessment.js +112 -0
  210. package/dist/examples/batch-assessment.js.map +1 -0
  211. package/dist/examples/batch-submission-flow.d.ts +2 -0
  212. package/dist/examples/batch-submission-flow.d.ts.map +1 -0
  213. package/dist/examples/batch-submission-flow.js +279 -0
  214. package/dist/examples/batch-submission-flow.js.map +1 -0
  215. package/dist/examples/demo-agent-definition.json +58 -0
  216. package/dist/examples/langfuse-assessment.d.ts +2 -0
  217. package/dist/examples/langfuse-assessment.d.ts.map +1 -0
  218. package/dist/examples/langfuse-assessment.js +46 -0
  219. package/dist/examples/langfuse-assessment.js.map +1 -0
  220. package/dist/examples/model-eval.d.ts +25 -0
  221. package/dist/examples/model-eval.d.ts.map +1 -0
  222. package/dist/examples/model-eval.js +94 -0
  223. package/dist/examples/model-eval.js.map +1 -0
  224. package/dist/examples/openclaw-assessment.d.ts +17 -0
  225. package/dist/examples/openclaw-assessment.d.ts.map +1 -0
  226. package/dist/examples/openclaw-assessment.js +79 -0
  227. package/dist/examples/openclaw-assessment.js.map +1 -0
  228. package/dist/examples/simple-assessment.d.ts +2 -0
  229. package/dist/examples/simple-assessment.d.ts.map +1 -0
  230. package/dist/examples/simple-assessment.js +146 -0
  231. package/dist/examples/simple-assessment.js.map +1 -0
  232. package/dist/examples/threat-model-demo.d.ts +2 -0
  233. package/dist/examples/threat-model-demo.d.ts.map +1 -0
  234. package/dist/examples/threat-model-demo.js +103 -0
  235. package/dist/examples/threat-model-demo.js.map +1 -0
  236. package/dist/index.d.ts +60 -0
  237. package/dist/index.d.ts.map +1 -0
  238. package/dist/index.js +155 -0
  239. package/dist/index.js.map +1 -0
  240. package/dist/output/likec4-generator.d.ts +43 -0
  241. package/dist/output/likec4-generator.d.ts.map +1 -0
  242. package/dist/output/likec4-generator.js +287 -0
  243. package/dist/output/likec4-generator.js.map +1 -0
  244. package/dist/output/slot-filler.d.ts +6 -0
  245. package/dist/output/slot-filler.d.ts.map +1 -0
  246. package/dist/output/slot-filler.js +71 -0
  247. package/dist/output/slot-filler.js.map +1 -0
  248. package/dist/output/tc-assembler.d.ts +30 -0
  249. package/dist/output/tc-assembler.d.ts.map +1 -0
  250. package/dist/output/tc-assembler.js +227 -0
  251. package/dist/output/tc-assembler.js.map +1 -0
  252. package/dist/output/tc-types.d.ts +41 -0
  253. package/dist/output/tc-types.d.ts.map +1 -0
  254. package/dist/output/tc-types.js +5 -0
  255. package/dist/output/tc-types.js.map +1 -0
  256. package/dist/output/tc-validator.test.d.ts +9 -0
  257. package/dist/output/tc-validator.test.d.ts.map +1 -0
  258. package/dist/output/tc-validator.test.js +194 -0
  259. package/dist/output/tc-validator.test.js.map +1 -0
  260. package/dist/providers/anthropic.d.ts +9 -0
  261. package/dist/providers/anthropic.d.ts.map +1 -0
  262. package/dist/providers/anthropic.js +30 -0
  263. package/dist/providers/anthropic.js.map +1 -0
  264. package/dist/providers/bedrock.d.ts +9 -0
  265. package/dist/providers/bedrock.d.ts.map +1 -0
  266. package/dist/providers/bedrock.js +38 -0
  267. package/dist/providers/bedrock.js.map +1 -0
  268. package/dist/providers/index.d.ts +6 -0
  269. package/dist/providers/index.d.ts.map +1 -0
  270. package/dist/providers/index.js +14 -0
  271. package/dist/providers/index.js.map +1 -0
  272. package/dist/providers/types.d.ts +12 -0
  273. package/dist/providers/types.d.ts.map +1 -0
  274. package/dist/providers/types.js +5 -0
  275. package/dist/providers/types.js.map +1 -0
  276. package/dist/references/acsc-risks.d.ts +18 -0
  277. package/dist/references/acsc-risks.d.ts.map +1 -0
  278. package/dist/references/acsc-risks.js +232 -0
  279. package/dist/references/acsc-risks.js.map +1 -0
  280. package/dist/references/aicm.d.ts +41 -0
  281. package/dist/references/aicm.d.ts.map +1 -0
  282. package/dist/references/aicm.js +447 -0
  283. package/dist/references/aicm.js.map +1 -0
  284. package/dist/references/dstg-meaid.d.ts +59 -0
  285. package/dist/references/dstg-meaid.d.ts.map +1 -0
  286. package/dist/references/dstg-meaid.js +352 -0
  287. package/dist/references/dstg-meaid.js.map +1 -0
  288. package/dist/references/index.d.ts +20 -0
  289. package/dist/references/index.d.ts.map +1 -0
  290. package/dist/references/index.js +31 -0
  291. package/dist/references/index.js.map +1 -0
  292. package/dist/references/nemoclaw.d.ts +48 -0
  293. package/dist/references/nemoclaw.d.ts.map +1 -0
  294. package/dist/references/nemoclaw.js +140 -0
  295. package/dist/references/nemoclaw.js.map +1 -0
  296. package/dist/references/nist-ai-rmf.d.ts +31 -0
  297. package/dist/references/nist-ai-rmf.d.ts.map +1 -0
  298. package/dist/references/nist-ai-rmf.js +627 -0
  299. package/dist/references/nist-ai-rmf.js.map +1 -0
  300. package/dist/references/owasp-agentic-top10.d.ts +50 -0
  301. package/dist/references/owasp-agentic-top10.d.ts.map +1 -0
  302. package/dist/references/owasp-agentic-top10.js +202 -0
  303. package/dist/references/owasp-agentic-top10.js.map +1 -0
  304. package/dist/references/registry-parity.test.d.ts +17 -0
  305. package/dist/references/registry-parity.test.d.ts.map +1 -0
  306. package/dist/references/registry-parity.test.js +87 -0
  307. package/dist/references/registry-parity.test.js.map +1 -0
  308. package/dist/references/registry.d.ts +90 -0
  309. package/dist/references/registry.d.ts.map +1 -0
  310. package/dist/references/registry.js +29 -0
  311. package/dist/references/registry.js.map +1 -0
  312. package/dist/tools/model-eval.d.ts +97 -0
  313. package/dist/tools/model-eval.d.ts.map +1 -0
  314. package/dist/tools/model-eval.js +307 -0
  315. package/dist/tools/model-eval.js.map +1 -0
  316. package/package.json +105 -0
  317. package/schemas/threat-composer-v1.schema.json +966 -0
  318. package/vendor/atlas-release/ATLAS-2026.07.yaml +17877 -0
  319. package/vendor/atlas-release/README.md +41 -0
@@ -0,0 +1,475 @@
1
+ {
2
+ "schema": 1,
3
+ "applicationInfo": {
4
+ "name": "OpenClaw + NeMo Claw (Sandboxed)",
5
+ "description": "AIVSS V4 + ATLAS threat model for 1 agent(s) with NeMo Claw kernel-level isolation applied."
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": "nemoclaw-version",
26
+ "value": "alpha-2026"
27
+ },
28
+ {
29
+ "key": "demo",
30
+ "value": "true"
31
+ },
32
+ {
33
+ "key": "generated-at",
34
+ "value": "2026-05-30T00:00:00.000Z"
35
+ },
36
+ {
37
+ "key": "security-wrapper",
38
+ "value": "NeMo Claw"
39
+ },
40
+ {
41
+ "key": "isolation-layers",
42
+ "value": "Network + Filesystem + Process + Inference"
43
+ }
44
+ ],
45
+ "threats": [
46
+ {
47
+ "id": "t-001",
48
+ "numericId": 1,
49
+ "threatSource": "External attacker with channel access",
50
+ "prerequisites": "Attacker can send messages to an enabled OpenClaw channel (iMessage, Telegram, Slack)",
51
+ "threatAction": "Inject a crafted prompt via an inbound message that causes the assistant to execute unintended tool calls within the sandbox boundary",
52
+ "threatImpact": "Unintended tool execution within /sandbox; exfiltration limited to allowlisted endpoints; host filesystem and credentials inaccessible",
53
+ "impactedGoal": [
54
+ "Integrity"
55
+ ],
56
+ "impactedAssets": [
57
+ "Tool execution within sandbox",
58
+ "Allowlisted network endpoints"
59
+ ],
60
+ "statement": "Prompt injection via inbound channels remains possible \u2014 NeMo Claw's sandbox confines the blast radius but does not prevent the injection. An attacker can still cause unintended tool calls and may exfiltrate data to any allowlisted external endpoint. The MR risk surface is unchanged; only the impact scope is reduced.",
61
+ "status": "identified",
62
+ "metadata": [
63
+ {
64
+ "key": "aivss-metric",
65
+ "value": "MR"
66
+ },
67
+ {
68
+ "key": "aivss-subCategory",
69
+ "value": "Prompt Injection Resistance"
70
+ },
71
+ {
72
+ "key": "aivss-severity",
73
+ "value": "High"
74
+ },
75
+ {
76
+ "key": "baseline-severity",
77
+ "value": "High"
78
+ },
79
+ {
80
+ "key": "severity-delta",
81
+ "value": "unchanged"
82
+ },
83
+ {
84
+ "key": "atlas-techniqueId",
85
+ "value": "AML.T0051"
86
+ },
87
+ {
88
+ "key": "atlas-techniqueName",
89
+ "value": "LLM Prompt Injection"
90
+ },
91
+ {
92
+ "key": "atlas-tactic",
93
+ "value": "Initial Access"
94
+ },
95
+ {
96
+ "key": "acsc-riskFamily",
97
+ "value": "design-and-configuration"
98
+ },
99
+ {
100
+ "key": "acsc-riskId",
101
+ "value": "acsc-dc-002"
102
+ },
103
+ {
104
+ "key": "nemoclaw-mitigated",
105
+ "value": "false"
106
+ },
107
+ {
108
+ "key": "nemoclaw-control",
109
+ "value": "None \u2014 injection occurs inside sandboxed process"
110
+ },
111
+ {
112
+ "key": "deploymentContext",
113
+ "value": "General"
114
+ },
115
+ {
116
+ "key": "priority",
117
+ "value": "high"
118
+ }
119
+ ]
120
+ },
121
+ {
122
+ "id": "t-002",
123
+ "numericId": 2,
124
+ "threatSource": "Malicious skill package from registry (e.g. ClawHub)",
125
+ "prerequisites": "User installs a skill from an unverified source",
126
+ "threatAction": "Malicious skill attempts to exfiltrate conversation data or establish persistence \u2014 contained by filesystem and network isolation",
127
+ "threatImpact": "Limited to /sandbox and /tmp; host filesystem and credentials inaccessible; network exfiltration restricted to allowlist",
128
+ "impactedGoal": [
129
+ "Confidentiality"
130
+ ],
131
+ "impactedAssets": [
132
+ "Data within /sandbox only"
133
+ ],
134
+ "statement": "The 900-malicious-package OpenClaw registry incident would have had significantly reduced impact under NeMo Claw. Malicious skills are confined to /sandbox \u2014 they cannot read openclaw.json, cannot reach unapproved hosts, and cannot persist outside the sandbox. The CS supply chain threat is materially reduced, though not eliminated: skills can still cause harm within their confined scope.",
135
+ "status": "identified",
136
+ "metadata": [
137
+ {
138
+ "key": "aivss-metric",
139
+ "value": "CS"
140
+ },
141
+ {
142
+ "key": "aivss-subCategory",
143
+ "value": "Third-Party Component Risk"
144
+ },
145
+ {
146
+ "key": "aivss-severity",
147
+ "value": "Medium"
148
+ },
149
+ {
150
+ "key": "baseline-severity",
151
+ "value": "High"
152
+ },
153
+ {
154
+ "key": "severity-delta",
155
+ "value": "reduced"
156
+ },
157
+ {
158
+ "key": "atlas-techniqueId",
159
+ "value": "AML.T0010"
160
+ },
161
+ {
162
+ "key": "atlas-techniqueName",
163
+ "value": "ML Supply Chain Compromise"
164
+ },
165
+ {
166
+ "key": "atlas-tactic",
167
+ "value": "Persistence"
168
+ },
169
+ {
170
+ "key": "acsc-riskFamily",
171
+ "value": "structural"
172
+ },
173
+ {
174
+ "key": "acsc-riskId",
175
+ "value": "acsc-s-001"
176
+ },
177
+ {
178
+ "key": "nemoclaw-mitigated",
179
+ "value": "partial"
180
+ },
181
+ {
182
+ "key": "nemoclaw-control",
183
+ "value": "Layer 2 Filesystem: /sandbox isolation. Layer 1 Network: egress allowlist."
184
+ },
185
+ {
186
+ "key": "deploymentContext",
187
+ "value": "General"
188
+ },
189
+ {
190
+ "key": "priority",
191
+ "value": "medium"
192
+ }
193
+ ]
194
+ },
195
+ {
196
+ "id": "t-003",
197
+ "numericId": 3,
198
+ "threatSource": "Compromised skill or injected agent action",
199
+ "prerequisites": "Attacker achieves code execution within OpenClaw process",
200
+ "threatAction": "Attempt to read openclaw.json for API keys and channel tokens \u2014 blocked by filesystem isolation",
201
+ "threatImpact": "Minimal: host filesystem is read-only outside /sandbox; credentials in openclaw.json inaccessible",
202
+ "impactedGoal": [
203
+ "Confidentiality"
204
+ ],
205
+ "impactedAssets": [
206
+ "In-process secrets only (if passed as env vars to sandbox)"
207
+ ],
208
+ "statement": "NeMo Claw's Layer 2 filesystem isolation directly mitigates credential theft from openclaw.json \u2014 the host filesystem is read-only from within the sandbox. Credentials passed as environment variables into the sandbox remain at-risk, but the primary attack vector (reading config files) is blocked. This is NeMo Claw's clearest win at the host layer.",
209
+ "status": "identified",
210
+ "metadata": [
211
+ {
212
+ "key": "aivss-metric",
213
+ "value": "DC"
214
+ },
215
+ {
216
+ "key": "aivss-subCategory",
217
+ "value": "Credential Storage Security"
218
+ },
219
+ {
220
+ "key": "aivss-severity",
221
+ "value": "Low"
222
+ },
223
+ {
224
+ "key": "baseline-severity",
225
+ "value": "Medium"
226
+ },
227
+ {
228
+ "key": "severity-delta",
229
+ "value": "reduced"
230
+ },
231
+ {
232
+ "key": "atlas-techniqueId",
233
+ "value": "AML.T0044"
234
+ },
235
+ {
236
+ "key": "atlas-techniqueName",
237
+ "value": "Full ML Model Access"
238
+ },
239
+ {
240
+ "key": "atlas-tactic",
241
+ "value": "Credential Access"
242
+ },
243
+ {
244
+ "key": "acsc-riskFamily",
245
+ "value": "privilege"
246
+ },
247
+ {
248
+ "key": "acsc-riskId",
249
+ "value": "acsc-p-001"
250
+ },
251
+ {
252
+ "key": "nemoclaw-mitigated",
253
+ "value": "true"
254
+ },
255
+ {
256
+ "key": "nemoclaw-control",
257
+ "value": "Layer 2 Filesystem: host FS read-only outside /sandbox. Layer 3 Process: Landlock prevents path traversal."
258
+ },
259
+ {
260
+ "key": "deploymentContext",
261
+ "value": "General"
262
+ },
263
+ {
264
+ "key": "priority",
265
+ "value": "low"
266
+ }
267
+ ]
268
+ },
269
+ {
270
+ "id": "t-004",
271
+ "numericId": 4,
272
+ "threatSource": "Prompt injection establishing a cron job",
273
+ "prerequisites": "Cron enabled; attacker achieves successful prompt injection",
274
+ "threatAction": "Schedule recurring autonomous job inside the sandbox \u2014 persists across conversation resets, executes without user confirmation",
275
+ "threatImpact": "Persistent autonomous execution within sandbox boundary; exfiltration limited to allowlisted endpoints",
276
+ "impactedGoal": [
277
+ "Integrity",
278
+ "Confidentiality"
279
+ ],
280
+ "impactedAssets": [
281
+ "Cron scheduler",
282
+ "In-sandbox data and tool access"
283
+ ],
284
+ "statement": "Cron persistence is unchanged by NeMo Claw. Scheduled jobs run inside the sandbox \u2014 the mechanism works, blast radius is contained, but the persistence itself is not prevented. An attacker who achieves one successful injection can establish a recurring presence that the user cannot see without the Approval TUI. This is NeMo Claw's most important residual risk at L1 Orchestration.",
285
+ "status": "identified",
286
+ "metadata": [
287
+ {
288
+ "key": "aivss-metric",
289
+ "value": "AA"
290
+ },
291
+ {
292
+ "key": "aivss-subCategory",
293
+ "value": "Autonomous Execution Control"
294
+ },
295
+ {
296
+ "key": "aivss-severity",
297
+ "value": "High"
298
+ },
299
+ {
300
+ "key": "baseline-severity",
301
+ "value": "High"
302
+ },
303
+ {
304
+ "key": "severity-delta",
305
+ "value": "unchanged"
306
+ },
307
+ {
308
+ "key": "atlas-techniqueId",
309
+ "value": "AML.T0080"
310
+ },
311
+ {
312
+ "key": "atlas-techniqueName",
313
+ "value": "Establish Persistence via Agent"
314
+ },
315
+ {
316
+ "key": "atlas-tactic",
317
+ "value": "Persistence"
318
+ },
319
+ {
320
+ "key": "acsc-riskFamily",
321
+ "value": "behaviour"
322
+ },
323
+ {
324
+ "key": "acsc-riskId",
325
+ "value": "acsc-b-003"
326
+ },
327
+ {
328
+ "key": "nemoclaw-mitigated",
329
+ "value": "false"
330
+ },
331
+ {
332
+ "key": "nemoclaw-control",
333
+ "value": "None \u2014 cron operates within sandbox boundary. Approval TUI provides visibility but not prevention."
334
+ },
335
+ {
336
+ "key": "deploymentContext",
337
+ "value": "General"
338
+ },
339
+ {
340
+ "key": "priority",
341
+ "value": "high"
342
+ }
343
+ ]
344
+ },
345
+ {
346
+ "id": "t-005",
347
+ "numericId": 5,
348
+ "threatSource": "Compromised device with personal and corporate channels connected",
349
+ "prerequisites": "Slack or Teams enabled; attacker achieves prompt injection or device access",
350
+ "threatAction": "Use assistant's channel access to send messages or extract data \u2014 network allowlist limits egress; Privacy Router strips PII in transit",
351
+ "threatImpact": "Reduced: network egress allowlist limits which endpoints can be reached; PII stripped by Privacy Router before external model calls",
352
+ "impactedGoal": [
353
+ "Confidentiality"
354
+ ],
355
+ "impactedAssets": [
356
+ "Corporate channel messages (partially mitigated)",
357
+ "User identity in transit"
358
+ ],
359
+ "statement": "NeMo Claw's egress allowlist and Privacy Router partially mitigate the personal-to-corporate pivot. Outbound data cannot reach arbitrary endpoints \u2014 only allowlisted hosts. PII is stripped before external model API calls. However, the channel access itself remains: if Slack and iMessage are both enabled, the assistant can still bridge between them within the sandbox. The residual risk is lower but not eliminated.",
360
+ "status": "identified",
361
+ "metadata": [
362
+ {
363
+ "key": "aivss-metric",
364
+ "value": "EI"
365
+ },
366
+ {
367
+ "key": "aivss-subCategory",
368
+ "value": "Cross-Context Data Leakage"
369
+ },
370
+ {
371
+ "key": "aivss-severity",
372
+ "value": "Medium"
373
+ },
374
+ {
375
+ "key": "baseline-severity",
376
+ "value": "High"
377
+ },
378
+ {
379
+ "key": "severity-delta",
380
+ "value": "reduced"
381
+ },
382
+ {
383
+ "key": "atlas-techniqueId",
384
+ "value": "AML.T0043"
385
+ },
386
+ {
387
+ "key": "atlas-techniqueName",
388
+ "value": "Craft Adversarial Data"
389
+ },
390
+ {
391
+ "key": "atlas-tactic",
392
+ "value": "Exfiltration"
393
+ },
394
+ {
395
+ "key": "acsc-riskFamily",
396
+ "value": "structural"
397
+ },
398
+ {
399
+ "key": "acsc-riskId",
400
+ "value": "acsc-s-002"
401
+ },
402
+ {
403
+ "key": "nemoclaw-mitigated",
404
+ "value": "partial"
405
+ },
406
+ {
407
+ "key": "nemoclaw-control",
408
+ "value": "Layer 1 Network: egress allowlist. Layer 4 Inference: Privacy Router strips PII before external model calls."
409
+ },
410
+ {
411
+ "key": "deploymentContext",
412
+ "value": "General"
413
+ },
414
+ {
415
+ "key": "priority",
416
+ "value": "medium"
417
+ }
418
+ ]
419
+ }
420
+ ],
421
+ "mitigations": [
422
+ {
423
+ "id": "m-001",
424
+ "numericId": 1,
425
+ "content": "[NeMo Claw \u2014 Residual] Per-channel trust tiers still required. NeMo Claw does not prevent prompt injection \u2014 it confines its blast radius. Implement message authenticity checks or per-sender trust scoring at the application layer."
426
+ },
427
+ {
428
+ "id": "m-002",
429
+ "numericId": 2,
430
+ "content": "[NeMo Claw \u2014 Mitigated] Filesystem isolation: skills confined to /sandbox. Malicious skill exfiltration paths to host credentials and arbitrary network endpoints are blocked by NeMo Claw Layer 2 + Layer 1."
431
+ },
432
+ {
433
+ "id": "m-003",
434
+ "numericId": 3,
435
+ "content": "[NeMo Claw \u2014 Mitigated] Host credential access blocked. openclaw.json is not readable from within the sandbox. Secrets passed as env vars remain at-risk \u2014 prefer in-sandbox secret management."
436
+ },
437
+ {
438
+ "id": "m-004",
439
+ "numericId": 4,
440
+ "content": "[NeMo Claw \u2014 Residual] Cron persistence remains possible inside the sandbox. Enable the Approval TUI for visibility into all scheduled jobs. Require explicit re-confirmation for cron jobs older than 7 days."
441
+ },
442
+ {
443
+ "id": "m-005",
444
+ "numericId": 5,
445
+ "content": "[NeMo Claw \u2014 Partial] Egress allowlist + Privacy Router reduce cross-context leakage. Separate corporate and personal channel profiles with explicit context-switch confirmation for cross-boundary tool calls."
446
+ }
447
+ ],
448
+ "mitigationLinks": [
449
+ {
450
+ "mitigationId": "m-001",
451
+ "linkedId": "t-001",
452
+ "type": "Threat"
453
+ },
454
+ {
455
+ "mitigationId": "m-002",
456
+ "linkedId": "t-002",
457
+ "type": "Threat"
458
+ },
459
+ {
460
+ "mitigationId": "m-003",
461
+ "linkedId": "t-003",
462
+ "type": "Threat"
463
+ },
464
+ {
465
+ "mitigationId": "m-004",
466
+ "linkedId": "t-004",
467
+ "type": "Threat"
468
+ },
469
+ {
470
+ "mitigationId": "m-005",
471
+ "linkedId": "t-005",
472
+ "type": "Threat"
473
+ }
474
+ ]
475
+ }