Back to skill

Security audit

Api Connect Hub Free

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a legitimate API-integration helper, but it asks agents to handle live service credentials and generate network-calling code without enough safeguards against token exposure or unintended API writes.

Install only if you are comfortable with an agent helping edit integration code and handle API credential names. Use placeholder values in chat, keep real tokens in a secret manager or tightly controlled environment, approve every new connector host before use, and disable retries for state-changing API calls unless the service supports idempotency keys.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:229
Finding

Configurable Connector Can Exfiltrate Environment Credentials to an Untrusted Endpoint

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 229–252
Vulnerability Type: Untrusted destination receives environment-sourced credentials
Risk Level: High

Vulnerable Code

python
path = endpoint.path
if path_params:
    for k, v in path_params.items():
        path = path.replace(f'{{{k}}}', str(v))
url = connector.base_url + path

# 2. Construct request headers
token = get_credential(connector.auth.credential_env)
headers = {
    connector.auth.header: f"{connector.auth.prefix} {token}",
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'APIConnectHub/1.0',
}

# 3. Send request with retry support
max_retries = 3 if retry else 0
for attempt in range(max_retries + 1):
    try:
        response = requests.request(
            method=endpoint.method,
            url=url,
            headers=headers,
            params=query,
            json=body,
            timeout=30,
        )

Technical Analysis

The request destination and credential source are both selected through mutable connector configuration:

  • connector.base_url determines where the HTTP request is sent.
  • connector.auth.credential_env determines which environment variable is read.
  • connector.auth.header and connector.auth.prefix control how that secret is transmitted.

The template does not validate that the destination uses HTTPS, restrict destinations to trusted API origins, bind particular credentials to approved domains, or prevent redirects from forwarding authentication data to another origin. Consequently, a malicious or tampered connector can select a valuable environment variable and transmit its value to an attacker-controlled server.

Path parameters are also inserted through direct string replacement without URL encoding. This can alter the intended request path, although the primary credential-disclosure issue already exists through the configurable base URL.

Attack Path

  1. An attacker persuad ...[truncated 1209 chars]
Remediation
View remediation

Remediation Suggestions

  1. Validate connector definitions against a strict schema before use.
  2. Require https:// for all credential-bearing requests and reject plaintext HTTP.
  3. Maintain an explicit allowlist mapping each credential environment variable to approved origins.
  4. Reject loopback, private, link-local, multicast, and cloud metadata destinations after DNS resolution.
  5. Revalidate the resolved destination for every redirect, or disable redirects for authenticated requests.
  6. Never forward authentication headers across origins.
  7. Require explicit user confirmation when a connector introduces a previously unapproved host or credential.
  8. Load connector templates only from trusted, integrity-verified sources.
  9. URL-encode path parameter values rather than performing direct string replacement.
  10. Run the Agent with a minimal environment containing only credentials needed for the current operation.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:245
Finding

Default Retry Logic Can Duplicate Non-Idempotent API Operations

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 245–272
Vulnerability Type: Unsafe replay of state-changing HTTP requests
Risk Level: Medium

Vulnerable Code

python
# 3. Send request with retry support
max_retries = 3 if retry else 0
for attempt in range(max_retries + 1):
    try:
        response = requests.request(
            method=endpoint.method,
            url=url,
            headers=headers,
            params=query,
            json=body,
            timeout=30,
        )

        # 4. Rate-limit check
        remaining = response.headers.get(connector.rate_limit.remaining_header)
        if remaining and int(remaining) < 100:
            print(f"Warning: {connector.name} rate limit nearly exhausted; {remaining} requests remain")

        # 5. Error handling
        if response.status_code == 429:
            # Rate limiting: read Retry-After and retry after waiting
            retry_after = int(response.headers.get('Retry-After', 60))
            print(f"Rate limited; retrying after {retry_after} seconds")
            time.sleep(retry_after)
            continue

        if response.status_code >= 500 and attempt < max_retries:
            # 5xx: retry with exponential backoff
            wait = 2 ** attempt
            print(f"Server error {response.status_code}; retrying after {wait} seconds")
            time.sleep(wait)
            continue

The related documentation at line 397 states that idempotency keys are recommended for non-idempotent POST operations, but the implementation does not generate or enforce such keys.

Technical Analysis

Retries are enabled by default and are applied without checking the HTTP method or endpoint semantics. Therefore, POST, PATCH, and other state-changing operations receive the same retry behavior as idempotent reads.

A server can successfully commit an operation but return a 5xx response, a rate-limit response, or no response because the connection fails after pro ...[truncated 1327 chars]

Remediation
View remediation

Remediation Suggestions

  1. Retry only methods known to be idempotent, such as GET and HEAD, by default.
  2. Treat endpoint idempotency as explicit connector metadata rather than inferring it solely from the HTTP method.
  3. Require a stable idempotency key before retrying POST, PATCH, or other state-changing operations.
  4. Verify that the target service supports the selected idempotency mechanism.
  5. Preserve the same idempotency key across every retry of one logical operation.
  6. Disable automatic retries where the upstream result is ambiguous and no reconciliation API exists.
  7. Add operation-status reconciliation before resubmission when supported.
  8. Add randomized, bounded exponential backoff and enforce a total retry-time budget.
  9. Record operation identifiers and retry decisions in security-safe audit logs.
  10. Add tests demonstrating that non-idempotent operations are never replayed without explicit authorization and protection.

T08 · Insecure Dependencies

Note
Location
SKILL.md:414
Finding

Unpinned Python Dependency Installation Produces a Non-Reproducible Supply Chain

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 414–415
Vulnerability Type: Unpinned third-party dependencies
Risk Level: Low

Vulnerable Code

text
| requests | Python package | Recommended | `pip install requests` |
| python-dotenv | Python package | Recommended | `pip install python-dotenv`, used to load .env files |

Technical Analysis

The installation instructions request floating versions of requests and python-dotenv. No reviewed version constraints, lock file, package hashes, or explicit trusted package index are supplied.

As a result, two installations performed at different times can resolve to different dependency trees. A future compromised, malicious, or unexpectedly incompatible release could therefore be installed without a source change in this project. The package names shown are conventional and no malicious package is identified; the issue is the absence of reproducible and integrity-verified dependency management.

Attack Path

  1. A user follows the documented pip install commands.
  2. The package installer queries its configured index and selects the latest matching releases.
  3. A compromised package release, compromised transitive dependency, or unsafe configured index supplies altered code.
  4. The package is installed into the Agent's Python environment.
  5. The altered dependency executes with the privileges of the Python process during import or runtime.

This is a conditional supply-chain path; the audited file does not itself demonstrate that either named package is malicious.

Impact Assessment

If dependency resolution is compromised, injected code could execute with the privileges of the user or Agent process. It could potentially access project files, environment credentials, network resources, and APIs available to that process. The practical risk is reduced because the named packages are well-known and the document marks them as recommended rather than automatically installing th ...[truncated 3 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin direct and transitive dependencies to reviewed versions.
  2. Provide a lock file generated through a reproducible dependency-management process.
  3. Use hash verification, such as pip's --require-hashes, for release artifacts.
  4. Specify the approved official package index and reject untrusted extra indexes.
  5. Install dependencies in an isolated virtual environment with minimal privileges.
  6. Scan locked dependencies for known vulnerabilities and review updates before adoption.
  7. Automate dependency updates through reviewed pull requests rather than resolving unrestricted latest versions at installation time.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
对Agent说:

> "帮我注册一个GitHub连接器,用Personal Access Token认证。"

Agent输出连接器注册YAML:

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
对Agent说:

> "帮我注册一个GitHub连接器,用Personal Access Token认证。"

Agent输出连接器注册YAML:

Credential Access

High
Category
Privilege Escalation
Confidence
94% confidence
Finding

The skill includes a concrete .env example populated with realistic-looking secret formats, normalizing direct handling of high-value credentials inside agent-readable artifacts. In this context, the danger is amplified because the skill is explicitly about credential management and may encourage users to place secrets into local plaintext files or prompts rather than into a dedicated secret manager.

Content

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

凭证文件结构:

bash
# .env 文件(已gitignore)
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
SLACK_BOT_TOKEN=xoxb-xxxxxxxxxxxx
STRIPE_SECRET_KEY=sk_live_xxxxxxxxxxxx

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
### Q3:支持OAuth2的刷新token流程吗?

免费版支持OAuth2的access token调用,但refresh token自动刷新流程属于专业版功能。免费版中access token过期后需手动刷新。建议access token有效期设为1小时,配合定时刷新脚本。

### Q4:重试策略会压垮上游服务吗?

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
### Q3:支持OAuth2的刷新token流程吗?

免费版支持OAuth2的access token调用,但refresh token自动刷新流程属于专业版功能。免费版中access token过期后需手动刷新。建议access token有效期设为1小时,配合定时刷新脚本。

### Q4:重试策略会压垮上游服务吗?

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest description says the skill should be used for "Webhook配置" and system connections, implying webhook-related support is part of the free edition's scope. However, the document later states that "Webhook管理(注册/接收/验签/重放)" is a professional-edition-only capability, creating a clear mismatch between the advertised purpose and the actual documented functionality of this skill file.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger description is broad enough to match common development conversation topics like API integration, webhook configuration, and system connection. In agent environments, overbroad invocation conditions can cause the skill to activate unexpectedly and perform sensitive actions such as generating credential-handling code, writing config files, or recommending network operations without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill gives contradictory statements about whether token refresh happens automatically in the free edition. Security-sensitive documentation inconsistency around credential lifecycle can cause operators to leave expired or stale auth flows in place, break integrations unexpectedly, or adopt unsafe manual token handling to compensate.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The documentation promises 401 token-refresh retry behavior, but the provided implementation performs no refresh logic. In practice, agents or users may rely on this claim and assume expired credentials will be safely recovered, causing repeated unauthorized requests, brittle automation, and potential insecure workarounds such as embedding new tokens manually.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 331)May include surrounding context.

md
|:---:|:---:|:---:|:---:|
| GitHub | API Key (token) | https://api.github.com | 5000/小时 |
| Slack | Bearer Token | https://slack.com/api | 1/秒(工作区级) |
| Notion | Bearer Token | https://api.notion.com/v1 | 3/秒 |
| Stripe | Bearer Token | https://api.stripe.com | 100读/100写每秒 |
| Twilio | Basic Auth | https://api.twilio.com | 按账户 |
| SendGrid | Bearer Token | https://api.sendgrid.com | 按包 |

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 338)May include surrounding context.

md
| HubSpot | Bearer Token | https://api.hubapi.com | 100/10秒(私有) |
| Salesforce | OAuth2/Bearer | https://{instance}.salesforce.com | 100/秒 |
| Airtable | Bearer Token | https://api.airtable.com | 5/秒 |
| Linear | API Key | https://api.linear.app/graphql | 按工作区 |
| Vercel | Bearer Token | https://api.vercel.com | 按账户 |
| Supabase | API Key | https://{project}.supabase.co | 按计划 |
| OpenAI | Bearer Token | https://api.openai.com | 按账户 |

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The capability coverage section uses keyword stacking with vague boundaries, increasing the chance of accidental triggering in unrelated contexts. In an agent system with write and exec tools, ambiguous scope raises the risk of unintended assistance touching configuration, credentials, or external services.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill encourages organizing and handling credentials but does not provide a prominent warning about sensitive-secret exposure risks during agent interaction. Users may paste tokens, PATs, or refresh tokens directly into prompts, leading to accidental disclosure in chat history, logs, or downstream tooling.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The document describes behaviors that can write files and perform live network/API operations, but lacks a unified warning about user impact and consent. In agent contexts, this can lead to unintended outbound requests, configuration changes, or touching production systems without the user fully understanding the consequences.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

“完全中文化表达”表述体现出该技能在语言/locale 上强制采用中文,但文档没有说明是否支持用户选择其他语言,也没有将该限制作为面向特定中文场景的明确约束。按组织语言策略,这属于未提供用户语言选择的单一语言限定。

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.