T09 · Insecure Skill Coding Practices
- Location
scripts/search.py:548- Finding
GitHub Personal Access Token Exposed Through Command-Line Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
WheelSpotter mostly does what it claims, but it needs review because it handles a GitHub token through command-line arguments and uses untrusted package metadata in agent evaluation prompts without clear guardrails.
Review before installing. Use this only when you intend to perform external package/repository searches, avoid passing GitHub tokens on the command line, and treat returned package descriptions and install suggestions as untrusted until independently verified.
scripts/search.py:548GitHub Personal Access Token Exposed Through Command-Line Arguments
SKILL.md:219Indirect Prompt Injection Through Untrusted Repository and Package Metadata
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
Args:
query: Search keywords
limit: Maximum results to return
token: GitHub personal access token (optional, increases rate limit)
Returns:
List of SearchResult objects
Accepting the GitHub personal access token as a command-line argument can expose the secret through shell history, process listings, job control tooling, and audit logs on multi-user or monitored systems. In an agent setting, this is riskier because orchestration layers often log full command invocations, which can accidentally disclose credentials beyond the intended scope.
parser.add_argument(
"-t", "--token",
help="GitHub personal access token (optional, increases rate limit)"
)
parser.add_argument(
The skill describes network access and references writing outputs/files and runnable scripts, but it declares no explicit tool scope such as permissions or allowed-tools. In an agent environment, this can lead to overbroad execution privileges, making it easier for the skill to perform unintended network calls or file writes if the host grants defaults permissively.
The trigger phrase 'find wheels' overlaps with a common built-in command pattern around 'find', creating a shadowing/confusion risk. In agent systems, command ambiguity can cause the wrong skill to activate, potentially leading to unexpected network searches, incorrect actions, or bypass of safer default flows.
The trigger keywords are broad and generic, so the skill may activate in unrelated conversations and steer the agent into unnecessary network-backed search behavior. Over-triggering increases the chance of unintended data disclosure to external services, wasted tokens/cost, and confusing or unsafe automation in contexts where the user did not request this capability.
Referencing a Docker image without a fixed tag or digest makes executions non-reproducible and exposes users to supply-chain risk if the upstream image changes, is replaced, or a malicious image is served under the same name. This is especially relevant because the skill presents action-oriented commands users may copy directly.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Returns:
List of SearchResult objects
"""
url = "https://api.github.com/search/repositories"
headers = {"Accept": "application/vnd.github.v3+json"}
if token:
The script accepts an arbitrary output path and writes results there, even though the skill is described as a search/scouting utility rather than a file-writing capability. In an agent context, this expands the tool's authority from read/search/network actions into local filesystem modification, which can be abused to overwrite user files, drop misleading content, or interfere with other workflows if path inputs are attacker-controlled.
The prompt templates and all activation guidance are written as fixed English instructions and examples, with no indication that users may interact in other languages or opt into English-only behavior. Under the language/locale policy, forcing or implicitly assuming a single language without user choice can be a policy concern unless clearly documented and justified.
The section header claims the HTTP client uses urllib to avoid external dependencies beyond requests, but the implementation immediately imports and uses the requests library instead. This is an active contradiction between documentation and code behavior, not merely an omitted detail.
No suspicious patterns detected.