Back to skill

Security audit

LinkedIn 同事查询,按公司 ID 与人员 ID 从 LinkedIn 数据找同事与团队成员。帮助招聘人员、销售团队与 B2B线索构建者发掘团队关系网、绘制组织关系、扩展联系清单——适合关系网拓展、背调调研与客户信息分析。

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated LinkedIn colleague lookup purpose, but it handles API keys and paid account operations in ways that deserve review before installation.

Review this before installing if you will use a real UPKUAJING_API_KEY or paid balance. Do not print ~/.upkuajing/.env in chat or terminal logs; set restrictive permissions on that file, use a virtual environment, and only run paid lookup, recharge, or error-report commands after explicit confirmation.

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)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unbounded Third-Party Dependency Installation

Content
View full analysis
=0.23.0 ``` `SKILL.md:27-30`: ```bash pip install -r requirements.txt ``` ### Technical Analysis The dependency specification permits any `httpx` release at or above version 0.23.0. It does not impose an upper bound, select an exact reviewed release, or verify the downloaded artifact with a cryptographic hash. Consequently, installations at different times can resolve to different code. A future compromised, malicious, or incompatible release could be installed without any change to the audited Skill package. The documented command also relies on the user's default Python package index and package-source configuration. The audit did not find evidence that the current `httpx` package is malicious. The risk arises from allowing unreviewed future artifacts to become part of the Skill's effective executable code. ### Attack Path 1. An attacker compromises a future permitted dependency release, its maintainer account, or the package-distribution channel. 2. A user follows the Skill instructions and runs `pip install -r requirements.txt`. 3. The package resolver selects the compromised release because it satisfies `httpx>=0.23.0`. 4. Malicious package code executes during installation, import, or HTTP-client use. 5. The code inherits the privileges and accessible data of the user running the Skill. ### Impact Assessment Successful exploitation could provide code execution with the invoking user's privileges. Because the Skill reads `UPKUAJING_API_KEY`, sends paid requests, and processes LinkedIn query results, compromised dependency code could potentially access: - The API key from the process environment or `~/.upkuajing/.env` - Company and person identifiers submitted by the user - API responses and ac ...[truncated 188 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/auth.py:62
Finding

API Key Exposure Through Terminal Output and Insufficient File-Permission Enforcement

Content
View full analysis
Remediation
View remediation

other

Note
Location
scripts/version_check.py:96
Finding

Undisclosed Automatic Version Telemetry and Persistent Usage Cache

Content
View full analysis
Path: UPKUAJING_DIR.mkdir(parents=True, exist_ok=True) return VERSION_CACHE_FILE def save_version_cache(cache: Dict[str, Any]) -> None: cache_file = get_version_cache_file() try: with open(cache_file, 'w', encoding='utf-8') as f: json.dump(cache, f, ensure_ascii=False, indent=2) except IOError: pass ``` It sends an additional network request in `scripts/version_check.py:96-103`: ```python url = f"{api_base_url}/agent/api/skills/version" headers = {"Content-Type": "application/json"} with httpx.Client(timeout=10.0) as client: response = client.post(url, json={"name": skill_name}, headers=headers) response.raise_for_status() ``` ### Technical Analysis The colleague-query operation automatically triggers a daily version request before performing its primary API request. The request sends a Skill identifier derived from the local installation directory. A cache under the user's home directory records the last check date and latest version. This behavior is ancillary to the declared colleague-list lookup and is not clearly disclosed in `SKILL.md`. It therefore exceeds the minimum network and filesystem activity required to complete the primary operation. The version request is sent to the same declared vendor API d ...[truncated 1537 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (39)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Remote version checks and local cache or metadata handling are not reflected in the skill’s stated purpose, creating undocumented outbound communication and local persistence. While often legitimate, undisclosed update checks can still expose usage metadata and broaden the operational attack surface.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Remote version checks and local cache or metadata handling are not reflected in the skill’s stated purpose, creating undocumented outbound communication and local persistence. While often legitimate, undisclosed update checks can still expose usage metadata and broaden the operational attack surface.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Remote version checks and local cache or metadata handling are not reflected in the skill’s stated purpose, creating undocumented outbound communication and local persistence. While often legitimate, undisclosed update checks can still expose usage metadata and broaden the operational attack surface.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Remote version checks and local cache or metadata handling are not reflected in the skill’s stated purpose, creating undocumented outbound communication and local persistence. While often legitimate, undisclosed update checks can still expose usage metadata and broaden the operational attack surface.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
97% confidence
Finding

The skill explicitly instructs reading the API key from ~/.upkuajing/.env using a shell command that would expose the full secret value. Displaying or retrieving raw credentials in normal workflow is dangerous because it can leak secrets into chat transcripts, logs, terminal history, or other observable channels.

Content

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

API密钥与充值

使用此技能需要API密钥。API密钥保存在 ~/.upkuajing/.env 文件中:

bash
cat ~/.upkuajing/.env

文件内容示例:

text

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

The skill directs the agent to check for and potentially obtain a missing API key, then save it automatically into ~/.upkuajing/.env. This combines credential discovery, creation, and storage inside a skill that is ostensibly for data lookup, increasing the risk of unauthorized secret handling and silent expansion of account access.

Content

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

md
### **未设置API密钥**
请先检查 `~/.upkuajing/.env` 文件是否有 UPKUAJING_API_KEY;
如果未设置 UPKUAJING_API_KEY API密钥,请提示并让用户选择:
1. 用户有,由用户提供(手动添加到 ~/.upkuajing/.env 文件)
2. 用户没有,你可使用接口进行申请(`auth.py --new_key`),申请到新密钥后,会自动保存到 ~/.upkuajing/.env
等待用户选择;

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

Automatically applying for a new API key and writing it to a local .env file creates a credential-management pathway that could be abused or mishandled, especially in shared or hosted environments. Because the skill also involves billable operations, this may lead to untracked account creation, unauthorized use, or exposure of long-lived secrets.

Content

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

md
请先检查 `~/.upkuajing/.env` 文件是否有 UPKUAJING_API_KEY;
如果未设置 UPKUAJING_API_KEY API密钥,请提示并让用户选择:
1. 用户有,由用户提供(手动添加到 ~/.upkuajing/.env 文件)
2. 用户没有,你可使用接口进行申请(`auth.py --new_key`),申请到新密钥后,会自动保存到 ~/.upkuajing/.env
等待用户选择;

### **账户充值**

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script implements API key issuance, account lookup, and recharge/payment flows that are unrelated to the declared LinkedIn colleague-discovery purpose of the skill. This kind of capability mismatch is dangerous because it introduces monetization and credential-management behavior into a data-enrichment skill, increasing the chance of unauthorized billing, hidden platform dependency, or deceptive functionality.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/auth.py (reported line 18)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/auth.py (reported line 22)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/auth.py (reported line 78)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/common.py (reported line 63)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/common.py (reported line 85)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/common.py (reported line 90)May include surrounding context.

python
"""
    申请新的 API 密钥。
    """
    # 检查是否已存在 .env 文件和 API key
    env_file = UPKUAJING_ENV_FILE

    if env_file.exists():

Credential Access

High
Category
Privilege Escalation
Confidence
78% confidence
Finding

Writing a newly issued API key directly into a plaintext .env file under the user's home directory creates a local secret-exposure risk, especially on shared systems, backups, or if permissions are too broad. In a skill already showing scope mismatch, silently provisioning and persisting credentials increases the risk of undisclosed account linkage and downstream misuse.

Content

Scanner excerpt · scripts/auth.py (reported line 71)May include surrounding context.

python
"envFilePath": str(env_file)
        }

    # 保存到 .env 文件
    try:
        with open(env_file, 'w', encoding='utf-8') as f:
            f.write(f"{API_KEY_ENV}={api_key}\n")

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The exposed commands for creating recharge orders and retrieving balance/pricing are out of scope for a people-search skill and enable financial/account actions not implied by the skill description. In context, this makes the skill more dangerous because users may invoke it expecting LinkedIn-style enrichment while it instead performs payment-related operations against an external service.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · scripts/common.py (reported line 19)May include surrounding context.

python
API_BASE_URL = "https://openapi.upkuajing.com"
API_KEY_ENV = "UPKUAJING_API_KEY"
UPKUAJING_DIR = Path.home() / '.upkuajing'
UPKUAJING_ENV_FILE = UPKUAJING_DIR / '.env'
UPKUAJING_LOGS_DIR = UPKUAJING_DIR / 'logs'

# 日志开关

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

技能清单声明该技能依托 LinkedIn 数据检索同事和团队成员,并发掘商务联系人;但此文件的核心逻辑是收集 skillId、requestId、context 等参数后调用 /agent/skill/error/report 上报异常。异常遥测上报并不是该清单描述中体现的业务功能,本文件行为与技能对外宣称用途存在明显语义不一致。

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares capabilities that involve environment access, local file access, and network use, but it does not define an explicit tool scope or permission boundary. That makes the effective privilege set opaque to users and reviewers, increasing the risk of unexpected credential access, file reads/writes, or outbound requests beyond the stated business purpose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill name includes a 'zh' locale marker and the description is written entirely in Chinese, indicating a language-specific behavior. The file does not state that users may choose another language or opt in to Chinese, which matches the policy concern for forced language/locale without user choice.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The document instructs agents to send exception context, request parameters, and response data to a remote error-reporting API, but it does not require explicit user notice, consent, or strict guidance to avoid transmitting sensitive personal or business data. In a skill that processes LinkedIn-derived people, colleague, and organizational relationship data, those payloads could contain personal identifiers, internal company information, or model interaction details, creating a real privacy and data-sharing risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code file contains user-facing natural-language descriptions and messages exclusively in Chinese, including the module description and CLI help text. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is clearly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
86% confidence
Finding

The unsafe default here is not merely the flag itself, but that the script defaults to a workflow where an external credential can be provisioned without authenticating an existing user. In the context of a LinkedIn colleague-discovery skill, this mismatch makes the behavior more suspicious because credential issuance is hidden behind a seemingly unrelated capability.

Content

Scanner excerpt · scripts/auth.py (reported line 41)May include surrounding context.

python
pass  # 如果读取失败,继续执行

    # 不需要认证申请新密钥
    response = make_request('/agent/auth/create', {}, require_auth=False)

    # 检查是否申请成功
    if response.get('code') != 0:

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
86% confidence
Finding

The unsafe default here is not merely the flag itself, but that the script defaults to a workflow where an external credential can be provisioned without authenticating an existing user. In the context of a LinkedIn colleague-discovery skill, this mismatch makes the behavior more suspicious because credential issuance is hidden behind a seemingly unrelated capability.

Content

Scanner excerpt · scripts/auth.py (reported line 41)May include surrounding context.

python
pass  # 如果读取失败,继续执行

    # 不需要认证申请新密钥
    response = make_request('/agent/auth/create', {}, require_auth=False)

    # 检查是否申请成功
    if response.get('code') != 0:

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

技能清单描述强调的是基于 LinkedIn 与企业信息进行人员检索和组织关系梳理,但此文件还实现了完整的任务ID生成、任务目录管理、元数据保存和结果追加写入等本地持久化机制。这不只是临时实现细节,而是额外的任务存储子系统,明显比描述中的检索分析能力更宽。

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
scripts/common.py:196