@aporthq/aport-agent-guardrails 1.0.8
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/LICENSE +217 -0
- package/README.md +481 -0
- package/bin/agent-guardrails +133 -0
- package/bin/aport-create-passport.sh +444 -0
- package/bin/aport-cursor-hook.sh +90 -0
- package/bin/aport-guardrail-api.sh +108 -0
- package/bin/aport-guardrail-bash.sh +394 -0
- package/bin/aport-guardrail-v2.sh +5 -0
- package/bin/aport-guardrail.sh +5 -0
- package/bin/aport-resolve-paths.sh +71 -0
- package/bin/aport-status.sh +276 -0
- package/bin/frameworks/crewai.sh +49 -0
- package/bin/frameworks/cursor.sh +95 -0
- package/bin/frameworks/langchain.sh +48 -0
- package/bin/frameworks/n8n.sh +36 -0
- package/bin/frameworks/openclaw.sh +19 -0
- package/bin/lib/allowlist.sh +18 -0
- package/bin/lib/common.sh +28 -0
- package/bin/lib/config.sh +46 -0
- package/bin/lib/constants.sh +232 -0
- package/bin/lib/detect.sh +65 -0
- package/bin/lib/error.sh +269 -0
- package/bin/lib/passport.sh +19 -0
- package/bin/lib/templates/.gitkeep +1 -0
- package/bin/lib/templates/config.yaml +6 -0
- package/bin/lib/validation.sh +206 -0
- package/bin/openclaw +660 -0
- package/docs/ADDING_A_FRAMEWORK.md +87 -0
- package/docs/AGENTS.md.example +40 -0
- package/docs/CODE_REVIEW.md +192 -0
- package/docs/DEPLOYMENT_READINESS.md +81 -0
- package/docs/FAQ_SECURITY_SCANNERS.md +373 -0
- package/docs/FRAMEWORK_ROADMAP.md +41 -0
- package/docs/HOSTED_PASSPORT_SETUP.md +362 -0
- package/docs/IMPLEMENTING_YOUR_OWN_EVALUATOR.md +433 -0
- package/docs/OPENCLAW_COMPATIBILITY.md +73 -0
- package/docs/OPENCLAW_LOCAL_INTEGRATION.md +596 -0
- package/docs/OPENCLAW_TOOLS_AND_POLICIES.md +54 -0
- package/docs/QUICKSTART.md +470 -0
- package/docs/QUICKSTART_OPENCLAW_PLUGIN.md +470 -0
- package/docs/README.md +28 -0
- package/docs/RELEASE.md +87 -0
- package/docs/REPO_LAYOUT.md +47 -0
- package/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md +1260 -0
- package/docs/TOOL_POLICY_MAPPING.md +46 -0
- package/docs/UPGRADE.md +46 -0
- package/docs/VERIFICATION_METHODS.md +97 -0
- package/docs/assets/README.md +8 -0
- package/docs/assets/porter.svg +54 -0
- package/docs/development/ERROR_CODES.md +616 -0
- package/docs/frameworks/GITHUB_ISSUE_PROPOSALS.md +1105 -0
- package/docs/frameworks/crewai.md +114 -0
- package/docs/frameworks/cursor.md +159 -0
- package/docs/frameworks/langchain.md +72 -0
- package/docs/frameworks/n8n.md +40 -0
- package/docs/frameworks/openclaw.md +40 -0
- package/docs/launch/ADD_APORT_AWESOME_LISTS_INSTRUCTIONS.md +146 -0
- package/docs/launch/ANNOUNCEMENT_GUIDE.md +266 -0
- package/docs/launch/AWESOME_REPOS.md +53 -0
- package/docs/launch/CURSOR_VSCODE_HOOKS_RESEARCH.md +77 -0
- package/docs/launch/DEMO_TERMINAL_OUTPUT.txt +48 -0
- package/docs/launch/DRY_AND_PLAN_CHECKLIST.md +47 -0
- package/docs/launch/EVIDENCE_README.md +61 -0
- package/docs/launch/EVIDENCE_TERMINAL_CAPTURE.txt +10 -0
- package/docs/launch/FRAMEWORK_SUPPORT_PLAN.md +1640 -0
- package/docs/launch/LAUNCH_READINESS_CHECKLIST.md +237 -0
- package/docs/launch/LAUNCH_STRATEGY_SUMMARY.md +464 -0
- package/docs/launch/OPENCLAW_FEEDBACK_AND_FIXES.md +85 -0
- package/docs/launch/POST_1_VALENTINE_IMPROVED.md +233 -0
- package/docs/launch/POST_2_GUARDRAIL_IMPROVED.md +369 -0
- package/docs/launch/PRE_LAUNCH_FIXES.md +766 -0
- package/docs/launch/QUICK_LAUNCH_CHECKLIST.md +400 -0
- package/docs/launch/READINESS_SUMMARY.md +262 -0
- package/docs/launch/README.md +68 -0
- package/docs/launch/USER_STORIES.md +327 -0
- package/docs/launch/scripts/add-aport-awesome-pr.sh +69 -0
- package/docs/operations/MONITORING.md +588 -0
- package/docs/reviews/2026-02-18-staff-review.md +268 -0
- package/extensions/openclaw-aport/README.md +415 -0
- package/extensions/openclaw-aport/index.js +625 -0
- package/extensions/openclaw-aport/openclaw-aport.js +7 -0
- package/extensions/openclaw-aport/openclaw.plugin.json +46 -0
- package/extensions/openclaw-aport/package.json +36 -0
- package/extensions/openclaw-aport/test.js +307 -0
- package/external/aport-policies/README.md +363 -0
- package/external/aport-policies/agent.session.create.v1/README.md +345 -0
- package/external/aport-policies/agent.session.create.v1/policy.json +162 -0
- package/external/aport-policies/agent.tool.register.v1/README.md +361 -0
- package/external/aport-policies/agent.tool.register.v1/policy.json +172 -0
- package/external/aport-policies/code.release.publish.v1/README.md +51 -0
- package/external/aport-policies/code.release.publish.v1/policy.json +121 -0
- package/external/aport-policies/code.repository.merge.v1/README.md +287 -0
- package/external/aport-policies/code.repository.merge.v1/express.example.js +332 -0
- package/external/aport-policies/code.repository.merge.v1/fastapi.example.py +370 -0
- package/external/aport-policies/code.repository.merge.v1/policy.json +162 -0
- package/external/aport-policies/data.export.create.v1/README.md +226 -0
- package/external/aport-policies/data.export.create.v1/express.example.js +172 -0
- package/external/aport-policies/data.export.create.v1/fastapi.example.py +165 -0
- package/external/aport-policies/data.export.create.v1/policy.json +133 -0
- package/external/aport-policies/data.report.ingest.v1/README.md +134 -0
- package/external/aport-policies/data.report.ingest.v1/express.example.js +105 -0
- package/external/aport-policies/data.report.ingest.v1/minimal-example.js +68 -0
- package/external/aport-policies/data.report.ingest.v1/policy.json +174 -0
- package/external/aport-policies/finance.crypto.trade.v1/README.md +146 -0
- package/external/aport-policies/finance.crypto.trade.v1/express.example.js +109 -0
- package/external/aport-policies/finance.crypto.trade.v1/minimal-example.js +65 -0
- package/external/aport-policies/finance.crypto.trade.v1/policy.json +176 -0
- package/external/aport-policies/finance.payment.charge.v1/README.md +326 -0
- package/external/aport-policies/finance.payment.charge.v1/express.example.js +250 -0
- package/external/aport-policies/finance.payment.charge.v1/fastapi.example.py +227 -0
- package/external/aport-policies/finance.payment.charge.v1/minimal-example.js +64 -0
- package/external/aport-policies/finance.payment.charge.v1/policy.json +224 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/passport.instance.json +42 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/passport.template.json +40 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/payments-charge-policy.test.js +817 -0
- package/external/aport-policies/finance.payment.charge.v1/tests/test_payments_charge_policy.py +486 -0
- package/external/aport-policies/finance.payment.payout.v1/README.md +78 -0
- package/external/aport-policies/finance.payment.payout.v1/policy.json +181 -0
- package/external/aport-policies/finance.payment.refund.v1/README.md +275 -0
- package/external/aport-policies/finance.payment.refund.v1/express.example.js +167 -0
- package/external/aport-policies/finance.payment.refund.v1/fastapi.example.py +136 -0
- package/external/aport-policies/finance.payment.refund.v1/minimal-example.js +183 -0
- package/external/aport-policies/finance.payment.refund.v1/policy.json +216 -0
- package/external/aport-policies/finance.payment.refund.v1/tests/refunds-policy.test.js +924 -0
- package/external/aport-policies/finance.payment.refund.v1/tests/test_refunds_policy.py +778 -0
- package/external/aport-policies/finance.transaction.execute.v1/README.md +309 -0
- package/external/aport-policies/finance.transaction.execute.v1/express.example.js +261 -0
- package/external/aport-policies/finance.transaction.execute.v1/fastapi.example.py +231 -0
- package/external/aport-policies/finance.transaction.execute.v1/minimal-example.js +78 -0
- package/external/aport-policies/finance.transaction.execute.v1/policy.json +189 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/passport.instance.json +42 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/passport.template.json +42 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/test_transactions_policy.py +214 -0
- package/external/aport-policies/finance.transaction.execute.v1/tests/transactions-policy.test.js +306 -0
- package/external/aport-policies/governance.data.access.v1/README.md +292 -0
- package/external/aport-policies/governance.data.access.v1/express.example.js +321 -0
- package/external/aport-policies/governance.data.access.v1/fastapi.example.py +279 -0
- package/external/aport-policies/governance.data.access.v1/minimal-example.js +65 -0
- package/external/aport-policies/governance.data.access.v1/policy.json +208 -0
- package/external/aport-policies/governance.data.access.v1/tests/contexts.jsonl +12 -0
- package/external/aport-policies/governance.data.access.v1/tests/data-access-policy.test.js +308 -0
- package/external/aport-policies/governance.data.access.v1/tests/expected.jsonl +12 -0
- package/external/aport-policies/governance.data.access.v1/tests/passport.instance.json +56 -0
- package/external/aport-policies/governance.data.access.v1/tests/passport.template.json +56 -0
- package/external/aport-policies/governance.data.access.v1/tests/test_data_access_policy.py +214 -0
- package/external/aport-policies/legal.contract.review.v1/README.md +109 -0
- package/external/aport-policies/legal.contract.review.v1/policy.json +378 -0
- package/external/aport-policies/legal.contract.review.v1/tests/legal-contract-review-policy.test.js +609 -0
- package/external/aport-policies/legal.contract.review.v1/tests/passport.template.json +49 -0
- package/external/aport-policies/mcp.tool.execute.v1/README.md +301 -0
- package/external/aport-policies/mcp.tool.execute.v1/policy.json +141 -0
- package/external/aport-policies/messaging.message.send.v1/README.md +230 -0
- package/external/aport-policies/messaging.message.send.v1/express.example.js +183 -0
- package/external/aport-policies/messaging.message.send.v1/fastapi.example.py +193 -0
- package/external/aport-policies/messaging.message.send.v1/policy.json +144 -0
- package/external/aport-policies/policy-template.json +107 -0
- package/external/aport-policies/system.command.execute.v1/README.md +275 -0
- package/external/aport-policies/system.command.execute.v1/policy.json +146 -0
- package/external/aport-spec/CONTRIBUTING.md +273 -0
- package/external/aport-spec/LICENSE +21 -0
- package/external/aport-spec/README.md +168 -0
- package/external/aport-spec/conformance/README.md +294 -0
- package/external/aport-spec/conformance/cases/data.export.v1/contexts/allow_users.json +6 -0
- package/external/aport-spec/conformance/cases/data.export.v1/contexts/deny_pii.json +6 -0
- package/external/aport-spec/conformance/cases/data.export.v1/expected/allow_users.decision.json +19 -0
- package/external/aport-spec/conformance/cases/data.export.v1/expected/deny_pii.decision.json +19 -0
- package/external/aport-spec/conformance/cases/data.export.v1/passports/template.json +29 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/allow_50usd.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_150usd.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/contexts/deny_currency.json +9 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/allow_50usd.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_150usd.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/expected/deny_currency.decision.json +19 -0
- package/external/aport-spec/conformance/cases/payments.refunds.v1/passports/template.json +42 -0
- package/external/aport-spec/conformance/package.json +44 -0
- package/external/aport-spec/conformance/pnpm-lock.yaml +642 -0
- package/external/aport-spec/conformance/src/cases.ts +371 -0
- package/external/aport-spec/conformance/src/ed25519.ts +167 -0
- package/external/aport-spec/conformance/src/jcs.ts +85 -0
- package/external/aport-spec/conformance/src/runner.ts +533 -0
- package/external/aport-spec/conformance/src/validators.ts +185 -0
- package/external/aport-spec/conformance/test-runner.js +315 -0
- package/external/aport-spec/conformance/tsconfig.json +21 -0
- package/external/aport-spec/error-schema.json +192 -0
- package/external/aport-spec/index.json +12 -0
- package/external/aport-spec/integrations/clawmoat/README.md +12 -0
- package/external/aport-spec/integrations/shield/README.md +245 -0
- package/external/aport-spec/integrations/shield/adapters/index.js +116 -0
- package/external/aport-spec/integrations/shield/adapters/system-command-execute.js +133 -0
- package/external/aport-spec/integrations/shield/test/README.md +58 -0
- package/external/aport-spec/integrations/shield/test/shield.md +40 -0
- package/external/aport-spec/integrations/shield/test/test-shield-to-verify.js +274 -0
- package/external/aport-spec/metrics-schema.json +504 -0
- package/external/aport-spec/oap/CHANGELOG.md +54 -0
- package/external/aport-spec/oap/VERSION.md +40 -0
- package/external/aport-spec/oap/capability-registry.md +229 -0
- package/external/aport-spec/oap/conformance.md +257 -0
- package/external/aport-spec/oap/decision-schema.json +114 -0
- package/external/aport-spec/oap/examples/context.refund.usd.50.json +9 -0
- package/external/aport-spec/oap/examples/decision.allow.sample.json +20 -0
- package/external/aport-spec/oap/examples/decision.deny.sample.json +23 -0
- package/external/aport-spec/oap/examples/passport.instance.v1.json +50 -0
- package/external/aport-spec/oap/examples/passport.template.v1.json +71 -0
- package/external/aport-spec/oap/oap-spec.md +426 -0
- package/external/aport-spec/oap/passport-schema.json +396 -0
- package/external/aport-spec/oap/security.md +213 -0
- package/external/aport-spec/oap/vc/context-oap-v1.jsonld +137 -0
- package/external/aport-spec/oap/vc/examples/oap-decision-vc.json +37 -0
- package/external/aport-spec/oap/vc/examples/oap-passport-vc.json +68 -0
- package/external/aport-spec/oap/vc/tools/INTEGRATION.md +375 -0
- package/external/aport-spec/oap/vc/tools/README.md +278 -0
- package/external/aport-spec/oap/vc/tools/examples/decision-to-vc.js +66 -0
- package/external/aport-spec/oap/vc/tools/examples/passport-to-vc.js +83 -0
- package/external/aport-spec/oap/vc/tools/examples/vc-to-decision.js +77 -0
- package/external/aport-spec/oap/vc/tools/examples/vc-to-passport.js +94 -0
- package/external/aport-spec/oap/vc/tools/package.json +38 -0
- package/external/aport-spec/oap/vc/tools/pnpm-lock.yaml +472 -0
- package/external/aport-spec/oap/vc/tools/src/cli.ts +226 -0
- package/external/aport-spec/oap/vc/tools/src/crypto-utils.ts +427 -0
- package/external/aport-spec/oap/vc/tools/src/index.ts +653 -0
- package/external/aport-spec/oap/vc/tools/src/test.ts +148 -0
- package/external/aport-spec/oap/vc/tools/src/vp.ts +382 -0
- package/external/aport-spec/oap/vc/tools/test-simple.js +214 -0
- package/external/aport-spec/oap/vc/tools/tsconfig.json +19 -0
- package/external/aport-spec/oap/vc/vc-mapping.md +443 -0
- package/external/aport-spec/passport-schema.json +586 -0
- package/external/aport-spec/rate-limiting.md +136 -0
- package/external/aport-spec/transport-profile.md +325 -0
- package/external/aport-spec/webhook-spec.md +314 -0
- package/package.json +70 -0
- package/skills/aport-agent-guardrail/SKILL.md +314 -0
- package/src/evaluator.js +252 -0
- package/src/server/index.js +72 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# FAQ: Security Scanner False Positives
|
|
2
|
+
|
|
3
|
+
**Last updated:** 2026-02-18
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Is APort malware?
|
|
8
|
+
|
|
9
|
+
**No.** APort is security infrastructure (like antivirus or firewall), not malware.
|
|
10
|
+
|
|
11
|
+
**Evidence:**
|
|
12
|
+
- ✅ Open-source: Full code review available on [GitHub](https://github.com/aporthq/aport-agent-guardrails)
|
|
13
|
+
- ✅ VirusTotal: 0 out of 70+ antivirus engines detected threats ([scan results](https://www.virustotal.com/gui/file/0fe9918f47fc191d31dfe9a58faedca16e7cedbfef9271520d05feb711699c06))
|
|
14
|
+
- ✅ npm verified: SHA-512 integrity checks pass
|
|
15
|
+
- ✅ No malware characteristics: No obfuscation, no credential theft, no backdoors, no privilege escalation
|
|
16
|
+
- ✅ 300+ installs from real users, design partners in fintech/healthcare/legal
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Why is it flagged as "suspicious"?
|
|
21
|
+
|
|
22
|
+
**Automated scanners flag ALL security tools because they need deep system access to protect the system.**
|
|
23
|
+
|
|
24
|
+
**What gets flagged:**
|
|
25
|
+
1. **Remote code execution** — npm install runs setup code
|
|
26
|
+
2. **System modifications** — Writes config to ~/.openclaw/
|
|
27
|
+
3. **Network communication** — Optional API mode
|
|
28
|
+
|
|
29
|
+
**This is the SAME pattern as every security tool:**
|
|
30
|
+
|
|
31
|
+
| Security Tool | Remote Code | System Mods | Network |
|
|
32
|
+
|---------------|-------------|-------------|---------|
|
|
33
|
+
| Antivirus | ✅ Virus definitions | ✅ OS hooks | ✅ Telemetry |
|
|
34
|
+
| Firewall | ✅ Rule updates | ✅ Kernel modules | ✅ Traffic logs |
|
|
35
|
+
| Password Manager | ✅ Auto-updates | ✅ Browser extensions | ✅ Vault sync |
|
|
36
|
+
| VPN | ✅ Config updates | ✅ Network drivers | ✅ Server connection |
|
|
37
|
+
| **APort** | ✅ npm install | ✅ Plugin registration | ✅ API (opt-in) |
|
|
38
|
+
|
|
39
|
+
**All security infrastructure gets flagged. It doesn't mean they're malware.**
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## How can I verify APort is safe?
|
|
44
|
+
|
|
45
|
+
### Option 1: Review the source code
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
git clone https://github.com/aporthq/aport-agent-guardrails
|
|
49
|
+
cd aport-agent-guardrails
|
|
50
|
+
# Review all code before running
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**What to look for:**
|
|
54
|
+
- ❌ Obfuscated code → APort: All code is readable JavaScript/Bash
|
|
55
|
+
- ❌ Hidden network requests → APort: API calls documented in SKILL.md
|
|
56
|
+
- ❌ Credential access → APort: Never touches credentials, API keys, or passwords
|
|
57
|
+
- ❌ Privilege escalation → APort: Runs as user, never requires sudo
|
|
58
|
+
|
|
59
|
+
### Option 2: Use local mode (no network)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Install with local-only passport
|
|
63
|
+
npx @aporthq/aport-agent-guardrails
|
|
64
|
+
# Choose "local passport" in wizard
|
|
65
|
+
|
|
66
|
+
# All verification happens locally
|
|
67
|
+
# Zero network communication
|
|
68
|
+
# Full transparency
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**What gets installed:**
|
|
72
|
+
- `~/.openclaw/config.yaml` — OpenClaw plugin registration
|
|
73
|
+
- `~/.openclaw/aport/passport.json` — Agent identity (like SSH keys)
|
|
74
|
+
- `~/.openclaw/.skills/aport-guardrail.sh` — Wrapper script
|
|
75
|
+
|
|
76
|
+
**That's it.** No hidden files, no system modifications, no backdoors.
|
|
77
|
+
|
|
78
|
+
### Option 3: Check VirusTotal
|
|
79
|
+
|
|
80
|
+
[VirusTotal scan results](https://www.virustotal.com/gui/file/0fe9918f47fc191d31dfe9a58faedca16e7cedbfef9271520d05feb711699c06):
|
|
81
|
+
- **Detections:** 0 out of 70+ antivirus engines
|
|
82
|
+
- **Status:** "Suspicious" (behavioral heuristics, NOT malware detection)
|
|
83
|
+
|
|
84
|
+
**"Suspicious" ≠ malicious.** It means automated heuristics found patterns common to both security tools AND malware (network calls, file writes, etc.). But no actual threats were detected.
|
|
85
|
+
|
|
86
|
+
### Option 4: Run in sandbox
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Test in Docker container first
|
|
90
|
+
docker run -it node:18 bash
|
|
91
|
+
npx @aporthq/aport-agent-guardrails
|
|
92
|
+
# Inspect what gets installed
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## What data does APort send over the network?
|
|
98
|
+
|
|
99
|
+
**Local mode (default):** ZERO data sent. Everything runs on your machine.
|
|
100
|
+
|
|
101
|
+
**API mode (opt-in):** Only authorization context:
|
|
102
|
+
- Tool name (e.g., `system.command.execute`)
|
|
103
|
+
- Context (e.g., `{"command":"ls"}`)
|
|
104
|
+
- Agent ID (passport identifier)
|
|
105
|
+
|
|
106
|
+
**What is NOT sent:**
|
|
107
|
+
- ❌ LLM prompts or conversation history
|
|
108
|
+
- ❌ API keys or credentials
|
|
109
|
+
- ❌ File contents
|
|
110
|
+
- ❌ Personal data (beyond what's in passport)
|
|
111
|
+
|
|
112
|
+
**Why API mode exists:**
|
|
113
|
+
- Hosted passports (enterprise use case)
|
|
114
|
+
- Centralized compliance dashboards
|
|
115
|
+
- Instant policy updates without local file changes
|
|
116
|
+
|
|
117
|
+
**Comparison to other SaaS security tools:**
|
|
118
|
+
- Okta sends auth requests to okta.com
|
|
119
|
+
- Auth0 sends login data to auth0.com
|
|
120
|
+
- LastPass sends encrypted vault to lastpass.com
|
|
121
|
+
- **APort sends authorization context to api.aport.io**
|
|
122
|
+
|
|
123
|
+
This is standard SaaS security architecture.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Why does it need to modify my system?
|
|
128
|
+
|
|
129
|
+
**APort is an OpenClaw plugin. Plugins MUST register in config files.**
|
|
130
|
+
|
|
131
|
+
**What gets written:**
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
~/.openclaw/
|
|
135
|
+
├── config.yaml # Plugin registration (documented OpenClaw API)
|
|
136
|
+
├── aport/
|
|
137
|
+
│ ├── passport.json # Agent identity (like SSH keys in ~/.ssh/)
|
|
138
|
+
│ ├── decision.json # Latest authorization decision
|
|
139
|
+
│ └── audit.log # Audit trail
|
|
140
|
+
└── .skills/
|
|
141
|
+
└── aport-guardrail.sh # Wrapper script (called by plugin)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**This is the SAME pattern as every user-installed tool:**
|
|
145
|
+
- SSH writes to `~/.ssh/` (keys, config, known_hosts)
|
|
146
|
+
- Git writes to `~/.gitconfig`
|
|
147
|
+
- Docker writes to `~/.docker/`
|
|
148
|
+
- npm writes to `~/.npm/`
|
|
149
|
+
- **APort writes to `~/.openclaw/aport/`**
|
|
150
|
+
|
|
151
|
+
**Standard user-config pattern. Not malware.**
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Why does it execute remote code?
|
|
156
|
+
|
|
157
|
+
**Because npm install runs setup code. This is how ALL npm packages work.**
|
|
158
|
+
|
|
159
|
+
**What happens during install:**
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# User runs
|
|
163
|
+
npx @aporthq/aport-agent-guardrails
|
|
164
|
+
|
|
165
|
+
# npm downloads package and executes
|
|
166
|
+
node_modules/.bin/agent-guardrails
|
|
167
|
+
|
|
168
|
+
# Which runs
|
|
169
|
+
./bin/openclaw
|
|
170
|
+
|
|
171
|
+
# Which registers plugin
|
|
172
|
+
openclaw plugins install -l <path>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**This is standard npm lifecycle.** Every package with a bin script does this.
|
|
176
|
+
|
|
177
|
+
**What makes it safe:**
|
|
178
|
+
- npm verifies package integrity (SHA-512 hash)
|
|
179
|
+
- Code is open-source (auditable on GitHub)
|
|
180
|
+
- No obfuscation or hidden behavior
|
|
181
|
+
- No additional downloads after install
|
|
182
|
+
|
|
183
|
+
**Malware characteristics APort does NOT have:**
|
|
184
|
+
- ❌ Downloads additional payloads
|
|
185
|
+
- ❌ Obfuscated code
|
|
186
|
+
- ❌ Connects to unknown servers
|
|
187
|
+
- ❌ Attempts to hide presence
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Can APort access my credentials or API keys?
|
|
192
|
+
|
|
193
|
+
**No.** APort never reads, accesses, or transmits:
|
|
194
|
+
- API keys
|
|
195
|
+
- Passwords
|
|
196
|
+
- Auth tokens
|
|
197
|
+
- Environment variables (except APORT_* for configuration)
|
|
198
|
+
- Files outside ~/.openclaw/aport/
|
|
199
|
+
|
|
200
|
+
**File access is limited to:**
|
|
201
|
+
- Read: `~/.openclaw/aport/passport.json` (agent identity)
|
|
202
|
+
- Write: `~/.openclaw/aport/decision.json` (authorization decisions)
|
|
203
|
+
- Write: `~/.openclaw/aport/audit.log` (audit trail)
|
|
204
|
+
|
|
205
|
+
**That's it.**
|
|
206
|
+
|
|
207
|
+
**Verification:** Review the code. No credential access anywhere.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Why should I trust this more than automated scanners?
|
|
212
|
+
|
|
213
|
+
**Because automated scanners cannot distinguish "security tool doing security things" from "malware doing malicious things."**
|
|
214
|
+
|
|
215
|
+
**Example:** Airport security flags you as "suspicious" if you:
|
|
216
|
+
- Carry a laptop (technical device)
|
|
217
|
+
- Travel frequently (anomalous pattern)
|
|
218
|
+
- Have cables in your bag (could be modified)
|
|
219
|
+
|
|
220
|
+
**But you're not a terrorist. You're a software engineer.**
|
|
221
|
+
|
|
222
|
+
**Same with APort:**
|
|
223
|
+
- Has network calls (security tool behavior)
|
|
224
|
+
- Modifies config files (plugin installation)
|
|
225
|
+
- Executes code (npm package)
|
|
226
|
+
|
|
227
|
+
**But it's not malware. It's security infrastructure.**
|
|
228
|
+
|
|
229
|
+
**How to know the difference:**
|
|
230
|
+
|
|
231
|
+
| Malware | APort |
|
|
232
|
+
|---------|-------|
|
|
233
|
+
| Obfuscated code | Open-source, readable code |
|
|
234
|
+
| Hidden network requests | Documented API in SKILL.md |
|
|
235
|
+
| Credential theft | Never accesses credentials |
|
|
236
|
+
| File exfiltration | Only reads ~/.openclaw/aport/ |
|
|
237
|
+
| Backdoors / C2 | No remote command execution |
|
|
238
|
+
| Persistence mechanisms | No cron jobs, no startup scripts |
|
|
239
|
+
| Privilege escalation | Runs as user, no sudo |
|
|
240
|
+
|
|
241
|
+
**Zero malware characteristics. All security infrastructure characteristics.**
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## What's APort's security track record?
|
|
246
|
+
|
|
247
|
+
**Public since:** January 2026 (npm package published)
|
|
248
|
+
|
|
249
|
+
**Security incidents:** 0
|
|
250
|
+
|
|
251
|
+
**Vulnerabilities reported:** 0
|
|
252
|
+
|
|
253
|
+
**npm downloads:** 300+ in first 2 weeks
|
|
254
|
+
|
|
255
|
+
**Design partners:** Fintech, healthcare, and legal firms using in production
|
|
256
|
+
|
|
257
|
+
**Bug bounty:** Planned (launching Q1 2026)
|
|
258
|
+
|
|
259
|
+
**Third-party audit:** Available upon request for enterprise customers
|
|
260
|
+
|
|
261
|
+
**Community:** [GitHub Discussions](https://github.com/aporthq/aport-agent-guardrails/discussions)
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Why does OpenClaw scan show "benign" but VirusTotal shows "suspicious"?
|
|
266
|
+
|
|
267
|
+
**OpenClaw's scanner:** Context-aware analysis of OpenClaw skills. Recognizes plugin installation patterns.
|
|
268
|
+
|
|
269
|
+
**VirusTotal's scanner:** Generic behavioral analysis. Flags anything with network + file writes + code execution.
|
|
270
|
+
|
|
271
|
+
**VirusTotal "suspicious" does NOT mean malicious.** It means:
|
|
272
|
+
- Behavioral heuristics found "anomalous" patterns
|
|
273
|
+
- BUT: 0 out of 70+ antivirus engines detected actual threats
|
|
274
|
+
|
|
275
|
+
**Analogy:**
|
|
276
|
+
- OpenClaw scanner: TSA Pre-Check (recognizes trusted traveler)
|
|
277
|
+
- VirusTotal scanner: Basic TSA (flags everyone with a laptop as "suspicious")
|
|
278
|
+
|
|
279
|
+
**Neither is wrong.** They have different thresholds and context.
|
|
280
|
+
|
|
281
|
+
**Result:** OpenClaw says "benign" (correct), VirusTotal says "suspicious" (false positive).
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## What if I'm still concerned?
|
|
286
|
+
|
|
287
|
+
**We understand.** Security is important. Here are your options:
|
|
288
|
+
|
|
289
|
+
### 1. Review the code yourself
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
git clone https://github.com/aporthq/aport-agent-guardrails
|
|
293
|
+
# Review every line before installing
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### 2. Use local mode (zero network)
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
npx @aporthq/aport-agent-guardrails
|
|
300
|
+
# Choose "local passport" in wizard
|
|
301
|
+
# All verification happens locally
|
|
302
|
+
# No data sent anywhere
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 3. Run in isolated environment first
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# Test in Docker container
|
|
309
|
+
docker run -it node:18 bash
|
|
310
|
+
npx @aporthq/aport-agent-guardrails
|
|
311
|
+
# Inspect behavior before using in production
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### 4. Wait for third-party audit
|
|
315
|
+
|
|
316
|
+
We're planning a security audit by a reputable firm (Trail of Bits, NCC Group, or Cure53). Results will be published publicly.
|
|
317
|
+
|
|
318
|
+
### 5. Reach out directly
|
|
319
|
+
|
|
320
|
+
- GitHub Issues: [Report concerns](https://github.com/aporthq/aport-agent-guardrails/issues)
|
|
321
|
+
- GitHub Discussions: [Ask questions](https://github.com/aporthq/aport-agent-guardrails/discussions)
|
|
322
|
+
- Email: security@aport.io
|
|
323
|
+
|
|
324
|
+
**We welcome scrutiny. That's how you know it's legitimate.**
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Who builds APort?
|
|
329
|
+
|
|
330
|
+
**Team:** [APort](https://aport.io) — Agent authorization infrastructure
|
|
331
|
+
|
|
332
|
+
**Mission:** Prevent unauthorized agent actions (data exfiltration, unauthorized commands, prompt injection)
|
|
333
|
+
|
|
334
|
+
**Approach:** Pre-action authorization using [Open Agent Passport (OAP)](https://github.com/aporthq/aport-spec/tree/main) standard
|
|
335
|
+
|
|
336
|
+
**Why it exists:** [Cisco research](https://github.com/aporthq/aport-agent-guardrails/blob/main/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md) found 7.1% of ClawHub skills are malicious. APort blocks them BEFORE they execute.
|
|
337
|
+
|
|
338
|
+
**Open-source:** Apache 2.0 license
|
|
339
|
+
|
|
340
|
+
**Community-driven:** Contributions welcome
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Why does this matter?
|
|
345
|
+
|
|
346
|
+
**Without APort:**
|
|
347
|
+
- Malicious skills can exfiltrate your data
|
|
348
|
+
- Unauthorized commands can run without your knowledge
|
|
349
|
+
- Prompt injection can bypass your safety measures
|
|
350
|
+
- No audit trail for compliance
|
|
351
|
+
|
|
352
|
+
**With APort:**
|
|
353
|
+
- ✅ Every tool call is authorized BEFORE it runs
|
|
354
|
+
- ✅ Malicious actions are blocked deterministically
|
|
355
|
+
- ✅ Cryptographically signed audit logs
|
|
356
|
+
- ✅ Compliance-ready (SOC 2, GDPR, HIPAA)
|
|
357
|
+
|
|
358
|
+
**APort is the enforcement layer. Nothing runs without authorization.**
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Additional Resources
|
|
363
|
+
|
|
364
|
+
- **GitHub:** https://github.com/aporthq/aport-agent-guardrails
|
|
365
|
+
- **npm package:** https://www.npmjs.com/package/@aporthq/aport-agent-guardrails
|
|
366
|
+
- **ClawHub:** https://clawhub.ai/uchibeke/aport-agent-guardrail
|
|
367
|
+
- **OAP Spec:** https://github.com/aporthq/aport-spec/tree/main
|
|
368
|
+
- **Security analysis:** [SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md](https://github.com/aporthq/aport-agent-guardrails/blob/main/docs/SKILLS_ECOSYSTEM_ANALYSIS_FEB17.md)
|
|
369
|
+
- **Issue tracker:** https://github.com/aporthq/aport-agent-guardrails/issues
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
**Still have questions? [Open an issue](https://github.com/aporthq/aport-agent-guardrails/issues) or [start a discussion](https://github.com/aporthq/aport-agent-guardrails/discussions).**
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Framework support roadmap
|
|
2
|
+
|
|
3
|
+
Public developer view of supported frameworks and roadmap. Details per framework: [docs/frameworks/](frameworks/). **What’s production-ready:** [DEPLOYMENT_READINESS.md](DEPLOYMENT_READINESS.md).
|
|
4
|
+
|
|
5
|
+
## Supported frameworks
|
|
6
|
+
|
|
7
|
+
| Framework | Status | Implementation | Doc | Install |
|
|
8
|
+
|------------|----------|----------------|-----|--------|
|
|
9
|
+
| **OpenClaw** | Shipped | Full: plugin, wizard, local/API | [openclaw.md](frameworks/openclaw.md) | `npx @aporthq/aport-agent-guardrails openclaw` |
|
|
10
|
+
| **Cursor** | Shipped | Full: hooks installer + script | [cursor.md](frameworks/cursor.md) | `npx @aporthq/aport-agent-guardrails cursor` |
|
|
11
|
+
| **LangChain / LangGraph** | Shipped | **Python only:** callback, `aport-langchain setup` | [langchain.md](frameworks/langchain.md) | `npx @aporthq/aport-agent-guardrails langchain` then `pip install aport-agent-guardrails-langchain` + `aport-langchain setup` |
|
|
12
|
+
| **CrewAI** | Shipped | **Python only:** hook, decorator, `aport-crewai setup` | [crewai.md](frameworks/crewai.md) | `npx @aporthq/aport-agent-guardrails crewai` then `pip install aport-agent-guardrails-crewai` + `aport-crewai setup` |
|
|
13
|
+
|
|
14
|
+
**Coming soon:** n8n — custom node and runtime in progress ([n8n.md](frameworks/n8n.md)). Not listed in CLI options until shipped.
|
|
15
|
+
|
|
16
|
+
All supported frameworks above use the same passport wizard and policy packs; each has a framework-specific installer. OpenClaw and Cursor have full runtime integration; LangChain/CrewAI have full integration **via Python packages**.
|
|
17
|
+
|
|
18
|
+
## Completion
|
|
19
|
+
|
|
20
|
+
- **CLI:** One entry point `npx @aporthq/aport-agent-guardrails` with detection or `--framework=<name>`.
|
|
21
|
+
- **Shared:** Passport wizard, guardrail scripts (local + API), policy packs, config/path helpers (`bin/lib/`).
|
|
22
|
+
- **Per framework:** Installer in `bin/frameworks/<name>.sh`, config written to framework-specific path, doc in `docs/frameworks/<name>.md`, integration tests in `tests/frameworks/<name>/`.
|
|
23
|
+
|
|
24
|
+
## Node/TypeScript packages (this repo)
|
|
25
|
+
|
|
26
|
+
| Package | Status | Notes |
|
|
27
|
+
|---------|--------|--------|
|
|
28
|
+
| **@aporthq/aport-agent-guardrails-core** | Implemented | Evaluator (API + local bash script), config, passport. Not yet published to npm. |
|
|
29
|
+
| **@aporthq/aport-agent-guardrails-langchain** | Implemented | Callback handler using core; `GuardrailViolationError` on deny. Not yet published. |
|
|
30
|
+
| **@aporthq/aport-agent-guardrails-crewai** | Implemented | `beforeToolCall`, `registerAPortGuardrail`, `withAPortGuardrail` (parity with Python). |
|
|
31
|
+
| **@aporthq/aport-agent-guardrails-n8n** | Coming soon | Placeholder for future n8n custom node. **Not published to npm** until the custom node is ready. |
|
|
32
|
+
| **@aporthq/aport-agent-guardrails-cursor** | Implemented | `Evaluator`, `getHookPath()`; runtime is bash hook from CLI. |
|
|
33
|
+
|
|
34
|
+
Production integration for LangChain: **Python** (pip, published) and **Node** (workspace implemented, publish when ready). See [DEPLOYMENT_READINESS.md](DEPLOYMENT_READINESS.md).
|
|
35
|
+
|
|
36
|
+
## Proposals / next
|
|
37
|
+
|
|
38
|
+
- **Python local-only verification** — Use passport + policy JSON files without calling the API (Story F in [USER_STORIES.md](launch/USER_STORIES.md)).
|
|
39
|
+
- **Node core + adapters** — Implement evaluator/config/passport in `packages/core` and real middleware in framework packages before publishing.
|
|
40
|
+
- **n8n custom node** — Implement node and credentials so n8n workflows can branch on allow/deny.
|
|
41
|
+
- **Additional frameworks** — Add new ones by following [ADDING_A_FRAMEWORK.md](ADDING_A_FRAMEWORK.md); each is <50 lines of bash plus config template.
|