Back to skill

Security audit

AndonQ

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Tencent Cloud support-ticket and SmartQA assistant; it handles sensitive cloud support data, but the risky behavior is mostly purpose-aligned and documented.

Install only if you are comfortable letting the skill query Tencent Cloud support data using your credentials. Use a least-privileged, revocable sub-account key, prefer session-only or secret-manager injection, avoid the plaintext shell-profile fallback, and do not use verbose or dry-run output in shared logs. Treat ticket contents, organization data, operation logs, and SmartQA prompts as sensitive because they may leave the local environment or appear in transcripts.

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

Warning
Location
SKILL.md:39
Finding

Plaintext cloud credentials are recommended as a persistent fallback configuration

Content
View full analysis
> ~/.zshrc echo 'export TENCENTCLOUD_SECRET_KEY="your-secret-key"' >> ~/.zshrc source ~/.zshrc ``` Windows PowerShell(写入用户级环境变量): ```powershell [Environment]::SetEnvironmentVariable("TENCENTCLOUD_SECRET_ID", "your-secret-id", "User") [Environment]::SetEnvironmentVariable("TENCENTCLOUD_SECRET_KEY", "your-secret-key", "User") ``` ``` ### Technical Analysis The Skill documentation offers persistent storage of a Tencent Cloud SecretId and SecretKey in shell initialization files or user-level environment variables. These mechanisms ordinarily store the credentials in plaintext and make them available across sessions. Although the surrounding documentation warns users about this risk, presenting plaintext persistence as a supported fallback can still lead to long-lived credentials being exposed through: - Other processes running under the same user account. - Shell configuration backups and synchronization services. - Diagnostic bundles and accidental file sharing. - Malware or compromised development tools. - Child processes that inherit the complete environment. - Local users or services with permission to read the relevant profile. The SecretKey is sufficient to generate valid TC3 signatures. Its impact is therefore determined by the permissions granted to the associated Tencent Cloud identity. The Skill states that only ticket-read permissions are necessary, but it cannot technically enforce that users supply a least-privileged key. ### Attack Path 1. A user follows the documented fallback and writes the SecretId and SecretKey to `.zshrc`, `.bashrc`, or a persistent user environment variable. 2. The profile is backed u ...[truncated 940 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
check_env.py:267
Finding

Environment validation reveals credential suffixes in terminal output

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/andon_api.py:1023
Finding

Dry-run diagnostics expose the beginning of the Authorization header

Content
View full analysis
///tc3_request, ... ``` Consequently, the printed prefix can expose all or part of the Tencent Cloud SecretId and associated signing metadata. Truncation is not equivalent to redaction because the credential identifier appears near the beginning of the header. The 60-character prefix is unlikely to include the final TC3 signature, and the SecretKey is not directly embedded in the header. Therefore, this issue does not independently allow request signing. Nevertheless, authentication headers should be treated as sensitive and should never be partially printed based on fixed character offsets. ### Attack Path 1. A user invokes the ticket CLI with `--dry-run`. 2. The code loads the real SecretId and SecretKey and generates an authentic TC3 Authorization header. 3. The first 60 characters of that header are written to stdout. 4. A shared terminal, Agent transcript, CI system, or diagnostic collector retains the output. 5. An attacker obtains the SecretId and signing metadata, then correlates them with another credential leak or uses the identifier for targeted cloud-account reconnaissance. ### I ...[truncated 510 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (26)

Tainted flow: 'req' from os.environ.get (line 842, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/andon_api.py (reported line 850)May include surrounding context.

python
)

    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            body = json.loads(resp.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        try:

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

There is a clear description-behavior mismatch. The declared purpose describes an operational assistant for Tencent Cloud work orders and product consultation. The actual code chunk only performs local environment diagnostics: Python version checking, skill version update checking against ClawHub, and Tencent Cloud credential presence checking. These are setup/maintenance behaviors, not the assistant capabilities described. While such checks could be ancillary to a larger skill, this supplied code chunk itself does not represent the declared end-user functionality and introduces an undeclared remote registry/version-check capability.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

There is a material description/behavior mismatch. The implemented code is narrowly focused on authenticated Andon API transport and ticket/query operations: GetMCTicketList, GetMCTicketById, DescribeTicket, DescribeTicketOperation, DescribeOrganizationTickets, DescribeOrganizationStories, DescribeOrganizationStory, and a local GetCurrentTime helper. These align with the declared ticket querying and organization work-order/story management portions. However, the description prominently claims '腾讯云全产品线智能问答' and use for consulting Tencent Cloud products such as CVM/COS, as well as requests to find a human customer-service agent. No code in this chunk performs knowledge retrieval, LLM/Q&A, product-answering, routing to support, chat handling, or escalation workflows. That is a substantive missing capability relative to the declared purpose. Additionally, the code contains helper support for CreateMCTicket, but the supported action list and CLI do not expose it; this is a minor undeclared/internal capability rather than the main issue. Overall, the actual behavior is a ticket/organization-query API client, not a full intelligent customer-service assistant as described.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code matches only the 'intelligent Q&A' portion of the description. It talks to /online-service/api/agent/create/session and /online-service/api/agent/chat, manages chat sessions, and parses streamed assistant responses. There is no code for querying or managing工单/需求单 records, no ticket APIs, no retrieval of lists/details/flows, and no explicit human-agent escalation capability. Therefore the declared description materially overstates the implemented functionality, making it a mismatch.

Content

No source excerpt is available for this finding.

Context Leakage

High
Category
Data Exfiltration
Confidence
85% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · scripts/smartqa_api.py (reported line 249)May include surrounding context.

python
# ──────────────────────────────────────────────
# HTTP transport — send chat request
# ──────────────────────────────────────────────

def send_chat(payload: dict, verbose: bool = False) -> dict:

Context Leakage

High
Category
Data Exfiltration
Confidence
85% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · scripts/smartqa_api.py (reported line 254)May include surrounding context.

python
def send_chat(payload: dict, verbose: bool = False) -> dict:
    """
    Send chat request and parse SSE stream response.

    Args:
        payload: chat request body dict

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares broad capabilities involving environment variables, file reads, shell execution, network access, and MCP interactions, but does not explicitly scope or constrain which tools are allowed. In an agent setting, missing tool-scope declarations can enable unintended execution paths or over-broad access to secrets and local resources, especially because this skill handles cloud credentials and remote network calls.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Using an overly broad trigger phrase like '我要找人' can cause accidental invocation of the human-support flow when the user did not intend to contact customer service. In this skill, such misrouting can disclose user context to an external support destination or prematurely redirect users away from safer local handling, especially since the skill also processes potentially sensitive Tencent Cloud ticket data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The top-level docstring presents all user-facing usage and operational instructions exclusively in Chinese, which imposes a language choice on users without offering an alternative or opt-in. The policy explicitly allows locale constraints only when documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · check_env.py (reported line 89)May include surrounding context.

python
返回版本字符串或 None。
    """
    try:
        result = subprocess.run(
            ["clawhub", "inspect", slug, "--json"],
            capture_output=True, text=True, timeout=VERSION_CHECK_TIMEOUT,
        )

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The listed triggers include generic phrases such as “需求单列表”, “成员需求”, “story list”, and “member stories”, which can plausibly appear in normal conversation outside this specific skill invocation context. The file does not provide narrowing context, exclusion conditions, or negative examples to clarify when the skill should activate versus when it should not.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The listed triggers include general phrases like “查看需求单” and “需求进展”, which are broad enough to match ordinary conversation about requirements or progress rather than a clearly scoped skill invocation. The file does not provide negative examples or activation constraints to distinguish when this skill should trigger versus other related skills.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file documents a skill that lists organization tickets and displays identifiers and titles for member-related support cases. The description includes output of UINs and ticket metadata but provides no warning about privacy, access sensitivity, or the need to ensure the requester is authorized to view organizational ticket data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs the agent to display ticket operation history, including fields such as InnerReply, Remark, Operator, and records explicitly marked with HasSecret, but it does not require a warning, masking, or consent check before showing potentially sensitive internal content. In a support-ticket context, operation logs may contain internal notes, staff identifiers, escalation details, or sensitive troubleshooting data, so presenting them directly can cause inadvertent information disclosure.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The listed triggers include generic phrases like "查看工单", "工单状态", and especially "check ticket", which can naturally occur in ordinary support conversations and could invoke the skill without enough specificity. The file does not provide scope constraints, exclusion conditions, or negative examples to clarify when this skill should or should not activate.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The optional ReturnCosUrl parameter can cause the skill to return signed attachment URLs, which may expose sensitive ticket attachments to the user or to downstream logging, chat history, or link previews. In a support-ticket context, attachments often contain screenshots, configuration data, logs, or other sensitive material, so failing to warn and constrain this behavior increases the risk of unintended data disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document does not warn that ticket listings may expose sensitive support information, including ticket IDs, product usage, issue descriptions, timestamps, and workflow state. In a cloud support assistant, this increases the risk of unintended disclosure to a user who does not realize the sensitivity of the returned data or when the action is triggered too readily.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger phrases are broad enough to match ordinary conversation such as asking to '看看工单' or 'my tickets', which can cause the agent to invoke a ticket-listing action without sufficiently clear user intent. In this skill context, that matters because the action reveals potentially sensitive support metadata and issue summaries tied to the user's account.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation instructs users to submit natural-language questions to the Andon smart customer-service API but does not clearly warn that the content will be transmitted to an external Tencent Cloud service. In a support context, users may include sensitive operational details, account identifiers, or internal incident information, so the lack of disclosure increases the risk of unintended data exposure.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The default language is hard-coded to "zh", and that value is inserted into the outbound chat payload without exposing a language-selection mechanism. This imposes a specific locale on all users and matches the policy-violation criterion for forced language without user opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code serializes the user question into a request body and sends it over HTTPS to Tencent Cloud, but the normal execution path provides no confirmation prompt or explicit disclosure that user-provided text will be transmitted to an external service. While the module docstring describes API behavior, the main non-verbose CLI flow does not warn users before sending their question data.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The docstring claims the script is 'read-only' and checks whether AK/SK are 'configured and valid', but the implementation only checks presence of environment variables and also makes a remote registry query. This mismatch can mislead operators about what the script actually does, causing them to run a networked check when they expect purely local validation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest describes a Tencent Cloud ticketing and Q&A assistant, but this file adds a capability to query a ClawHub registry for remote skill version information via a subprocess call. That capability is not part of handling tickets, requirements, or customer-service conversations, and is not justified by the stated user-facing purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The display rules explicitly require the ticket list and status labels to be shown in Chinese, but the file also includes English trigger phrases, suggesting multilingual use. Because no user opt-in or justification for the Chinese-only output is documented, this is a locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

Natural-language policy violations include forcing a specific language without user opt-in. This file presents all usage instructions and behavior descriptions only in Chinese, with no indication that users can choose another language or that the locale restriction is required.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.