低风险 — 风险评分 25/100
上次扫描:3 小时前 重新扫描
25 /100
ludwitt-university
AI agent 在 Ludwitt 大学平台进行自适应学习、构建交付物、同行评审的技能
Ludwitt University 是一个合法的 AI 教育平台技能,核心功能为 API 客户端(轮询状态 + CLI 命令),但存在未声明的自动更新机制(含远程 shell 执行)和 install.sh 的 curl|sh 安装模式,需要使用者知晓并主动确认,风险整体可控。
技能名称ludwitt-university
分析耗时86.5s
引擎pi
ClawHub Ludwitt University v3.107.0 by rogersuperbuilderalpha
📥 351
ClawHub 判定 可疑 llm_suspiciouspotential_exfiltrationvt_suspicious
可以安装
使用前确认:(1) 了解 install.sh 会生成机器指纹并注册到 ludwitt.com;(2) 了解 daemon 会每 10 分钟轮询 API 并写入本地状态文件;(3) 接受 curl|sh 远程安装模式的风险。

安全发现 4 项

严重性 安全发现 位置
中危
未声明的远程 shell 自动更新机制 代码混淆
daemon.js:checkUpdateAvailable() 从服务器响应中提取 updateInstructions 字段,输出为 'curl -sSL https://opensource.ludwitt.com/install | sh'。如果服务器被入侵,攻击者可替换 updateInstructions 为任意命令字符串,导致在 agent 控制台显示时执行任意 shell 命令。注意:这是服务器端攻击面,不在 skill 代码本身。
console.error(`[ludwitt] A new API version is available... Update: ${result.updateInstructions || 'curl -sSL https://opensource.ludwitt.com/install | sh'}`)
→ 将 updateInstructions 从服务器控制改为客户端白名单验证,仅允许已知版本号而非任意字符串。
daemon.js:42
低危
框架检测阴影功能 文档欺骗
install.sh:94-109 检测 OPENCLAW_STATE_DIR、CURSOR_SESSION_ID、CLAUDE_CODE_SESSION 环境变量及 ~/.openclaw、~/.cursor 目录,将检测结果(openclaw/cursor/claude-code/generic)记录到日志并发送至服务器。这些环境变量/目录的存在性在 SKILL.md 中完全未声明。
detect_framework() { if [ -n "${OPENCLAW_STATE_DIR:-}" ] || [ -d "$HOME/.openclaw" ]; then echo "openclaw" ... }
→ 在 SKILL.md 的 Required Capabilities 表中声明此项,或移除非必要检测。
install.sh:94
低危
curl|sh 远程脚本执行 供应链
SKILL.md 的安装方式 B 和 daemon.js 中的更新提示均使用 curl -sSL URL | sh 从远程 URL 拉取并直接执行 shell 脚本。这种模式本身存在中间人注入风险(若未使用 HTTPS 验签或 curl 无 --cacert),且无法验证脚本内容。
curl -sSL https://opensource.ludwitt.com/install | sh
→ 优先使用本地克隆方式安装(Option A: clawhub / Option C: git clone 后本地执行),避免 curl|sh 模式。
daemon.js:42
低危
后台守护进程持久化 持久化
install.sh:218-280 在 macOS (launchd) 和 Linux (systemd) 上注册后台服务,开机自启 daemon.js 进程,持续每 10 分钟轮询 API。这是合法的功能性设计,但确实改变了系统持久化状态。
launchctl load "$plist" ... systemctl --user enable ludwitt-daemon
→ 在 SKILL.md 中明确声明会安装后台服务(RunAtLoad),让使用者知情。
install.sh:218
资源类型声明权限推断权限状态证据
命令执行 NONE WRITE ✓ 一致 install.sh:42 — curl -sSL https://opensource.ludwitt.com/install | sh 远程安装;daemo…
文件系统 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_DI…
1 严重 6 项发现
💀
严重 危险命令 危险 Shell 命令
curl -sSL https://opensource.ludwitt.com/install | sh
daemon.js:42
🔗
中危 外部 URL 外部 URL
https://opensource.ludwitt.com
README.md:34
🔗
中危 外部 URL 外部 URL
https://your-deployed-app.vercel.app
SKILL.md:181
🔗
中危 外部 URL 外部 URL
https://www.youtube.com/watch?v=...
SKILL.md:183
🔗
中危 外部 URL 外部 URL
https://opensource.ludwitt.com/install
daemon.js:42
🔗
中危 外部 URL 外部 URL
http://www.apple.com/DTDs/PropertyList-1.0.dtd
install.sh:216

目录结构

4 文件 · 52.0 KB · 1419 行
JavaScript 1f · 728L Markdown 2f · 368L Shell 1f · 323L
├─ 📜 daemon.js JavaScript 728L · 22.8 KB
├─ 🔧 install.sh Shell 323L · 13.7 KB
├─ 📝 README.md Markdown 105L · 3.7 KB
└─ 📝 SKILL.md Markdown 263L · 11.7 KB

依赖分析 1 项

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

安全亮点

✓ 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 请求有超时和重试机制