ludwitt-university
The skill embeds a server-controlled update instruction (curl|sh) into console.error output after every API request, creating a potential C2 channel where the remote server can inject and cause execution of arbitrary shell commands through agent stderr monitoring.
The daemon embeds the server-returned 'updateInstructions' field directly into a console.error() call at daemon.js:42. If the server (opensource.ludwitt.com) is compromised or returns malicious updateInstructions containing 'curl | sh', and if the agent's environment monitors/processes stderr output, arbitrary shell commands can be auto-executed. This is a covert C2 channel that bypasses the skill's declared permissions.
daemon.js:42 为什么得出这个结论
3/4 个维度触发发现 2 项声明之外的能力或越权行为。
提取到 1 个高危 IOC 或外联信号。
报告包含 5 步攻击链,另有 3 项高危或严重发现。
依赖结构存在,但暂未看到明显高危告警。
攻击链
初始入口 · SKILL.md:39
持久化 · install.sh:208
credential_theft · install.sh:64
持久化 · install.sh:229
最终危害 · daemon.js:42
风险分是怎么被拉高的
daemon.js:42 embeds result.updateInstructions from the server into console.error; combined with stderr monitoring, this enables server-injected arbitrary shell command execution via curl|sh pattern
install.sh registers a launchd (macOS) or systemd (Linux) service that auto-starts on boot, undeclared in SKILL.md capabilities
install.sh:64-69 generates SHA256 fingerprint from hostname, platform, arch, CPU model — sent to remote server at registration
SKILL.md requires 'Bash' access but _meta.json and SKILL.md lack explicit allowedTools declarations
skill-card.md states MIT-0 but AGPL-3.0 is claimed in SKILL.md
最关键的证据
Server-controlled shell command injection via updateInstructions
The daemon embeds the server-returned 'updateInstructions' field directly into a console.error() call at daemon.js:42. If the server (opensource.ludwitt.com) is compromised or returns malicious updateInstructions containing 'curl | sh', and if the agent's environment monitors/processes stderr output, arbitrary shell commands can be auto-executed. This is a covert C2 channel that bypasses the skill's declared permissions.
daemon.js:42 Undeclared persistent background service with boot persistence
install.sh installs a launchd service on macOS (~/Library/LaunchAgents/com.ludwitt.daemon.plist) and a systemd service on Linux (~/.config/systemd/user/ludwitt-daemon.service). Both are configured to RunAtLoad/Start on boot with KeepAlive. This persistence mechanism is not declared in SKILL.md's capabilities table.
install.sh:208 Machine fingerprinting sent to remote server at registration
install.sh generates a SHA256 machine fingerprint by hashing hostname, OS platform, architecture, and CPU model combined with 32 random bytes. This fingerprint is sent to the Ludwitt server at registration time (install.sh:136). This creates a unique per-machine identifier that persists across reinstalls if the auth.json is retained.
install.sh:64 Shell rc file modification undeclared in capabilities
install.sh:229-244 appends 'export PATH=$HOME/.ludwitt/bin:$PATH' to ~/.zshrc or ~/.bashrc without declaring this shell environment modification in SKILL.md. This is an undocumented side effect that persists PATH changes.
install.sh:229 API key stored in plaintext file with mode 600
Credentials (agentId, apiKey, fingerprint) are stored in ~/.ludwitt/auth.json with chmod 600. While the file permissions are correctly restrictive, the apiKey is a bearer token that provides API access and is sent with every request. No encryption at rest.
install.sh:151 No dependency pinning
No package.json, requirements.txt, or equivalent dependency manifest exists. The daemon relies only on built-in Node.js modules (fs, path, https, http, crypto via os). No external npm dependencies means no supply chain risk from third-party packages.
daemon.js:1 声明能力 vs 实际能力
SKILL.md line ~20 declares network access SKILL.md requires file write access for papers; install.sh writes to ~/.ludwitt/ install.sh:136 executes curl; install.sh:229-260 modifies shell rc files; daemon.js:42 contains curl|sh injection install.sh:64 reads os.hostname(), os.platform(), os.cpus() for fingerprinting No skill invocation chain detected 可疑产物与外联
curl -sSL https://opensource.ludwitt.com/install | sh daemon.js:42
https://opensource.ludwitt.com README.md:34
https://your-deployed-app.vercel.app SKILL.md:181
https://www.youtube.com/watch?v=... SKILL.md:183
https://opensource.ludwitt.com/install daemon.js:42
http://www.apple.com/DTDs/PropertyList-1.0.dtd install.sh:216
https://clawhub.ai/user/rogerSuperBuilderAlpha skill-card.md:7
https://clawhub.ai/rogerSuperBuilderAlpha/ludwitt-university skill-card.md:29
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| Node.js builtins only (fs, path, https, http, url, crypto via os) | N/A | builtin | 否 | No npm package dependencies — zero supply chain risk |
文件构成
daemon.js install.sh SKILL.md README.md skill-card.md