Tp2
- Category
- MCP Tool Poisoning
- Confidence
- 85% confidence
- Finding
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
- Content
Security audit
Security checks for vulnerabilities and agentic risk
This skill appears to be a legitimate Baidu document-parsing integration, but it can send full documents and credentials to external services with limited privacy warnings and one unsafe result-download pattern.
Install only if you are comfortable sending documents or document URLs to Baidu Cloud and handling Baidu API credentials locally. Avoid using it on confidential, regulated, customer, legal, financial, or identity documents unless your organization permits that processing, and treat returned result links as sensitive while they remain valid.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
The skill explains how to submit file_data or file_url to Baidu's cloud API, but it does not clearly warn users that document contents will be transmitted to a third-party service and may remain accessible via returned result URLs for up to 30 days. For document-processing skills, this omission is significant because users may unknowingly send confidential PDFs, contracts, IDs, or internal materials off-platform.
The document references the agent's configuration directory and instructs users to place secrets there, which normalizes storing sensitive credentials in a high-value agent config location. In agent ecosystems, config directories are especially sensitive because they may be broadly readable by tooling, copied during troubleshooting, or included in backups and sync workflows.
export BAIDU_DOC_AI_SECRET_KEY="your_actual_secret_key_here"
或通过配置文件 `~/.claude/settings.json`:
```json
{
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
| 18 | Open api qps request limit reached | QPS 超限 | 降低请求频率 |
| 19 | Open api total request limit reached | 总量配额超限 | 购买额外配额 |
| 100 | Invalid parameter | access_token 无效 | 重新获取 |
| 110 | Access token invalid or no longer valid | access_token 无效 | 重新获取(30天有效期) |
| 111 | Access token expired | access_token 过期 | 重新获取 |
### 文件相关错误
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
| 18 | Open api qps request limit reached | QPS 超限 | 降低请求频率 |
| 19 | Open api total request limit reached | 总量配额超限 | 购买额外配额 |
| 100 | Invalid parameter | access_token 无效 | 重新获取 |
| 110 | Access token invalid or no longer valid | access_token 无效 | 重新获取(30天有效期) |
| 111 | Access token expired | access_token 过期 | 重新获取 |
### 文件相关错误
The skill documents use of environment variables and outbound network access to a third-party API, but it does not declare any explicit tool scope or permission boundaries. This creates a least-privilege and transparency problem: an agent may invoke network and secret-reading capabilities without prior restriction or clear review, increasing the risk of unintended data exposure or misuse.
The trigger phrases are broad terms like '文档解析' and 'PaddleOCR' that could match many ordinary user requests, causing the skill to activate outside clearly intended contexts. In a skill that uploads document content to a third-party API, over-broad activation increases the chance of accidental transmission of sensitive files or invoking billable external operations without clear user intent.
The guide explicitly recommends storing long-lived API credentials in ~/.claude/settings.json, which is a plaintext local configuration file, without any warning about file permissions, local compromise, backups, or accidental disclosure. While common in setup docs, this increases the chance that sensitive credentials are exposed through shared machines, dotfile sync, logs, or source control mistakes.
The verification step instructs users to transmit their API key and secret to a remote token endpoint, but does not clearly warn that this sends secret material over the network and should only be done against the official HTTPS endpoint. Although this is functionally required for OAuth token exchange, missing guidance can lead to unsafe copy/paste behavior, use in shell history, or misuse against spoofed endpoints.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST 'https://aip.baidubce.com/oauth/2.0/token' \
-d 'grant_type=client_credentials' \
-d 'client_id={your_api_key}' \
-d 'client_secret={your_secret_key}'
The documentation explicitly states that uploaded document contents are sent to a third-party Baidu API and that the parsed results are exposed via URLs valid for 30 days, but it does not warn users about confidentiality, retention, link access scope, or the risks of uploading sensitive data. In a document-parsing skill, users are likely to submit contracts, IDs, financial records, or other regulated content, so omission of privacy and data-handling guidance can lead to inadvertent data disclosure.
This skill uploads user-provided document contents or document URLs to Baidu's external cloud OCR service, but the code provides no explicit disclosure, consent gate, or privacy warning at the point of transmission. In a document-parsing skill, this is contextually important because inputs may contain highly sensitive business, legal, identity, or regulated data, so silent third-party transmission materially increases privacy and compliance risk.
The code blindly trusts parse_result_url returned by the remote API and performs a requests.get on it without validating the scheme, host, or whether it matches an expected Baidu domain. If the upstream service, a MITM position, or an abused API response can supply an arbitrary URL, this creates an SSRF-style outbound request primitive and could be used to reach unintended internal or sensitive network resources from the runtime environment.
if download_result:
parse_result_url = result.get('result', {}).get('parse_result_url')
if parse_result_url:
parse_response = requests.get(parse_result_url)
parse_response.encoding = 'utf-8'
result['parse_result'] = parse_response.json()
return result
A language/locale policy concern exists when a skill forces a specific language without user opt-in. This file presents all instructions solely in Chinese and does not state that the skill is region-specific or offer an alternative language option.
This markdown file presents all guidance and headings in Chinese while mixing in some English error strings, with no indication that the content is region-specific or that alternate languages are available. Under the policy check for language or locale constraints, this can be read as a fixed-language experience without user opt-in.
No suspicious patterns detected.