Back to skill

Security audit

YesApi 果创云低代码平台

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real YesApi database-management wrapper, but it needs Review because it can modify or delete live remote data with little safeguarding and can send credentials to a configurable API domain.

Install only with least-privilege YesApi credentials and a test account first. Do not run test_yesapi.py against production data. Keep YESAPI_DOMAIN fixed to the legitimate HTTPS YesApi endpoint unless you fully trust the target, and avoid granting credentials permission to delete models, drop tables, or batch-delete records unless those actions are intended.

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
yesapi_client.py:43
Finding

API Credentials Can Be Exfiltrated Through an Untrusted Configurable Domain

Content
View full analysis
Dict[str, Any]: """发起API请求""" if params is None: params = {} # 添加必要参数 params['app_key'] = self.config.app_key params['_timestamp'] = int(time.time()) # 静态签名 sign = self.config.sign if sign: params['sign'] = sign url = f"{self.config.domain}/?s={service}" try: if method.upper() == "GET": response = self.session.get(url, params=params, timeout=30) else: response = self.session.post(url, params=params, json=data, timeout=30) ``` ### Technical Analysis The request destination is taken directly from `YESAPI_DOMAIN` without validating its scheme, hostname, port, or relationship to the legitimate YesApi service. Every request then adds the application key and reusable static signing value to the URL query parameters. An attacker who can influence the environment or configuration can set `YESAPI_DOMAIN` to an attacker-controlled server. Any subsequent API operation will transmit both `YESAPI_APP_KEY` and `YESAPI_SIGN` to that server. If an `http://` destination is configured, the values can also be intercepted in transit. Even w ...[truncated 1663 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
test_yesapi.py:283
Finding

Default Integration Test Performs Destructive Operations Against the Configured Account

Content
View full analysis
操作 -> 删除 test_sequence = [ ("获取模型列表", self.test_get_models), ("创建模型", self.test_create_model), ("添加字段", self.test_add_field), ("插入数据", self.test_insert_data), ("查询数据", self.test_query_data), ("更新数据", self.test_update_data), ("批量更新", self.test_batch_update), ("删除数据", self.test_delete_data), ("批量删除", self.test_batch_delete), # ("删除模型", self.test_delete_model), ] results = {} for test_name, test_func in test_sequence: try: result = test_func() results[test_name] = "✅ 成功" if result else "❌ 失败" time.sleep(0.5) # 避免请求过快 except Exception as e: results[test_name] = f"❌ 异常: {str(e)}" # 打印测试总结 print("\n" + "=" * 60) print("测试结果总结") print("=" * 60) for test_name, status in results.items(): print(f"{test_name}: {status}") success_count = sum(1 for status in results.values() if "✅" in status) total_count = len(results) print(f"\n总计: {success_count}/{total_count} 个测试通过") if success_count == total_count: print("🎉 所有测试都通过了!") else: print("⚠️ 部分测试失败,请检查配置和网络连接") if __name__ == "__main__": tester = YesApiComprehensiveTest() tester.run_all_tests() ``` The invoked test methods call live mutating endpoints, including: ```python result = self.client.create_model( model_name=self.test_model_name, model_desc="测试模型描述" ) result = self.client.batch_update( model_name=self.test_model_name, where=where_condition, data=update_data ) result = self.client.delete_data( model_name=self.test_model_name, ...[truncated 2456 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Open-Ended Dependency Versions Prevent Reproducible and Integrity-Controlled Installation

Content
View full analysis
=2.28.0 pydantic>=1.10.0 python-dotenv>=0.19.0 ``` ### Technical Analysis All dependencies use open-ended minimum-version constraints. A fresh installation can therefore resolve to any future release accepted by the package resolver. The project has no reviewed lockfile and does not provide package hashes. This prevents reproducible builds and means the installed dependency set can change without any modification to this project. If a future dependency release is compromised, malicious, or incompatible, installation may retrieve and execute that package's code. The unused `pydantic` dependency also unnecessarily increases the dependency and supply-chain attack surface. No evidence was found that the listed package names are currently malicious or typosquatted. The issue is the absence of version and artifact integrity controls. ### Attack Path 1. A user runs the documented command `pip3 install -r requirements.txt`. 2. The resolver queries the configured Python package index. 3. It selects the newest available releases satisfying the open-ended constraints. 4. A compromised future release, compromised package index, or unsafe mirror supplies an accepted artifact. 5. The artifact is installed and its code becomes available for execution during import or package use. This path depends on an upstream compromise or untrusted package source; it is not evidence that the current dependencies are malicious. ### Impact Assessment A compromised dependency executes with the privileges of the user or service installing and running the skill. Depending on those privileges, potential impact can include: - Reading environment variables, including YesApi credentials. - Modifying project or user-accessible files. - Making unauthorized network requests. - Altering API request and ...[truncated 247 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (23)

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 · README.md (reported line 40)May include surrounding context.

复制 .env.example 为 .env 并配置你的信息:

bash
cp .env.example .env

编辑 .env 文件:

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 · README.md (reported line 179)May include surrounding context.

md
├── skill_handler.py          # Skill 处理器
├── test_yesapi.py            # 测试脚本
├── .env.example              # 环境变量示例
├── .env                      # 环境变量配置(需要手动创建)
├── requirements.txt          # 依赖包
├── README.md                 # 项目说明
└── SKILL.md                  # Skill 描述文件

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README documents delete operations, including record deletion and batch deletion, without any warning about irreversibility, backup needs, or confirmation safeguards. In a skill that exposes natural-language CRUD operations against a live low-code/database platform, this increases the risk of accidental destructive actions by users or downstream agents.

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 1)May include surrounding context.

md
--- name: yesapi description: YesApi果创云低代码平台接口封装,支持表单结构和数据操作 version: 1.0.0 homepage: https://api.yesapi.net/ user-invocable: true metadata: {"requires": {"env": ["YESAPI_APP_KEY", "YESAPI_DOMAIN", "YESAPI_SIGN"]}, "tags": ["api", "lowcode", "yesapi", "form", "database"]} ---

# YesApi 果创云低代码平台 Skill

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly exposes destructive operations such as deleting models, deleting records, and batch deletion without any documented confirmation, scoping safeguards, or warning flow. In a user-invocable skill connected to a live low-code/database platform, this increases the risk of accidental or overly broad destructive actions causing data loss or service disruption.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Natural-language parsing, docstrings, errors, and test requests are all Chinese-specific, and request recognition depends on Chinese keywords such as 模型, 表单, 查询, and 删除. There is no opt-in, fallback, or documentation indicating that the skill is intentionally limited to Chinese, which can violate language/locale policy expectations.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill initializes a network client with credentials from environment variables and exposes broad remote model/data management capabilities, including create, update, and delete operations. In an agent setting, this creates a real risk of unintended or unauthorized actions against an external service if the skill is invoked without strict authorization, purpose limitation, or user confirmation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The handler exposes model deletion, including optional table dropping, without any warning, confirmation, dry-run, or safety interlock. If triggered accidentally or by a malicious prompt, this can permanently destroy remote schema or data and may be difficult to recover from.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill performs network-backed insert, update, batch update, delete, and batch delete operations without any user-facing disclosure that external state will be modified. In an agent environment, hidden side effects increase the risk of users or upstream systems invoking sensitive operations without informed consent.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Natural-language parsing maps loosely phrased user input directly to remote actions, including destructive ones like deleting models or records. Because there is no intent verification, allowlist, or confirmation step, an ambiguous or manipulated prompt could cause unauthorized remote modification or deletion.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script's human-facing docstrings and console messages are entirely in Chinese, which imposes a specific language on users without any opt-in or alternative. Under the language/locale policy, this is a natural-language constraint that should either be optional or explicitly justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The delete_model method performs a potentially destructive remote deletion, including optional database table removal via is_drop_table, but provides no confirmation prompt or user-facing warning beyond a developer docstring. For code files, destructive or irreversible operations should have some visible disclosure unless the warning is documented elsewhere, which is not shown here.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The delete_data and batch_delete methods invoke remote deletion endpoints that can permanently remove user data, but the code provides no confirmation, warning log, or other user-visible disclosure. The surrounding docstrings describe parameters but do not warn about data loss, so these destructive actions are not clearly disclosed to users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The README instructs users to place API credentials in a local .env file but does not warn against committing that file to source control, sharing logs containing secrets, or exposing the values in examples and debug output. This is a common source of accidental credential leakage, though the README itself does not directly exfiltrate secrets.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The technical implementation section states '支持异步操作提高性能' at L104, while the rest of the file describes a requests-based wrapper and provides no indication of actual async interfaces or async-specific APIs. This is an intent/documentation divergence because the documentation affirmatively claims a capability that is not supported by the described implementation.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency is specified with a lower-bound range instead of an exact pinned version, which makes builds non-reproducible and allows different environments to resolve to different releases. This increases supply-chain risk because a vulnerable or unexpected future version could be installed without review.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.28.0
pydantic>=1.10.0
python-dotenv>=0.19.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding

Requests has multiple known advisories, and because the manifest does not pin an exact version, there is no reliable way to determine whether installation will select a patched or vulnerable release. In this context the danger is indirect but real: consumers of the skill may deploy with an affected version and inherit issues such as credential leakage or request-handling flaws.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Using an unpinned version for pydantic means the installed package may vary over time or across systems, reducing reproducibility and weakening dependency integrity controls. If an insecure release is resolved, the application could inherit known flaws without any change to this file.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
requests>=2.28.0
pydantic>=1.10.0
python-dotenv>=0.19.0

Unverifiable Dependency: pydantic has 4 known advisory(ies) (CVE-2021-29510 (Use of "infinity" as an input to datetime and date fields causes infinite loop i); CVE-2024-3772 (Pydantic regular expression denial of service); CVE-2021-29510 (Pydantic is a data validation and settings management using Python type hinting.) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
86% confidence
Finding

Pydantic has known security advisories, and the unpinned requirement prevents verification that only a safe release will be installed. This creates a supply-chain exposure where downstream environments may resolve to vulnerable versions, including ones affected by denial-of-service or parsing issues.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The python-dotenv requirement is not pinned, so dependency resolution may select different versions in different installations. That creates avoidable supply-chain uncertainty and can expose the project to newly introduced vulnerable releases.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
requests>=2.28.0
pydantic>=1.10.0
python-dotenv>=0.19.0

Unverifiable Dependency: python-dotenv has 2 known advisory(ies) (CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

Python-dotenv has published advisories, and without version pinning the dependency may resolve to a release whose security posture is unknown at install time. Even though the requirements file alone does not prove exploitation, it leaves downstream users exposed to avoidable dependency risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This code accesses YESAPI_APP_KEY and YESAPI_SIGN from environment variables, which are sensitive credentials. While the file has internal comments and success/failure logs for client setup, it does not explicitly disclose to the user that credentials will be loaded from the environment when the script runs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The file's natural-language descriptions and parameter guidance consistently require or strongly steer Chinese-language usage, such as instructing users to provide Chinese names/descriptions, without indicating that language choice is optional. This can violate language/locale policy when a skill imposes a specific language without user opt-in or a clearly justified regional constraint.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.