T09 · Insecure Skill Coding Practices
- Location
payment.py:11- Finding
Hard-Coded Billing API Credential
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a paid crypto security tool, but its artifacts overstate critical protections, use mock/random security results, and include under-scoped billing behavior with a hardcoded API credential.
Review this skill carefully before installing. Do not rely on it for real wallet protection, contract audit decisions, emergency freezes, token revocations, transaction approvals, or multisig administration unless the publisher replaces the mock/demo logic with verifiable implementations and removes the hardcoded billing credential. Treat any payment use as sending a stable user identifier to skillpay.me and potentially charging immediately when payment verification runs.
payment.py:11Hard-Coded Billing API Credential
payment.py:42External Disclosure of a Stable User Identifier
scripts/multisig_manager.py:106Multisig Quorum and Administrative Authorization Can Be Bypassed
scripts/contract_auditor.py:78Security Decisions Are Based on Fabricated and Unrelated Results
SKILL.md:211Documentation Advertises Nonexistent Security-Critical Operations
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
def check_balance(user_id: str) -> float:
"""查询用户余额"""
try:
resp = requests.get(
f"{BILLING_API_URL}/api/v1/billing/balance",
params={"user_id": user_id},
headers=HEADERS,
The code transmits an environment-derived user identifier to an external billing service and performs an actual charge operation. In this skill context, that is more dangerous because the skill is presented as a security-defense tool, yet it contains hidden monetization logic with a hardcoded privileged API key, creating risk of unauthorized billing, privacy leakage, and abuse if the file is exposed or reused.
返回: {"ok": bool, "balance": float, "payment_url": str|None}
"""
try:
resp = requests.post(
f"{BILLING_API_URL}/api/v1/billing/charge",
headers=HEADERS,
json={
The function sends the environment-derived user identifier to a third-party payment-link endpoint, which exposes user metadata externally without a clear user-facing disclosure. In a security-focused skill, unexpected outbound payment-link generation is especially suspicious because it expands data sharing beyond the declared defensive purpose.
def get_payment_link(user_id: str, amount: float = 5.0) -> str:
"""生成充值链接"""
try:
resp = requests.post(
f"{BILLING_API_URL}/api/v1/billing/payment-link",
headers=HEADERS,
json={"user_id": user_id, "amount": amount},
This finding indicates the marketed 'full-spectrum' security functionality is not actually implemented, with only limited wallet or static scanning behavior present. In a security skill, capability inflation is especially dangerous because missed detections can directly contribute to fund loss, unsafe approvals, or failure to respond correctly to incidents.
This finding indicates the marketed 'full-spectrum' security functionality is not actually implemented, with only limited wallet or static scanning behavior present. In a security skill, capability inflation is especially dangerous because missed detections can directly contribute to fund loss, unsafe approvals, or failure to respond correctly to incidents.
This finding indicates the marketed 'full-spectrum' security functionality is not actually implemented, with only limited wallet or static scanning behavior present. In a security skill, capability inflation is especially dangerous because missed detections can directly contribute to fund loss, unsafe approvals, or failure to respond correctly to incidents.
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
wallet 0x... --status
python scripts/multisig_manager.py --wallet 0x... --propose --to 0x... --value 1.0
python scripts/multisig_manager.py --wallet 0x... --sign --tx-id 1
python scripts/multisig_manager.py --wallet 0x... --execute --tx-id 1
python scripts/multisig_manager.py --wallet 0x... --add-owner 0x...
### scripts/incident_responder.py
安全事件响应器
```bash
# 紧急冻结
python scripts/incident_responder.py --emergency-freeze --wallet 0x...
# 事件分析
python scripts/incident_responder.py --analyze --tx-hash 0x...
# 损失评估
python scripts/incident_responder.py --assess-loss --address 0x...
# 生成报告
python scripts/incident_responder.py --generate-report --incident-id 1
安全监控中心
# 启动监控
python scripts/security_monitor.py --daemon
# 监控特定地址
python scripts/security_monitor.py --watch 0x... --events all
# 监控合�
The file is dominated by billing enforcement logic even though the declared skill purpose is security defense, auditing, and threat protection. This mismatch is dangerous because it indicates concealed or unjustified capability, increasing the likelihood of deceptive monetization or supply-chain style abuse within a trusted security tool.
The docstring says the function verifies whether the user has paid, but it actually calls charge_user and deducts funds. This misleading description can cause hidden charges, defeats informed consent, and is particularly severe in a security-focused skill where users may place elevated trust in the code.
The add_owner and remove_owner methods directly modify the wallet's owner set without requiring a submitted admin transaction, approval tracking, or threshold enforcement. In a multisig manager, ownership changes are the most sensitive control-plane actions; allowing them unilaterally defeats the multisig security model and can let a single caller seize or weaken wallet control.
change_threshold updates the signature requirement immediately and unilaterally, with no multisig approval path. A caller could reduce the threshold to 1 and then execute sensitive actions alone, effectively bypassing the intended multi-party security guarantees.
Several core security checks such as contract verification, scam reports, taint analysis, approvals, and asset diversity are driven by random values rather than real data sources. In a wallet-security skill, this can produce false assurances or false alarms, causing users to trust malicious addresses or avoid legitimate ones based on fabricated results.
The skill advertises comprehensive wallet security detection and protection, but the actual scan only performs local format and blacklist checks while the rest of the 'full scan' is simulated. In a security-defense context, this mismatch is dangerous because users may rely on incomplete or fake assessments to make high-stakes transaction and wallet decisions.
The skill advertises and demonstrates capabilities that imply network access, environment-variable use, and potentially writing configuration or reports, but it declares no explicit tool scope or permissions boundary. In an agent environment, this creates an authorization gap where high-impact operations may be available without clear restriction or user visibility.
The skill explicitly covers private-key and mnemonic handling but does not place a prominent warning near those features telling users never to submit raw secrets into the agent. In this context, omission is dangerous because users may paste highly sensitive credentials into a conversational interface, leading to irreversible asset compromise if exposed or misused.
The documented operations include irreversible or disruptive actions such as revoking approvals, emergency freeze, executing multisig transactions, and adding owners, but the warnings are generic and not attached to the dangerous commands themselves. In a security operations skill, poorly signposted destructive actions increase the chance of accidental outages, locked assets, or unintended on-chain changes.
The file description and all user-facing status/error/payment messages are written in Chinese, with no indication that the user can choose another language. This creates a locale/language policy issue because the skill effectively imposes one language without opt-in or justification.
The code performs charging and payment-link generation that are not justified by the stated security-defense scope. Users invoking a security tool would not reasonably expect their identifiers to be sent to a billing processor or charges attempted automatically, making the behavior deceptive and risky in context.
This external transmission sends billing-related user data and initiates a charge to a third-party service. Network transmission alone is not always unsafe, but here it is risky because it is embedded in a security tool, uses a hardcoded API credential, and may trigger billing without transparent user consent.
返回: {"ok": bool, "balance": float, "payment_url": str|None}
"""
try:
resp = requests.post(
f"{BILLING_API_URL}/api/v1/billing/charge",
headers=HEADERS,
json={
The charge request sends user identifiers to an external service without a clear user-facing warning at the point of collection or transmission. This is a privacy and transparency problem, and the context makes it worse because the skill claims a defensive security purpose rather than payment processing.
This outbound request sends user-linked data to obtain a payment URL from an external service. In context, the unexpected transmission is more dangerous because it is unrelated to the skill's stated defensive function and may expose users to undisclosed third-party processing.
def get_payment_link(user_id: str, amount: float = 5.0) -> str:
"""生成充值链接"""
try:
resp = requests.post(
f"{BILLING_API_URL}/api/v1/billing/payment-link",
headers=HEADERS,
json={"user_id": user_id, "amount": amount},
This markdown file is entirely framed as a Chinese-language handbook, beginning with a Chinese-only title and continuing throughout without any indication that language is configurable or intentionally limited to a region-specific audience. Under the policy rule, forcing a specific language without user opt-in is a natural-language policy concern.
The natural-language strings and descriptions throughout the file are written exclusively in Chinese, starting with the module docstring, and the script presents its interface and report output in that language by default. There is no indication that users can opt into another language or locale, which is a language-policy concern under the stated rules.
The function claims to audit a user-specified contract address and network, but it ignores both and always returns hardcoded mock Solidity. In a security-audit skill, this can mislead users into believing a real contract was analyzed, creating false assurance and potentially causing unsafe deployment, trading, or incident-response decisions.
The comment states the code should call Etherscan, but the implementation silently substitutes mock code while downstream logic treats the result as authoritative. This discrepancy is especially dangerous in a defensive security tool because it undermines trust in audit results and can conceal that no real target was inspected.
No suspicious patterns detected.