Back to skill

Security audit

Wxpush

Security checks across malware telemetry and agentic risk

Overview

This is a disclosed WeChat push-message helper, but it handles real messaging credentials and users should avoid its URL-based secret examples.

Install only if you trust the wxpush endpoint you configure. Prefer a self-hosted or vetted service, keep ~/.config/wxpush/wxpush.env private with 600 permissions, avoid GET/query-string examples for tokens or AppSecrets, and rotate any credential that may have appeared in a URL, terminal history, or logs.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (7)

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The documentation explicitly recommends passing sensitive credentials in URL query parameters, including a token and, in examples elsewhere, appid/secret. Query-string secrets are commonly exposed through browser history, reverse-proxy and CDN logs, analytics systems, referrer leakage, and shared terminal history, so documenting this without warning or safer guidance increases the chance of credential compromise.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The document instructs users to pass highly sensitive credentials such as AppID, AppSecret, OpenID, and template identifiers directly in request parameters, including a GET example that places secrets in the URL. This is dangerous because URLs are commonly logged by browsers, proxies, reverse proxies, application servers, and shell history, increasing the chance of credential exposure and unauthorized message sending.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The documentation explicitly permits passing the API token in the URL query string, which can expose credentials through browser history, proxy logs, referrer leakage, server access logs, and shared terminals. In this context the file is an API reference for a message-push skill, so readers are likely to copy these examples directly into production usage, increasing the chance of accidental token disclosure.

External Transmission

Medium
Category
Data Exfiltration
Content
## 发送消息

读取 `~/.config/wxpush/wxpush.env`,根据 mode 选择 curl 或 Python 发送请求。

优先使用 curl(最简洁),不可用时用 Python(标准库,无需额外依赖)。
Confidence
92% confidence
Finding
The skill instructs the agent to send message contents and, depending on mode, authentication material such as API tokens or WeChat AppID/Secret to a remote endpoint configured in WXPUSH_API_URL. This is an external transmission path for secrets and user data, and the danger is elevated because the documentation explicitly promotes third-party default endpoints, so sensitive credentials may be exfiltrated outside the local environment.

Credential Access

High
Category
Privilege Escalation
Content
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2], 'token': cfg.get('WXPUSH_API_TOKEN','')}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json'})
print(urlopen(req, timeout=15).read().decode())
Confidence
88% confidence
Finding
This code reads secrets from ~/.config/wxpush/wxpush.env and immediately transmits the token to the configured remote service. Accessing a local secret store is expected for this skill's function, but it still constitutes a real vulnerability pattern because the skill operationalizes credential use and export to an external endpoint that may be third-party or attacker-controlled if misconfigured.

Credential Access

High
Category
Privilege Escalation
Content
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2]}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json','Authorization':cfg.get('WXPUSH_API_TOKEN','')})
print(urlopen(req, timeout=15).read().decode())
Confidence
88% confidence
Finding
The script reads WXPUSH_API_TOKEN from the local env file and places it in an Authorization header for a remote HTTP request. That is a direct credential-access-and-use flow; in context it is part of intended functionality, but it remains dangerous because compromise or misconfiguration of WXPUSH_API_URL would disclose a reusable authentication token to an untrusted service.

Credential Access

High
Category
Privilege Escalation
Content
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2], 'appid': cfg.get('WXPUSH_APPID',''), 'secret': cfg.get('WXPUSH_SECRET',''), 'userid': cfg.get('WXPUSH_USERID',''), 'template_id': cfg.get('WXPUSH_TEMPLATE_ID','')}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json'})
print(urlopen(req, timeout=15).read().decode())
Confidence
95% confidence
Finding
This variant reads highly sensitive WeChat credentials from the local env file, including AppID and Secret, and sends them to the remote service in the request body. The context makes this more dangerous than the token-only modes because WeChat secrets are long-lived upstream credentials; transmitting them to default or third-party endpoints could enable full abuse of the associated WeChat integration beyond a single message send.

VirusTotal

66/66 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.