@agent-ix/spec-objects-security 0.5.0 → 0.9.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 +247 -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/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,7 @@ object_types:
|
|
|
21
54
|
protects: [externally-exposed]
|
|
22
55
|
references: [auth_flow]
|
|
23
56
|
data_schema:
|
|
24
|
-
|
|
57
|
+
schema: schemas/AuthFlow.json
|
|
25
58
|
body_extraction:
|
|
26
59
|
yield_pattern:
|
|
27
60
|
match:
|
|
@@ -45,13 +78,18 @@ object_types:
|
|
|
45
78
|
after_heading: Flow
|
|
46
79
|
required: true
|
|
47
80
|
language: mermaid
|
|
81
|
+
# Added at 0.2.0 (FR-005): the `## Operations` subsections.
|
|
82
|
+
operations:
|
|
83
|
+
from: section_body
|
|
84
|
+
after_heading: Operations
|
|
85
|
+
required: false
|
|
48
86
|
- name: permission
|
|
49
87
|
allowed_links:
|
|
50
88
|
grants: [scope]
|
|
51
89
|
guards: [externally-exposed]
|
|
52
90
|
references: [role]
|
|
53
91
|
data_schema:
|
|
54
|
-
|
|
92
|
+
schema: schemas/Permission.json
|
|
55
93
|
body_extraction:
|
|
56
94
|
yield_pattern:
|
|
57
95
|
match:
|
|
@@ -68,11 +106,17 @@ object_types:
|
|
|
68
106
|
path:
|
|
69
107
|
- verb
|
|
70
108
|
required: true
|
|
109
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
110
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
111
|
+
properties:
|
|
112
|
+
from: section_body
|
|
113
|
+
after_heading: Properties
|
|
114
|
+
required: false
|
|
71
115
|
- name: scope
|
|
72
116
|
allowed_links:
|
|
73
117
|
references: [permission]
|
|
74
118
|
data_schema:
|
|
75
|
-
|
|
119
|
+
schema: schemas/Scope.json
|
|
76
120
|
body_extraction:
|
|
77
121
|
yield_pattern:
|
|
78
122
|
match:
|
|
@@ -83,12 +127,18 @@ object_types:
|
|
|
83
127
|
from: section_body
|
|
84
128
|
after_heading: Grants
|
|
85
129
|
required: true
|
|
130
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
131
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
132
|
+
properties:
|
|
133
|
+
from: section_body
|
|
134
|
+
after_heading: Properties
|
|
135
|
+
required: false
|
|
86
136
|
- name: role
|
|
87
137
|
allowed_links:
|
|
88
138
|
grants: [permission]
|
|
89
139
|
references: [role]
|
|
90
140
|
data_schema:
|
|
91
|
-
|
|
141
|
+
schema: schemas/Role.json
|
|
92
142
|
body_extraction:
|
|
93
143
|
yield_pattern:
|
|
94
144
|
match:
|
|
@@ -99,12 +149,18 @@ object_types:
|
|
|
99
149
|
from: section_body
|
|
100
150
|
after_heading: Permissions
|
|
101
151
|
required: true
|
|
152
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
153
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
154
|
+
properties:
|
|
155
|
+
from: section_body
|
|
156
|
+
after_heading: Properties
|
|
157
|
+
required: false
|
|
102
158
|
- name: secret
|
|
103
159
|
roles: [sensitive]
|
|
104
160
|
allowed_links:
|
|
105
161
|
references: [secret]
|
|
106
162
|
data_schema:
|
|
107
|
-
|
|
163
|
+
schema: schemas/Secret.json
|
|
108
164
|
body_extraction:
|
|
109
165
|
yield_pattern:
|
|
110
166
|
match:
|
|
@@ -115,12 +171,18 @@ object_types:
|
|
|
115
171
|
from: section_body
|
|
116
172
|
after_heading: Rotation
|
|
117
173
|
required: true
|
|
174
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
175
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
176
|
+
properties:
|
|
177
|
+
from: section_body
|
|
178
|
+
after_heading: Properties
|
|
179
|
+
required: false
|
|
118
180
|
- name: encryption_key
|
|
119
181
|
roles: [sensitive]
|
|
120
182
|
allowed_links:
|
|
121
183
|
encrypts: [sensitive, data_classification]
|
|
122
184
|
data_schema:
|
|
123
|
-
|
|
185
|
+
schema: schemas/EncryptionKey.json
|
|
124
186
|
body_extraction:
|
|
125
187
|
yield_pattern:
|
|
126
188
|
match:
|
|
@@ -137,11 +199,17 @@ object_types:
|
|
|
137
199
|
path:
|
|
138
200
|
- rotation
|
|
139
201
|
required: false
|
|
202
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
203
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
204
|
+
properties:
|
|
205
|
+
from: section_body
|
|
206
|
+
after_heading: Properties
|
|
207
|
+
required: false
|
|
140
208
|
- name: session_config
|
|
141
209
|
allowed_links:
|
|
142
210
|
references: [auth_flow, jwt_claim]
|
|
143
211
|
data_schema:
|
|
144
|
-
|
|
212
|
+
schema: schemas/SessionConfig.json
|
|
145
213
|
body_extraction:
|
|
146
214
|
yield_pattern:
|
|
147
215
|
match:
|
|
@@ -152,12 +220,17 @@ object_types:
|
|
|
152
220
|
from: section_body
|
|
153
221
|
after_heading: Settings
|
|
154
222
|
required: true
|
|
223
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
224
|
+
invariants:
|
|
225
|
+
from: section_body
|
|
226
|
+
after_heading: Invariants
|
|
227
|
+
required: false
|
|
155
228
|
- name: data_classification
|
|
156
229
|
allowed_links:
|
|
157
230
|
classifies: [persistable, externally-exposed, sensitive]
|
|
158
231
|
references: [data_classification]
|
|
159
232
|
data_schema:
|
|
160
|
-
|
|
233
|
+
schema: schemas/DataClassification.json
|
|
161
234
|
body_extraction:
|
|
162
235
|
yield_pattern:
|
|
163
236
|
match:
|
|
@@ -168,12 +241,18 @@ object_types:
|
|
|
168
241
|
from: section_body
|
|
169
242
|
after_heading: Handling
|
|
170
243
|
required: true
|
|
244
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
245
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
246
|
+
properties:
|
|
247
|
+
from: section_body
|
|
248
|
+
after_heading: Properties
|
|
249
|
+
required: false
|
|
171
250
|
- name: trust_boundary
|
|
172
251
|
allowed_links:
|
|
173
252
|
contains: [asset, api_endpoint]
|
|
174
253
|
references: [trust_boundary]
|
|
175
254
|
data_schema:
|
|
176
|
-
|
|
255
|
+
schema: schemas/TrustBoundary.json
|
|
177
256
|
body_extraction:
|
|
178
257
|
yield_pattern:
|
|
179
258
|
match:
|
|
@@ -185,12 +264,23 @@ object_types:
|
|
|
185
264
|
after_heading: Boundary
|
|
186
265
|
required: true
|
|
187
266
|
language: mermaid
|
|
267
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
268
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
269
|
+
properties:
|
|
270
|
+
from: section_body
|
|
271
|
+
after_heading: Properties
|
|
272
|
+
required: false
|
|
273
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
274
|
+
invariants:
|
|
275
|
+
from: section_body
|
|
276
|
+
after_heading: Invariants
|
|
277
|
+
required: false
|
|
188
278
|
- name: audit_event
|
|
189
279
|
roles: [event-like]
|
|
190
280
|
allowed_links:
|
|
191
281
|
references: [audit_event]
|
|
192
282
|
data_schema:
|
|
193
|
-
|
|
283
|
+
schema: schemas/AuditEvent.json
|
|
194
284
|
body_extraction:
|
|
195
285
|
yield_pattern:
|
|
196
286
|
match:
|
|
@@ -202,12 +292,18 @@ object_types:
|
|
|
202
292
|
after_heading: Event Schema
|
|
203
293
|
required: true
|
|
204
294
|
language: json
|
|
295
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
296
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
297
|
+
properties:
|
|
298
|
+
from: section_body
|
|
299
|
+
after_heading: Properties
|
|
300
|
+
required: false
|
|
205
301
|
- name: csrf_token
|
|
206
302
|
roles: [sensitive]
|
|
207
303
|
allowed_links:
|
|
208
304
|
references: [csrf_token]
|
|
209
305
|
data_schema:
|
|
210
|
-
|
|
306
|
+
schema: schemas/CsrfToken.json
|
|
211
307
|
body_extraction:
|
|
212
308
|
yield_pattern:
|
|
213
309
|
match:
|
|
@@ -219,11 +315,17 @@ object_types:
|
|
|
219
315
|
path:
|
|
220
316
|
- rotation_window
|
|
221
317
|
required: true
|
|
318
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
319
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
320
|
+
properties:
|
|
321
|
+
from: section_body
|
|
322
|
+
after_heading: Properties
|
|
323
|
+
required: false
|
|
222
324
|
- name: cors_policy
|
|
223
325
|
allowed_links:
|
|
224
326
|
references: [cors_policy]
|
|
225
327
|
data_schema:
|
|
226
|
-
|
|
328
|
+
schema: schemas/CorsPolicy.json
|
|
227
329
|
body_extraction:
|
|
228
330
|
yield_pattern:
|
|
229
331
|
match:
|
|
@@ -234,11 +336,16 @@ object_types:
|
|
|
234
336
|
from: section_body
|
|
235
337
|
after_heading: Origins
|
|
236
338
|
required: true
|
|
339
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
340
|
+
invariants:
|
|
341
|
+
from: section_body
|
|
342
|
+
after_heading: Invariants
|
|
343
|
+
required: false
|
|
237
344
|
- name: password_policy
|
|
238
345
|
allowed_links:
|
|
239
346
|
references: [password_policy]
|
|
240
347
|
data_schema:
|
|
241
|
-
|
|
348
|
+
schema: schemas/PasswordPolicy.json
|
|
242
349
|
body_extraction:
|
|
243
350
|
yield_pattern:
|
|
244
351
|
match:
|
|
@@ -249,11 +356,16 @@ object_types:
|
|
|
249
356
|
from: section_body
|
|
250
357
|
after_heading: Rules
|
|
251
358
|
required: true
|
|
359
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
360
|
+
invariants:
|
|
361
|
+
from: section_body
|
|
362
|
+
after_heading: Invariants
|
|
363
|
+
required: false
|
|
252
364
|
- name: mfa_method
|
|
253
365
|
allowed_links:
|
|
254
366
|
references: [mfa_method]
|
|
255
367
|
data_schema:
|
|
256
|
-
|
|
368
|
+
schema: schemas/MfaMethod.json
|
|
257
369
|
body_extraction:
|
|
258
370
|
yield_pattern:
|
|
259
371
|
match:
|
|
@@ -270,12 +382,18 @@ object_types:
|
|
|
270
382
|
path:
|
|
271
383
|
- factor
|
|
272
384
|
required: false
|
|
385
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
386
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
387
|
+
properties:
|
|
388
|
+
from: section_body
|
|
389
|
+
after_heading: Properties
|
|
390
|
+
required: false
|
|
273
391
|
- name: jwt_claim
|
|
274
392
|
roles: [sensitive]
|
|
275
393
|
allowed_links:
|
|
276
394
|
references: [jwt_claim]
|
|
277
395
|
data_schema:
|
|
278
|
-
|
|
396
|
+
schema: schemas/JwtClaim.json
|
|
279
397
|
body_extraction:
|
|
280
398
|
yield_pattern:
|
|
281
399
|
match:
|
|
@@ -287,12 +405,18 @@ object_types:
|
|
|
287
405
|
after_heading: Schema
|
|
288
406
|
required: true
|
|
289
407
|
language: json
|
|
408
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
409
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
410
|
+
properties:
|
|
411
|
+
from: section_body
|
|
412
|
+
after_heading: Properties
|
|
413
|
+
required: false
|
|
290
414
|
- name: threat
|
|
291
415
|
allowed_links:
|
|
292
416
|
threatens: [asset, attack_surface]
|
|
293
417
|
exploits: [vulnerability]
|
|
294
418
|
data_schema:
|
|
295
|
-
|
|
419
|
+
schema: schemas/Threat.json
|
|
296
420
|
body_extraction:
|
|
297
421
|
yield_pattern:
|
|
298
422
|
match:
|
|
@@ -321,13 +445,19 @@ object_types:
|
|
|
321
445
|
path:
|
|
322
446
|
- vector
|
|
323
447
|
required: true
|
|
448
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
449
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
450
|
+
properties:
|
|
451
|
+
from: section_body
|
|
452
|
+
after_heading: Properties
|
|
453
|
+
required: false
|
|
324
454
|
- name: control
|
|
325
455
|
allowed_links:
|
|
326
456
|
mitigates: [threat, risk, vulnerability]
|
|
327
457
|
implements: [policy]
|
|
328
458
|
protects: [externally-exposed, asset]
|
|
329
459
|
data_schema:
|
|
330
|
-
|
|
460
|
+
schema: schemas/Control.json
|
|
331
461
|
body_extraction:
|
|
332
462
|
yield_pattern:
|
|
333
463
|
match:
|
|
@@ -338,12 +468,23 @@ object_types:
|
|
|
338
468
|
from: section_body
|
|
339
469
|
after_heading: Mappings
|
|
340
470
|
required: true
|
|
471
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
472
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
473
|
+
properties:
|
|
474
|
+
from: section_body
|
|
475
|
+
after_heading: Properties
|
|
476
|
+
required: false
|
|
477
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
478
|
+
invariants:
|
|
479
|
+
from: section_body
|
|
480
|
+
after_heading: Invariants
|
|
481
|
+
required: false
|
|
341
482
|
- name: risk
|
|
342
483
|
allowed_links:
|
|
343
484
|
arises_from: [threat, vulnerability]
|
|
344
485
|
references: [asset]
|
|
345
486
|
data_schema:
|
|
346
|
-
|
|
487
|
+
schema: schemas/Risk.json
|
|
347
488
|
body_extraction:
|
|
348
489
|
yield_pattern:
|
|
349
490
|
match:
|
|
@@ -360,12 +501,18 @@ object_types:
|
|
|
360
501
|
path:
|
|
361
502
|
- impact
|
|
362
503
|
required: true
|
|
504
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
505
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
506
|
+
properties:
|
|
507
|
+
from: section_body
|
|
508
|
+
after_heading: Properties
|
|
509
|
+
required: false
|
|
363
510
|
- name: vulnerability
|
|
364
511
|
allowed_links:
|
|
365
512
|
affects: [asset, attack_surface]
|
|
366
513
|
references: [vulnerability]
|
|
367
514
|
data_schema:
|
|
368
|
-
|
|
515
|
+
schema: schemas/Vulnerability.json
|
|
369
516
|
body_extraction:
|
|
370
517
|
yield_pattern:
|
|
371
518
|
match:
|
|
@@ -382,11 +529,17 @@ object_types:
|
|
|
382
529
|
path:
|
|
383
530
|
- severity
|
|
384
531
|
required: true
|
|
532
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
533
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
534
|
+
properties:
|
|
535
|
+
from: section_body
|
|
536
|
+
after_heading: Properties
|
|
537
|
+
required: false
|
|
385
538
|
- name: asset
|
|
386
539
|
allowed_links:
|
|
387
540
|
references: [data_classification, trust_boundary]
|
|
388
541
|
data_schema:
|
|
389
|
-
|
|
542
|
+
schema: schemas/Asset.json
|
|
390
543
|
body_extraction:
|
|
391
544
|
yield_pattern:
|
|
392
545
|
match:
|
|
@@ -397,12 +550,18 @@ object_types:
|
|
|
397
550
|
from: section_body
|
|
398
551
|
after_heading: Description
|
|
399
552
|
required: true
|
|
553
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
554
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
555
|
+
properties:
|
|
556
|
+
from: section_body
|
|
557
|
+
after_heading: Properties
|
|
558
|
+
required: false
|
|
400
559
|
- name: attack_surface
|
|
401
560
|
roles: [externally-exposed]
|
|
402
561
|
allowed_links:
|
|
403
562
|
exposes: [asset, api_endpoint]
|
|
404
563
|
data_schema:
|
|
405
|
-
|
|
564
|
+
schema: schemas/AttackSurface.json
|
|
406
565
|
body_extraction:
|
|
407
566
|
yield_pattern:
|
|
408
567
|
match:
|
|
@@ -413,11 +572,17 @@ object_types:
|
|
|
413
572
|
from: section_body
|
|
414
573
|
after_heading: Entry Points
|
|
415
574
|
required: true
|
|
575
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
576
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
577
|
+
properties:
|
|
578
|
+
from: section_body
|
|
579
|
+
after_heading: Properties
|
|
580
|
+
required: false
|
|
416
581
|
- name: policy
|
|
417
582
|
allowed_links:
|
|
418
583
|
governs: [control, role, permission, data_classification]
|
|
419
584
|
data_schema:
|
|
420
|
-
|
|
585
|
+
schema: schemas/Policy.json
|
|
421
586
|
body_extraction:
|
|
422
587
|
yield_pattern:
|
|
423
588
|
match:
|
|
@@ -428,12 +593,17 @@ object_types:
|
|
|
428
593
|
from: section_body
|
|
429
594
|
after_heading: Policy
|
|
430
595
|
required: true
|
|
596
|
+
# Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
|
|
597
|
+
invariants:
|
|
598
|
+
from: section_body
|
|
599
|
+
after_heading: Invariants
|
|
600
|
+
required: false
|
|
431
601
|
- name: audit_finding
|
|
432
602
|
allowed_links:
|
|
433
603
|
traces_to: [risk]
|
|
434
604
|
references: [control, vulnerability, asset]
|
|
435
605
|
data_schema:
|
|
436
|
-
|
|
606
|
+
schema: schemas/AuditFinding.json
|
|
437
607
|
body_extraction:
|
|
438
608
|
yield_pattern:
|
|
439
609
|
match:
|
|
@@ -444,11 +614,62 @@ object_types:
|
|
|
444
614
|
from: section_body
|
|
445
615
|
after_heading: Recommendation
|
|
446
616
|
required: true
|
|
617
|
+
# Added at 0.2.0 (FR-005): the typed `## Properties` table the
|
|
618
|
+
# semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
|
|
619
|
+
properties:
|
|
620
|
+
from: section_body
|
|
621
|
+
after_heading: Properties
|
|
622
|
+
required: false
|
|
447
623
|
|
|
448
624
|
# FR-043: concrete-term lexicon — security / identity / auth objects.
|
|
625
|
+
# FR-058 (quire-rs v0.31.0): upward-trace completeness — the second half of
|
|
626
|
+
# agent-ix/spec-objects-security#5. Declaration, not code: the engine holds no
|
|
627
|
+
# archetype name, no verb and no direction.
|
|
628
|
+
#
|
|
629
|
+
# A threat nobody controls and a risk nobody treats are both perfectly
|
|
630
|
+
# well-formed documents that pass every schema and grammar check, and both are
|
|
631
|
+
# evidence of an unaddressed exposure. Nothing that reads a document on its own
|
|
632
|
+
# can see it; only reading the edge set upward can.
|
|
633
|
+
traceability:
|
|
634
|
+
required_relations:
|
|
635
|
+
# STRIDE without coverage is a list. A threat with no inbound `mitigates` is
|
|
636
|
+
# one somebody enumerated and then left.
|
|
637
|
+
- name: threat-has-control
|
|
638
|
+
from: threat
|
|
639
|
+
edges: [mitigates]
|
|
640
|
+
to: []
|
|
641
|
+
direction: incoming
|
|
642
|
+
check: uncontrolled-threat
|
|
643
|
+
# The same statement about the scored artefact rather than the mechanism: a
|
|
644
|
+
# risk with no treatment was assessed and then dropped.
|
|
645
|
+
- name: risk-has-treatment
|
|
646
|
+
from: risk
|
|
647
|
+
edges: [mitigates]
|
|
648
|
+
to: []
|
|
649
|
+
direction: incoming
|
|
650
|
+
check: untreated-risk
|
|
651
|
+
# `direction: incoming` throughout, because the mitigation is authored from
|
|
652
|
+
# the control's or requirement's end — a control says what it mitigates. A
|
|
653
|
+
# threat listing its own controls would duplicate the fact and let the two
|
|
654
|
+
# drift.
|
|
655
|
+
#
|
|
656
|
+
# DELIBERATELY NOT DECLARED: `vulnerability`. #5 names "threat/hazard/risk"
|
|
657
|
+
# and a vulnerability is a property of an implementation rather than a thing
|
|
658
|
+
# the specification owes a response to. Adding it would widen the ticket.
|
|
659
|
+
#
|
|
660
|
+
# ALSO NOT DECLARED: the reverse direction, "every security-classified
|
|
661
|
+
# requirement traces to an upstream threat". It needs a way to say a
|
|
662
|
+
# requirement is security-classified, and no such axis exists — neither this
|
|
663
|
+
# module nor iso declares one. Filed rather than invented.
|
|
664
|
+
#
|
|
665
|
+
# A risk that transitively arises from itself states nothing, and no
|
|
666
|
+
# per-document check can see it: the defect is a property of the graph.
|
|
667
|
+
acyclic_edges:
|
|
668
|
+
- arises_from
|
|
669
|
+
|
|
449
670
|
lexicon:
|
|
450
671
|
token: {definition: a bearer credential representing identity or grant}
|
|
451
|
-
secret: {definition: a confidential value (key, password) kept out of code}
|
|
672
|
+
secret: {definition: "a confidential value (key, password) kept out of code"}
|
|
452
673
|
scope: {definition: a named permission boundary on a grant}
|
|
453
674
|
claim: {definition: an assertion carried in a token}
|
|
454
675
|
permission: {definition: an allowed action on a resource}
|
|
@@ -460,5 +681,5 @@ lexicon:
|
|
|
460
681
|
nonce: {definition: a single-use value preventing replay}
|
|
461
682
|
hash: {definition: a fixed-size digest of input}
|
|
462
683
|
cipher: {definition: an encryption/decryption algorithm}
|
|
463
|
-
audit: {definition: a recorded, tamper-evident event trail}
|
|
684
|
+
audit: {definition: "a recorded, tamper-evident event trail"}
|
|
464
685
|
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.9.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/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/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/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/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/DefaultedField.json"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|