T09 · Insecure Skill Coding Practices
- Location
scripts/mwf-bench:599- Finding
The audit command transmits all active plugin slugs despite the --top limit
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly purpose-aligned, but site audits can disclose more of a WordPress site's active-plugin inventory and use more paid quota than the `--top` wording suggests, and wp-cli is silently allowed to run as root when the agent is already root.
Review before installing if you may audit sensitive WordPress sites. Use lookup/compare freely for named plugins, but treat audit as sharing active-plugin inventory metadata with MakeWPFast and potentially spending quota for every uncached active plugin, not just the displayed `--top` results. Avoid running audits as root unless you explicitly accept wp-cli root execution.
scripts/mwf-bench:599The audit command transmits all active plugin slugs despite the --top limit
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
me Your tier / quota / usage (free, no quota charge)
resolve <name> [--theme] Show the resolved slug (no paid call)
audit [--path .] [--top N] Benchmark the heavy active plugins of a local WP site
auth Store your API key (keychain or 0600 file)
Key resolution order: $MWF_API_KEY -> macOS keychain -> ~/.config/makewpfast/key
Get a key at https://makewpfast.com/api/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
me Your tier / quota / usage (free, no quota charge)
resolve <name> [--theme] Show the resolved slug (no paid call)
audit [--path .] [--top N] Benchmark the heavy active plugins of a local WP site
auth Store your API key (keychain or 0600 file)
Key resolution order: $MWF_API_KEY -> macOS keychain -> ~/.config/makewpfast/key
Get a key at https://makewpfast.com/api/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
me Your tier / quota / usage (free, no quota charge)
resolve <name> [--theme] Show the resolved slug (no paid call)
audit [--path .] [--top N] Benchmark the heavy active plugins of a local WP site
auth Store your API key (keychain or 0600 file)
Key resolution order: $MWF_API_KEY -> macOS keychain -> ~/.config/makewpfast/key
Get a key at https://makewpfast.com/api/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
me Your tier / quota / usage (free, no quota charge)
resolve <name> [--theme] Show the resolved slug (no paid call)
audit [--path .] [--top N] Benchmark the heavy active plugins of a local WP site
auth Store your API key (keychain or 0600 file)
Key resolution order: $MWF_API_KEY -> macOS keychain -> ~/.config/makewpfast/key
Get a key at https://makewpfast.com/api/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
me Your tier / quota / usage (free, no quota charge)
resolve <name> [--theme] Show the resolved slug (no paid call)
audit [--path .] [--top N] Benchmark the heavy active plugins of a local WP site
auth Store your API key (keychain or 0600 file)
Key resolution order: $MWF_API_KEY -> macOS keychain -> ~/.config/makewpfast/key
Get a key at https://makewpfast.com/api/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
KEYCHAIN_SERVICE = "makewpfast-bench"
KEYCHAIN_ACCOUNT = "default"
CONFIG_DIR = Path.home() / ".config" / "makewpfast"
KEY_FILE = CONFIG_DIR / "key"
The tool automatically adds --allow-root when executed as UID 0, causing wp-cli to run in a mode it intentionally blocks by default. In agent or CI environments where this script may run with elevated privileges, this removes a safety barrier and can make any wp-cli plugin-loading side effects or path mis-targeting execute as root against the local system or site files.
def detect_active_plugins(path):
"""Use wp-cli to list active plugin slugs. Returns (slugs, error)."""
# wp-cli refuses to run as root without --allow-root (common in Docker/CI/managed hosts).
root_flag = ["--allow-root"] if hasattr(os, "geteuid") and os.geteuid() == 0 else []
wp = None
for cand in ("wp", "wp-cli", "wp-cli.phar"):
The auto-construction of root_flag means root execution proceeds silently rather than requiring explicit human confirmation. In the context of an agent skill that may audit arbitrary local paths, this increases the blast radius of mistakes or malicious prompting because wp-cli commands can execute with full filesystem privileges.
def detect_active_plugins(path):
"""Use wp-cli to list active plugin slugs. Returns (slugs, error)."""
# wp-cli refuses to run as root without --allow-root (common in Docker/CI/managed hosts).
root_flag = ["--allow-root"] if hasattr(os, "geteuid") and os.geteuid() == 0 else []
wp = None
for cand in ("wp", "wp-cli", "wp-cli.phar"):
try:
Without declared permissions the skill's intent is opaque and cannot be validated.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
a clean WordPress baseline.
The API is **paid and quota-limited**. The CLI protects the user's quota with a local cache,
name→slug resolution, and batch guards — so **always delegate to the CLI; never hand-write
`curl`**. Treat the CLI as the only way to touch the API.
## Setup (once)
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
1. `mwf-bench lookup <plugin>` to get its grade.
2. Propose 1–3 well-known alternatives from your own knowledge.
3. `mwf-bench compare <plugin> <alt1> <alt2>` to verify they're actually faster — don't claim an
alternative is faster without checking it against the dataset.
## Quota discipline reminders
- Cached rows print "(cached, N days old)" and don't touch the API.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from pathlib import Path
API_BASE = "https://makewpfast.com/wp-json/mwf-api/v1"
WPORG_PLUGINS = "https://api.wordpress.org/plugins/info/1.2/"
WPORG_THEMES = "https://api.wordpress.org/themes/info/1.2/"
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from pathlib import Path
API_BASE = "https://makewpfast.com/wp-json/mwf-api/v1"
WPORG_PLUGINS = "https://api.wordpress.org/plugins/info/1.2/"
WPORG_THEMES = "https://api.wordpress.org/themes/info/1.2/"
SUBSCRIBE_URL = "https://makewpfast.com/api/"
USER_AGENT = "mwf-bench/1.0 (+https://makewpfast.com/api/)"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
def detect_active_plugins(path):
"""Use wp-cli to list active plugin slugs. Returns (slugs, error)."""
# wp-cli refuses to run as root without --allow-root (common in Docker/CI/managed hosts).
root_flag = ["--allow-root"] if hasattr(os, "geteuid") and os.geteuid() == 0 else []
wp = None
for cand in ("wp", "wp-cli", "wp-cli.phar"):
No suspicious patterns detected.