agent-security-lens 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 (81) hide show
  1. package/.env.example +10 -0
  2. package/.mcp/server.json +42 -0
  3. package/CHANGELOG.md +17 -0
  4. package/LICENSE +17 -0
  5. package/PRIVACY.md +37 -0
  6. package/README.md +150 -0
  7. package/RELEASE-MANIFEST.json +449 -0
  8. package/SECURITY.md +24 -0
  9. package/apps/mcp-server/agent-security-lens-mcp.mjs +441 -0
  10. package/bin/agent-security-lens.mjs +117 -0
  11. package/data/ecosystems/agent-candidates.json +230 -0
  12. package/data/intelligence/components.json +22989 -0
  13. package/data/intelligence/security-evaluation-standard.json +221 -0
  14. package/data/recommendations/core/recommendations.json +256 -0
  15. package/data/trust/signal-taxonomy.json +107 -0
  16. package/docs/asl-agent-component-safety-standard-v0.2.md +56 -0
  17. package/examples/dot-hermes/.hermes/config.json +17 -0
  18. package/examples/dot-openclaw/.openclaw/openclaw.json +17 -0
  19. package/examples/hermes-like/.env.example +2 -0
  20. package/examples/hermes-like/config.json +37 -0
  21. package/examples/hermes-like/optional-mcps/github-tools.json +8 -0
  22. package/examples/hermes-like/skills/openclaw-imports/browser-skill/SKILL.md +8 -0
  23. package/examples/openclaw-like/.env.example +2 -0
  24. package/examples/openclaw-like/AGENTS.md +7 -0
  25. package/examples/openclaw-like/openclaw.json +28 -0
  26. package/examples/openclaw-like/workspace/skills/browser-control/SKILL.md +8 -0
  27. package/llms.txt +25 -0
  28. package/package.json +50 -0
  29. package/profiles/generic-agent/profile.json +19 -0
  30. package/profiles/hermes-like/profile.json +23 -0
  31. package/profiles/mcp-server/profile.json +18 -0
  32. package/profiles/openclaw-like/profile.json +22 -0
  33. package/profiles/skill-runtime/profile.json +19 -0
  34. package/rule-packs/core/rules.json +82 -0
  35. package/rule-packs/hermes/rules.json +44 -0
  36. package/rule-packs/mcp/rules.json +65 -0
  37. package/rule-packs/openclaw/rules.json +46 -0
  38. package/rule-packs/skills/rules.json +45 -0
  39. package/schemas/agent-install-decision.schema.json +432 -0
  40. package/schemas/agent-usage-event.schema.json +45 -0
  41. package/schemas/assessment-result.schema.json +361 -0
  42. package/schemas/comparison-result.schema.json +113 -0
  43. package/schemas/component-alternative-graph.schema.json +187 -0
  44. package/schemas/component-intelligence.schema.json +93 -0
  45. package/schemas/decision-feedback.schema.json +49 -0
  46. package/schemas/ecosystem-candidate-registry.schema.json +98 -0
  47. package/schemas/profile.schema.json +65 -0
  48. package/schemas/recommendation-pack.schema.json +114 -0
  49. package/schemas/rule-pack.schema.json +113 -0
  50. package/schemas/trust-signal-taxonomy.schema.json +68 -0
  51. package/scripts/verify-examples.mjs +121 -0
  52. package/scripts/verify-mcp-server.mjs +278 -0
  53. package/scripts/verify-registry.mjs +264 -0
  54. package/server.json +42 -0
  55. package/src/assessment/assess.mjs +108 -0
  56. package/src/assessment/discover-targets.mjs +127 -0
  57. package/src/assessment/risk-domains.mjs +83 -0
  58. package/src/assessment/summarize.mjs +57 -0
  59. package/src/core/files.mjs +74 -0
  60. package/src/intelligence/cloud-client.mjs +260 -0
  61. package/src/intelligence/component-intelligence.mjs +358 -0
  62. package/src/intelligence/decision-engine.mjs +772 -0
  63. package/src/intelligence/finding-context.mjs +180 -0
  64. package/src/intelligence/safety-score-v0.2.mjs +294 -0
  65. package/src/observations/json-observations.mjs +211 -0
  66. package/src/observations/observation-rules.mjs +157 -0
  67. package/src/profiles/load-profiles.mjs +130 -0
  68. package/src/recommendations/component-alternative-graph.mjs +94 -0
  69. package/src/recommendations/load-recommendations.mjs +17 -0
  70. package/src/recommendations/match-recommendations.mjs +79 -0
  71. package/src/report/comparison-console.mjs +71 -0
  72. package/src/report/console.mjs +103 -0
  73. package/src/report/markdown.mjs +145 -0
  74. package/src/results/compare-results.mjs +106 -0
  75. package/src/results/save-result.mjs +29 -0
  76. package/src/rules/load-rules.mjs +22 -0
  77. package/src/rules/match-rules.mjs +99 -0
  78. package/src/rules/supersedes.mjs +39 -0
  79. package/src/store/assessment-store.mjs +78 -0
  80. package/src/trust/derive-trust-signals.mjs +73 -0
  81. package/src/trust/load-trust-signals.mjs +17 -0
@@ -0,0 +1,221 @@
1
+ {
2
+ "schema_version": "0.2.0",
3
+ "updated_at": "2026-06-15T00:00:00.000Z",
4
+ "standard_id": "asl-agent-component-safety-standard",
5
+ "model_version": "asl-safety-standard@0.2.0",
6
+ "principle": "ASL evaluates a component in a specific installation context. Capability exposure is not proof of malicious intent; decisions combine exposure, verified controls, supply-chain trust, evidence confidence and confirmed incidents.",
7
+ "exposure_contexts": {
8
+ "runtime_exposure": {
9
+ "weight": 1,
10
+ "meaning": "Executable source or runtime configuration on the default component path."
11
+ },
12
+ "install_exposure": {
13
+ "weight": 0.85,
14
+ "meaning": "Installation, setup, build or deployment behavior."
15
+ },
16
+ "documented_optional_capability": {
17
+ "weight": 0.45,
18
+ "meaning": "Capability documented in examples, tests or optional bundled instructions."
19
+ },
20
+ "supply_chain_exposure": {
21
+ "weight": 0.35,
22
+ "meaning": "Dependency, manifest or publication metadata exposure."
23
+ },
24
+ "repository_maintenance_activity": {
25
+ "weight": 0,
26
+ "meaning": "Repository CI or release activity retained as evidence but excluded from installed-component runtime risk."
27
+ }
28
+ },
29
+ "score_dimensions": {
30
+ "exposure_risk": {
31
+ "direction": "higher_is_more_exposed",
32
+ "range": [0, 100],
33
+ "meaning": "Potential impact of the capabilities the component can exercise."
34
+ },
35
+ "control_strength": {
36
+ "direction": "higher_is_better",
37
+ "range": [0, 100],
38
+ "meaning": "Controls already verified for the proposed installation. Recommended controls do not count until applied."
39
+ },
40
+ "supply_chain_trust": {
41
+ "direction": "higher_is_better",
42
+ "range": [0, 100],
43
+ "meaning": "Source identity, version pinning, release provenance, maintenance and dependency transparency."
44
+ },
45
+ "evidence_confidence": {
46
+ "direction": "higher_is_better",
47
+ "range": [0, 100],
48
+ "meaning": "Completeness, reliability, reproducibility and independent review of ASL evidence."
49
+ },
50
+ "incident_risk": {
51
+ "direction": "higher_is_more_severe",
52
+ "range": [0, 100],
53
+ "meaning": "Version-scoped, deduplicated and corroborated security incidents. General sentiment is auxiliary only."
54
+ }
55
+ },
56
+ "review_levels": {
57
+ "L0_discovered": "Source discovered; no security decision.",
58
+ "L1_auto_assessed": "Automated metadata or static assessment; cannot authorize automatic installation.",
59
+ "L2_evidence_reviewed": "Versioned evidence, technical scan, community-source check and independent recalculation completed.",
60
+ "L3_runtime_validated": "L2 plus controlled runtime or sandbox validation.",
61
+ "L4_continuously_monitored": "L3 plus active version, incident and source-change monitoring."
62
+ },
63
+ "component_states": {
64
+ "cataloged": "Discovered from a source. Not reviewed.",
65
+ "triaged": "Basic metadata and source have been checked.",
66
+ "scanned": "Static risk signals have been extracted.",
67
+ "review_pending": "Waiting for ASL team review.",
68
+ "reviewed": "Reviewed with evidence and a machine-readable decision.",
69
+ "published": "Served to agents through ASL intelligence API.",
70
+ "deprecated": "Outdated or superseded.",
71
+ "archived": "No longer active or duplicate."
72
+ },
73
+ "permission_model": [
74
+ "shell-execution",
75
+ "subprocess-spawn",
76
+ "remote-code-install",
77
+ "filesystem-read",
78
+ "filesystem-write",
79
+ "credential-access",
80
+ "browser-access",
81
+ "network-access",
82
+ "database-access",
83
+ "repository-write",
84
+ "message-write",
85
+ "workflow-automation",
86
+ "background-execution",
87
+ "data-retention",
88
+ "multi-agent-delegation",
89
+ "third-party-integration"
90
+ ],
91
+ "risk_domains": [
92
+ {
93
+ "id": "execution-risk",
94
+ "weight": -25,
95
+ "signals": ["shell-execution", "subprocess-spawn", "remote-code-install", "docker-runtime"]
96
+ },
97
+ {
98
+ "id": "data-exposure-risk",
99
+ "weight": -22,
100
+ "signals": ["credential-access", "filesystem-read", "browser-access", "database-access", "data-retention"]
101
+ },
102
+ {
103
+ "id": "remote-access-risk",
104
+ "weight": -16,
105
+ "signals": ["network-access", "external-api", "webhook", "remote-mcp-endpoint"]
106
+ },
107
+ {
108
+ "id": "delegation-risk",
109
+ "weight": -14,
110
+ "signals": ["multi-agent-delegation", "tool-chaining", "third-party-integration"]
111
+ },
112
+ {
113
+ "id": "persistence-automation-risk",
114
+ "weight": -18,
115
+ "signals": ["workflow-automation", "background-execution", "scheduled-trigger"]
116
+ },
117
+ {
118
+ "id": "instruction-injection-risk",
119
+ "weight": -20,
120
+ "signals": ["hidden-instruction", "override-rules", "ignore-safety", "prompt-injection-pattern"]
121
+ }
122
+ ],
123
+ "trust_signals": [
124
+ {
125
+ "id": "source-official-or-known-org",
126
+ "weight": 12,
127
+ "source": "github_metadata"
128
+ },
129
+ {
130
+ "id": "active-maintenance",
131
+ "weight": 8,
132
+ "source": "commit_history"
133
+ },
134
+ {
135
+ "id": "transparent-permissions",
136
+ "weight": 10,
137
+ "source": "documentation_review"
138
+ },
139
+ {
140
+ "id": "signed-release-or-pinned-version",
141
+ "weight": 8,
142
+ "source": "release_metadata"
143
+ },
144
+ {
145
+ "id": "high-community-adoption",
146
+ "weight": 6,
147
+ "source": "popularity_signal"
148
+ },
149
+ {
150
+ "id": "negative-community-reports",
151
+ "weight": -18,
152
+ "source": "sentiment_monitoring"
153
+ },
154
+ {
155
+ "id": "unresolved-security-issues",
156
+ "weight": -16,
157
+ "source": "issue_monitoring"
158
+ },
159
+ {
160
+ "id": "unknown-maintainer",
161
+ "weight": -10,
162
+ "source": "metadata_gap"
163
+ }
164
+ ],
165
+ "source_reliability": {
166
+ "official_registry": 0.95,
167
+ "official_github_org": 0.9,
168
+ "github_metadata": 0.75,
169
+ "package_registry": 0.75,
170
+ "directory_listing": 0.65,
171
+ "community_report": 0.55,
172
+ "social_media": 0.45,
173
+ "unverified_blog": 0.35
174
+ },
175
+ "sentiment_monitoring": {
176
+ "sources": ["GitHub issues", "GitHub discussions", "Reddit", "Hacker News", "V2EX", "X/Twitter", "YouTube/Bilibili comments", "WeChat public articles"],
177
+ "negative_terms": [
178
+ "stole token",
179
+ "leaked key",
180
+ "unexpected shell",
181
+ "hidden download",
182
+ "malicious",
183
+ "unsafe",
184
+ "suspicious",
185
+ "prompt injection",
186
+ "credential leak",
187
+ "cookie",
188
+ "backdoor"
189
+ ],
190
+ "positive_terms": ["read-only", "scoped token", "sandbox", "signed release", "permission documented"],
191
+ "fields": ["mention_count", "negative_count", "positive_count", "source_reliability", "sample_urls", "last_seen_at"],
192
+ "rule": "Sentiment is an auxiliary risk signal. It never alone proves a component is malicious."
193
+ },
194
+ "decision_thresholds": {
195
+ "allow": "Only when evidence is reviewed, residual risk is low, supply-chain trust is sufficient and required controls are verified.",
196
+ "allow_with_restrictions": "Evidence is reviewed and the installation is acceptable only after listed controls are applied.",
197
+ "ask_user": "Evidence is incomplete, required controls are missing or the proposed context remains highly exposed.",
198
+ "avoid": "A hard failure or confirmed unresolved critical incident blocks installation."
199
+ },
200
+ "hard_failures": [
201
+ "credential-theft-confirmed",
202
+ "hidden-data-exfiltration",
203
+ "malicious-code-confirmed",
204
+ "token-passthrough",
205
+ "known-critical-vulnerability-unmitigated",
206
+ "version-mismatch",
207
+ "destructive-action-without-confirmation",
208
+ "confirmed-critical-security-incident"
209
+ ],
210
+ "community_intelligence_policy": {
211
+ "confidence_rule": "Evidence confidence measures whether relevant sources were systematically checked and records are reproducible. Positive sentiment never proves safety.",
212
+ "incident_rule": "Negative claims affect incident risk only after component identity, affected version, source independence and technical support are evaluated.",
213
+ "deduplication_keys": ["canonical_url", "content_hash", "claim_type", "affected_version", "technical_artifact_hash"],
214
+ "incident_states": ["unverified", "credible", "corroborated", "confirmed", "fixed", "rejected"]
215
+ },
216
+ "evidence_requirements": {
217
+ "cataloged": ["source_url", "collected_at", "source_type"],
218
+ "reviewed": ["source_url", "install_or_usage_docs", "permission_or_capability_evidence", "risk_signals", "safe_install_plan"],
219
+ "published": ["reviewed_record", "decision", "trust_score", "version_or_time_window", "reviewer_or_team"]
220
+ }
221
+ }
@@ -0,0 +1,256 @@
1
+ {
2
+ "id": "core-recommendations",
3
+ "version": "0.1.0",
4
+ "status": "draft",
5
+ "recommendations": [
6
+ {
7
+ "id": "pin-local-mcp-server",
8
+ "title": "Replace moving MCP commands with pinned local MCP servers",
9
+ "type": "replacement",
10
+ "status": "draft",
11
+ "source": "manual-curated",
12
+ "confidence": 0.62,
13
+ "rank": 90,
14
+ "applies_to": {
15
+ "rule_ids": ["obs-mcp-stdio-process", "mcp-stdio-process-server"],
16
+ "permissions_any": ["subprocess-spawn", "mcp-tool-access"]
17
+ },
18
+ "recommended_actions": [
19
+ "Verify the MCP package owner before enabling the server.",
20
+ "Pin the MCP package or executable version."
21
+ ],
22
+ "recommended_alternatives": [
23
+ "Use a local MCP server pinned to a reviewed version.",
24
+ "Disable unused MCP servers before running the agent."
25
+ ],
26
+ "agent_instruction": "Review this MCP server, pin its package or executable version, and disable it if the current task does not require it.",
27
+ "one_step_commands": [
28
+ {
29
+ "title": "Ask the agent to pin MCP server versions",
30
+ "command": "Review all MCP stdio servers in this workspace. Pin package or executable versions, then disable any server that is not required for the current workflow.",
31
+ "platform": "agent-instruction",
32
+ "requires_confirmation": true
33
+ }
34
+ ],
35
+ "rollback_note": "Restore the previous MCP configuration from version control or the saved assessment snapshot."
36
+ },
37
+ {
38
+ "id": "replace-remote-mcp-with-local",
39
+ "title": "Use local pinned MCP for sensitive workspaces",
40
+ "type": "replacement",
41
+ "status": "draft",
42
+ "source": "manual-curated",
43
+ "confidence": 0.58,
44
+ "rank": 86,
45
+ "applies_to": {
46
+ "rule_ids": ["obs-mcp-remote-endpoint", "mcp-remote-endpoint"],
47
+ "categories": ["remote-access-risk"],
48
+ "permissions_any": ["external-endpoint", "network-access", "mcp-tool-access"]
49
+ },
50
+ "recommended_actions": [
51
+ "Verify who operates the remote MCP endpoint.",
52
+ "Disable remote MCP endpoints for sensitive local repositories."
53
+ ],
54
+ "recommended_alternatives": [
55
+ "Use a local pinned MCP server for sensitive workspaces.",
56
+ "Use remote MCP only with explicit tool allowlists."
57
+ ],
58
+ "agent_instruction": "Disable remote MCP endpoints in this workspace unless the owner is verified and the exposed tools are explicitly allowlisted.",
59
+ "one_step_commands": [
60
+ {
61
+ "title": "Ask the agent to remove remote MCP endpoints",
62
+ "command": "Find remote MCP endpoints in this agent configuration. Disable them for sensitive workspace use, or replace them with local pinned MCP servers.",
63
+ "platform": "agent-instruction",
64
+ "requires_confirmation": true
65
+ }
66
+ ],
67
+ "rollback_note": "Re-enable the remote endpoint only after recording its owner, purpose and allowed tools."
68
+ },
69
+ {
70
+ "id": "scope-filesystem-access",
71
+ "title": "Scope filesystem tools to a dedicated workspace",
72
+ "type": "configuration",
73
+ "status": "draft",
74
+ "source": "manual-curated",
75
+ "confidence": 0.64,
76
+ "rank": 88,
77
+ "applies_to": {
78
+ "rule_ids": ["obs-mcp-filesystem-capability", "mcp-filesystem-write"],
79
+ "permissions_any": ["filesystem-read", "filesystem-write"]
80
+ },
81
+ "recommended_actions": [
82
+ "Limit filesystem access to a dedicated project directory.",
83
+ "Prefer read-only filesystem tools when inspection is enough."
84
+ ],
85
+ "recommended_alternatives": [
86
+ "Use read-only filesystem tooling.",
87
+ "Use a temporary workspace copy for untrusted agent runs."
88
+ ],
89
+ "agent_instruction": "Restrict filesystem MCP access to the current project workspace and switch to read-only mode when write access is not required.",
90
+ "one_step_commands": [
91
+ {
92
+ "title": "Ask the agent to scope filesystem access",
93
+ "command": "Review filesystem tool configuration. Limit it to this project directory and remove write access unless the task explicitly needs it.",
94
+ "platform": "agent-instruction",
95
+ "requires_confirmation": true
96
+ }
97
+ ],
98
+ "rollback_note": "Restore the previous path scope only after confirming the agent needs broader file access."
99
+ },
100
+ {
101
+ "id": "lock-down-remote-triggers",
102
+ "title": "Require allowlists for remote trigger channels",
103
+ "type": "configuration",
104
+ "status": "draft",
105
+ "source": "manual-curated",
106
+ "confidence": 0.6,
107
+ "rank": 84,
108
+ "applies_to": {
109
+ "rule_ids": ["obs-remote-trigger-config", "openclaw-remote-channel-policy", "hermes-gateway-trigger"],
110
+ "permissions_any": ["remote-trigger"]
111
+ },
112
+ "recommended_actions": [
113
+ "Set explicit user or group allowlists for remote channels.",
114
+ "Disable remote trigger channels in sensitive workspaces."
115
+ ],
116
+ "recommended_alternatives": [
117
+ "Use local-only mode for sensitive work.",
118
+ "Require manual approval before remote messages start agent actions."
119
+ ],
120
+ "agent_instruction": "Disable open remote trigger channels or add explicit allowlists before trusting this agent environment.",
121
+ "one_step_commands": [
122
+ {
123
+ "title": "Ask the agent to lock down remote triggers",
124
+ "command": "Find remote trigger channels such as Telegram, Discord, gateway or webhook settings. Disable open triggers or add explicit allowlists.",
125
+ "platform": "agent-instruction",
126
+ "requires_confirmation": true
127
+ }
128
+ ],
129
+ "rollback_note": "Keep a copy of the original channel settings before changing trigger policies."
130
+ },
131
+ {
132
+ "id": "disable-unreviewed-schedules",
133
+ "title": "Disable scheduled agent runs until reviewed",
134
+ "type": "workflow",
135
+ "status": "draft",
136
+ "source": "manual-curated",
137
+ "confidence": 0.57,
138
+ "rank": 76,
139
+ "applies_to": {
140
+ "rule_ids": ["obs-scheduled-agent-execution", "openclaw-scheduled-task"],
141
+ "permissions_any": ["scheduled-execution"]
142
+ },
143
+ "recommended_actions": [
144
+ "Review scheduled prompts and allowed tools.",
145
+ "Disable schedules that can run without active user review."
146
+ ],
147
+ "recommended_alternatives": [
148
+ "Use manual run mode for sensitive tasks.",
149
+ "Require confirmation before scheduled tasks execute tools."
150
+ ],
151
+ "agent_instruction": "Disable scheduled agent execution until each scheduled prompt and its allowed tools have been reviewed.",
152
+ "one_step_commands": [
153
+ {
154
+ "title": "Ask the agent to disable unreviewed schedules",
155
+ "command": "Find scheduled agent tasks. Disable any schedule whose prompt and allowed tools have not been reviewed.",
156
+ "platform": "agent-instruction",
157
+ "requires_confirmation": true
158
+ }
159
+ ],
160
+ "rollback_note": "Re-enable only the specific schedule that has a reviewed prompt and tool scope."
161
+ },
162
+ {
163
+ "id": "use-scoped-agent-credentials",
164
+ "title": "Replace personal credentials with scoped agent credentials",
165
+ "type": "credential",
166
+ "status": "draft",
167
+ "source": "manual-curated",
168
+ "confidence": 0.66,
169
+ "rank": 92,
170
+ "applies_to": {
171
+ "rule_ids": ["obs-credential-reference", "core-env-reference", "skill-env-requirement"],
172
+ "permissions_any": ["credential-access", "env-read"]
173
+ },
174
+ "recommended_actions": [
175
+ "Use dedicated low-privilege credentials for agent environments.",
176
+ "Remove unused secrets from local agent configuration."
177
+ ],
178
+ "recommended_alternatives": [
179
+ "Use scoped tokens with limited repository or workspace access.",
180
+ "Use read-only tokens when the agent only needs inspection."
181
+ ],
182
+ "agent_instruction": "Replace personal or high-privilege credentials with dedicated low-privilege tokens for this agent environment.",
183
+ "one_step_commands": [
184
+ {
185
+ "title": "Ask the agent to inventory credential use",
186
+ "command": "List credentials referenced by this agent environment and propose scoped low-privilege replacements before running tools.",
187
+ "platform": "agent-instruction",
188
+ "requires_confirmation": true
189
+ }
190
+ ],
191
+ "rollback_note": "Revoke any temporary token created during review if it is no longer needed."
192
+ },
193
+ {
194
+ "id": "review-shell-execution-policy",
195
+ "title": "Require review for shell-capable agent behavior",
196
+ "type": "workflow",
197
+ "status": "draft",
198
+ "source": "manual-curated",
199
+ "confidence": 0.56,
200
+ "rank": 82,
201
+ "applies_to": {
202
+ "rule_ids": ["core-shell-execution"],
203
+ "permissions_any": ["shell-execution"]
204
+ },
205
+ "recommended_actions": [
206
+ "Review the command source and argument construction.",
207
+ "Disable shell access when the workflow does not need it."
208
+ ],
209
+ "recommended_alternatives": [
210
+ "Use a sandboxed command runner.",
211
+ "Use read-only inspection tools instead of shell execution."
212
+ ],
213
+ "agent_instruction": "Do not grant shell execution to this agent until the command source, allowed commands and workspace scope are reviewed.",
214
+ "one_step_commands": [
215
+ {
216
+ "title": "Ask the agent to restrict shell use",
217
+ "command": "Review shell execution usage in this environment. Disable shell tools unless the task explicitly requires them, and document allowed commands.",
218
+ "platform": "agent-instruction",
219
+ "requires_confirmation": true
220
+ }
221
+ ],
222
+ "rollback_note": "Restore shell access only for reviewed tasks and commands."
223
+ },
224
+ {
225
+ "id": "pin-remote-skill-sources",
226
+ "title": "Pin remote skill sources to reviewed versions",
227
+ "type": "replacement",
228
+ "status": "draft",
229
+ "source": "manual-curated",
230
+ "confidence": 0.59,
231
+ "rank": 80,
232
+ "applies_to": {
233
+ "rule_ids": ["core-remote-download", "skill-remote-install-source", "hermes-openclaw-migration"],
234
+ "permissions_any": ["external-download", "skill-installation"]
235
+ },
236
+ "recommended_actions": [
237
+ "Verify the skill source and maintainer.",
238
+ "Pin skill sources to a commit SHA or signed release."
239
+ ],
240
+ "recommended_alternatives": [
241
+ "Use bundled skills from a reviewed distribution.",
242
+ "Use a locally vendored skill copy for sensitive workspaces."
243
+ ],
244
+ "agent_instruction": "Replace moving remote skill sources with pinned commits or reviewed release artifacts before enabling the skill.",
245
+ "one_step_commands": [
246
+ {
247
+ "title": "Ask the agent to pin remote skill sources",
248
+ "command": "Find remote skill install sources. Replace moving branches or latest URLs with pinned commits or reviewed release versions.",
249
+ "platform": "agent-instruction",
250
+ "requires_confirmation": true
251
+ }
252
+ ],
253
+ "rollback_note": "Keep the previous skill source URL in the assessment record before replacing it."
254
+ }
255
+ ]
256
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "id": "trust-signal-taxonomy",
3
+ "version": "0.1.0",
4
+ "status": "draft",
5
+ "signals": [
6
+ {
7
+ "id": "static-shell-execution",
8
+ "title": "Shell execution capability detected",
9
+ "direction": "negative",
10
+ "weight": -25,
11
+ "source_type": "static-analysis",
12
+ "applies_to": ["agent", "mcp", "skill", "version"],
13
+ "evidence_required": ["finding_id", "file_path", "line_number", "permission:shell-execution", "permission:subprocess-spawn"],
14
+ "description": "The entity can execute local commands or delegates to a local process."
15
+ },
16
+ {
17
+ "id": "static-remote-endpoint",
18
+ "title": "Remote endpoint capability detected",
19
+ "direction": "negative",
20
+ "weight": -18,
21
+ "source_type": "static-analysis",
22
+ "applies_to": ["agent", "mcp", "skill", "version"],
23
+ "evidence_required": ["finding_id", "file_path", "line_number", "permission:network-access"],
24
+ "description": "The entity uses a remote endpoint that can receive data, provide tools or influence agent behavior."
25
+ },
26
+ {
27
+ "id": "static-credential-reference",
28
+ "title": "Credential reference detected",
29
+ "direction": "negative",
30
+ "weight": -18,
31
+ "source_type": "static-analysis",
32
+ "applies_to": ["agent", "mcp", "skill", "version"],
33
+ "evidence_required": ["finding_id", "file_path", "line_number", "permission:credential-access"],
34
+ "description": "The entity references credentials, tokens or environment variables."
35
+ },
36
+ {
37
+ "id": "static-filesystem-write",
38
+ "title": "Filesystem write capability detected",
39
+ "direction": "negative",
40
+ "weight": -22,
41
+ "source_type": "static-analysis",
42
+ "applies_to": ["agent", "mcp", "skill", "version"],
43
+ "evidence_required": ["finding_id", "file_path", "line_number", "permission:filesystem-write"],
44
+ "description": "The entity can write to local files or delegates to a tool that can write to local files."
45
+ },
46
+ {
47
+ "id": "github-active-maintenance",
48
+ "title": "Active maintenance",
49
+ "direction": "positive",
50
+ "weight": 10,
51
+ "source_type": "github",
52
+ "applies_to": ["agent", "mcp", "skill", "maintainer"],
53
+ "evidence_required": ["repository_url", "recent_commit_date", "release_or_tag_history"],
54
+ "description": "The repository appears actively maintained based on recent commits, releases or issue activity."
55
+ },
56
+ {
57
+ "id": "github-verified-organization",
58
+ "title": "Verified or recognizable organization",
59
+ "direction": "positive",
60
+ "weight": 12,
61
+ "source_type": "github",
62
+ "applies_to": ["agent", "mcp", "skill", "maintainer"],
63
+ "evidence_required": ["organization_url", "verification_or_reputation_evidence"],
64
+ "description": "The maintainer is a verified or recognizable organization with public history."
65
+ },
66
+ {
67
+ "id": "transparency-permission-docs",
68
+ "title": "Transparent permission documentation",
69
+ "direction": "positive",
70
+ "weight": 12,
71
+ "source_type": "transparency",
72
+ "applies_to": ["agent", "mcp", "skill", "version"],
73
+ "evidence_required": ["readme_url_or_path", "permission_section"],
74
+ "description": "The project explains what permissions, tools, credentials or network endpoints it uses."
75
+ },
76
+ {
77
+ "id": "transparency-pinned-release",
78
+ "title": "Pinned or signed release available",
79
+ "direction": "positive",
80
+ "weight": 10,
81
+ "source_type": "transparency",
82
+ "applies_to": ["agent", "mcp", "skill", "version"],
83
+ "evidence_required": ["release_url", "tag_or_signature_evidence"],
84
+ "description": "The entity can be installed from a pinned version, release artifact or signed package."
85
+ },
86
+ {
87
+ "id": "community-negative-report",
88
+ "title": "Negative community report",
89
+ "direction": "negative",
90
+ "weight": -25,
91
+ "source_type": "community",
92
+ "applies_to": ["agent", "mcp", "skill", "maintainer", "version"],
93
+ "evidence_required": ["source_url", "report_summary", "accessed_at"],
94
+ "description": "Community discussion reports suspicious behavior, hidden downloads, unexpected shell usage or credential exposure."
95
+ },
96
+ {
97
+ "id": "manual-reviewed-alternative",
98
+ "title": "Manually reviewed alternative",
99
+ "direction": "positive",
100
+ "weight": 15,
101
+ "source_type": "manual-review",
102
+ "applies_to": ["recommendation", "mcp", "skill"],
103
+ "evidence_required": ["reviewer", "review_date", "review_notes"],
104
+ "description": "A recommendation or alternative has been manually reviewed against the current taxonomy."
105
+ }
106
+ ]
107
+ }
@@ -0,0 +1,56 @@
1
+ # ASL Agent Component Safety Standard v0.2
2
+
3
+ ## Evaluation Subject
4
+
5
+ ASL does not permanently label an MCP, Skill, or Agent as safe or unsafe. It evaluates whether a specific component, version, and source are acceptable under a specific permission, control, and deployment context.
6
+
7
+ Capability exposure is not proof of malicious intent. Only evidence-backed hard failures or confirmed unresolved critical incidents directly produce `avoid`.
8
+
9
+ ## Dimensions
10
+
11
+ | Dimension | Range | Meaning |
12
+ |---|---:|---|
13
+ | Exposure Risk | 0-100 | Potential impact of shell, file, credential, browser, network, and background capabilities |
14
+ | Control Strength | 0-100 | Verified isolation, confirmation, least-privilege, and audit controls |
15
+ | Supply Chain Trust | 0-100 | Source identity, version pinning, releases, maintenance, and publication transparency |
16
+ | Evidence Confidence | 0-100 | Evidence completeness, reliability, reproducibility, and independent review |
17
+ | Incident Risk | 0-100 | Severity of deduplicated, version-scoped, and corroborated security incidents |
18
+
19
+ Recommended mitigations do not increase Control Strength until they are applied and verifiable.
20
+
21
+ ## Exposure Contexts
22
+
23
+ | Context | Weight | Meaning |
24
+ |---|---:|---|
25
+ | `runtime_exposure` | 1.00 | Executable source or runtime configuration on the default path |
26
+ | `install_exposure` | 0.85 | Installation, setup, build, or deployment behavior |
27
+ | `documented_optional_capability` | 0.45 | Capability shown in documentation, examples, tests, or optional Skills |
28
+ | `supply_chain_exposure` | 0.35 | Dependency, manifest, and publication metadata exposure |
29
+ | `repository_maintenance_activity` | 0.00 | Repository CI and release activity, not installed-component runtime permission |
30
+
31
+ Maintenance findings remain archived evidence for review and historical comparison.
32
+
33
+ ## Decisions
34
+
35
+ - `allow`: reviewed evidence, low residual risk, sufficient supply-chain trust, and required controls verified.
36
+ - `allow_with_restrictions`: evidence is sufficient, but returned controls must be applied first.
37
+ - `ask_user`: evidence is incomplete, required controls are missing, or the proposed context remains highly exposed.
38
+ - `avoid`: a hard failure or confirmed unresolved critical incident blocks installation.
39
+
40
+ Static L2 review alone never authorizes unrestricted installation.
41
+
42
+ ## Evidence Levels
43
+
44
+ - `L0 Discovered`
45
+ - `L1 Auto Assessed`
46
+ - `L2 Evidence Reviewed`
47
+ - `L3 Runtime Validated`
48
+ - `L4 Continuously Monitored`
49
+
50
+ ## Community and Incident Evidence
51
+
52
+ Positive sentiment does not prove safety, and ordinary negative comments do not directly reduce the score. ASL checks component identity, affected version, technical support, source independence, and maintainer response. Sentiment is auxiliary; credible incidents enter Incident Risk.
53
+
54
+ ## Reproducibility
55
+
56
+ Every reviewed record must disclose its component and source, scoring model version, decision, required controls, evidence level, review time, known limitations, and historical versions. Superseded records are archived rather than erased.
@@ -0,0 +1,17 @@
1
+ {
2
+ "mcp": {
3
+ "servers": {
4
+ "remote-tools": {
5
+ "type": "http",
6
+ "url": "https://example-hermes.invalid/mcp"
7
+ }
8
+ }
9
+ },
10
+ "gateway": {
11
+ "telegram": {
12
+ "enabled": true,
13
+ "botToken": "${TELEGRAM_BOT_TOKEN}",
14
+ "allowed_users": []
15
+ }
16
+ }
17
+ }