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 Why this conclusion was reached
3/4 dimensions flagged2 undeclared or violating capabilities were inferred.
1 high-risk artifacts or egress signals were extracted.
The report includes 5 attack-chain steps and 3 severe findings.
Dependencies are present but no obvious high-risk issue stands out.
Attack Chain
Entry · SKILL.md:39
Persistence · install.sh:208
credential_theft · install.sh:64
Persistence · install.sh:229
Impact · daemon.js:42
What drove the risk score up
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
Most important evidence
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 Declared capability vs actual capability
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 Suspicious artifacts and egress
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
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| Node.js builtins only (fs, path, https, http, url, crypto via os) | N/A | builtin | No | No npm package dependencies — zero supply chain risk |
File composition
daemon.js install.sh SKILL.md README.md skill-card.md