Back to skill

Security audit

Enterprise Intro

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent enterprise-reporting skill, but it needs Review because it sends signed API requests to a user-configured host and includes instructions to hide AI involvement.

Install only if you trust Qibook/企百科 and can verify CHINADAAS_BASE_URL is the official HTTPS API endpoint. Protect the CHINADAAS key, avoid querying confidential enterprises, and consider removing the AI-concealment wording before using the templates in customer-facing reports.

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
scripts/base.py:17
Finding

Unvalidated API Base URL Allows Signed Requests to Arbitrary Destinations

Content
View full analysis
dict: """ Generate API request headers. """ timestamp = str(int(time.time() * 1000)) nonce = str(random.randint(0, 999999)) signature = encrypt(f"{nonce};{KEY};{timestamp};{UID};") return { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Uid': UID, 'X-Nonce': nonce, 'X-Timestamp': timestamp, 'X-Signature': signature } ``` ```python def call_api(endpoint: str, params: dict = None, method: str = 'GET') -> dict: """ Unified API request function. """ url = BASE_URL + endpoint headers = get_headers() params = params or {} try: if method.upper() == 'POST': response = requests.post(url, headers=headers, json=params, timeout=30) else: response = requests.get(url, headers=headers, params=params, timeout=30) return response.json() ``` ### Technical Analysis The API destination is read directly from `CHINADAAS_BASE_URL` and concatenated with endpoint paths without parsing or validating the scheme, hostname, port, or resolved address. Although the Skill documentation states that HTTPS requests are sent to the Qibook service, the implementation does not enforce HTTPS or restrict requests to `qibook.com`. Every request includes the account UID and a request-specific authentication signature. It also transmits the queried enterprise name and related query parameters. If an attacker can influence the runtime environment, deployment configuration, or launche ...[truncated 2256 chars]
Remediation
View remediation
str: if not value: raise RuntimeError("CHINADAAS_BASE_URL is required") parsed = urlparse(value) if parsed.scheme != "https": raise RuntimeError("The API base URL must use HTTPS") if parsed.username or parsed.password or parsed.fragment: raise RuntimeError("The API base URL contains prohibited components") if parsed.hostname not in ALLOWED_HOSTS: raise RuntimeError("The API hostname is not approved") return value.rstrip("/") + "/" BASE_URL ...[truncated 160 chars]

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/debt_financing.py:48
Finding

Direct API Requests Without Timeouts Can Block Skill Execution Indefinitely

Content
View full analysis
dict: """Bond list information query.""" url = url_o + '/issueBond' timestamp = str(int(time.time() * 1000)) nonce = str(random.randint(0, 999999)) headers = { 'Accept': 'application/json', 'X-Uid': uid, 'X-Nonce': nonce, 'X-Timestamp': timestamp, 'X-Signature': encrypt(nonce + ";" + key + ";" + timestamp + ";" + uid + ";") } params = {'entname': entname} try: response = requests.get(url, headers=headers, params=params) response_json = response.json() if response_json.get('code') == 404: return None return response_json except Exception: return None ``` ```python def _call_financing_api(entname: str) -> dict: """Enterprise financing information query.""" url = url_o + '/financingInformation' timestamp = str(int(time.time() * 1000)) nonce = str(random.randint(0, 999999)) headers = { 'Accept': 'application/json', 'X-Uid': uid, 'X-Nonce': nonce, 'X-Timestamp': timestamp, 'X-Signature': encrypt(nonce + ";" + key + ";" + timestamp + ";" + uid + ";") } params = {'entname': entname} try: response = requests.get(url, headers=headers, params=params) return response.json() except Exception: return None ``` Equivalent timeout-free calls were identified at: ```python # scripts/financial_info. ...[truncated 1966 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (100)

Tainted flow: 'url' from os.environ.get (line 92, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
92% confidence
Finding

The request target is built from BASE_URL sourced directly from an environment variable and then used in outbound HTTP calls. If that environment variable is misconfigured or attacker-controlled, the skill will send authenticated requests and user/query data to an arbitrary host, creating SSRF-style exfiltration risk and credential leakage via the custom headers.

Content

Scanner excerpt · scripts/base.py (reported line 98)May include surrounding context.

python
try:
        if method.upper() == 'POST':
            response = requests.post(url, headers=headers, json=params, timeout=30)
        else:
            response = requests.get(url, headers=headers, params=params, timeout=30)

Tainted flow: 'url' from os.environ.get (line 92, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
92% confidence
Finding

The GET path has the same issue as the POST path: BASE_URL comes from the environment and is concatenated into a request URL without validation. An attacker who can influence deployment configuration could redirect requests, query parameters, and authentication headers to an unintended endpoint.

Content

Scanner excerpt · scripts/base.py (reported line 100)May include surrounding context.

python
if method.upper() == 'POST':
            response = requests.post(url, headers=headers, json=params, timeout=30)
        else:
            response = requests.get(url, headers=headers, params=params, timeout=30)

        return response.json()
    except requests.exceptions.Timeout:

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

该描述与代码主功能不一致。代码没有实现企业“百科”或综合企业画像生成,而是专门围绕企业招投标活动做数据拉取、统计和摘要,包括项目时间线、采购类型、行业分布、中标次数与金额、公告来源、地域分布、关系网络等。虽然这些内容可作为企业调研的一部分,但不足以支撑“基于多维企业数据”的综合企业洞察、信用分析或尽调报告描述。因此属于声明范围明显大于且不同于实际能力的功能性不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个面向企业综合信息洞察的“企业百科生成技能”,应基于多维企业数据生成较全面的企业简介或分析报告。而提供的代码块专注于“实际控制人一体化脚本”,其核心行为是:查询企业基本信息、若为分公司则切换到总公司名称、调用实际控制人 API、映射字段并输出实际控制人 Markdown。没有看到多维数据聚合、信用分析、商业调研、尽调报告生成等综合能力,因此该代码的主要用途与声明用途存在明显不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个范围较广的“企业百科生成技能”,强调基于多维企业数据生成综合企业洞察,并适用于信用分析、商业调研、投资尽调等场景。但提供的代码块功能非常具体且单一:仅查询企业客户/供应商关系数据,并将其整理为 Markdown 摘要。它没有展示整合多维企业数据的能力,也没有体现生成综合企业简介、信用分析或尽调报告所需的其他核心信息维度。因此,代码的实际主用途明显比声明更窄,属于描述与行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个覆盖企业综合信息的百科/洞察生成技能,强调多维企业数据、信用分析、商业调研、投资尽调等广泛用途。但代码只实现了单一专题:企业债权融资信息查询与格式化总结。它访问的接口只有 /issueBond 和 /financingInformation,处理的字段也全部围绕债券、借款、授信、信托、租赁和有息债务展开,没有看到企业基本信息、股东、高管、工商、司法、经营风险、信用评级全景等“企业百科”或“综合洞察”所需的数据维度。因此这是主功能层面的明显不一致,而不是细节上的实现差异。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

声明描述的是一个较宽泛的“企业百科生成”能力,强调基于多维企业数据生成专业企业洞察简介报告,可用于信用分析、商业调研和投资尽调。代码则没有体现多维数据整合、洞察分析、信用评估或尽调报告生成逻辑;它只访问几个特定接口获取上市公司基本信息与三大财务报表,对数据做筛选、字段映射和简单文本拼接。输出内容本质上是财务信息摘要,而不是综合企业百科或专业分析报告。因此其主要功能比声明更窄、更偏财务报表查询与格式化,属于描述与实际行为的实质性不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

代码的核心功能是集团信息查询与摘要,不是通用的企业百科生成。它调用的接口仅包括企业基本信息、集团母公司识别、集团成员识别,并围绕母公司、子公司、控制链路、层级、持股比例、地域分布等生成简短文本。这与声明中的“基于多维企业数据生成专业企业洞察简介报告”存在明显范围差异:声明暗示更全面的企业综合画像,可用于信用分析、商业调研、投资尽调,而代码并未体现财务、信用、司法、经营风险、舆情等多维分析能力。因此属于描述与实际行为的实质性不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述的是一个较宽泛的“企业百科生成”能力,面向综合企业洞察、信用分析和尽调报告;而代码仅实现了一个“历史大数据”子功能,主要抓取工商历史变更和历史对外投资信息,并格式化成 Markdown。它没有展示多维数据整合、信用分析、尽调结论、风险评估、商业调研等能力,因此实际行为与声明的主要目的相比明显偏窄且不同,属于描述与代码行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个覆盖多维企业数据、可生成综合企业洞察简介的技能,适用场景包括信用分析、商业调研、投资尽调等较宽泛任务。但代码唯一的数据来源是 /invevents API,且处理逻辑全部围绕融资事件与近三年投资事件展开,最终输出标题和内容也明确是“投融资事件提炼”。它没有展示企业信用、工商、司法、经营、财务、舆情等其他维度数据处理能力,因此不足以支撑“企业百科”“综合信息”“信用分析报告/商业调研报告/投资尽调报告”等声明用途。虽然投融资信息可作为尽调或企业介绍的一部分,但当前实现的主要目的和能力边界明显更窄,属于实质性描述不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个广义的企业百科/企业洞察报告生成技能,强调基于多维企业数据生成综合性企业信用、商业调研、投资尽调报告。实际代码并未整合多维企业数据,也没有进行信用分析、经营风险、财务、股权、舆情等综合企业画像处理;它只围绕企业的法人名称展开关联查询,获取该法人在其他企业的法人、高管、投资和实际控制关系,并生成“投资任职信息分析”报告。因此其主要功能与声明的核心用途存在实质偏差。虽然该功能可能可作为尽调中的一个子模块,但作为整体技能描述并不能准确代表该代码块的真实主用途。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

该代码的核心目的非常明确,是围绕企业知识产权进行数据采集、统计处理和 Markdown 报告生成。它分别查询专利、商标、作品著作权、软件著作权,提炼总量、年份分布、有效性、类型分布和代表性资产,最终生成“知识产权信息提炼”报告。虽然知识产权可作为企业洞察的一部分,但声明描述的是更广义的“企业百科生成”和“多维企业数据”综合分析,尤其强调信用分析、商业调研、投资尽调等场景;而代码并未体现企业信用、工商、财务、经营、风险、股权等综合维度,也没有生成综合企业画像。因此这是明显的描述与实际行为不匹配,且属于主要用途层面的偏差。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

代码的核心职责非常明确:根据企业名称调用 /listed/inv 和 /hkListed/inv 接口,查询A股/内地上市信息以及港股上市信息,并进行字段筛选、合并、中文映射、财务指标去重与格式化,最终生成题为“上市信息提炼”的Markdown结果。它不是一个通用的企业百科生成器,也没有体现企业信用分析、工商全景、尽调多维数据整合等更广泛能力。尤其明显的是,代码专门实现了港股查询 _call_hk_listed_api,并输出“港股企业信息/港股股票基本信息”,这直接与描述中的“NOT for: 非中国大陆企业查询”不符。因此应判定为描述与实际行为存在实质性不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

描述强调“企业百科生成”以及“基于多维企业数据生成专业的企业洞察简介报告”,适用于信用分析、商业调研、投资尽调等较综合场景。但代码只调用一个经营事件相关接口(/businessOpportunityQuery),并围绕经营事件做字段映射、删减、按年份统计、事件时间线提炼和简单关键词总结。其主功能是企业经营动态摘要,而不是企业综合百科/尽调报告生成。虽然仍属于企业信息报告范畴,但主目的和能力范围明显比声明更窄,构成描述与实际行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

该描述与代码存在明显的目的层级不一致。描述强调的是面向企业综合画像的“企业百科生成”与“专业洞察简介报告”,通常应覆盖多维企业信息,甚至支持信用分析、商业调研、投资尽调等更全面输出。而当前代码只围绕关联方主题工作:调用单一关联方接口,对股权/控制路径、子公司、关键管理人员、实控人等数据做清洗统计,并输出一个简短的“关联方信息提炼”Markdown。虽然关联方信息可以作为企业洞察报告的一个组成部分,但该代码并不能独立支撑所声明的综合报告能力,因此属于描述大于实际行为的能力不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个范围较广的“企业百科生成”技能,强调基于多维企业数据生成综合企业洞察简介,可用于信用分析、商业调研、投资尽调等场景。相比之下,代码的核心功能非常聚焦:调用 /index/accountRiskClassification 获取风险评级数据,必要时调用 /entinfo 处理分公司与总公司映射,然后按权重整理风险标签,最终输出“风险评测提炼”Markdown。代码没有显示出对企业工商、经营、财务、舆情、股权、知识产权等多维信息的汇总分析能力,因此其实际主用途明显比声明更窄且不同,属于描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

该代码的主功能非常明确:按企业名称查询风险大数据接口,并对风险统计、详细风险事件、风险类型分类进行整理和 Markdown 输出。覆盖的数据模块几乎全部是司法、处罚、失信、欠税、抽查、股权质押等负面或风险类信息。声明则描述为“企业百科生成技能”,强调基于多维企业数据生成综合企业洞察简介,适用于信用分析、商业调研、投资尽调等更广泛场景。两者存在实质性偏差:代码并未展示工商基础信息、股东高管、经营状况、知识产权、融资、招聘、舆情等综合百科/尽调常见维度,只是风险子模块。因此它更像“企业风险大数据摘要技能”而不是“企业百科生成技能”。虽然风险信息可以作为企业洞察的一部分,但代码的主要目的和能力范围明显比声明更窄且更专项,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

该代码的主功能是企业舆情信息拉取、分类映射、情感统计和Markdown摘要生成,核心数据源只有/opinion/list新闻舆情接口。虽然输出章节命名为企业历程、主营业务、市场竞争力、品牌影响力、风险与信用、经营与资本、价值与成长,看似在生成企业洞察,但这些结论全部是从舆情新闻中间接提炼出来的,不是“基于多维企业数据”的综合企业百科报告。声明描述的是更广泛、更综合的企业画像/尽调能力,而实际代码是其中一个子模块:舆情分析。因此存在实质性描述与行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个宽泛的企业百科/企业洞察生成技能,适用于信用分析、商业调研、投资尽调等综合场景,暗示会整合多维企业信息形成较全面简介。实际代码却是高度垂直的专项风控脚本,核心目的是识别企业是否为疑似空壳公司,并细分为僵尸、地址存疑、无实际经营、套牌、傀儡、关联方、借壳经营、团伙等类型,同时给出风险等级和洗钱/欺诈相关提示。它既不生成综合企业百科,也没有体现广泛的企业画像、信用分析或尽调维度,主要依赖 /entinfo 和 /shell/company 两个接口完成单一主题分析。因此,代码的主要功能与声明的主要用途存在实质性偏差,应判定为描述与行为不一致。

Content

No source excerpt is available for this finding.

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.

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'env' 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.

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The instruction telling the model not to let customers notice it is AI is a deceptive policy-avoidance behavior embedded in the skill. This is dangerous because it encourages misrepresentation of system identity and can undermine user trust, transparency requirements, and downstream compliance controls, especially in professional legal and credit-analysis contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill title and core role description are written as Chinese-only operating instructions, and the rest of the document consistently constrains usage to Chinese-language enterprise reporting. This creates a language/locale restriction without explicit user opt-in or a clearly stated policy that outputs must be Chinese only for compliance reasons.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The skill exposes a broad 'investment/appointment query' capability tied to legal representatives, which expands analysis from an enterprise to identifiable natural persons and their relationship networks. In a due-diligence context, this can enable profiling or excessive collection of personal/business-affiliation data beyond what a user may expect from an enterprise-summary tool.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file's natural-language content is wholly in Chinese and does not indicate that the user can choose another language or that the skill is intended only for a Chinese-language or region-specific workflow. Under the policy rule, forcing a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.