Back to skill

Security audit

GitHub Projects Explorer

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward GitHub repository search helper, but users should avoid the documented option to store a GitHub token permanently in a shell startup file.

Install only if you are comfortable with the skill querying GitHub over the network. Prefer running it without a token, or use a fine-grained, read-only, short-lived GitHub token set only for the current command or shell session. Do not append real tokens to ~/.zshrc or commit/sync shell configuration files containing tokens.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Note
Location
SKILL.md:32
Finding
Persistent Plaintext Storage of GitHub Access Token## Vulnerability Details **File Location**: `SKILL.md`, lines 32-36 **Vulnerability Type**: Plaintext credential storage **Risk Level**: Low **Vulnerable Code Snippet**: ```bash # To add it permanently to ~/.zshrc: echo 'export GITHUB_TOKEN="your-token"' >> ~/.zshrc source ~/.zshrc ``` ### Technical Analysis The Skill recommends permanently storing a reusable GitHub access token as plaintext in the user's `~/.zshrc` file. Shell initialization files are not designed as credential stores and may be exposed through dotfile repositories, workstation backups, synchronization services, diagnostic archives, or other local processes and users with permission to read the file. Although the script sends the token only to the fixed HTTPS GitHub API endpoint and uses it for the declared repository-search functionality, persistent plaintext storage is not necessary. The unauthenticated API remains available at a lower rate limit, while authenticated access can use a secure credential provider or an ephemeral environment variable. ### Attack Path 1. A user follows the documented permanent configuration procedure and inserts a valid GitHub token into `~/.zshrc`. 2. The token remains stored in plaintext after the Skill finishes running. 3. An attacker or unintended data-processing system obtains read access to the file through local access, malware, a dotfile repository, backup extraction, configuration synchronization, or a support bundle. 4. The token is extracted and submitted to GitHub's API. 5. The attacker performs operations authorized by the token until it expires or is revoked. ### Impact Assessment Successful exploitation discloses the GitHub access token. The resulting privileges are limited to the repositories, organizations, and API operations granted by the token's configured scopes. A broadly scoped token could permit access to private repository metadata or modification of GitHub resources; a fine-grained ...[truncated 152 chars]
Remediation
## Remediation Suggestions - Remove the recommendation to append the token to `~/.zshrc` or any other plaintext shell startup file. - Prefer GitHub CLI authentication, an operating-system credential store, or an approved secrets manager. - If an environment variable must be used, set it only for the process invocation or current shell session rather than persisting it. - Recommend a fine-grained GitHub token restricted to the minimum required read-only repository-search permissions, with a short expiration period. - Instruct users to rotate the token immediately if it was committed, synchronized, backed up insecurely, or otherwise disclosed. - Preserve the existing fixed HTTPS API destination and avoid logging or including the token in URLs, command output, or exception messages.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (11)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill documentation describes functionality that uses environment variables and network access, but the manifest does not declare any tool scope such as permissions or allowed-tools. This creates a transparency and least-privilege problem: an agent or reviewer cannot easily determine what capabilities the skill is expected to use, increasing the risk of unintended outbound requests or secret access during execution.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The skill instructs users to persist a GitHub token in ~/.zshrc, which can cause long-lived credentials to be stored in plaintext shell startup files and automatically loaded into many future sessions. In a skill context that already uses environment access and network calls, this increases the chance of token exposure through local compromise, accidental sharing of dotfiles, shell-history mistakes, or misuse by other tools running in the same environment.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.error

# GitHub API 配置
GITHUB_API_URL = "https://api.github.com/search/repositories"

def get_github_token() -> Optional[str]:
    """获取 GitHub Token(可选,用于提高请求限制)"""
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Low
Confidence
82% confidence
Finding
This markdown file includes multiple examples showing use of an Authorization token in headers, but it does not warn users not to hardcode real tokens, avoid sharing them, or prefer environment variables/secret storage. Because the examples involve credentials and outbound API requests, a brief safety note would improve user awareness.

Natural-Language Policy Violations

Low
Confidence
98% confidence
Finding
The module docstring presents the tool description only in Chinese, which imposes a specific language on users. The policy for this category flags language or locale constraints when the skill does not provide user opt-in or explain that the tool is intentionally region-specific.

Natural-Language Policy Violations

Low
Confidence
96% confidence
Finding
The argparse description/help text is presented only in Chinese, and this pattern continues in user-facing output strings elsewhere in the file. This forces a specific language for interaction without offering an alternative locale or documenting a justified regional restriction.

Static analysis

No suspicious patterns detected.