Back to skill

Security audit

Textin Parse

Security checks for vulnerabilities and agentic risk

Overview

This is a real Textin document-parsing skill, but it handles API secrets and uploaded documents with weak safeguards.

Review before installing. Use only with documents you are comfortable sending to Textin, avoid sensitive or regulated files unless your policy allows that provider, and do not paste long-lived API secrets into chat. Prefer rotating any credential already used with this skill, restrict the config file permissions manually if installed, and avoid using the shell parser on untrusted filenames until its curl argument handling is fixed.

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/config.sh:7
Finding

API credentials are stored in plaintext with permissions determined by the ambient umask

Content
View full analysis
"$CONFIG_FILE" echo "✅ 凭证已保存" } get_credentials() { if [ -f "$CONFIG_FILE" ]; then cat "$CONFIG_FILE" else echo "{}" fi } ``` The secret is also accepted as a command-line argument and can be printed in full: ```bash case "$1" in save) save_credentials "$2" "$3" ;; get) get_credentials ;; ``` ### Technical Analysis The script writes the Textin application ID and secret code directly to `$HOME/.openclaw/textin-config.json`. It does not set a restrictive umask, apply `chmod 600` to the file, or verify the permissions of an existing file. Consequently, actual permissions depend on the invoking process's umask. Under a common umask of `022`, a newly created file may be mode `0644`, allowing other local users to read the API secret where home-directory traversal permissions permit it. An existing file with overly broad permissions remains overly broad after redirection. The `get` operation outputs the complete configuration, including the secret, to standard output. This can expose it through terminal recording, agent transcripts, redirected logs, CI logs, or other output consumers. The `save` interface also requires the secret as a positional command-line argument. Command-line arguments may be captured in shell history, process telemetry, audit logs, or process listings while the command runs. Constructing JSON with shell string interpolation is additionally fragile. Quotes, backslashes, or control characters in supplied values can corrupt the configurat ...[truncated 1416 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/parse.py:24
Finding

Python client stores and displays the complete API secret

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/parse.sh:129
Finding

Unquoted curl request body permits command-option injection through a crafted local filename

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (18)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill explicitly asks the user to paste x-ti-app-id and x-ti-secret-code into the chat and says it will save them to a configuration file, but it provides no warning about credential sensitivity, retention, or storage protections. This is dangerous because secrets may be exposed in conversation logs, mishandled by the assistant, or written insecurely to disk, enabling unauthorized API use.

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · scripts/parse.sh (reported line 154)May include surrounding context.

sh
# 发送请求
if [ "$CONTENT_TYPE" = "text/plain" ]; then
    RESPONSE=$(curl -s -X POST "${API_URL}?${QUERY_PARAMS}" \
        -H "x-ti-app-id: ${APP_ID}" \
        -H "x-ti-secret-code: ${SECRET_CODE}" \
        -H "Content-Type: ${CONTENT_TYPE}" \

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill appears to rely on capabilities such as network access and likely file operations to upload documents and persist configuration, but it does not declare any explicit tool scope or permission boundaries. That increases the risk of overbroad execution because reviewers and runtime policy cannot easily constrain what the skill is allowed to do.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger description is broad enough to overlap with common requests like document parsing or content extraction, which can cause the skill to activate in situations the user did not intend. In a skill that handles file uploads and credentials, accidental invocation increases the chance of unnecessary data exposure or confusing behavior.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

Instructing users to share API credentials directly with the assistant for storage/configuration creates a direct secret-handling risk. In this skill’s context, the danger is elevated because the assistant is also intended to process uploaded files and likely use network/file capabilities, making credential compromise potentially useful for ongoing unauthorized access to a third-party service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script writes the API app_id and secret_code directly to a predictable file in the user's home directory in plaintext, with no permission hardening, encryption, or warning about persistent local storage. In the context of a document-parsing skill that relies on third-party API credentials, this creates a realistic risk of credential disclosure to other local users, backup systems, logs, or malware on the host.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/parse.py (reported line 13)May include surrounding context.

python
import requests

CONFIG_FILE = os.path.expanduser("~/.openclaw/textin-config.json")
API_URL = "https://api.textin.com/ai/service/v1/pdf_to_markdown"


def load_config():

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/parse.sh (reported line 22)May include surrounding context.

sh
import requests

CONFIG_FILE = os.path.expanduser("~/.openclaw/textin-config.json")
API_URL = "https://api.textin.com/ai/service/v1/pdf_to_markdown"


def load_config():

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script saves API credentials in plaintext JSON under the user's home directory without warning about sensitive storage or applying explicit permission restrictions. On shared systems or misconfigured environments, other local users or processes may be able to read and abuse those credentials to access the external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script transmits full document contents or URL references to an external API service without an explicit warning, consent step, or privacy notice at the point of use. This can expose sensitive or regulated data if a user assumes parsing happens locally, especially because the tool is designed for arbitrary PDFs, images, and office documents.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This curl invocation transmits document content and potentially sensitive query parameters, including pdf_pwd, to an external service. In the context of a document-parsing skill, external transmission is expected functionality, but it remains security-relevant because sensitive local documents, embedded secrets, or passwords may be disclosed to a remote provider without strong guardrails.

Content

Scanner excerpt · scripts/parse.sh (reported line 154)May include surrounding context.

sh
# 发送请求
if [ "$CONTENT_TYPE" = "text/plain" ]; then
    RESPONSE=$(curl -s -X POST "${API_URL}?${QUERY_PARAMS}" \
        -H "x-ti-app-id: ${APP_ID}" \
        -H "x-ti-secret-code: ${SECRET_CODE}" \
        -H "Content-Type: ${CONTENT_TYPE}" \

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script uploads either a user-supplied URL or the contents of a local file to a third-party API, but it does not present an explicit warning, confirmation, or disclosure at the time of transmission. In a document-parsing skill, this creates a real data-exfiltration/privacy risk because users may provide sensitive local files without appreciating that the contents leave the machine and are sent to an external service.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

Comments and output strings such as 凭证已保存 are written only in Chinese, and the script provides no language selection or documented justification for a Chinese-only interface. This creates a natural-language locale constraint without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

User-facing descriptions, help text, and status/error messages throughout the script are written only in Chinese. This imposes a specific language on users without opt-in or explanation, which matches the locale-policy violation category.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The manifest frames the skill as a document parsing wrapper, but this file also implements saving API credentials to a local config file and printing them back to the user. While related to API access, credential persistence is a separate capability not mentioned in the stated purpose of parsing documents and extracting structured content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

The manifest emphasizes document parsing across formats, but the implementation also accepts arbitrary http/https URLs and forwards them to the external API. That URL-handling capability broadens the skill from file/content parsing into remote resource retrieval initiation, which is not explicitly stated in the manifest.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script's comments, usage text, and runtime messages are written in Chinese only, which imposes a specific language on users without opt-in or explanation. This matches the locale-policy concern for natural-language content because no alternative language or documented regional constraint is provided.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest description is written only in Chinese ("Textin 文档解析 API 封装") with no indication that users may choose another language or locale. The policy requires flagging language or locale constraints when they are imposed without opt-in or justification.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.