安全决策报告

ludwitt-university

Ludwitt University 是一个合法的 AI 教育平台技能,核心功能为 API 客户端(轮询状态 + CLI 命令),但存在未声明的自动更新机制(含远程 shell 执行)和 install.sh 的 curl|sh 安装模式,需要使用者知晓并主动确认,风险整体可控。

安装决策优先 来源: ClawHub 扫描时间: 2026/4/7
文件 4
IOC 6
越权项 0
发现 4

为什么得出这个结论

1/4 个维度触发
通过
声明与实际能力

声明资源与推断能力基本一致。

阻止
隐藏执行与外联

提取到 1 个高危 IOC 或外联信号。

通过
攻击链与高危发现

没有形成明确的恶意路径。

通过
依赖与供应链卫生

依赖结构存在,但暂未看到明显高危告警。

风险分是怎么被拉高的

未声明的自动更新机制(含远程 shell 执行) +15

daemon.js:42 checkUpdateAvailable() 会输出 'curl -sSL https://opensource.ludwitt.com/install | sh' 作为更新指令,服务器可控制此字符串注入任意命令,需服务器被攻破才可利用。

框架检测读取未声明的环境变量 +5

install.sh:94-109 检测 CURSOR_SESSION_ID、CLAUDE_CODE_SESSION、OPENCLAW_STATE_DIR 等环境变量并记录框架类型,未在 SKILL.md 中声明。

curl|sh 远程安装模式 +5

SKILL.md 虽提及但非强制,install.sh 本身从远程 URL 拉取并执行脚本,是行业常见但本身有风险的模式。

最关键的证据

中危 代码混淆

未声明的远程 shell 自动更新机制

daemon.js:checkUpdateAvailable() 从服务器响应中提取 updateInstructions 字段,输出为 'curl -sSL https://opensource.ludwitt.com/install | sh'。如果服务器被入侵,攻击者可替换 updateInstructions 为任意命令字符串,导致在 agent 控制台显示时执行任意 shell 命令。注意:这是服务器端攻击面,不在 skill 代码本身。

daemon.js:42
将 updateInstructions 从服务器控制改为客户端白名单验证,仅允许已知版本号而非任意字符串。
低危 文档欺骗

框架检测阴影功能

install.sh:94-109 检测 OPENCLAW_STATE_DIR、CURSOR_SESSION_ID、CLAUDE_CODE_SESSION 环境变量及 ~/.openclaw、~/.cursor 目录,将检测结果(openclaw/cursor/claude-code/generic)记录到日志并发送至服务器。这些环境变量/目录的存在性在 SKILL.md 中完全未声明。

install.sh:94
在 SKILL.md 的 Required Capabilities 表中声明此项,或移除非必要检测。
低危 供应链

curl|sh 远程脚本执行

SKILL.md 的安装方式 B 和 daemon.js 中的更新提示均使用 curl -sSL URL | sh 从远程 URL 拉取并直接执行 shell 脚本。这种模式本身存在中间人注入风险(若未使用 HTTPS 验签或 curl 无 --cacert),且无法验证脚本内容。

daemon.js:42
优先使用本地克隆方式安装(Option A: clawhub / Option C: git clone 后本地执行),避免 curl|sh 模式。
低危 持久化

后台守护进程持久化

install.sh:218-280 在 macOS (launchd) 和 Linux (systemd) 上注册后台服务,开机自启 daemon.js 进程,持续每 10 分钟轮询 API。这是合法的功能性设计,但确实改变了系统持久化状态。

install.sh:218
在 SKILL.md 中明确声明会安装后台服务(RunAtLoad),让使用者知情。

声明能力 vs 实际能力

命令执行 通过
声明 NONE
→
推断 WRITE
install.sh:42 — curl -sSL https://opensource.ludwitt.com/install | sh 远程安装;daemon.js:42 — 输出远程 sh 更新指令(阴影功能,未在 SKILL.md 声明)
文件系统 通过
声明 NONE
→
推断 WRITE
SKILL.md 声明需要文件读写;daemon.js 写入 ~/.ludwitt/*.md, auth.json
网络访问 通过
声明 NONE
→
推断 READ
SKILL.md 声明需要网络访问;daemon.js 向 opensource.ludwitt.com 发送 API 请求
环境变量 通过
声明 NONE
→
推断 READ
install.sh:94-109 — 检测 CURSOR_SESSION_ID, CLAUDE_CODE_SESSION, OPENCLAW_STATE_DIR 并写入日志

可疑产物与外联

严重 危险命令
curl -sSL https://opensource.ludwitt.com/install | sh

daemon.js:42

中危 外部 URL
https://opensource.ludwitt.com

README.md:34

中危 外部 URL
https://your-deployed-app.vercel.app

SKILL.md:181

中危 外部 URL
https://www.youtube.com/watch?v=...

SKILL.md:183

中危 外部 URL
https://opensource.ludwitt.com/install

daemon.js:42

中危 外部 URL
http://www.apple.com/DTDs/PropertyList-1.0.dtd

install.sh:216

依赖与供应链

包名版本来源漏洞备注
node (runtime) 18+ system 否 仅依赖 Node.js 运行时,无 npm 第三方依赖包,纯原生实现

文件构成

4 个文件 · 1419 行
JavaScript 1 个文件 · 728 行Markdown 2 个文件 · 368 行Shell 1 个文件 · 323 行
需关注文件 · 4
daemon.js JavaScript · 728 行
未声明的远程 shell 自动更新机制 · curl|sh 远程脚本执行 · curl -sSL https://opensource.ludwitt.com/install | sh · https://opensource.ludwitt.com/install
install.sh Shell · 323 行
框架检测阴影功能 · 后台守护进程持久化 · http://www.apple.com/DTDs/PropertyList-1.0.dtd
SKILL.md Markdown · 263 行
https://your-deployed-app.vercel.app · https://www.youtube.com/watch?v=...
README.md Markdown · 105 行
https://opensource.ludwitt.com

安全亮点

SKILL.md 详细声明了所需权限(代码执行、部署、GitHub、文件读写),且明确要求用户确认后才注册
API key 和 fingerprint 存储在 ~/.ludwitt/auth.json,权限设为 600(仅所有者可读),符合最佳实践
README.md 链接到真实 GitHub 仓库(rogerSuperBuilderAlpha/ludwitt-openclaw),AGPL-3.0 许可证可追溯
daemon.js 使用环境变量(LUDWITT_REQUEST_TIMEOUT_MS, LUDWITT_REQUEST_RETRIES)配置网络行为,不硬编码敏感值
无 base64 编码、eval()、反向 shell 等典型恶意指标
无遍历环境变量收割凭证的行为
代码结构清晰,HTTP 请求有超时和重试机制