Skill Trust Decision

ludwitt-university

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

Install decision first Source: ClawHub Scanned: Apr 7, 2026
Files 4
Artifacts 6
Violations 0
Findings 4

Why this conclusion was reached

1/4 dimensions flagged
Pass
Declared vs actual capability

Declared resources and inferred behavior are broadly aligned.

Block
Hidden execution and egress

1 high-risk artifacts or egress signals were extracted.

Pass
Attack chain and severe findings

There is no explicit malicious chain in the report.

Pass
Dependencies and supply chain hygiene

Dependencies are present but no obvious high-risk issue stands out.

What drove the risk score up

未声明的自动更新机制(含远程 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 拉取并执行脚本,是行业常见但本身有风险的模式。

Most important evidence

Medium Obfuscation

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

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

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

框架检测阴影功能

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 表中声明此项,或移除非必要检测。
Low Supply Chain

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 模式。
Low Persistence

后台守护进程持久化

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

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

Declared capability vs actual capability

Shell Pass
Declared NONE
→
Inferred WRITE
install.sh:42 — curl -sSL https://opensource.ludwitt.com/install | sh 远程安装;daemon.js:42 — 输出远程 sh 更新指令(阴影功能,未在 SKILL.md 声明)
Filesystem Pass
Declared NONE
→
Inferred WRITE
SKILL.md 声明需要文件读写;daemon.js 写入 ~/.ludwitt/*.md, auth.json
Network Pass
Declared NONE
→
Inferred READ
SKILL.md 声明需要网络访问;daemon.js 向 opensource.ludwitt.com 发送 API 请求
Environment Pass
Declared NONE
→
Inferred READ
install.sh:94-109 — 检测 CURSOR_SESSION_ID, CLAUDE_CODE_SESSION, OPENCLAW_STATE_DIR 并写入日志

Suspicious artifacts and egress

Critical Dangerous Command
curl -sSL https://opensource.ludwitt.com/install | sh

daemon.js:42

Medium External URL
https://opensource.ludwitt.com

README.md:34

Medium External URL
https://your-deployed-app.vercel.app

SKILL.md:181

Medium External URL
https://www.youtube.com/watch?v=...

SKILL.md:183

Medium External URL
https://opensource.ludwitt.com/install

daemon.js:42

Medium External URL
http://www.apple.com/DTDs/PropertyList-1.0.dtd

install.sh:216

Dependencies and supply chain

PackageVersionSourceKnown vulnNotes
node (runtime) 18+ system No 仅依赖 Node.js 运行时,无 npm 第三方依赖包,纯原生实现

File composition

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

Security positives

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