T09 · Insecure Skill Coding Practices
- Location
scripts/tunnel.sh:43- Finding
SSH Host Authentication Is Disabled for localhost.run Tunnels
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does what it says, but it gives unsafe tunneling and host-validation instructions that can expose local development services more broadly than users may expect.
Review this carefully before installing. Use it only for non-sensitive development servers, verify the port and app before sharing the URL, avoid exposing admin pages or real credentials, do not commit or persist host-check bypass settings, and stop any persistent tunnel as soon as the demo is done.
scripts/tunnel.sh:43SSH Host Authentication Is Disabled for localhost.run Tunnels
SKILL.md:110Instructions Disable Development-Server Host Validation Globally
scripts/tunnel.sh:37Unvalidated and Unquoted Port Argument Enables Command-Option Injection
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl -s http://localhost:4040/api/tunnels | python3 -c "
import sys,json; d=json.load(sys.stdin)
for t in d['tunnels']:
print(t['config']['addr'], t['public_url'])"
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl -s http://localhost:4040/api/tunnels | python3 -c "
import sys,json; d=json.load(sys.stdin)
for t in d['tunnels']:
print(t['config']['addr'], t['public_url'])"
The framework-specific fixes explicitly disable host-header validation (disableHostCheck, allowedHosts: 'all', DANGEROUSLY_DISABLE_HOST_CHECK=true) to make public tunneling work, but they omit any warning that these settings weaken protections against DNS rebinding and unintended host-based access. Because this skill is specifically about exposing development servers externally, the dangerous context amplifies the risk of turning temporary demo settings into persistent insecure defaults.
The skill clearly instructs the agent to run multiple shell commands (ssh, ngrok, curl, python3, package installation), yet it declares no tool scope or permissions boundary. That omission increases the chance an agent will execute network-exposing commands without explicit user consent or sandboxing, which is risky in a skill whose main purpose is publishing localhost to the public internet.
The skill's primary purpose is exposing a local development server to the internet, but it does not prominently warn that the resulting URL is public and may expose source previews, internal admin pages, API endpoints, secrets in responses, or development-only features. In this context, lack of a privacy/data-exposure warning is material because users may treat localhost as inherently private and share sensitive content unintentionally.
The header comment lists methods as 'ngrok (default)', implying ngrok will be used when no method is provided. However, the code sets METHOD=${2:-localhost.run}, so the actual default is localhost.run. This is a direct contradiction between documentation and implementation.