Trusted — Risk Score 5/100
Last scan:2 days ago Rescan
5 /100
zulip-bridge
High-performance Zulip bridge skill for OpenClaw
Legitimate Zulip messaging bridge plugin with no malicious behavior, proper credential handling, and strong security controls including SSRF protection, path traversal mitigation, and local file exfiltration prevention.
Skill Namezulip-bridge
Duration53.8s
Enginepi
Safe to install
This skill is safe to use. No security concerns identified.

Findings 1 items

Severity Finding Location
Low
Filesystem read access for config loading Sensitive Access
The skill reads configuration from ~/.openclaw/openclaw.json. This is necessary for the core messaging functionality and documented in SKILL.md.
process.env.ZULIP_API_KEY?.trim()
→ No action needed. This is legitimate access for credential retrieval.
src/zulip/accounts.ts:84
ResourceDeclaredInferredStatusEvidence
Network READ READ ✓ Aligned HTTP requests only to configured Zulip server
Environment READ READ ✓ Aligned Only reads ZULIP_API_KEY, ZULIP_EMAIL, ZULIP_URL (legitimate)
Filesystem NONE READ ✓ Aligned Reads ~/.openclaw/openclaw.json; temp files for uploads (both documented and nec…
Shell NONE NONE No subprocess/exec calls found
Skill Invoke NONE NONE No skill invocation
Clipboard NONE NONE No clipboard access
Browser NONE NONE No browser access
Database NONE NONE No database access
1 High 15 findings
🔑
High API Key 疑似硬编码凭证
apiKey: "other-config-api-key"
test/accounts.test.ts:74
🔗
Medium External URL 外部 URL
https://chat.example.com
docs/config.md:14
🔗
Medium External URL 外部 URL
https://staging.example.com
docs/config.md:142
🔗
Medium External URL 外部 URL
https://chat.example.com.
src/config-ui-hints.ts:18
🔗
Medium External URL 外部 URL
https://docs.openclaw.ai/channels/zulip
src/onboarding.ts:27
🔗
Medium External URL 外部 URL
https://env.zulipchat.com
test/accounts.test.ts:20
🔗
Medium External URL 外部 URL
https://config.zulipchat.com
test/accounts.test.ts:47
🔗
Medium External URL 外部 URL
https://other.zulipchat.com
test/accounts.test.ts:76
🔗
Medium External URL 外部 URL
https://zulip.example.com
test/client.test.ts:16
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/1/abc/test.png
test/path-traversal.test.ts:7
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/3/hash789/full.pdf
test/smoke.test.ts:14
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/1/abc-123/file.png
test/smoke.test.ts:20
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/2/xyz_456/another.jpg
test/smoke.test.ts:21
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/malformed/url
test/smoke.test.ts:23
🔗
Medium External URL 外部 URL
https://zulip.example.com/user_uploads/1/too-short
test/smoke.test.ts:24

File Tree

46 files · 223.1 KB · 6956 lines
TypeScript 34f · 6178L Markdown 7f · 602L JSON 4f · 158L JavaScript 1f · 18L
├─ 📁 docs
│ ├─ 📁 archive
│ │ ├─ 📝 zulip-bridge-audit.md Markdown 39L · 1.5 KB
│ │ └─ 📝 zulip-bridge-fix-plan.md Markdown 65L · 1.9 KB
│ ├─ 📝 config.md Markdown 154L · 6.4 KB
│ ├─ 📝 observability.md Markdown 62L · 3.2 KB
│ └─ 📝 smoke-test.md Markdown 83L · 3.8 KB
├─ 📁 src
│ ├─ 📁 zulip
│ │ ├─ 📜 accounts.ts TypeScript 170L · 5.6 KB
│ │ ├─ 📜 client.ts TypeScript 922L · 27.5 KB
│ │ ├─ 📜 dedupe-store.ts TypeScript 121L · 3.3 KB
│ │ ├─ 📜 monitor-helpers.ts TypeScript 224L · 6.2 KB
│ │ ├─ 📜 monitor.ts TypeScript 967L · 29.6 KB
│ │ ├─ 📜 policy.ts TypeScript 73L · 2.2 KB
│ │ ├─ 📜 probe.ts TypeScript 66L · 1.8 KB
│ │ ├─ 📜 queue-manager.ts TypeScript 191L · 5.6 KB
│ │ ├─ 📜 send.ts TypeScript 264L · 8.0 KB
│ │ └─ 📜 uploads.ts TypeScript 105L · 3.0 KB
│ ├─ 📜 actions.ts TypeScript 866L · 28.4 KB
│ ├─ 📜 channel.ts TypeScript 283L · 9.8 KB
│ ├─ 📜 config-schema.ts TypeScript 64L · 2.2 KB
│ ├─ 📜 config-ui-hints.ts TypeScript 68L · 2.4 KB
│ ├─ 📜 group-mentions.ts TypeScript 10L · 359 B
│ ├─ 📜 normalize.ts TypeScript 45L · 1.3 KB
│ ├─ 📜 onboarding-helpers.ts TypeScript 44L · 1.4 KB
│ ├─ 📜 onboarding.ts TypeScript 377L · 13.1 KB
│ ├─ 📜 runtime.ts TypeScript 14L · 325 B
│ ├─ 📜 setup-core.ts TypeScript 65L · 2.5 KB
│ ├─ 📜 setup-surface.ts TypeScript 155L · 5.5 KB
│ └─ 📜 types.ts TypeScript 72L · 2.8 KB
├─ 📁 test
│ ├─ 📜 accounts.test.ts TypeScript 88L · 2.8 KB
│ ├─ 📜 client.test.ts TypeScript 41L · 1.3 KB
│ ├─ 📜 dedupe-store.test.ts TypeScript 127L · 3.8 KB
│ ├─ 📜 monitor-regression.test.ts TypeScript 12L · 513 B
│ ├─ 📜 path-traversal.test.ts TypeScript 58L · 2.1 KB
│ ├─ 📜 policy.test.ts TypeScript 293L · 8.4 KB
│ ├─ 📜 queue-manager.test.ts TypeScript 134L · 3.3 KB
│ ├─ 📜 send-security.test.ts TypeScript 69L · 1.8 KB
│ └─ 📜 smoke.test.ts TypeScript 89L · 3.1 KB
├─ 📁 types
│ └─ 📜 openclaw-plugin-sdk.d.ts TypeScript 80L · 2.9 KB
├─ 📜 index.ts TypeScript 17L · 549 B
├─ 📋 openclaw.plugin.json JSON 64L · 1.6 KB
├─ 📋 package.json JSON 52L · 1.3 KB
├─ 📝 README.md Markdown 160L · 6.8 KB
├─ 📜 setup-entry.ts TypeScript 4L · 168 B
├─ 📝 SKILL.md Markdown 39L · 1.7 KB
├─ 📜 test-loader.js JavaScript 18L · 688 B
├─ 📋 tsconfig.build.json JSON 15L · 272 B
└─ 📋 tsconfig.json JSON 27L · 520 B

Dependencies 2 items

PackageVersionSourceKnown VulnsNotes
openclaw >=2026.3.23 <2027 peerDependency No Peer dependency, platform-provided
zod indirect via overrides npm No Override to prevent unused dependency bloat

Security Positives

✓ SSRF protection: upload downloads restricted to configured Zulip server origin (src/zulip/uploads.ts:100-101)
✓ Path traversal sanitization: Content-Disposition filenames sanitized with path.basename() (src/zulip/uploads.ts:70)
✓ Local file exfiltration prevention: mediaUrl rejects non-HTTP protocols with security warning logging (src/zulip/send.ts:146-150)
✓ Realm setting allowlist: Only safe settings like 'name', 'description' can be updated (src/actions.ts:36)
✓ String length validation: All user inputs capped at 10000 chars to prevent DoS
✓ No external network calls outside of the configured Zulip server
✓ No obfuscation, no base64-encoded payloads, no eval() calls
✓ Comprehensive security test suite including path-traversal and send-security tests
✓ Credential access limited to ZULIP_* prefixed env vars only for the default account
✓ Minimal dependencies with no untrusted external packages