T09 · Insecure Skill Coding Practices
- Location
scripts/send_sms.py:35- Finding
API Credentials and SMS Content Exposed in URL Query Parameters
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do what it says, but it handles SMS data and reusable VoIP.ms credentials in a way that can expose them through request URL logs.
Review before installing. Use only a dedicated VoIP.ms API sub-account limited to SMS, avoid sending highly sensitive messages through this tool, treat terminal output as sensitive, and prefer an implementation that sends credentials and message parameters in a POST body if the VoIP.ms API supports it. Rotate credentials if full request URLs may have been logged.
scripts/send_sms.py:35API Credentials and SMS Content Exposed in URL Query Parameters
scripts/get_sms.py:54API Credentials Exposed in SMS Retrieval URL Query Parameters
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
req = urllib.request.Request(url, headers={'User-Agent': 'OpenClaw/1.0'})
try:
with urllib.request.urlopen(req) as response:
body = response.read().decode("utf-8")
except Exception as exc:
print(f"Error: API request failed: {exc}", file=sys.stderr)
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
req = urllib.request.Request(url, headers={'User-Agent': 'OpenClaw/1.0'})
try:
with urllib.request.urlopen(req) as response:
body = response.read().decode("utf-8")
except Exception as exc:
print(f"Error: API request failed: {exc}", file=sys.stderr)
The code clearly implements SMS retrieval only: it parses optional DID and day-range arguments, loads VoIP.ms API credentials from environment variables, calls the VoIP.ms getSMS method, and outputs the result. This aligns with the retrieval portion of the description and is consistent with the stated lack of Bitwarden dependency. However, the declared purpose says the skill supports both sending and retrieving SMS messages, while this code chunk shows only retrieval behavior and no sending functionality. That is a material description-behavior mismatch for the supplied code chunk.
The code is consistent with part of the description: it uses the VoIP.ms API and has no Bitwarden dependency. However, the declared purpose says the skill supports both sending and retrieving SMS messages, while this code chunk only sends SMS messages using the sendSMS API method. No retrieval functionality is present in the provided code. That is a material description-to-behavior mismatch for the supplied chunk, even though the sending portion is accurately represented.
The skill documentation instructs use of environment variables for API credentials and describes network-capable scripts, but it does not declare any explicit tool scope or permissions. In agent ecosystems, missing scope declarations can allow broader-than-expected access to secrets and outbound connectivity, reducing transparency and making misuse harder to constrain or audit.
This manifest describes sending and retrieving SMS via the VoIP.ms API and declares required username/password environment variables, but it provides no warning or disclosure about handling sensitive credentials or transmitting user message data to a third-party service. For a manifest/description file, the skill description should clearly warn about privacy and credential implications of these behaviors.
The script places API username and password directly in the request URL query string. Even though the request uses HTTPS, URLs are commonly exposed in client logs, proxy logs, browser/history equivalents, debugging output, monitoring systems, and upstream infrastructure, which can leak long-lived credentials.
The script places API username, API password, destination number, and SMS message in the request URL query string. Even though the request uses HTTPS, query strings are more likely to be exposed through proxy logs, debugging tools, browser/history equivalents, upstream infrastructure, or exception telemetry, causing credential leakage and disclosure of message contents.