Back to skill

Security audit

Transcript Analysis

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does the transcript analysis it advertises, but it ships and uses a built-in third-party API credential and follows provider-returned URLs without validation.

Review before installing. Prefer web mode only, and do not use API mode until the embedded QVeris credential is removed, each user supplies their own secret securely, and returned content URLs are validated against an allowlist with size limits.

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

T09 · Insecure Skill Coding Practices

Error
Location
transcript_analyzer.py:46
Finding

Hard-Coded QVeris Bearer Credential

Content
View full analysis

Vulnerability Details

File Location: transcript_analyzer.py:46, used at transcript_analyzer.py:151
Vulnerability Type: Hard-coded API secret
Risk Level: High

Vulnerable Code:

python
QVERIS_API_KEY = "sk-OAk52GSBLKryEWgg-bKP4yoJyRqA6RToSYSTTND7-jg"

The credential is subsequently placed in an authorization header:

python
req.add_header("Authorization", f"Bearer {QVERIS_API_KEY}")

Technical Analysis

A live-looking QVeris bearer token is embedded directly in the distributed source code. Anyone with access to the Skill package can retrieve the credential without executing the program.

Authentication is necessary for the declared optional API mode, but distributing a shared credential is not necessary and violates least-privilege secret-management practices. Source-level secrets cannot be meaningfully protected through repository or package access controls once the Skill is distributed.

The token is transmitted over HTTPS to the configured QVeris endpoint, so the primary issue is not transport security. The issue is disclosure and unauthorized reuse of the bearer credential. Because bearer tokens generally grant access based solely on possession, an attacker does not need an additional password or cryptographic proof.

Attack Path

  1. An attacker downloads or otherwise obtains the Skill package.
  2. The attacker reads transcript_analyzer.py and extracts the token from line 46.
  3. The attacker constructs requests to the QVeris API using:
    http
    Authorization: Bearer <extracted-token>
    
  4. The attacker invokes any QVeris operations permitted by the token.
  5. The attacker consumes API quota, incurs associated costs, or accesses other resources available under the credential until it is revoked.

Impact Assessment

Successful exploitation grants the attacker the same QVeris API privileges assigned to the exposed token. The exact authorization sco ...[truncated 596 chars]

Remediation
View remediation

Remediation Suggestions

  1. Revoke and rotate the exposed credential immediately.
  2. Remove the token from the source code and repository history.
  3. Require each user to supply a QVeris key through a protected environment variable or secret manager, for example:
    python
    QVERIS_API_KEY = os.environ.get("QVERIS_API_KEY")
    if not QVERIS_API_KEY:
        raise RuntimeError(
            "QVERIS_API_KEY is required when --mode api is selected"
        )
    
  4. Only load the secret when API mode is selected; web mode should not require access to it.
  5. Avoid printing the token or including it in exceptions, generated reports, telemetry, or logs.
  6. Configure the replacement token with the narrowest available API scope, quota, and lifetime.
  7. Add automated secret scanning to the development and release process.
  8. If shared service access is required, use a controlled backend that authenticates individual users rather than distributing a shared bearer token.

T09 · Insecure Skill Coding Practices

Warning
Location
transcript_analyzer.py:158
Finding

Unvalidated Response-Controlled URL Retrieval

Content
View full analysis

Vulnerability Details

File Location: transcript_analyzer.py:158-160
Vulnerability Type: Server-side request forgery and unsafe URL handling
Risk Level: Medium

Vulnerable Code:

python
if r.get("full_content_file_url"):
    with urlopen(r["full_content_file_url"], timeout=30) as f:
        return json.loads(f.read().decode("utf-8"))

Technical Analysis

The program passes full_content_file_url from the QVeris API response directly to urlopen without validating the URL scheme, hostname, destination address, port, or redirect chain.

Fetching a provider-generated content URL may be necessary for the declared API functionality. However, allowing the response to select an unrestricted destination exceeds the minimum network privileges required. A compromised service, malicious intermediary with control over otherwise valid API responses, or attacker who gains influence over the response could direct the Skill to:

  • Internal HTTP services.
  • Loopback or link-local endpoints.
  • Private network addresses.
  • Cloud instance metadata services.
  • Local resources through a scheme supported by the URL handler.
  • An attacker-controlled endpoint used for network reconnaissance.

HTTPS protects the response against ordinary network tampering but does not protect against a compromised or malicious upstream service. The code also lacks a response-size limit, allowing a selected endpoint to return an excessively large body and consume memory before JSON parsing.

Attack Path

  1. A user executes the Skill in API mode.
  2. The attacker compromises QVeris, its response-generation path, or another component capable of controlling full_content_file_url.
  3. The attacker returns a URL targeting an internal or local resource, such as a loopback service, private-network endpoint, or cloud metadata address.
  4. The Skill calls urlopen on the supplied URL from the user's network context.
  5. The targe ...[truncated 1498 chars]
Remediation
View remediation

Remediation Suggestions

  1. Parse the returned URL before making a request.
  2. Require the https scheme and reject all other schemes.
  3. Maintain an explicit allowlist of QVeris-approved content-storage hostnames.
  4. Reject URLs containing embedded user credentials, unexpected ports, fragments, or malformed hostnames.
  5. Resolve the hostname and reject loopback, private, link-local, multicast, reserved, and unspecified IP addresses for both IPv4 and IPv6.
  6. Disable redirects or validate every redirect destination against the same scheme, hostname, and address rules.
  7. Revalidate the connected destination to mitigate DNS rebinding and time-of-check/time-of-use issues.
  8. Apply a strict maximum response size and stream the body rather than reading an unbounded response into memory.
  9. Validate the returned JSON against the expected transcript schema before processing or writing it.
  10. Where possible, replace arbitrary response URLs with a provider endpoint whose host is fixed in configuration.
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Tp2

High
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

No source excerpt is available for this finding.

Tp2

High
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

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This finding indicates the skill's declared behavior does not fully disclose that it accesses external websites/APIs and may use an embedded third-party API key. Hidden network access and hardcoded credentials are dangerous because they expand the trust boundary, can leak secrets, and may cause unauthorized third-party actions or billing outside user expectations. The skill context increases severity because the workflow explicitly instructs running a bundled Python script via Bash, so undisclosed external calls would execute in practice if the skill is followed.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 164)May include surrounding context.

md
本技能捆绑 `transcript_analyzer.py` 脚本,安装后位于 skill 目录内。

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

A live API credential is hard-coded directly in the source, which exposes the secret to anyone with code access and allows unauthorized reuse of the external service account. If leaked through source control, logs, packaging, or downstream distribution, attackers can consume credits, impersonate the application, or pivot into any data accessible via that API key.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The embedded API key is not only stored insecurely, it is actively used in outbound requests without meaningful user disclosure at the point of execution. This combines secret exposure with silent use of a third-party account, increasing the risk of credential abuse, unexpected billing, and unreviewed external dependency trust.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description, workflow, prompts, and documentation are written entirely in Chinese, including the user confirmation text, while only one trigger is provided in English. This creates a language/locale constraint without explicit user opt-in or documentation that the skill is intentionally limited to Chinese-speaking users.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The module docstring, usage guidance, and output descriptions are written entirely in Chinese, with no indication that users may choose another language. Under the policy, language constraints should be optional or explicitly justified; here the file presents a single-language interface by default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

In API mode, the tool sends the queried symbol and quarter data to an external service and may fetch additional content from a returned URL, but the code provides only minimal console labeling rather than explicit consent and privacy disclosure. While the transmitted fields are not highly sensitive by themselves, silent outbound transmission to a third party can violate user expectations and organizational data-handling rules.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
transcript_analyzer.py:46