@agent-ix/spec-objects-security 0.5.0 → 0.8.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/README.md +2 -0
- package/manifest.yaml +270 -26
- package/package.json +8 -2
- package/schemas/Asset.json +78 -0
- package/schemas/AttackSurface.json +55 -0
- package/schemas/AuditEvent.json +57 -0
- package/schemas/AuditFinding.json +67 -0
- package/schemas/AuthFlow.json +69 -0
- package/schemas/ConfidentialityLevel.json +13 -0
- package/schemas/Control.json +83 -0
- package/schemas/ControlEffectiveness.json +12 -0
- package/schemas/ControlMapping.json +26 -0
- package/schemas/CorsPolicy.json +46 -0
- package/schemas/CsrfToken.json +46 -0
- package/schemas/DataClassification.json +61 -0
- package/schemas/DefaultedField.json +14 -0
- package/schemas/EffectivenessField.json +15 -0
- package/schemas/EncryptionKey.json +78 -0
- package/schemas/FindingStatus.json +14 -0
- package/schemas/FlowStep.json +24 -0
- package/schemas/IdentityField.json +15 -0
- package/schemas/Impact.json +14 -0
- package/schemas/ImpactField.json +15 -0
- package/schemas/JwtClaim.json +49 -0
- package/schemas/LevelField.json +15 -0
- package/schemas/Likelihood.json +14 -0
- package/schemas/LikelihoodField.json +15 -0
- package/schemas/MfaFactorKind.json +12 -0
- package/schemas/MfaMethod.json +69 -0
- package/schemas/OccurrenceField.json +14 -0
- package/schemas/OccurrenceTypeRef.json +15 -0
- package/schemas/PasswordPolicy.json +40 -0
- package/schemas/Permission.json +49 -0
- package/schemas/Policy.json +52 -0
- package/schemas/Risk.json +79 -0
- package/schemas/Role.json +55 -0
- package/schemas/Scope.json +49 -0
- package/schemas/Secret.json +78 -0
- package/schemas/SecretLifecycle.json +14 -0
- package/schemas/SessionConfig.json +43 -0
- package/schemas/Severity.json +14 -0
- package/schemas/SeverityField.json +15 -0
- package/schemas/StatusField.json +15 -0
- package/schemas/StrideCategory.json +15 -0
- package/schemas/StrideCategoryField.json +15 -0
- package/schemas/Threat.json +67 -0
- package/schemas/TrustBoundary.json +69 -0
- package/schemas/TrustLevel.json +12 -0
- package/schemas/TrustLevelField.json +15 -0
- package/schemas/Vulnerability.json +70 -0
- package/schemas/toolchain.json +97 -0
- package/skeletons/asset.md +22 -14
- package/skeletons/asset.sysml.md +27 -0
- package/skeletons/attack_surface.md +21 -18
- package/skeletons/audit_event.md +31 -18
- package/skeletons/audit_finding.md +22 -18
- package/skeletons/auth_flow.md +56 -21
- package/skeletons/control.md +45 -16
- package/skeletons/cors_policy.md +33 -17
- package/skeletons/csrf_token.md +17 -13
- package/skeletons/data_classification.md +23 -18
- package/skeletons/encryption_key.md +19 -12
- package/skeletons/jwt_claim.md +25 -14
- package/skeletons/mfa_method.md +17 -11
- package/skeletons/password_policy.md +35 -20
- package/skeletons/permission.md +18 -12
- package/skeletons/policy.md +33 -17
- package/skeletons/risk.md +20 -14
- package/skeletons/role.md +20 -13
- package/skeletons/scope.md +18 -12
- package/skeletons/secret.md +23 -16
- package/skeletons/secret.sysml.md +29 -0
- package/skeletons/session_config.md +35 -18
- package/skeletons/threat.md +22 -11
- package/skeletons/threat.sysml.md +26 -0
- package/skeletons/trust_boundary.md +51 -16
- package/skeletons/vulnerability.md +18 -15
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# spec-objects-security
|
|
2
2
|
|
|
3
|
+
[](https://discord.gg/6qsdhSPE)
|
|
4
|
+
|
|
3
5
|
> Filament Module: tier-2 security and identity ObjectTypes (threats, controls, auth flows, secrets, policies)
|
|
4
6
|
|
|
5
7
|
`spec-objects-security` is an **Agent-IX Filament module**: a `manifest.yaml` plus per-kind authoring **skeletons** (and frontmatter schemas) that teach the spec tooling a vocabulary of object kinds. It is not a standalone app — it is loaded by [`quire-cli`](https://github.com/agent-ix/quire-cli) and [`quoin`](https://github.com/agent-ix/quoin) to author and validate Markdown spec artifacts.
|
package/manifest.yaml
CHANGED
|
@@ -1,7 +1,40 @@
|
|
|
1
1
|
manifest_version: 1.0.0
|
|
2
2
|
name: spec-objects-security
|
|
3
|
-
version: 0.
|
|
3
|
+
version: 0.2.0
|
|
4
4
|
description: 'Filament Module: tier-2 security and identity ObjectTypes (threats, controls, auth flows, secrets, policies)'
|
|
5
|
+
semantic:
|
|
6
|
+
contract_version: 1.0.0
|
|
7
|
+
semantic_core: 0.3.0
|
|
8
|
+
package: agent-ix/spec-objects-security
|
|
9
|
+
exports:
|
|
10
|
+
- auth_flow
|
|
11
|
+
- permission
|
|
12
|
+
- scope
|
|
13
|
+
- role
|
|
14
|
+
- secret
|
|
15
|
+
- encryption_key
|
|
16
|
+
- session_config
|
|
17
|
+
- data_classification
|
|
18
|
+
- trust_boundary
|
|
19
|
+
- audit_event
|
|
20
|
+
- csrf_token
|
|
21
|
+
- cors_policy
|
|
22
|
+
- password_policy
|
|
23
|
+
- mfa_method
|
|
24
|
+
- jwt_claim
|
|
25
|
+
- threat
|
|
26
|
+
- control
|
|
27
|
+
- risk
|
|
28
|
+
- vulnerability
|
|
29
|
+
- asset
|
|
30
|
+
- attack_surface
|
|
31
|
+
- policy
|
|
32
|
+
- audit_finding
|
|
33
|
+
imports: {}
|
|
34
|
+
targets: [json-schema, markdown]
|
|
35
|
+
mappings: [typed-table, sysml-fence, ocl-clause]
|
|
36
|
+
compatibility_posture: additive
|
|
37
|
+
legacy_forms: warning
|
|
5
38
|
nav:
|
|
6
39
|
category:
|
|
7
40
|
slug: security
|
|
@@ -21,7 +54,8 @@ object_types:
|
|
|
21
54
|
protects: [externally-exposed]
|
|
22
55
|
references: [auth_flow]
|
|
23
56
|
data_schema:
|
|
24
|
-
|
|
57
|
+
schema: schemas/AuthFlow.json
|
|
58
|
+
digest: sha256:3e0bf1f277ead76fe354693c49563ffd73c990086822ac8b8ad91225589d9e49
|
|
25
59
|
body_extraction:
|
|
26
60
|
yield_pattern:
|
|
27
61
|
match:
|
|
@@ -45,13 +79,19 @@ object_types:
|
|
|
45
79
|
after_heading: Flow
|
|
46
80
|
required: true
|
|
47
81
|
language: mermaid
|
|
82
|
+
# Added at 0.2.0 (FR-005): the `## Operations` subsections.
|
|
83
|
+
operations:
|
|
84
|
+
from: section_body
|
|
85
|
+
after_heading: Operations
|
|
86
|
+
required: false
|
|
48
87
|
- name: permission
|
|
49
88
|
allowed_links:
|
|
50
89
|
grants: [scope]
|
|
51
90
|
guards: [externally-exposed]
|
|
52
91
|
references: [role]
|
|
53
92
|
data_schema:
|
|
54
|
-
|
|
93
|
+
schema: schemas/Permission.json
|
|
94
|
+
digest: sha256:fbe12967f34580936a83f496ca51f7f879c01affaa39c66988d724de169e1220
|
|
55
95
|
body_extraction:
|
|
56
96
|
yield_pattern:
|
|
57
97
|
match:
|
|
@@ -68,11 +108,18 @@ object_types:
|
|
|
68
108
|
path:
|
|
69
109
|
- verb
|
|
70
110
|
required: true
|
|
111
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
112
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
113
|
+
properties:
|
|
114
|
+
from: section_body
|
|
115
|
+
after_heading: Properties
|
|
116
|
+
required: false
|
|
71
117
|
- name: scope
|
|
72
118
|
allowed_links:
|
|
73
119
|
references: [permission]
|
|
74
120
|
data_schema:
|
|
75
|
-
|
|
121
|
+
schema: schemas/Scope.json
|
|
122
|
+
digest: sha256:8d68d19fc7950d9a17b3d0e757e276689a002d15316133e9d774f220c0af52d2
|
|
76
123
|
body_extraction:
|
|
77
124
|
yield_pattern:
|
|
78
125
|
match:
|
|
@@ -83,12 +130,19 @@ object_types:
|
|
|
83
130
|
from: section_body
|
|
84
131
|
after_heading: Grants
|
|
85
132
|
required: true
|
|
133
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
134
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
135
|
+
properties:
|
|
136
|
+
from: section_body
|
|
137
|
+
after_heading: Properties
|
|
138
|
+
required: false
|
|
86
139
|
- name: role
|
|
87
140
|
allowed_links:
|
|
88
141
|
grants: [permission]
|
|
89
142
|
references: [role]
|
|
90
143
|
data_schema:
|
|
91
|
-
|
|
144
|
+
schema: schemas/Role.json
|
|
145
|
+
digest: sha256:407a81699de5fea5f1a7868b456216afa99201f82bbe11f1c6203784c1ee7e33
|
|
92
146
|
body_extraction:
|
|
93
147
|
yield_pattern:
|
|
94
148
|
match:
|
|
@@ -99,12 +153,19 @@ object_types:
|
|
|
99
153
|
from: section_body
|
|
100
154
|
after_heading: Permissions
|
|
101
155
|
required: true
|
|
156
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
157
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
158
|
+
properties:
|
|
159
|
+
from: section_body
|
|
160
|
+
after_heading: Properties
|
|
161
|
+
required: false
|
|
102
162
|
- name: secret
|
|
103
163
|
roles: [sensitive]
|
|
104
164
|
allowed_links:
|
|
105
165
|
references: [secret]
|
|
106
166
|
data_schema:
|
|
107
|
-
|
|
167
|
+
schema: schemas/Secret.json
|
|
168
|
+
digest: sha256:2d06ce2ad6ea0a23014a301529a4caa1691a3757ed9f4b4b5dc3f9b559fd1586
|
|
108
169
|
body_extraction:
|
|
109
170
|
yield_pattern:
|
|
110
171
|
match:
|
|
@@ -115,12 +176,19 @@ object_types:
|
|
|
115
176
|
from: section_body
|
|
116
177
|
after_heading: Rotation
|
|
117
178
|
required: true
|
|
179
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
180
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
181
|
+
properties:
|
|
182
|
+
from: section_body
|
|
183
|
+
after_heading: Properties
|
|
184
|
+
required: false
|
|
118
185
|
- name: encryption_key
|
|
119
186
|
roles: [sensitive]
|
|
120
187
|
allowed_links:
|
|
121
188
|
encrypts: [sensitive, data_classification]
|
|
122
189
|
data_schema:
|
|
123
|
-
|
|
190
|
+
schema: schemas/EncryptionKey.json
|
|
191
|
+
digest: sha256:171b8ffdececb9061db539f4a4bbc410df6f76494bb53819728cc610f41eb54c
|
|
124
192
|
body_extraction:
|
|
125
193
|
yield_pattern:
|
|
126
194
|
match:
|
|
@@ -137,11 +205,18 @@ object_types:
|
|
|
137
205
|
path:
|
|
138
206
|
- rotation
|
|
139
207
|
required: false
|
|
208
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
209
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
210
|
+
properties:
|
|
211
|
+
from: section_body
|
|
212
|
+
after_heading: Properties
|
|
213
|
+
required: false
|
|
140
214
|
- name: session_config
|
|
141
215
|
allowed_links:
|
|
142
216
|
references: [auth_flow, jwt_claim]
|
|
143
217
|
data_schema:
|
|
144
|
-
|
|
218
|
+
schema: schemas/SessionConfig.json
|
|
219
|
+
digest: sha256:125c2d9668ecc9cc031950916069754a33a315b33c6c9069151da8c651def4fd
|
|
145
220
|
body_extraction:
|
|
146
221
|
yield_pattern:
|
|
147
222
|
match:
|
|
@@ -152,12 +227,18 @@ object_types:
|
|
|
152
227
|
from: section_body
|
|
153
228
|
after_heading: Settings
|
|
154
229
|
required: true
|
|
230
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
231
|
+
invariants:
|
|
232
|
+
from: section_body
|
|
233
|
+
after_heading: Invariants
|
|
234
|
+
required: false
|
|
155
235
|
- name: data_classification
|
|
156
236
|
allowed_links:
|
|
157
237
|
classifies: [persistable, externally-exposed, sensitive]
|
|
158
238
|
references: [data_classification]
|
|
159
239
|
data_schema:
|
|
160
|
-
|
|
240
|
+
schema: schemas/DataClassification.json
|
|
241
|
+
digest: sha256:32e1217369954ee17b09fa4aba8b02a062fa2a432f124dd99f87db468f87b9ec
|
|
161
242
|
body_extraction:
|
|
162
243
|
yield_pattern:
|
|
163
244
|
match:
|
|
@@ -168,12 +249,19 @@ object_types:
|
|
|
168
249
|
from: section_body
|
|
169
250
|
after_heading: Handling
|
|
170
251
|
required: true
|
|
252
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
253
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
254
|
+
properties:
|
|
255
|
+
from: section_body
|
|
256
|
+
after_heading: Properties
|
|
257
|
+
required: false
|
|
171
258
|
- name: trust_boundary
|
|
172
259
|
allowed_links:
|
|
173
260
|
contains: [asset, api_endpoint]
|
|
174
261
|
references: [trust_boundary]
|
|
175
262
|
data_schema:
|
|
176
|
-
|
|
263
|
+
schema: schemas/TrustBoundary.json
|
|
264
|
+
digest: sha256:0069a8d8e1dae0353bbb5446983138a6ac6be2aba5cb0bc93e195d284372ef84
|
|
177
265
|
body_extraction:
|
|
178
266
|
yield_pattern:
|
|
179
267
|
match:
|
|
@@ -185,12 +273,24 @@ object_types:
|
|
|
185
273
|
after_heading: Boundary
|
|
186
274
|
required: true
|
|
187
275
|
language: mermaid
|
|
276
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
277
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
278
|
+
properties:
|
|
279
|
+
from: section_body
|
|
280
|
+
after_heading: Properties
|
|
281
|
+
required: false
|
|
282
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
283
|
+
invariants:
|
|
284
|
+
from: section_body
|
|
285
|
+
after_heading: Invariants
|
|
286
|
+
required: false
|
|
188
287
|
- name: audit_event
|
|
189
288
|
roles: [event-like]
|
|
190
289
|
allowed_links:
|
|
191
290
|
references: [audit_event]
|
|
192
291
|
data_schema:
|
|
193
|
-
|
|
292
|
+
schema: schemas/AuditEvent.json
|
|
293
|
+
digest: sha256:bd4fed5dc4d80f9041b368d151789d9b2c2a39b4c72f1c1c71a30820b70f52ec
|
|
194
294
|
body_extraction:
|
|
195
295
|
yield_pattern:
|
|
196
296
|
match:
|
|
@@ -202,12 +302,19 @@ object_types:
|
|
|
202
302
|
after_heading: Event Schema
|
|
203
303
|
required: true
|
|
204
304
|
language: json
|
|
305
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
306
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
307
|
+
properties:
|
|
308
|
+
from: section_body
|
|
309
|
+
after_heading: Properties
|
|
310
|
+
required: false
|
|
205
311
|
- name: csrf_token
|
|
206
312
|
roles: [sensitive]
|
|
207
313
|
allowed_links:
|
|
208
314
|
references: [csrf_token]
|
|
209
315
|
data_schema:
|
|
210
|
-
|
|
316
|
+
schema: schemas/CsrfToken.json
|
|
317
|
+
digest: sha256:7abfff62af262c21376408e97faa1fc1546df2a9954c59aae5af25ee9469c254
|
|
211
318
|
body_extraction:
|
|
212
319
|
yield_pattern:
|
|
213
320
|
match:
|
|
@@ -219,11 +326,18 @@ object_types:
|
|
|
219
326
|
path:
|
|
220
327
|
- rotation_window
|
|
221
328
|
required: true
|
|
329
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
330
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
331
|
+
properties:
|
|
332
|
+
from: section_body
|
|
333
|
+
after_heading: Properties
|
|
334
|
+
required: false
|
|
222
335
|
- name: cors_policy
|
|
223
336
|
allowed_links:
|
|
224
337
|
references: [cors_policy]
|
|
225
338
|
data_schema:
|
|
226
|
-
|
|
339
|
+
schema: schemas/CorsPolicy.json
|
|
340
|
+
digest: sha256:55b8cb1c09cc43d8daa6aa7c461d3ede2f8c600d51f5c74cff0facfed0fe1af3
|
|
227
341
|
body_extraction:
|
|
228
342
|
yield_pattern:
|
|
229
343
|
match:
|
|
@@ -234,11 +348,17 @@ object_types:
|
|
|
234
348
|
from: section_body
|
|
235
349
|
after_heading: Origins
|
|
236
350
|
required: true
|
|
351
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
352
|
+
invariants:
|
|
353
|
+
from: section_body
|
|
354
|
+
after_heading: Invariants
|
|
355
|
+
required: false
|
|
237
356
|
- name: password_policy
|
|
238
357
|
allowed_links:
|
|
239
358
|
references: [password_policy]
|
|
240
359
|
data_schema:
|
|
241
|
-
|
|
360
|
+
schema: schemas/PasswordPolicy.json
|
|
361
|
+
digest: sha256:3deb79e250c2ee75b380a5c50c0f2942b9fa4d7207c8b2b5b2bce1bd8aad408f
|
|
242
362
|
body_extraction:
|
|
243
363
|
yield_pattern:
|
|
244
364
|
match:
|
|
@@ -249,11 +369,17 @@ object_types:
|
|
|
249
369
|
from: section_body
|
|
250
370
|
after_heading: Rules
|
|
251
371
|
required: true
|
|
372
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
373
|
+
invariants:
|
|
374
|
+
from: section_body
|
|
375
|
+
after_heading: Invariants
|
|
376
|
+
required: false
|
|
252
377
|
- name: mfa_method
|
|
253
378
|
allowed_links:
|
|
254
379
|
references: [mfa_method]
|
|
255
380
|
data_schema:
|
|
256
|
-
|
|
381
|
+
schema: schemas/MfaMethod.json
|
|
382
|
+
digest: sha256:89797c934801cba2523b6d79c2ec746cdb79d18b3e071a3693e37fb0fea04064
|
|
257
383
|
body_extraction:
|
|
258
384
|
yield_pattern:
|
|
259
385
|
match:
|
|
@@ -270,12 +396,19 @@ object_types:
|
|
|
270
396
|
path:
|
|
271
397
|
- factor
|
|
272
398
|
required: false
|
|
399
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
400
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
401
|
+
properties:
|
|
402
|
+
from: section_body
|
|
403
|
+
after_heading: Properties
|
|
404
|
+
required: false
|
|
273
405
|
- name: jwt_claim
|
|
274
406
|
roles: [sensitive]
|
|
275
407
|
allowed_links:
|
|
276
408
|
references: [jwt_claim]
|
|
277
409
|
data_schema:
|
|
278
|
-
|
|
410
|
+
schema: schemas/JwtClaim.json
|
|
411
|
+
digest: sha256:7c38c084af9264b74dfa135e11825a0f09211664b325093e632521155c006321
|
|
279
412
|
body_extraction:
|
|
280
413
|
yield_pattern:
|
|
281
414
|
match:
|
|
@@ -287,12 +420,19 @@ object_types:
|
|
|
287
420
|
after_heading: Schema
|
|
288
421
|
required: true
|
|
289
422
|
language: json
|
|
423
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
424
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
425
|
+
properties:
|
|
426
|
+
from: section_body
|
|
427
|
+
after_heading: Properties
|
|
428
|
+
required: false
|
|
290
429
|
- name: threat
|
|
291
430
|
allowed_links:
|
|
292
431
|
threatens: [asset, attack_surface]
|
|
293
432
|
exploits: [vulnerability]
|
|
294
433
|
data_schema:
|
|
295
|
-
|
|
434
|
+
schema: schemas/Threat.json
|
|
435
|
+
digest: sha256:7103325eae471a7d8f8cf345b91297e89a169eaf9ee6f69b9925badc07b74046
|
|
296
436
|
body_extraction:
|
|
297
437
|
yield_pattern:
|
|
298
438
|
match:
|
|
@@ -321,13 +461,20 @@ object_types:
|
|
|
321
461
|
path:
|
|
322
462
|
- vector
|
|
323
463
|
required: true
|
|
464
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
465
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
466
|
+
properties:
|
|
467
|
+
from: section_body
|
|
468
|
+
after_heading: Properties
|
|
469
|
+
required: false
|
|
324
470
|
- name: control
|
|
325
471
|
allowed_links:
|
|
326
472
|
mitigates: [threat, risk, vulnerability]
|
|
327
473
|
implements: [policy]
|
|
328
474
|
protects: [externally-exposed, asset]
|
|
329
475
|
data_schema:
|
|
330
|
-
|
|
476
|
+
schema: schemas/Control.json
|
|
477
|
+
digest: sha256:1ae3e01ec7d15725eb6bc179d75b583ebe5794a8724c08811cfaa8b0a013eacd
|
|
331
478
|
body_extraction:
|
|
332
479
|
yield_pattern:
|
|
333
480
|
match:
|
|
@@ -338,12 +485,24 @@ object_types:
|
|
|
338
485
|
from: section_body
|
|
339
486
|
after_heading: Mappings
|
|
340
487
|
required: true
|
|
488
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
489
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
490
|
+
properties:
|
|
491
|
+
from: section_body
|
|
492
|
+
after_heading: Properties
|
|
493
|
+
required: false
|
|
494
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
495
|
+
invariants:
|
|
496
|
+
from: section_body
|
|
497
|
+
after_heading: Invariants
|
|
498
|
+
required: false
|
|
341
499
|
- name: risk
|
|
342
500
|
allowed_links:
|
|
343
501
|
arises_from: [threat, vulnerability]
|
|
344
502
|
references: [asset]
|
|
345
503
|
data_schema:
|
|
346
|
-
|
|
504
|
+
schema: schemas/Risk.json
|
|
505
|
+
digest: sha256:08424445bfb977cd7f407dc2221b3728eb69d90e7ff94398781dc1105d4e6597
|
|
347
506
|
body_extraction:
|
|
348
507
|
yield_pattern:
|
|
349
508
|
match:
|
|
@@ -360,12 +519,19 @@ object_types:
|
|
|
360
519
|
path:
|
|
361
520
|
- impact
|
|
362
521
|
required: true
|
|
522
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
523
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
524
|
+
properties:
|
|
525
|
+
from: section_body
|
|
526
|
+
after_heading: Properties
|
|
527
|
+
required: false
|
|
363
528
|
- name: vulnerability
|
|
364
529
|
allowed_links:
|
|
365
530
|
affects: [asset, attack_surface]
|
|
366
531
|
references: [vulnerability]
|
|
367
532
|
data_schema:
|
|
368
|
-
|
|
533
|
+
schema: schemas/Vulnerability.json
|
|
534
|
+
digest: sha256:9c1f1e726faf41be9d6547bb2c84588c6339d0eb468d22e79b8a631ef11266b3
|
|
369
535
|
body_extraction:
|
|
370
536
|
yield_pattern:
|
|
371
537
|
match:
|
|
@@ -382,11 +548,18 @@ object_types:
|
|
|
382
548
|
path:
|
|
383
549
|
- severity
|
|
384
550
|
required: true
|
|
551
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
552
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
553
|
+
properties:
|
|
554
|
+
from: section_body
|
|
555
|
+
after_heading: Properties
|
|
556
|
+
required: false
|
|
385
557
|
- name: asset
|
|
386
558
|
allowed_links:
|
|
387
559
|
references: [data_classification, trust_boundary]
|
|
388
560
|
data_schema:
|
|
389
|
-
|
|
561
|
+
schema: schemas/Asset.json
|
|
562
|
+
digest: sha256:d41e5f5acc58187e9237ee8ee0e3d173c403e24a557d053c1fbed8c9eebf7a37
|
|
390
563
|
body_extraction:
|
|
391
564
|
yield_pattern:
|
|
392
565
|
match:
|
|
@@ -397,12 +570,19 @@ object_types:
|
|
|
397
570
|
from: section_body
|
|
398
571
|
after_heading: Description
|
|
399
572
|
required: true
|
|
573
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
574
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
575
|
+
properties:
|
|
576
|
+
from: section_body
|
|
577
|
+
after_heading: Properties
|
|
578
|
+
required: false
|
|
400
579
|
- name: attack_surface
|
|
401
580
|
roles: [externally-exposed]
|
|
402
581
|
allowed_links:
|
|
403
582
|
exposes: [asset, api_endpoint]
|
|
404
583
|
data_schema:
|
|
405
|
-
|
|
584
|
+
schema: schemas/AttackSurface.json
|
|
585
|
+
digest: sha256:fd36db8ffc5df3b4dda5175b1bb14f1cf67b9e0c76a3a3fdf626bcea9961ccf3
|
|
406
586
|
body_extraction:
|
|
407
587
|
yield_pattern:
|
|
408
588
|
match:
|
|
@@ -413,11 +593,18 @@ object_types:
|
|
|
413
593
|
from: section_body
|
|
414
594
|
after_heading: Entry Points
|
|
415
595
|
required: true
|
|
596
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
597
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
598
|
+
properties:
|
|
599
|
+
from: section_body
|
|
600
|
+
after_heading: Properties
|
|
601
|
+
required: false
|
|
416
602
|
- name: policy
|
|
417
603
|
allowed_links:
|
|
418
604
|
governs: [control, role, permission, data_classification]
|
|
419
605
|
data_schema:
|
|
420
|
-
|
|
606
|
+
schema: schemas/Policy.json
|
|
607
|
+
digest: sha256:824bb21f2689ed75c5cd33e361b56baa5a28555bbd3fe387510195982ef0c299
|
|
421
608
|
body_extraction:
|
|
422
609
|
yield_pattern:
|
|
423
610
|
match:
|
|
@@ -428,12 +615,18 @@ object_types:
|
|
|
428
615
|
from: section_body
|
|
429
616
|
after_heading: Policy
|
|
430
617
|
required: true
|
|
618
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
619
|
+
invariants:
|
|
620
|
+
from: section_body
|
|
621
|
+
after_heading: Invariants
|
|
622
|
+
required: false
|
|
431
623
|
- name: audit_finding
|
|
432
624
|
allowed_links:
|
|
433
625
|
traces_to: [risk]
|
|
434
626
|
references: [control, vulnerability, asset]
|
|
435
627
|
data_schema:
|
|
436
|
-
|
|
628
|
+
schema: schemas/AuditFinding.json
|
|
629
|
+
digest: sha256:e5c166f8dea995a7babd81f9f2d93ea14570965a7fe0dc3042135ab0924688a7
|
|
437
630
|
body_extraction:
|
|
438
631
|
yield_pattern:
|
|
439
632
|
match:
|
|
@@ -444,11 +637,62 @@ object_types:
|
|
|
444
637
|
from: section_body
|
|
445
638
|
after_heading: Recommendation
|
|
446
639
|
required: true
|
|
640
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
641
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
642
|
+
properties:
|
|
643
|
+
from: section_body
|
|
644
|
+
after_heading: Properties
|
|
645
|
+
required: false
|
|
447
646
|
|
|
448
647
|
# FR-043: concrete-term lexicon — security / identity / auth objects.
|
|
648
|
+
# FR-058 (quire-rs v0.31.0): upward-trace completeness — the second half of
|
|
649
|
+
# agent-ix/spec-objects-security#5. Declaration, not code: the engine holds no
|
|
650
|
+
# archetype name, no verb and no direction.
|
|
651
|
+
#
|
|
652
|
+
# A threat nobody controls and a risk nobody treats are both perfectly
|
|
653
|
+
# well-formed documents that pass every schema and grammar check, and both are
|
|
654
|
+
# evidence of an unaddressed exposure. Nothing that reads a document on its own
|
|
655
|
+
# can see it; only reading the edge set upward can.
|
|
656
|
+
traceability:
|
|
657
|
+
required_relations:
|
|
658
|
+
# STRIDE without coverage is a list. A threat with no inbound `mitigates` is
|
|
659
|
+
# one somebody enumerated and then left.
|
|
660
|
+
- name: threat-has-control
|
|
661
|
+
from: threat
|
|
662
|
+
edges: [mitigates]
|
|
663
|
+
to: []
|
|
664
|
+
direction: incoming
|
|
665
|
+
check: uncontrolled-threat
|
|
666
|
+
# The same statement about the scored artefact rather than the mechanism: a
|
|
667
|
+
# risk with no treatment was assessed and then dropped.
|
|
668
|
+
- name: risk-has-treatment
|
|
669
|
+
from: risk
|
|
670
|
+
edges: [mitigates]
|
|
671
|
+
to: []
|
|
672
|
+
direction: incoming
|
|
673
|
+
check: untreated-risk
|
|
674
|
+
# `direction: incoming` throughout, because the mitigation is authored from
|
|
675
|
+
# the control's or requirement's end — a control says what it mitigates. A
|
|
676
|
+
# threat listing its own controls would duplicate the fact and let the two
|
|
677
|
+
# drift.
|
|
678
|
+
#
|
|
679
|
+
# DELIBERATELY NOT DECLARED: `vulnerability`. #5 names "threat/hazard/risk"
|
|
680
|
+
# and a vulnerability is a property of an implementation rather than a thing
|
|
681
|
+
# the specification owes a response to. Adding it would widen the ticket.
|
|
682
|
+
#
|
|
683
|
+
# ALSO NOT DECLARED: the reverse direction, "every security-classified
|
|
684
|
+
# requirement traces to an upstream threat". It needs a way to say a
|
|
685
|
+
# requirement is security-classified, and no such axis exists — neither this
|
|
686
|
+
# module nor iso declares one. Filed rather than invented.
|
|
687
|
+
#
|
|
688
|
+
# A risk that transitively arises from itself states nothing, and no
|
|
689
|
+
# per-document check can see it: the defect is a property of the graph.
|
|
690
|
+
acyclic_edges:
|
|
691
|
+
- arises_from
|
|
692
|
+
|
|
449
693
|
lexicon:
|
|
450
694
|
token: {definition: a bearer credential representing identity or grant}
|
|
451
|
-
secret: {definition: a confidential value (key, password) kept out of code}
|
|
695
|
+
secret: {definition: "a confidential value (key, password) kept out of code"}
|
|
452
696
|
scope: {definition: a named permission boundary on a grant}
|
|
453
697
|
claim: {definition: an assertion carried in a token}
|
|
454
698
|
permission: {definition: an allowed action on a resource}
|
|
@@ -460,5 +704,5 @@ lexicon:
|
|
|
460
704
|
nonce: {definition: a single-use value preventing replay}
|
|
461
705
|
hash: {definition: a fixed-size digest of input}
|
|
462
706
|
cipher: {definition: an encryption/decryption algorithm}
|
|
463
|
-
audit: {definition: a recorded, tamper-evident event trail}
|
|
707
|
+
audit: {definition: "a recorded, tamper-evident event trail"}
|
|
464
708
|
policy: {definition: a declarative rule governing access or behavior}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-ix/spec-objects-security",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Filament Module: tier-2 security and identity ObjectTypes (threat, control, risk, asset, policy, auth_flow, role, scope, jwt_claim, secret)",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"author": "Agent IX <agents@agent-ix.dev>",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
22
|
"scripts": {
|
|
23
|
-
"prepack": "node scripts/stage-npm.mjs"
|
|
23
|
+
"prepack": "node scripts/stage-npm.mjs",
|
|
24
|
+
"postpack": "node scripts/stage-npm.mjs --clean"
|
|
24
25
|
},
|
|
25
26
|
"publishConfig": {
|
|
26
27
|
"registry": "https://registry.npmjs.org/",
|
|
@@ -29,5 +30,10 @@
|
|
|
29
30
|
"repository": {
|
|
30
31
|
"type": "git",
|
|
31
32
|
"url": "git+https://github.com/agent-ix/spec-objects-security.git"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@agent-ix/semantic-core": "0.3.0",
|
|
36
|
+
"@typespec/compiler": "1.15.0",
|
|
37
|
+
"@typespec/json-schema": "1.15.0"
|
|
32
38
|
}
|
|
33
39
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Asset.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"fields": {
|
|
7
|
+
"type": "array",
|
|
8
|
+
"items": {
|
|
9
|
+
"$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
|
|
10
|
+
},
|
|
11
|
+
"minItems": 1,
|
|
12
|
+
"contains": {
|
|
13
|
+
"$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"relations": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"items": {
|
|
19
|
+
"$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/RelationDecl.json"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"clauses": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"items": {
|
|
25
|
+
"$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"operations": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"items": {
|
|
31
|
+
"$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/OperationDecl.json"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"classification": {
|
|
35
|
+
"$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/ConfidentialityLevel.json"
|
|
36
|
+
},
|
|
37
|
+
"owner": {
|
|
38
|
+
"$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"required": [
|
|
42
|
+
"fields"
|
|
43
|
+
],
|
|
44
|
+
"unevaluatedProperties": {
|
|
45
|
+
"not": {}
|
|
46
|
+
},
|
|
47
|
+
"description": "A thing worth protecting.",
|
|
48
|
+
"allOf": [
|
|
49
|
+
{
|
|
50
|
+
"properties": {
|
|
51
|
+
"fields": {
|
|
52
|
+
"items": {
|
|
53
|
+
"not": {
|
|
54
|
+
"$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"properties": {
|
|
62
|
+
"operations": {
|
|
63
|
+
"items": {
|
|
64
|
+
"properties": {
|
|
65
|
+
"params": {
|
|
66
|
+
"items": {
|
|
67
|
+
"not": {
|
|
68
|
+
"$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|