Trusted — Risk Score 5/100
Last scan:2 days ago Rescan
5 /100
openclaw-rp-plugin
SillyTavern-compatible roleplay plugin for OpenClaw with long memory, multimodal output, and Generative-Agents-style companion
这是一个合法的 OpenClaw SillyTavern 角色扮演插件。预扫描标记的 5 个 base64 IOC 均为文件解析功能(处理角色卡附件、媒体文件、data URL),不存在代码混淆或恶意执行。插件无 shell 执行、凭证收割、敏感路径遍历等高危行为。
Skill Nameopenclaw-rp-plugin
Duration51.5s
Enginepi
Safe to install
该技能可安全使用。Base64 编解码仅用于 SillyTavern PNG 角色卡解析和附件导入,属于正常文件处理功能。

Findings 4 items

Severity Finding Location
Info
Base64 编解码用于文件解析(误报排除)
预扫描标记的 5 处 Buffer.from(..., 'base64') 均为合法用途:(1) commandRouter.js:100 附件内容解码,(2) commandRouter.js:141 data URL 解析,(3) register.js:148 媒体文件存储,(4) attachments.js:16 附件处理,(5) png.js:34 SillyTavern PNG 角色卡 tEXt chunk 解析。这些是标准的文件导入功能,不是代码混淆。
decoded = Buffer.from(encoded, 'base64').toString('utf8')
→ 无需修改,这些是 SillyTavern 角色卡 PNG 格式的规范解析方式
src/utils/png.js:34
Info
ffmpeg 调用为合法媒体转码
register.js:127-139 使用 execFile('ffmpeg') 将 PCM 音频转码为 MP3,这是 TTS 功能的必要组成部分。用户需安装 ffmpeg 作为可选依赖。
await execFileAsync('ffmpeg', ['-hide_banner', '-loglevel', 'error', '-y', '-f', 's16le', ...])
→ 无需修改,ffmpeg 是标准媒体处理工具
src/openclaw/register.js:127
Low
SOUL.md 写入功能
sync-agent-persona 命令可将 RP 角色信息写入 Agent 的 SOUL.md 文件,使用标记块隔离管理内容。这是合法的 Agent Persona 同步功能。
MANAGED_SOUL_BEGIN / MANAGED_SOUL_END 标记块
→ 确保标记块机制正确隔离 RP 内容
src/openclaw/agentPersona.js:1
Info
配置读取 ~/.openclaw
插件读取 ~/.openclaw/openclaw-rp/provider.json 和 openclaw.json 获取配置,这是标准插件配置机制。
loadProviderFileConfig() / loadOpenClawFileConfig()
→ 无需修改,配置文件在插件目录内
src/openclaw/register.js:1150
ResourceDeclaredInferredStatusEvidence
Filesystem WRITE WRITE ✓ Aligned 写入 ~/.openclaw/ 配置、媒体目录
Network READ READ ✓ Aligned fetch() 外部 URL 用于导入,API 调用 OpenAI/Gemini
Shell NONE NONE execFile('ffmpeg') 用于 PCM→MP3 转码,合法 CLI 工具
Database WRITE WRITE ✓ Aligned SQLite 本地存储 rp_sessions、turns、assets
5 Critical 9 findings
🔒
Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(attachment.content, "base64"
src/core/commandRouter.js:100
🔒
Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(match[2], "base64"
src/core/commandRouter.js:141
🔒
Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(dataUrl.base64, "base64"
src/openclaw/register.js:148
🔒
Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(resolved, "base64"
src/utils/attachments.js:16
🔒
Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(encoded, "base64"
src/utils/png.js:34
🔗
Medium External URL 外部 URL
https://arxiv.org/abs/2304.03442
README.md:7
🔗
Medium External URL 外部 URL
https://example.local/audio.mp3
examples/smoke-run.js:26
🔗
Medium External URL 外部 URL
https://example.local/image.png
examples/smoke-run.js:31
🔗
Medium External URL 外部 URL
https://api.telegram.org
src/providers/attachmentResolvers.js:52

File Tree

70 files · 360.8 KB · 11857 lines
JavaScript 61f · 10617L Markdown 7f · 1143L JSON 2f · 97L
├─ 📁 docs
│ ├─ 📝 ARCHITECTURE.md Markdown 176L · 5.9 KB
│ └─ 📝 ARCHITECTURE.zh-CN.md Markdown 175L · 5.6 KB
├─ 📁 examples
│ ├─ 📜 openclaw-rp-bootstrap.js JavaScript 59L · 1.5 KB
│ └─ 📜 smoke-run.js JavaScript 61L · 1.8 KB
├─ 📁 src
│ ├─ 📁 channels
│ │ └─ 📜 adapters.js JavaScript 119L · 2.7 KB
│ ├─ 📁 core
│ │ ├─ 📜 commandRouter.js JavaScript 1189L · 38.0 KB
│ │ ├─ 📜 defaultPreset.js JavaScript 98L · 3.0 KB
│ │ ├─ 📜 lorebookMatcher.js JavaScript 41L · 1.2 KB
│ │ ├─ 📜 modelConfigResolver.js JavaScript 87L · 2.5 KB
│ │ ├─ 📜 promptBuilder.js JavaScript 153L · 4.9 KB
│ │ ├─ 📜 rateLimiter.js JavaScript 20L · 558 B
│ │ ├─ 📜 retry.js JavaScript 42L · 974 B
│ │ ├─ 📜 sessionManager.js JavaScript 779L · 25.1 KB
│ │ └─ 📜 sessionMutex.js JavaScript 26L · 559 B
│ ├─ 📁 importers
│ │ ├─ 📜 cardImporter.js JavaScript 163L · 4.1 KB
│ │ ├─ 📜 lorebookImporter.js JavaScript 73L · 2.4 KB
│ │ └─ 📜 presetImporter.js JavaScript 84L · 2.4 KB
│ ├─ 📁 openclaw
│ │ ├─ 📜 agentImageTool.js JavaScript 172L · 5.5 KB
│ │ ├─ 📜 agentPersona.js JavaScript 164L · 5.3 KB
│ │ ├─ 📜 autoImage.js JavaScript 250L · 6.5 KB
│ │ ├─ 📜 i18n.js JavaScript 111L · 3.9 KB
│ │ ├─ 📜 nodeSqliteCompat.js JavaScript 51L · 956 B
│ │ └─ 📜 register.js JavaScript 2165L · 63.8 KB
│ ├─ 📁 providers
│ │ ├─ 📜 attachmentResolvers.js JavaScript 103L · 2.8 KB
│ │ ├─ 📜 gemini.js JavaScript 290L · 10.6 KB
│ │ └─ 📜 openaiCompatible.js JavaScript 267L · 7.1 KB
│ ├─ 📁 store
│ │ ├─ 📜 inMemoryStore.js JavaScript 479L · 15.1 KB
│ │ ├─ 📜 schema.js JavaScript 120L · 3.8 KB
│ │ └─ 📜 sqliteStore.js JavaScript 772L · 23.2 KB
│ ├─ 📁 utils
│ │ ├─ 📜 attachments.js JavaScript 68L · 1.5 KB
│ │ ├─ 📜 commandParser.js JavaScript 92L · 1.8 KB
│ │ ├─ 📜 id.js JavaScript 10L · 259 B
│ │ ├─ 📜 imageIntent.js JavaScript 221L · 6.2 KB
│ │ ├─ 📜 multilingualEmbedding.js JavaScript 139L · 3.6 KB
│ │ ├─ 📜 png.js JavaScript 52L · 1.7 KB
│ │ ├─ 📜 sessionKey.js JavaScript 15L · 542 B
│ │ ├─ 📜 textCleaner.js JavaScript 104L · 3.2 KB
│ │ ├─ 🔑 tiktokenEstimator.js JavaScript 18L · 456 B
│ │ ├─ 📜 timeout.js JavaScript 21L · 539 B
│ │ └─ 🔑 tokenEstimator.js JavaScript 16L · 482 B
│ ├─ 📜 errors.js JavaScript 35L · 691 B
│ ├─ 📜 index.js JavaScript 28L · 1.2 KB
│ ├─ 📜 openclawIntegration.js JavaScript 63L · 1.6 KB
│ ├─ 📜 plugin.js JavaScript 154L · 4.7 KB
│ └─ 📜 types.js JavaScript 50L · 1.3 KB
├─ 📁 tests
│ ├─ 📜 agentImageTool.test.js JavaScript 99L · 2.8 KB
│ ├─ 📜 agentPersona.test.js JavaScript 83L · 2.7 KB
│ ├─ 📜 attachmentResolvers.test.js JavaScript 86L · 2.2 KB
│ ├─ 📜 cardImporter.test.js JavaScript 58L · 1.4 KB
│ ├─ 📜 channelsAdapter.test.js JavaScript 59L · 1.6 KB
│ ├─ 📜 commandParser.test.js JavaScript 15L · 588 B
│ ├─ 📜 hooksAndPolicies.test.js JavaScript 331L · 9.7 KB
│ ├─ 📜 imageIntent.test.js JavaScript 84L · 2.4 KB
│ ├─ 📜 integrationHandlers.test.js JavaScript 135L · 3.5 KB
│ ├─ 📜 lorebookMatcher.test.js JavaScript 21L · 847 B
│ ├─ 📜 openaiCompatibleProvider.test.js JavaScript 124L · 3.4 KB
│ ├─ 📜 openclawAutoImage.test.js JavaScript 210L · 5.5 KB
│ ├─ 📜 pluginStoreSelection.test.js JavaScript 31L · 748 B
│ ├─ 📜 promptBuilder.test.js JavaScript 31L · 1.0 KB
│ ├─ 📜 ragMemory.test.js JavaScript 86L · 2.4 KB
│ ├─ 📜 routerFlow.test.js JavaScript 116L · 3.9 KB
│ ├─ 📜 textCleaner.test.js JavaScript 13L · 690 B
│ └─ 🔑 tokenEstimatorFactory.test.js JavaScript 11L · 426 B
├─ 📝 CHANGELOG.md Markdown 47L · 3.6 KB
├─ 📝 CHANGELOG.zh.md Markdown 41L · 3.0 KB
├─ 📋 openclaw.plugin.json JSON 49L · 1.2 KB
├─ 📋 package.json JSON 48L · 1.5 KB
├─ 📝 README.md Markdown 263L · 9.1 KB
├─ 📝 README.zh.md Markdown 262L · 9.3 KB
└─ 📝 SKILL.md Markdown 179L · 6.3 KB

Dependencies 3 items

PackageVersionSourceKnown VulnsNotes
better-sqlite3 ^9.0.0 npm No 可选依赖,用于 SQLite 持久化
js-tiktoken ^1.0.0 npm No 可选依赖,用于 token 计数
openclaw * npm No peer dependency,插件宿主

Security Positives

✓ 代码结构清晰,遵循 OpenClaw 插件规范
✓ 有完整的测试套件(31 个测试文件)
✓ 使用标记块隔离 SOUL.md 管理内容,防止污染
✓ 无动态代码执行、eval、命令注入
✓ SQLite 数据库存储在本地,无敏感数据外传
✓ API 密钥通过环境变量或配置文件获取,无硬编码