@highflame/policy 2.2.24 → 2.2.25

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.
@@ -353,7 +353,8 @@
353
353
  "key": "rpm_remaining_pct",
354
354
  "type": "number",
355
355
  "required": false,
356
- "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
356
+ "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
357
+ "range": "0-100"
357
358
  },
358
359
  {
359
360
  "key": "rpm_exceeded",
@@ -365,7 +366,8 @@
365
366
  "key": "tpm_remaining_pct",
366
367
  "type": "number",
367
368
  "required": false,
368
- "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
369
+ "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
370
+ "range": "0-100"
369
371
  },
370
372
  {
371
373
  "key": "tpm_exceeded",
@@ -395,7 +397,8 @@
395
397
  "key": "malicious_package_score",
396
398
  "type": "number",
397
399
  "required": false,
398
- "description": "100 when a malicious package was detected, 0 otherwise"
400
+ "description": "100 when a malicious package was detected, 0 otherwise",
401
+ "range": "0-100"
399
402
  },
400
403
  {
401
404
  "key": "malicious_packages",
@@ -425,7 +428,8 @@
425
428
  "key": "package_risk_score",
426
429
  "type": "number",
427
430
  "required": false,
428
- "description": "Graduated supply-chain risk score (0-100). 100 when any malicious package is found; proportional to advisory count for advisory-only packages; 0 when all packages are clean."
431
+ "description": "Graduated supply-chain risk score (0-100). 100 when any malicious package is found; proportional to advisory count for advisory-only packages; 0 when all packages are clean.",
432
+ "range": "0-100"
429
433
  },
430
434
  {
431
435
  "key": "package_check_status",
@@ -659,7 +663,8 @@
659
663
  "key": "rpm_remaining_pct",
660
664
  "type": "number",
661
665
  "required": false,
662
- "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
666
+ "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
667
+ "range": "0-100"
663
668
  },
664
669
  {
665
670
  "key": "rpm_exceeded",
@@ -671,7 +676,8 @@
671
676
  "key": "tpm_remaining_pct",
672
677
  "type": "number",
673
678
  "required": false,
674
- "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
679
+ "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
680
+ "range": "0-100"
675
681
  },
676
682
  {
677
683
  "key": "tpm_exceeded",
@@ -701,7 +707,8 @@
701
707
  "key": "malicious_package_score",
702
708
  "type": "number",
703
709
  "required": false,
704
- "description": "100 when a malicious package was detected, 0 otherwise"
710
+ "description": "100 when a malicious package was detected, 0 otherwise",
711
+ "range": "0-100"
705
712
  },
706
713
  {
707
714
  "key": "malicious_packages",
@@ -731,7 +738,8 @@
731
738
  "key": "package_risk_score",
732
739
  "type": "number",
733
740
  "required": false,
734
- "description": "Graduated supply-chain risk score (0-100)"
741
+ "description": "Graduated supply-chain risk score (0-100)",
742
+ "range": "0-100"
735
743
  },
736
744
  {
737
745
  "key": "package_check_status",
@@ -995,7 +1003,8 @@
995
1003
  "key": "rpm_remaining_pct",
996
1004
  "type": "number",
997
1005
  "required": false,
998
- "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1006
+ "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1007
+ "range": "0-100"
999
1008
  },
1000
1009
  {
1001
1010
  "key": "rpm_exceeded",
@@ -1007,7 +1016,8 @@
1007
1016
  "key": "tpm_remaining_pct",
1008
1017
  "type": "number",
1009
1018
  "required": false,
1010
- "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1019
+ "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1020
+ "range": "0-100"
1011
1021
  },
1012
1022
  {
1013
1023
  "key": "tpm_exceeded",
@@ -1199,7 +1209,8 @@
1199
1209
  "key": "rpm_remaining_pct",
1200
1210
  "type": "number",
1201
1211
  "required": false,
1202
- "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1212
+ "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1213
+ "range": "0-100"
1203
1214
  },
1204
1215
  {
1205
1216
  "key": "rpm_exceeded",
@@ -1211,7 +1222,8 @@
1211
1222
  "key": "tpm_remaining_pct",
1212
1223
  "type": "number",
1213
1224
  "required": false,
1214
- "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1225
+ "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1226
+ "range": "0-100"
1215
1227
  },
1216
1228
  {
1217
1229
  "key": "tpm_exceeded",
@@ -1403,7 +1415,8 @@
1403
1415
  "key": "rpm_remaining_pct",
1404
1416
  "type": "number",
1405
1417
  "required": false,
1406
- "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1418
+ "description": "Remaining RPM (requests per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1419
+ "range": "0-100"
1407
1420
  },
1408
1421
  {
1409
1422
  "key": "rpm_exceeded",
@@ -1415,7 +1428,8 @@
1415
1428
  "key": "tpm_remaining_pct",
1416
1429
  "type": "number",
1417
1430
  "required": false,
1418
- "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)"
1431
+ "description": "Remaining TPM (tokens per minute) as percentage (0-100). Gateway-metered, Shield-decided (ADR 0014)",
1432
+ "range": "0-100"
1419
1433
  },
1420
1434
  {
1421
1435
  "key": "tpm_exceeded",
@@ -0,0 +1,59 @@
1
+ // =============================================================================
2
+ // Malicious Package (Default)
3
+ // =============================================================================
4
+ // Blocks tool calls that install or download packages flagged as malicious
5
+ // by the osv.dev database (OpenSSF MAL- advisories). The malicious_package
6
+ // detector (Shield, Tier Slow) parses package-manager invocations (pip, npm,
7
+ // yarn, pnpm, bun, uv, gem, cargo, go, composer) out of tool-call arguments
8
+ // and checks each referenced package against the OSV batch API.
9
+ //
10
+ // Context keys consumed:
11
+ // - malicious_package_detected: Bool
12
+ // - package_install_detected: Bool
13
+ // - package_check_status: String ("" | "degraded")
14
+ //
15
+ // Compliance:
16
+ // - OWASP LLM03 (Supply Chain), OWASP ASI02
17
+ //
18
+ // Category: agent-security
19
+ // Namespace: AIGateway
20
+ // =============================================================================
21
+
22
+ @id("agent-security.block-malicious-package")
23
+ @name("Block malicious package installs")
24
+ @description("Blocks call_tool when a referenced package carries a known-malicious osv.dev (MAL-) advisory.")
25
+ @severity("critical")
26
+ @tags("category:agent-security,threat:supply-chain,detection:aggregate,surface:call-tool,owasp:llm03,owasp:asi02")
27
+ @reject_message("Package install blocked: the requested package is flagged as malicious in the osv.dev database.")
28
+ forbid (
29
+ principal,
30
+ action == AIGateway::Action::"call_tool",
31
+ resource
32
+ )
33
+ when {
34
+ context has malicious_package_detected &&
35
+ context.malicious_package_detected == true
36
+ };
37
+
38
+ // Alternative (fail-closed): the detector fails OPEN by design — when the
39
+ // OSV lookup is unavailable, installs proceed with package_check_status set
40
+ // to "degraded". Uncomment to block package installs whenever they cannot be
41
+ // verified, trading install availability for supply-chain certainty.
42
+ //
43
+ // @id("agent-security.block-unverified-package")
44
+ // @name("Block unverified package installs")
45
+ // @description("Blocks call_tool package installs when the malicious-package lookup is degraded.")
46
+ // @severity("medium")
47
+ // @tags("category:agent-security,threat:supply-chain,detection:aggregate,surface:call-tool,owasp:llm03")
48
+ // @reject_message("Package install blocked: the package could not be verified against the malicious-package database.")
49
+ // forbid (
50
+ // principal,
51
+ // action == AIGateway::Action::"call_tool",
52
+ // resource
53
+ // )
54
+ // when {
55
+ // context has package_install_detected &&
56
+ // context.package_install_detected == true &&
57
+ // context has package_check_status &&
58
+ // context.package_check_status == "degraded"
59
+ // };
@@ -103,6 +103,20 @@
103
103
  "owasp:asi04"
104
104
  ]
105
105
  },
106
+ {
107
+ "id": "agent-security.malicious-package",
108
+ "name": "Malicious Package",
109
+ "description": "Block package installs (pip, npm, yarn, pnpm, bun, uv, gem, cargo, go, composer) flagged as malicious.",
110
+ "category": "agent-security",
111
+ "file": "defaults/malicious_package.cedar",
112
+ "severity": "critical",
113
+ "tags": [
114
+ "category:agent-security",
115
+ "threat:supply-chain",
116
+ "owasp:llm03",
117
+ "owasp:asi02"
118
+ ]
119
+ },
106
120
  {
107
121
  "id": "tools.mcp-server-allowlist",
108
122
  "name": "MCP Server Allowlist",