handoffprobe 0.1.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 (295) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +533 -0
  3. package/dist/attacks/index.d.ts +3 -0
  4. package/dist/attacks/index.d.ts.map +1 -0
  5. package/dist/attacks/index.js +3 -0
  6. package/dist/attacks/index.js.map +1 -0
  7. package/dist/attacks/p0/approval.d.ts +5 -0
  8. package/dist/attacks/p0/approval.d.ts.map +1 -0
  9. package/dist/attacks/p0/approval.js +121 -0
  10. package/dist/attacks/p0/approval.js.map +1 -0
  11. package/dist/attacks/p0/authorization.d.ts +6 -0
  12. package/dist/attacks/p0/authorization.d.ts.map +1 -0
  13. package/dist/attacks/p0/authorization.js +241 -0
  14. package/dist/attacks/p0/authorization.js.map +1 -0
  15. package/dist/attacks/p0/credentials.d.ts +10 -0
  16. package/dist/attacks/p0/credentials.d.ts.map +1 -0
  17. package/dist/attacks/p0/credentials.js +206 -0
  18. package/dist/attacks/p0/credentials.js.map +1 -0
  19. package/dist/attacks/p0/identity.d.ts +10 -0
  20. package/dist/attacks/p0/identity.d.ts.map +1 -0
  21. package/dist/attacks/p0/identity.js +200 -0
  22. package/dist/attacks/p0/identity.js.map +1 -0
  23. package/dist/attacks/p0/index.d.ts +9 -0
  24. package/dist/attacks/p0/index.d.ts.map +1 -0
  25. package/dist/attacks/p0/index.js +9 -0
  26. package/dist/attacks/p0/index.js.map +1 -0
  27. package/dist/attacks/p0/lifecycle.d.ts +6 -0
  28. package/dist/attacks/p0/lifecycle.d.ts.map +1 -0
  29. package/dist/attacks/p0/lifecycle.js +142 -0
  30. package/dist/attacks/p0/lifecycle.js.map +1 -0
  31. package/dist/attacks/p0/target.d.ts +11 -0
  32. package/dist/attacks/p0/target.d.ts.map +1 -0
  33. package/dist/attacks/p0/target.js +177 -0
  34. package/dist/attacks/p0/target.js.map +1 -0
  35. package/dist/attacks/p0/tenant.d.ts +10 -0
  36. package/dist/attacks/p0/tenant.d.ts.map +1 -0
  37. package/dist/attacks/p0/tenant.js +155 -0
  38. package/dist/attacks/p0/tenant.js.map +1 -0
  39. package/dist/attacks/p0/types.d.ts +9 -0
  40. package/dist/attacks/p0/types.d.ts.map +1 -0
  41. package/dist/attacks/p0/types.js +2 -0
  42. package/dist/attacks/p0/types.js.map +1 -0
  43. package/dist/attacks/p1/approval.d.ts +5 -0
  44. package/dist/attacks/p1/approval.d.ts.map +1 -0
  45. package/dist/attacks/p1/approval.js +259 -0
  46. package/dist/attacks/p1/approval.js.map +1 -0
  47. package/dist/attacks/p1/audit.d.ts +4 -0
  48. package/dist/attacks/p1/audit.d.ts.map +1 -0
  49. package/dist/attacks/p1/audit.js +128 -0
  50. package/dist/attacks/p1/audit.js.map +1 -0
  51. package/dist/attacks/p1/authorization.d.ts +5 -0
  52. package/dist/attacks/p1/authorization.d.ts.map +1 -0
  53. package/dist/attacks/p1/authorization.js +239 -0
  54. package/dist/attacks/p1/authorization.js.map +1 -0
  55. package/dist/attacks/p1/index.d.ts +7 -0
  56. package/dist/attacks/p1/index.d.ts.map +1 -0
  57. package/dist/attacks/p1/index.js +7 -0
  58. package/dist/attacks/p1/index.js.map +1 -0
  59. package/dist/attacks/p1/race.d.ts +5 -0
  60. package/dist/attacks/p1/race.d.ts.map +1 -0
  61. package/dist/attacks/p1/race.js +255 -0
  62. package/dist/attacks/p1/race.js.map +1 -0
  63. package/dist/attacks/p1/replay.d.ts +6 -0
  64. package/dist/attacks/p1/replay.d.ts.map +1 -0
  65. package/dist/attacks/p1/replay.js +285 -0
  66. package/dist/attacks/p1/replay.js.map +1 -0
  67. package/dist/attacks/p1/types.d.ts +28 -0
  68. package/dist/attacks/p1/types.d.ts.map +1 -0
  69. package/dist/attacks/p1/types.js +2 -0
  70. package/dist/attacks/p1/types.js.map +1 -0
  71. package/dist/cli/config.d.ts +15 -0
  72. package/dist/cli/config.d.ts.map +1 -0
  73. package/dist/cli/config.js +100 -0
  74. package/dist/cli/config.js.map +1 -0
  75. package/dist/cli/diagnostics.d.ts +4 -0
  76. package/dist/cli/diagnostics.d.ts.map +1 -0
  77. package/dist/cli/diagnostics.js +23 -0
  78. package/dist/cli/diagnostics.js.map +1 -0
  79. package/dist/cli/discovery.d.ts +3 -0
  80. package/dist/cli/discovery.d.ts.map +1 -0
  81. package/dist/cli/discovery.js +75 -0
  82. package/dist/cli/discovery.js.map +1 -0
  83. package/dist/cli/execution-catalog.d.ts +12 -0
  84. package/dist/cli/execution-catalog.d.ts.map +1 -0
  85. package/dist/cli/execution-catalog.js +76 -0
  86. package/dist/cli/execution-catalog.js.map +1 -0
  87. package/dist/cli/protocols.d.ts +6 -0
  88. package/dist/cli/protocols.d.ts.map +1 -0
  89. package/dist/cli/protocols.js +6 -0
  90. package/dist/cli/protocols.js.map +1 -0
  91. package/dist/cli/reporters.d.ts +7 -0
  92. package/dist/cli/reporters.d.ts.map +1 -0
  93. package/dist/cli/reporters.js +126 -0
  94. package/dist/cli/reporters.js.map +1 -0
  95. package/dist/cli/run-cli.d.ts +6 -0
  96. package/dist/cli/run-cli.d.ts.map +1 -0
  97. package/dist/cli/run-cli.js +243 -0
  98. package/dist/cli/run-cli.js.map +1 -0
  99. package/dist/cli/test-command.d.ts +29 -0
  100. package/dist/cli/test-command.d.ts.map +1 -0
  101. package/dist/cli/test-command.js +118 -0
  102. package/dist/cli/test-command.js.map +1 -0
  103. package/dist/cli.d.ts +3 -0
  104. package/dist/cli.d.ts.map +1 -0
  105. package/dist/cli.js +11 -0
  106. package/dist/cli.js.map +1 -0
  107. package/dist/core/adapters.d.ts +23 -0
  108. package/dist/core/adapters.d.ts.map +1 -0
  109. package/dist/core/adapters.js +2 -0
  110. package/dist/core/adapters.js.map +1 -0
  111. package/dist/core/attacks.d.ts +29 -0
  112. package/dist/core/attacks.d.ts.map +1 -0
  113. package/dist/core/attacks.js +38 -0
  114. package/dist/core/attacks.js.map +1 -0
  115. package/dist/core/errors.d.ts +16 -0
  116. package/dist/core/errors.d.ts.map +1 -0
  117. package/dist/core/errors.js +22 -0
  118. package/dist/core/errors.js.map +1 -0
  119. package/dist/core/evidence.d.ts +18 -0
  120. package/dist/core/evidence.d.ts.map +1 -0
  121. package/dist/core/evidence.js +2 -0
  122. package/dist/core/evidence.js.map +1 -0
  123. package/dist/core/findings.d.ts +25 -0
  124. package/dist/core/findings.d.ts.map +1 -0
  125. package/dist/core/findings.js +4 -0
  126. package/dist/core/findings.js.map +1 -0
  127. package/dist/core/index.d.ts +10 -0
  128. package/dist/core/index.d.ts.map +1 -0
  129. package/dist/core/index.js +10 -0
  130. package/dist/core/index.js.map +1 -0
  131. package/dist/core/provenance.d.ts +8 -0
  132. package/dist/core/provenance.d.ts.map +1 -0
  133. package/dist/core/provenance.js +2 -0
  134. package/dist/core/provenance.js.map +1 -0
  135. package/dist/core/redaction.d.ts +4 -0
  136. package/dist/core/redaction.d.ts.map +1 -0
  137. package/dist/core/redaction.js +59 -0
  138. package/dist/core/redaction.js.map +1 -0
  139. package/dist/core/runner.d.ts +42 -0
  140. package/dist/core/runner.d.ts.map +1 -0
  141. package/dist/core/runner.js +181 -0
  142. package/dist/core/runner.js.map +1 -0
  143. package/dist/core/security-context.d.ts +64 -0
  144. package/dist/core/security-context.d.ts.map +1 -0
  145. package/dist/core/security-context.js +56 -0
  146. package/dist/core/security-context.js.map +1 -0
  147. package/dist/github-action/core.d.ts +34 -0
  148. package/dist/github-action/core.d.ts.map +1 -0
  149. package/dist/github-action/core.js +118 -0
  150. package/dist/github-action/core.js.map +1 -0
  151. package/dist/github-action/run-action.d.ts +2 -0
  152. package/dist/github-action/run-action.d.ts.map +1 -0
  153. package/dist/github-action/run-action.js +112 -0
  154. package/dist/github-action/run-action.js.map +1 -0
  155. package/dist/index.d.ts +6 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +6 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/p0-fixture/a2a/executor.d.ts +22 -0
  160. package/dist/p0-fixture/a2a/executor.d.ts.map +1 -0
  161. package/dist/p0-fixture/a2a/executor.js +183 -0
  162. package/dist/p0-fixture/a2a/executor.js.map +1 -0
  163. package/dist/p0-fixture/a2a/harness.d.ts +16 -0
  164. package/dist/p0-fixture/a2a/harness.d.ts.map +1 -0
  165. package/dist/p0-fixture/a2a/harness.js +160 -0
  166. package/dist/p0-fixture/a2a/harness.js.map +1 -0
  167. package/dist/p0-fixture/authorization.d.ts +24 -0
  168. package/dist/p0-fixture/authorization.d.ts.map +1 -0
  169. package/dist/p0-fixture/authorization.js +66 -0
  170. package/dist/p0-fixture/authorization.js.map +1 -0
  171. package/dist/p0-fixture/constants.d.ts +17 -0
  172. package/dist/p0-fixture/constants.d.ts.map +1 -0
  173. package/dist/p0-fixture/constants.js +17 -0
  174. package/dist/p0-fixture/constants.js.map +1 -0
  175. package/dist/p0-fixture/handoff/adapter.d.ts +6 -0
  176. package/dist/p0-fixture/handoff/adapter.d.ts.map +1 -0
  177. package/dist/p0-fixture/handoff/adapter.js +8 -0
  178. package/dist/p0-fixture/handoff/adapter.js.map +1 -0
  179. package/dist/p0-fixture/index.d.ts +11 -0
  180. package/dist/p0-fixture/index.d.ts.map +1 -0
  181. package/dist/p0-fixture/index.js +11 -0
  182. package/dist/p0-fixture/index.js.map +1 -0
  183. package/dist/p0-fixture/mcp/fake-tools.d.ts +7 -0
  184. package/dist/p0-fixture/mcp/fake-tools.d.ts.map +1 -0
  185. package/dist/p0-fixture/mcp/fake-tools.js +322 -0
  186. package/dist/p0-fixture/mcp/fake-tools.js.map +1 -0
  187. package/dist/p0-fixture/mcp/harness.d.ts +16 -0
  188. package/dist/p0-fixture/mcp/harness.d.ts.map +1 -0
  189. package/dist/p0-fixture/mcp/harness.js +114 -0
  190. package/dist/p0-fixture/mcp/harness.js.map +1 -0
  191. package/dist/p0-fixture/mcp/types.d.ts +29 -0
  192. package/dist/p0-fixture/mcp/types.d.ts.map +1 -0
  193. package/dist/p0-fixture/mcp/types.js +2 -0
  194. package/dist/p0-fixture/mcp/types.js.map +1 -0
  195. package/dist/p0-fixture/payload-hash.d.ts +2 -0
  196. package/dist/p0-fixture/payload-hash.d.ts.map +1 -0
  197. package/dist/p0-fixture/payload-hash.js +20 -0
  198. package/dist/p0-fixture/payload-hash.js.map +1 -0
  199. package/dist/p0-fixture/reference.d.ts +8 -0
  200. package/dist/p0-fixture/reference.d.ts.map +1 -0
  201. package/dist/p0-fixture/reference.js +42 -0
  202. package/dist/p0-fixture/reference.js.map +1 -0
  203. package/dist/p0-fixture/scenario.d.ts +14 -0
  204. package/dist/p0-fixture/scenario.d.ts.map +1 -0
  205. package/dist/p0-fixture/scenario.js +22 -0
  206. package/dist/p0-fixture/scenario.js.map +1 -0
  207. package/dist/p0-fixture/state.d.ts +43 -0
  208. package/dist/p0-fixture/state.d.ts.map +1 -0
  209. package/dist/p0-fixture/state.js +85 -0
  210. package/dist/p0-fixture/state.js.map +1 -0
  211. package/dist/p0-fixture/target-adapter.d.ts +20 -0
  212. package/dist/p0-fixture/target-adapter.d.ts.map +1 -0
  213. package/dist/p0-fixture/target-adapter.js +62 -0
  214. package/dist/p0-fixture/target-adapter.js.map +1 -0
  215. package/dist/p1-fixture/approval-target-adapter.d.ts +47 -0
  216. package/dist/p1-fixture/approval-target-adapter.d.ts.map +1 -0
  217. package/dist/p1-fixture/approval-target-adapter.js +172 -0
  218. package/dist/p1-fixture/approval-target-adapter.js.map +1 -0
  219. package/dist/p1-fixture/audit-target-adapter.d.ts +36 -0
  220. package/dist/p1-fixture/audit-target-adapter.d.ts.map +1 -0
  221. package/dist/p1-fixture/audit-target-adapter.js +226 -0
  222. package/dist/p1-fixture/audit-target-adapter.js.map +1 -0
  223. package/dist/p1-fixture/barrier.d.ts +10 -0
  224. package/dist/p1-fixture/barrier.d.ts.map +1 -0
  225. package/dist/p1-fixture/barrier.js +44 -0
  226. package/dist/p1-fixture/barrier.js.map +1 -0
  227. package/dist/p1-fixture/clock.d.ts +7 -0
  228. package/dist/p1-fixture/clock.d.ts.map +1 -0
  229. package/dist/p1-fixture/clock.js +30 -0
  230. package/dist/p1-fixture/clock.js.map +1 -0
  231. package/dist/p1-fixture/index.d.ts +9 -0
  232. package/dist/p1-fixture/index.d.ts.map +1 -0
  233. package/dist/p1-fixture/index.js +9 -0
  234. package/dist/p1-fixture/index.js.map +1 -0
  235. package/dist/p1-fixture/race-target-adapter.d.ts +49 -0
  236. package/dist/p1-fixture/race-target-adapter.d.ts.map +1 -0
  237. package/dist/p1-fixture/race-target-adapter.js +384 -0
  238. package/dist/p1-fixture/race-target-adapter.js.map +1 -0
  239. package/dist/p1-fixture/replay-target-adapter.d.ts +44 -0
  240. package/dist/p1-fixture/replay-target-adapter.d.ts.map +1 -0
  241. package/dist/p1-fixture/replay-target-adapter.js +248 -0
  242. package/dist/p1-fixture/replay-target-adapter.js.map +1 -0
  243. package/dist/p1-fixture/state.d.ts +78 -0
  244. package/dist/p1-fixture/state.d.ts.map +1 -0
  245. package/dist/p1-fixture/state.js +191 -0
  246. package/dist/p1-fixture/state.js.map +1 -0
  247. package/dist/p1-fixture/target-adapter.d.ts +30 -0
  248. package/dist/p1-fixture/target-adapter.d.ts.map +1 -0
  249. package/dist/p1-fixture/target-adapter.js +142 -0
  250. package/dist/p1-fixture/target-adapter.js.map +1 -0
  251. package/dist/protocol-lab/a2a/executor.d.ts +13 -0
  252. package/dist/protocol-lab/a2a/executor.d.ts.map +1 -0
  253. package/dist/protocol-lab/a2a/executor.js +112 -0
  254. package/dist/protocol-lab/a2a/executor.js.map +1 -0
  255. package/dist/protocol-lab/a2a/harness.d.ts +11 -0
  256. package/dist/protocol-lab/a2a/harness.d.ts.map +1 -0
  257. package/dist/protocol-lab/a2a/harness.js +160 -0
  258. package/dist/protocol-lab/a2a/harness.js.map +1 -0
  259. package/dist/protocol-lab/evidence.d.ts +17 -0
  260. package/dist/protocol-lab/evidence.d.ts.map +1 -0
  261. package/dist/protocol-lab/evidence.js +28 -0
  262. package/dist/protocol-lab/evidence.js.map +1 -0
  263. package/dist/protocol-lab/fixture.d.ts +11 -0
  264. package/dist/protocol-lab/fixture.d.ts.map +1 -0
  265. package/dist/protocol-lab/fixture.js +54 -0
  266. package/dist/protocol-lab/fixture.js.map +1 -0
  267. package/dist/protocol-lab/handoff/adapter.d.ts +9 -0
  268. package/dist/protocol-lab/handoff/adapter.d.ts.map +1 -0
  269. package/dist/protocol-lab/handoff/adapter.js +13 -0
  270. package/dist/protocol-lab/handoff/adapter.js.map +1 -0
  271. package/dist/protocol-lab/handoff/translate.d.ts +3 -0
  272. package/dist/protocol-lab/handoff/translate.d.ts.map +1 -0
  273. package/dist/protocol-lab/handoff/translate.js +14 -0
  274. package/dist/protocol-lab/handoff/translate.js.map +1 -0
  275. package/dist/protocol-lab/mcp/fake-tools.d.ts +5 -0
  276. package/dist/protocol-lab/mcp/fake-tools.d.ts.map +1 -0
  277. package/dist/protocol-lab/mcp/fake-tools.js +58 -0
  278. package/dist/protocol-lab/mcp/fake-tools.js.map +1 -0
  279. package/dist/protocol-lab/mcp/harness.d.ts +7 -0
  280. package/dist/protocol-lab/mcp/harness.d.ts.map +1 -0
  281. package/dist/protocol-lab/mcp/harness.js +97 -0
  282. package/dist/protocol-lab/mcp/harness.js.map +1 -0
  283. package/dist/protocol-lab/models.d.ts +31 -0
  284. package/dist/protocol-lab/models.d.ts.map +1 -0
  285. package/dist/protocol-lab/models.js +2 -0
  286. package/dist/protocol-lab/models.js.map +1 -0
  287. package/dist/protocol-lab/run.d.ts +2 -0
  288. package/dist/protocol-lab/run.d.ts.map +1 -0
  289. package/dist/protocol-lab/run.js +22 -0
  290. package/dist/protocol-lab/run.js.map +1 -0
  291. package/dist/protocol-lab/target-adapter.d.ts +10 -0
  292. package/dist/protocol-lab/target-adapter.d.ts.map +1 -0
  293. package/dist/protocol-lab/target-adapter.js +33 -0
  294. package/dist/protocol-lab/target-adapter.js.map +1 -0
  295. package/package.json +77 -0
@@ -0,0 +1,200 @@
1
+ import { cloneSecurityContext } from '../../core/index.js';
2
+ import { P0_AUTHORIZED_DOWNSTREAM, P0_CAPABILITY_UPDATE, P0_PRINCIPAL, P0_UNAUTHORIZED_DOWNSTREAM, createP0ReferenceContext, createP0UpdateInvoiceScenario, } from '../../p0-fixture/index.js';
3
+ function projectSources(section) {
4
+ return [
5
+ {
6
+ kind: 'project',
7
+ title: 'P0 Security Test Specification',
8
+ locator: `docs/P0_TEST_SPECIFICATION.md#${section}`,
9
+ },
10
+ {
11
+ kind: 'project',
12
+ title: 'Attack Catalog',
13
+ locator: 'docs/ATTACK_CATALOG.md#v01-p0--implement-first',
14
+ },
15
+ ];
16
+ }
17
+ function relevantEvidenceSequences(result) {
18
+ const relevant = new Set(['handoff.translate', 'p0.authorization', 'p0.tool.result']);
19
+ return result.evidence
20
+ .filter((event) => relevant.has(event.event))
21
+ .map((event) => event.sequence);
22
+ }
23
+ function evaluateIdentityMutation(result, messages) {
24
+ const output = result.output;
25
+ const envelope = output.mcpResult.envelope;
26
+ const authorization = envelope.authorization;
27
+ const before = envelope.before.sideEffectCounter;
28
+ const after = envelope.after.sideEffectCounter;
29
+ const evidenceSequences = relevantEvidenceSequences(result);
30
+ if (authorization.invariantAllowed) {
31
+ return {
32
+ status: 'inconclusive',
33
+ observedBehavior: 'The intended identity mutation did not create an invalid identity-bound authorization state.',
34
+ evidenceSequences,
35
+ };
36
+ }
37
+ if (!authorization.executed && after === before) {
38
+ return {
39
+ status: 'pass',
40
+ observedBehavior: messages.pass,
41
+ evidenceSequences,
42
+ };
43
+ }
44
+ if (authorization.executed && after > before) {
45
+ return {
46
+ status: 'fail',
47
+ observedBehavior: messages.fail,
48
+ evidenceSequences,
49
+ ...(messages.failSeverity === undefined
50
+ ? {}
51
+ : {
52
+ severity: messages.failSeverity,
53
+ }),
54
+ };
55
+ }
56
+ return {
57
+ status: 'inconclusive',
58
+ observedBehavior: 'Identity-binding and synthetic side-effect evidence could not establish a deterministic PASS or FAIL.',
59
+ evidenceSequences,
60
+ };
61
+ }
62
+ function createDefinition(input) {
63
+ return {
64
+ id: input.id,
65
+ name: input.name,
66
+ category: 'identity',
67
+ defaultSeverity: input.defaultSeverity,
68
+ priority: 'P0',
69
+ preconditions: input.preconditions,
70
+ mutationSteps: input.mutationSteps,
71
+ expectedInvariant: input.invariant,
72
+ evidenceRequirements: input.evidence,
73
+ applicability: {
74
+ a2a: ['1.0'],
75
+ mcp: ['2026-07-28'],
76
+ },
77
+ propertyClass: 'composition_responsibility',
78
+ sourceReferences: projectSources(input.section),
79
+ sideEffectClass: 'synthetic',
80
+ destructive: false,
81
+ };
82
+ }
83
+ function createUpdateAuthorizedContext() {
84
+ const context = createP0ReferenceContext();
85
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
86
+ throw new Error('Identity P0 fixture requires authority bindings.');
87
+ }
88
+ context.capabilities = [P0_CAPABILITY_UPDATE];
89
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
90
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
91
+ return context;
92
+ }
93
+ class LoseOriginalPrincipalAdapter {
94
+ id = 'p0-id-001:lose-original-principal';
95
+ translate(context) {
96
+ const translated = cloneSecurityContext(context);
97
+ if (translated.effectiveAuthority === undefined) {
98
+ throw new Error('HP-ID-001 requires effective authority.');
99
+ }
100
+ /*
101
+ * Model a handoff that loses user:alice and
102
+ * rebases the downstream request onto the
103
+ * generic executing agent identity.
104
+ */
105
+ translated.principal = P0_AUTHORIZED_DOWNSTREAM;
106
+ translated.effectiveAuthority.principal = P0_AUTHORIZED_DOWNSTREAM;
107
+ return translated;
108
+ }
109
+ }
110
+ class SubstituteAgentIdentityAdapter {
111
+ id = 'p0-id-002:substitute-agent-identity';
112
+ translate(context) {
113
+ const translated = cloneSecurityContext(context);
114
+ /*
115
+ * Delegation remains bound to agent:billing,
116
+ * but the executing downstream identity
117
+ * becomes agent:support.
118
+ */
119
+ translated.downstream = P0_UNAUTHORIZED_DOWNSTREAM;
120
+ return translated;
121
+ }
122
+ }
123
+ const ID_001_DEFINITION = createDefinition({
124
+ id: 'HP-ID-001',
125
+ name: 'Original principal continuity loss',
126
+ defaultSeverity: 'medium',
127
+ preconditions: [
128
+ 'The original A2A principal is user:alice.',
129
+ 'A protected invoice.update action depends on principal-bound authority.',
130
+ ],
131
+ mutationSteps: [
132
+ 'Drop user:alice during handoff translation.',
133
+ 'Replace the downstream principal representation with agent:billing.',
134
+ 'Attempt the protected update_invoice action without a new principal-bound grant.',
135
+ ],
136
+ invariant: 'Protected actions requiring principal-bound policy must remain attributable to the original principal.',
137
+ evidence: [
138
+ 'original principal',
139
+ 'downstream identity',
140
+ 'authorization decision',
141
+ 'protected action',
142
+ 'synthetic side effect',
143
+ ],
144
+ section: 'hp-id-001--original-principal-continuity-loss',
145
+ });
146
+ const ID_002_DEFINITION = createDefinition({
147
+ id: 'HP-ID-002',
148
+ name: 'Agent identity substitution',
149
+ defaultSeverity: 'high',
150
+ preconditions: [
151
+ 'Delegated invoice.update authority is bound to agent:billing.',
152
+ 'The delegation has already been accepted before the identity mutation.',
153
+ ],
154
+ mutationSteps: [
155
+ 'Replace the executing downstream identity agent:billing with agent:support.',
156
+ 'Retain the original authority binding to agent:billing.',
157
+ 'Attempt the protected update_invoice action.',
158
+ ],
159
+ invariant: 'Identity-bound authority must not survive replacement of the authorized agent.',
160
+ evidence: ['expected agent', 'actual agent', 'authority binding', 'tool invocation', 'result'],
161
+ section: 'hp-id-002--agent-identity-substitution',
162
+ });
163
+ const ID_001_CASE = {
164
+ definition: ID_001_DEFINITION,
165
+ evaluate(result) {
166
+ return evaluateIdentityMutation(result, {
167
+ pass: 'The protected action was rejected after user:alice was lost during handoff translation.',
168
+ fail: 'The protected synthetic update executed after user:alice was replaced by a generic agent identity, proving a principal-bound authorization bypass.',
169
+ failSeverity: 'high',
170
+ });
171
+ },
172
+ };
173
+ const ID_002_CASE = {
174
+ definition: ID_002_DEFINITION,
175
+ evaluate(result) {
176
+ return evaluateIdentityMutation(result, {
177
+ pass: 'The protected action was rejected after agent:billing was replaced by agent:support.',
178
+ fail: 'agent:support executed the protected synthetic update while relying on authority still bound to agent:billing.',
179
+ });
180
+ },
181
+ };
182
+ export const HP_ID_001 = {
183
+ attack: ID_001_CASE,
184
+ scenario: createP0UpdateInvoiceScenario(24001),
185
+ handoffAdapter: new LoseOriginalPrincipalAdapter(),
186
+ createContext: createUpdateAuthorizedContext,
187
+ };
188
+ export const HP_ID_002 = {
189
+ attack: ID_002_CASE,
190
+ scenario: createP0UpdateInvoiceScenario(24002),
191
+ handoffAdapter: new SubstituteAgentIdentityAdapter(),
192
+ createContext: createUpdateAuthorizedContext,
193
+ };
194
+ export const P0_IDENTITY_ATTACKS = [HP_ID_001, HP_ID_002];
195
+ export const P0_IDENTITY_BASELINE = {
196
+ originalPrincipal: P0_PRINCIPAL,
197
+ authorizedAgent: P0_AUTHORIZED_DOWNSTREAM,
198
+ unauthorizedAgent: P0_UNAUTHORIZED_DOWNSTREAM,
199
+ };
200
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/attacks/p0/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export * from './approval.js';
2
+ export * from './authorization.js';
3
+ export * from './credentials.js';
4
+ export * from './identity.js';
5
+ export * from './lifecycle.js';
6
+ export * from './target.js';
7
+ export * from './tenant.js';
8
+ export * from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/attacks/p0/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './approval.js';
2
+ export * from './authorization.js';
3
+ export * from './credentials.js';
4
+ export * from './identity.js';
5
+ export * from './lifecycle.js';
6
+ export * from './target.js';
7
+ export * from './tenant.js';
8
+ export * from './types.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/attacks/p0/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { P0AttackPlan } from './types.js';
2
+ export declare const HP_LIFECYCLE_001: P0AttackPlan;
3
+ export declare const P0_LIFECYCLE_BASELINE: {
4
+ readonly taskId: "task:p0-001";
5
+ };
6
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/attacks/p0/lifecycle.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8M/C,eAAO,MAAM,gBAAgB,EAAE,YAQ9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;CAExB,CAAC"}
@@ -0,0 +1,142 @@
1
+ import { P0_CAPABILITY_UPDATE, P0_TASK_ID, P0IdentityHandoffAdapter, createP0ReferenceContext, } from '../../p0-fixture/index.js';
2
+ function createLifecycleContext() {
3
+ const context = createP0ReferenceContext();
4
+ if (context.upstreamAuthority === undefined ||
5
+ context.effectiveAuthority === undefined ||
6
+ context.lifecycle === undefined) {
7
+ throw new Error('HP-LIFECYCLE-001 requires authority and lifecycle bindings.');
8
+ }
9
+ context.capabilities = [P0_CAPABILITY_UPDATE];
10
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
11
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
12
+ context.lifecycle.state = 'active';
13
+ return context;
14
+ }
15
+ function sequenceFor(result, event) {
16
+ return result.evidence.find((candidate) => candidate.event === event)?.sequence;
17
+ }
18
+ function evaluateLifecycle(result) {
19
+ const start = sequenceFor(result, 'lifecycle.start');
20
+ const request = sequenceFor(result, 'mcp.tool.call');
21
+ const cancellation = sequenceFor(result, 'lifecycle.cancel');
22
+ const toolResult = sequenceFor(result, 'p0.tool.result');
23
+ const evidenceSequences = [start, request, cancellation, toolResult].filter((value) => value !== undefined);
24
+ if (start === undefined ||
25
+ request === undefined ||
26
+ cancellation === undefined ||
27
+ toolResult === undefined ||
28
+ !(start < request && request < cancellation && cancellation < toolResult)) {
29
+ return {
30
+ status: 'inconclusive',
31
+ observedBehavior: 'Lifecycle evidence did not prove start -> downstream request -> cancellation -> tool result ordering.',
32
+ evidenceSequences,
33
+ };
34
+ }
35
+ const output = result.output;
36
+ const envelope = output.mcpResult.envelope;
37
+ const authorization = envelope.authorization;
38
+ const decision = authorization.decision;
39
+ if (decision === null) {
40
+ return {
41
+ status: 'inconclusive',
42
+ observedBehavior: 'Lifecycle authorization decision was unavailable.',
43
+ evidenceSequences,
44
+ };
45
+ }
46
+ const before = envelope.before.sideEffectCounter;
47
+ const after = envelope.after.sideEffectCounter;
48
+ if (decision.lifecycleAllows) {
49
+ return {
50
+ status: 'inconclusive',
51
+ observedBehavior: 'The authorization layer did not observe the governing task as cancelled.',
52
+ evidenceSequences,
53
+ };
54
+ }
55
+ if (!authorization.executed && after === before) {
56
+ return {
57
+ status: 'pass',
58
+ observedBehavior: 'Cancellation propagated before protected execution and no synthetic side effect occurred.',
59
+ evidenceSequences,
60
+ };
61
+ }
62
+ if (authorization.executed && after > before) {
63
+ return {
64
+ status: 'fail',
65
+ observedBehavior: 'The protected synthetic update executed after cancellation using stale authority or intent.',
66
+ evidenceSequences,
67
+ };
68
+ }
69
+ return {
70
+ status: 'inconclusive',
71
+ observedBehavior: 'Lifecycle and side-effect evidence could not establish deterministic PASS or FAIL.',
72
+ evidenceSequences,
73
+ };
74
+ }
75
+ const DEFINITION = {
76
+ id: 'HP-LIFECYCLE-001',
77
+ name: 'Cancellation not propagated',
78
+ category: 'lifecycle',
79
+ defaultSeverity: 'high',
80
+ priority: 'P0',
81
+ preconditions: [
82
+ 'The governing A2A task starts active.',
83
+ 'A protected update_invoice request begins.',
84
+ 'A deterministic cancellation barrier exists before the protected tool execution.',
85
+ ],
86
+ mutationSteps: [
87
+ 'Record the active governing task.',
88
+ 'Issue the downstream MCP request.',
89
+ 'Cancel the governing A2A task after request dispatch but before tool execution.',
90
+ 'Observe whether the protected synthetic side effect still executes.',
91
+ ],
92
+ expectedInvariant: 'Cancellation of the governing upstream task must prevent the protected downstream side effect unless semantics explicitly permit completion.',
93
+ evidenceRequirements: [
94
+ 'task ID',
95
+ 'start event',
96
+ 'downstream request event',
97
+ 'cancellation event',
98
+ 'side-effect event',
99
+ 'deterministic ordering',
100
+ 'side-effect counter before and after',
101
+ ],
102
+ applicability: {
103
+ a2a: ['1.0'],
104
+ mcp: ['2026-07-28'],
105
+ },
106
+ propertyClass: 'composition_responsibility',
107
+ sourceReferences: [
108
+ {
109
+ kind: 'project',
110
+ title: 'P0 Security Test Specification',
111
+ locator: 'docs/P0_TEST_SPECIFICATION.md#hp-lifecycle-001--cancellation-not-propagated',
112
+ },
113
+ ],
114
+ sideEffectClass: 'synthetic',
115
+ destructive: false,
116
+ };
117
+ const ATTACK = {
118
+ definition: DEFINITION,
119
+ evaluate: evaluateLifecycle,
120
+ };
121
+ const SCENARIO = {
122
+ id: 'lifecycle-cancel-before-update',
123
+ tool: 'update_invoice',
124
+ lifecycleTracking: true,
125
+ cancelLifecycleBeforeTool: true,
126
+ buildArguments(context) {
127
+ return {
128
+ resource: context.resource,
129
+ amountCents: 27001,
130
+ };
131
+ },
132
+ };
133
+ export const HP_LIFECYCLE_001 = {
134
+ attack: ATTACK,
135
+ scenario: SCENARIO,
136
+ handoffAdapter: new P0IdentityHandoffAdapter(),
137
+ createContext: createLifecycleContext,
138
+ };
139
+ export const P0_LIFECYCLE_BASELINE = {
140
+ taskId: P0_TASK_ID,
141
+ };
142
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/attacks/p0/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { P0AttackPlan } from './types.js';
2
+ export declare const HP_TARGET_001: P0AttackPlan;
3
+ export declare const HP_TARGET_002: P0AttackPlan;
4
+ export declare const P0_TARGET_ATTACKS: readonly P0AttackPlan[];
5
+ export declare const P0_TARGET_BASELINE: {
6
+ readonly grantedResource: "invoice:INV-1001";
7
+ readonly alternateResource: "invoice:INV-2002";
8
+ readonly narrowCapability: "invoice.read";
9
+ readonly broaderCapability: "invoice.update";
10
+ };
11
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../src/attacks/p0/target.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAyO/C,eAAO,MAAM,aAAa,EAAE,YAQ3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAQ3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,SAAS,YAAY,EAAmC,CAAC;AAEzF,eAAO,MAAM,kBAAkB;;;;;CAQrB,CAAC"}
@@ -0,0 +1,177 @@
1
+ import { cloneSecurityContext } from '../../core/index.js';
2
+ import { P0_AUTHORIZED_RESOURCE, P0_CAPABILITY_READ, P0_CAPABILITY_UPDATE, P0IdentityHandoffAdapter, P0_UNAUTHORIZED_RESOURCE, createP0ReferenceContext, createP0UpdateInvoiceScenario, } from '../../p0-fixture/index.js';
3
+ function evidenceSequences(result) {
4
+ return result.evidence
5
+ .filter((event) => ['handoff.translate', 'p0.authorization', 'p0.tool.result'].includes(event.event))
6
+ .map((event) => event.sequence);
7
+ }
8
+ function evaluateProtectedMutation(result, messages) {
9
+ const output = result.output;
10
+ const envelope = output.mcpResult.envelope;
11
+ const authorization = envelope.authorization;
12
+ const before = envelope.before.sideEffectCounter;
13
+ const after = envelope.after.sideEffectCounter;
14
+ const sequences = evidenceSequences(result);
15
+ if (authorization.invariantAllowed) {
16
+ return {
17
+ status: 'inconclusive',
18
+ observedBehavior: 'The intended target mutation did not create an invalid authorization state.',
19
+ evidenceSequences: sequences,
20
+ };
21
+ }
22
+ if (!authorization.executed && after === before) {
23
+ return {
24
+ status: 'pass',
25
+ observedBehavior: messages.pass,
26
+ evidenceSequences: sequences,
27
+ };
28
+ }
29
+ if (authorization.executed && after > before) {
30
+ return {
31
+ status: 'fail',
32
+ observedBehavior: messages.fail,
33
+ evidenceSequences: sequences,
34
+ };
35
+ }
36
+ return {
37
+ status: 'inconclusive',
38
+ observedBehavior: 'Target-binding evidence and synthetic side effects could not establish a deterministic PASS or FAIL.',
39
+ evidenceSequences: sequences,
40
+ };
41
+ }
42
+ function createUpdateAuthorizedContext() {
43
+ const context = createP0ReferenceContext();
44
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
45
+ throw new Error('HP-TARGET-001 requires authority bindings.');
46
+ }
47
+ context.capabilities = [P0_CAPABILITY_UPDATE];
48
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
49
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
50
+ return context;
51
+ }
52
+ class SubstituteResourceAdapter {
53
+ id = 'p0-target-001:resource-substitution';
54
+ translate(context) {
55
+ const translated = cloneSecurityContext(context);
56
+ if (translated.effectiveAuthority === undefined) {
57
+ throw new Error('HP-TARGET-001 requires effective authority.');
58
+ }
59
+ translated.resource = P0_UNAUTHORIZED_RESOURCE;
60
+ translated.effectiveAuthority.resources = [P0_UNAUTHORIZED_RESOURCE];
61
+ return translated;
62
+ }
63
+ }
64
+ const TARGET_001_DEFINITION = {
65
+ id: 'HP-TARGET-001',
66
+ name: 'Resource substitution',
67
+ category: 'target',
68
+ defaultSeverity: 'high',
69
+ priority: 'P0',
70
+ preconditions: [
71
+ 'Authority is bound to invoice:INV-1001.',
72
+ 'The alternate invoice:INV-2002 exists in the synthetic fixture.',
73
+ ],
74
+ mutationSteps: [
75
+ 'Replace invoice:INV-1001 with invoice:INV-2002 during handoff translation.',
76
+ 'Retain the original upstream resource grant.',
77
+ 'Attempt update_invoice against the substituted resource.',
78
+ ],
79
+ expectedInvariant: 'Authority for resource A must not automatically authorize resource B.',
80
+ evidenceRequirements: [
81
+ 'granted resource',
82
+ 'requested resource',
83
+ 'translated resource',
84
+ 'authorization result',
85
+ 'resource state or result',
86
+ ],
87
+ applicability: {
88
+ a2a: ['1.0'],
89
+ mcp: ['2026-07-28'],
90
+ },
91
+ propertyClass: 'composition_responsibility',
92
+ sourceReferences: [
93
+ {
94
+ kind: 'project',
95
+ title: 'P0 Security Test Specification',
96
+ locator: 'docs/P0_TEST_SPECIFICATION.md#hp-target-001--resource-substitution',
97
+ },
98
+ ],
99
+ sideEffectClass: 'synthetic',
100
+ destructive: false,
101
+ };
102
+ const TARGET_002_DEFINITION = {
103
+ id: 'HP-TARGET-002',
104
+ name: 'Capability/tool semantic collision',
105
+ category: 'target',
106
+ defaultSeverity: 'high',
107
+ priority: 'P0',
108
+ preconditions: [
109
+ 'The upstream capability is invoice.read.',
110
+ 'The downstream MCP surface exposes update_invoice.',
111
+ ],
112
+ mutationSteps: [
113
+ 'Preserve the narrow invoice.read authority.',
114
+ 'Map the request to the broader update_invoice MCP tool.',
115
+ 'Attempt execution without receiving invoice.update authority.',
116
+ ],
117
+ expectedInvariant: 'A narrow upstream capability must not map to a broader MCP tool merely because their names or descriptions are similar.',
118
+ evidenceRequirements: [
119
+ 'upstream capability',
120
+ 'downstream tool',
121
+ 'translation mapping',
122
+ 'authority',
123
+ 'synthetic side effect',
124
+ ],
125
+ applicability: {
126
+ a2a: ['1.0'],
127
+ mcp: ['2026-07-28'],
128
+ },
129
+ propertyClass: 'composition_responsibility',
130
+ sourceReferences: [
131
+ {
132
+ kind: 'project',
133
+ title: 'P0 Security Test Specification',
134
+ locator: 'docs/P0_TEST_SPECIFICATION.md#hp-target-002--capabilitytool-semantic-collision',
135
+ },
136
+ ],
137
+ sideEffectClass: 'synthetic',
138
+ destructive: false,
139
+ };
140
+ const TARGET_001_CASE = {
141
+ definition: TARGET_001_DEFINITION,
142
+ evaluate(result) {
143
+ return evaluateProtectedMutation(result, {
144
+ pass: 'The substituted invoice:INV-2002 target was rejected and remained unchanged.',
145
+ fail: 'The original invoice:INV-1001 grant executed a protected synthetic mutation against invoice:INV-2002.',
146
+ });
147
+ },
148
+ };
149
+ const TARGET_002_CASE = {
150
+ definition: TARGET_002_DEFINITION,
151
+ evaluate(result) {
152
+ return evaluateProtectedMutation(result, {
153
+ pass: 'The invoice.read to update_invoice semantic mismatch was rejected.',
154
+ fail: 'The broader update_invoice tool executed while the upstream authority remained limited to invoice.read.',
155
+ });
156
+ },
157
+ };
158
+ export const HP_TARGET_001 = {
159
+ attack: TARGET_001_CASE,
160
+ scenario: createP0UpdateInvoiceScenario(26001),
161
+ handoffAdapter: new SubstituteResourceAdapter(),
162
+ createContext: createUpdateAuthorizedContext,
163
+ };
164
+ export const HP_TARGET_002 = {
165
+ attack: TARGET_002_CASE,
166
+ scenario: createP0UpdateInvoiceScenario(26002),
167
+ handoffAdapter: new P0IdentityHandoffAdapter(),
168
+ createContext: createP0ReferenceContext,
169
+ };
170
+ export const P0_TARGET_ATTACKS = [HP_TARGET_001, HP_TARGET_002];
171
+ export const P0_TARGET_BASELINE = {
172
+ grantedResource: P0_AUTHORIZED_RESOURCE,
173
+ alternateResource: P0_UNAUTHORIZED_RESOURCE,
174
+ narrowCapability: P0_CAPABILITY_READ,
175
+ broaderCapability: P0_CAPABILITY_UPDATE,
176
+ };
177
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../../src/attacks/p0/target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { P0AttackPlan } from './types.js';
2
+ export declare const HP_TENANT_001_LOSS: P0AttackPlan;
3
+ export declare const HP_TENANT_001: P0AttackPlan;
4
+ export declare const P0_TENANT_001_VARIANTS: readonly P0AttackPlan[];
5
+ export declare const P0_TENANT_BASELINE: {
6
+ readonly authorized: "tenant:acme";
7
+ readonly unauthorized: "tenant:globex";
8
+ readonly unauthorizedResource: "invoice:INV-2002";
9
+ };
10
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/attacks/p0/tenant.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsN/C,eAAO,MAAM,kBAAkB,EAAE,YAQhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAQ3B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,SAAS,YAAY,EAAwC,CAAC;AAEnG,eAAO,MAAM,kBAAkB;;;;CAMrB,CAAC"}