Back to skill

Security audit

Meme Risk Radar

Security checks for vulnerabilities and agentic risk

Overview

This token-scanning skill looks mostly genuine, but its payment handling could leak a billing key or charge more than once during failures.

Review the billing behavior before installing in paid mode. Use noop billing for local testing, avoid custom billing endpoints unless fully trusted, and ask the publisher to fix idempotency, validate billing URLs, align documentation with the actual environment variables, and remove PaxHeader metadata files from the package.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/billing.py:54
Finding

Non-idempotent billing retries can cause duplicate charges

Content
View full analysis
BillingResult: # SkillPay API v1 format headers = { "X-API-Key": self.api_key, "Content-Type": "application/json", } # Use configured price (in USDT) payload = { "user_id": user_ref, "skill_id": self.skill_id, "amount": float(self.price_usdt), # USDT per call } delay = 0.8 for attempt in range(3): try: resp = self.session.post(f"{self.billing_url}/charge", json=payload, headers=headers, timeout=12) ``` The caller generates an idempotency key, but it is not included in the request: ```python def maybe_bill(call_name: str) -> Dict[str, Any]: client = build_billing_client() amount = os.getenv("SKILLPAY_PRICE_USDT", "0.002").strip() user_ref = os.getenv("SKILLPAY_USER_REF", "anonymous").strip() or "anonymous" result = client.charge(call_name, amount, user_ref, str(uuid4())) ``` ### Technical Analysis The billing client accepts an `idempotency_key` and retries the charge operation up to three times, but never transmits the key to the billing provider. Charging is a state-changing financial operation. If the provider applies a charge but the response is lost, times out, or returns an HTTP 5xx status, the client cannot distinguish that condition from a request that was never processed. The retry loop may therefore submit the same logical charge several times. Because each request lacks a stable server-recognized idempotency identifier, the billing provider may treat every retry as a separate transaction. ### Attack Path 1. A user invokes a paid `scan` or `audit` command. 2. `maybe_bill()` creates an idempotency key and calls the billing client. 3. The billing pro ...[truncated 983 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/billing.py:37
Finding

Unvalidated billing endpoint can expose the billing API key

Content
View full analysis
None: self.api_key = api_key self.skill_id = skill_id self.billing_url = billing_url or os.getenv("SKILLPAY_BILLING_URL", "https://skillpay.me/api/v1/billing") self.price_usdt = price_usdt or os.getenv("SKILLPAY_PRICE_USDT", "0.002") self.session = requests.Session() # Configure proxies from environment http_proxy = os.getenv("HTTP_PROXY", os.getenv("http_proxy")) https_proxy = os.getenv("HTTPS_PROXY", os.getenv("https_proxy")) if http_proxy or https_proxy: self.session.proxies = {} if http_proxy: self.session.proxies["http"] = http_proxy if https_proxy: self.session.proxies["https"] = https_proxy def charge(self, call_name: str, amount_usdt: str, user_ref: str, idempotency_key: str) -> BillingResult: # SkillPay API v1 format headers = { "X-API-Key": self.api_key, "Content-Type": "application/json", } # Use configured price (in USDT) payload = { "user_id": user_ref, "skill_id": self.skill_id, "amount": float(self.price_usdt), # USDT per call } delay = 0.8 for attempt in range(3): try: resp = self.session.post(f"{self.billing_url}/charge", json=payload, headers=headers, timeout=12) ``` The configured value is passed directly from the environment: ```python billing_url = os.getenv("SKILLPAY_BILLING_URL", "") price_usdt = os.getenv("SKILLPAY_PRICE_USDT", "0.002") r ...[truncated 2086 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/billing.py:120
Finding

Billing configuration documentation does not match the implemented environment variables

Content
View full analysis
BillingClient: mode = os.getenv("SKILLPAY_BILLING_MODE", "skillpay").strip().lower() if mode == "noop": return NoopBillingClient() api_key = os.getenv("SKILL_BILLING_API_KEY", "").strip() if not api_key: raise BillingError("missing_skillpay_apikey") skill_id = os.getenv("SKILL_ID", "").strip() if not skill_id: raise BillingError("missing_skill_id") billing_url = os.getenv("SKILLPAY_BILLING_URL", "") price_usdt = os.getenv("SKILLPAY_PRICE_USDT", "0.002") return SkillPayBillingClient(api_key=api_key, skill_id=skill_id, billing_url=billing_url, price_usdt=price_usdt) ``` ### Technical Analysis The documentation states that the API key is read from `SKILLPAY_APIKEY`, while the implementation reads `SKILL_BILLING_API_KEY`. The implementation also requires `SKILL_ID`, but the documented required variables do not include it. Likewise, the documentation describes `SKILLPAY_BASE_URL`, `SKILLPAY_CHARGE_URL` ...[truncated 1369 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (43)

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

The PAX header contains embedded NUL/control-byte content inside what is expected to be plain-text archive metadata. While this is often an artifact of extended attributes created by macOS archiving tools rather than deliberate malware, such bytes can confuse parsers, truncate strings in downstream tooling, or cause inconsistent security scanning and extraction behavior.

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · README.md (reported line 31)May include surrounding context.

md
1. Clone or copy to OpenClaw skills directory
2. Install dependencies: pip install -r requirements.txt
3. Configure environment variables: cp .env.example .env
4. Create global command (optional)

## Usage

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This is a clear description-behavior mismatch. The declared purpose describes a functional security/risk-analysis skill with token discovery, enrichment, reporting, and billing support. However, the actual supplied chunk contains only archive header metadata entries and no executable logic demonstrating any of those capabilities. Because the code does not show the claimed primary purpose or supporting behavior, the description is not accurately represented by the supplied code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This is a clear description-behavior mismatch. The declared purpose describes a substantive Binance Web3 meme-token risk radar with data retrieval, enrichment, reporting, and payment-related hooks. However, the provided chunk only shows PaxHeader/archive metadata entries associated with a file name and timestamps/xattrs. There is no executable logic to assess against the claimed behavior. Because the actual supplied content does not implement, or even evidence, the declared capabilities, the description is not accurately represented by this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description specifies a concrete security/risk-analysis skill with Binance Web3 integrations, reporting behavior, and payment hooks. However, the provided code chunk is only PaxHeader metadata entries (mtime and extended attributes) and does not contain executable Python logic. Because the actual supplied content does not implement or evidence the declared functionality, the description does not accurately represent the provided code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description promises a token-risk radar with blockchain data access, enrichment, reporting, and billing support. The provided code chunk does not implement any of those capabilities. Instead, it consists of PaxHeader/tar metadata entries associated with a shell script file, including mtime and macOS provenance xattrs. This is materially unrelated to the declared primary purpose, so the description does not accurately represent the supplied code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose describes an application-level token risk radar for Binance Web3 data, including scanning meme tokens, enriching audit information, generating Chinese/English reports, and handling billing hooks. The provided code does none of that. Instead, it is a deployment helper script whose sole purpose is to publish the skill directory through the clawhub CLI after verifying the tool is installed. This is a materially different primary purpose and introduces an undeclared capability: publishing/deployment automation. Therefore, the description does not accurately represent this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description describes a concrete security/risk-analysis skill with blockchain data integrations, reporting, and billing support. However, the provided code chunk contains only archive metadata lines for a test file and does not include executable code implementing any of those features. Because the actual supplied content is unrelated to the stated primary purpose and shows none of the described capabilities, this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description describes a security/risk-analysis skill for meme tokens with external data enrichment and payment hooks. The actual supplied chunk contains only archive header metadata referencing a test file and filesystem attributes. There is no evidence of the declared primary functionality, resource access, triggers, or supporting implementation. This is a material description-behavior mismatch because the provided code is unrelated to the stated purpose.

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
95% confidence
Finding

The file appears to be a tar/PaxHeader metadata artifact rather than a normal YAML skill file, and it contains embedded NUL bytes and binary extended-attribute data. Binary bytes in a text-parsed configuration path can confuse downstream tooling, cause parser differentials, or hide content from reviewers and scanners, which is risky in a security-sensitive agent skill package.

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding

Text artifact contains embedded NUL bytes

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.