T09 · Insecure Skill Coding Practices
- Location
scripts/search_cli.py:26- Finding
API credential and search data transmitted over plaintext HTTP
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a disclosed Feedax web-monitoring search tool, but it handles API keys and search queries unsafely over unencrypted HTTP and includes risky secret-check instructions.
Review carefully before installing. Use a low-privilege or disposable Feedax API key, avoid sensitive searches unless approved, do not run commands that print `.env` contents, expect queries to be sent to Feedax, and expect results to be saved on the Desktop unless you choose another output path. The HTTP endpoint should be treated as a serious security issue until replaced with HTTPS.
scripts/search_cli.py:26API credential and search data transmitted over plaintext HTTP
skill.md:21Documented API-key check exposes the complete secret
README.md:28API key is placed in a project-local environment file without the claimed ignore protection
requirements.txt:1Dependencies are not pinned or integrity-verified
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
# Feedax Search API Key
# 复制本文件为 .env 并填入你在 https://www.feedax.cn 申请的 Key(勿与他人共用)
# 也可参考 .env.example
FEEDAX_SEARCH_API_KEY=
The declared description promises an internet content monitoring and intelligence analysis skill with multi-source public web retrieval, query filters, NLP processing, and API-key-based external service access. The supplied code does none of that. It is a standalone command-line tool for parsing Chinese geographic names into administrative area codes using a local assets/area_codes.json file. Its functions are limited to loading local region data, exact/combined/fuzzy matching of place names, and returning province/city/county codes. This is a materially different primary purpose, with unrelated functionality and no evidence of network retrieval, public content monitoring, sentiment analysis, deduplication, structuring of online content, or use of the declared FEEDAX API credential.
声明描述的是一个面向全网内容监测与情报分析的搜索技能,核心能力应包括外部数据访问、检索过滤和内容分析;而给出的代码仅是辅助性的时间范围计算脚本。该脚本的功能与“计算 publishTimeFrom/publishTimeTo 毫秒时间戳”完全一致,但这只是搜索系统中的一个小型工具组件,无法代表声明中的主要技能能力。虽然时间处理可能是搜索参数构造的支持细节,但当前提供的代码块本身与所宣称的主要用途相比差异重大,因此应判定为描述与行为不匹配。
The core purpose broadly matches: this code does internet/public-content retrieval with multiple filters and uses FEEDAX_SEARCH_API_KEY as declared. However, the description overstates capabilities not present in the supplied code chunk. There is no visible NLP processing, deduplication, or key-information extraction logic; the code mainly forwards search parameters to a remote API, normalizes a fixed set of fields, prints a summary, and saves JSON locally. Additionally, it writes files to the user's Desktop by default, which is a meaningful behavior not mentioned in the description. So the description does not accurately represent the actual implemented behavior of this chunk.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from typing import Dict, Any, List, Optional
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from typing import Dict, Any, List, Optional
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from typing import Dict, Any, List, Optional
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from typing import Dict, Any, List, Optional
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from typing import Dict, Any, List, Optional
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from dotenv import load_dotenv
# 加载 .env 文件
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(env_path)
# API配置
The skill description and trigger terms are broad enough to match ordinary requests such as '搜索', '查找', '信息', or '查询', which can cause the skill to activate in situations the user did not clearly intend. In an agent environment, overbroad activation increases the chance of unintended web searches and downstream execution of the skill's workflow without explicit user awareness.
The instruction to run cat .env | grep FEEDAX_SEARCH_API_KEY causes the agent or user to read from a secrets file directly, normalizing secret-file access as part of routine execution. Even though it targets presence checking, this pattern can expose the API key value in terminal output, logs, transcripts, or agent telemetry if executed by an automated system.
cat .env | grep FEEDAX_SEARCH_API_KEY
The execution flow repeats the practice of reading .env with cat to check for FEEDAX_SEARCH_API_KEY, again creating a path for credential disclosure through console output, logs, or conversation transcripts. In a skill intended for agent use, embedding this as a standard step makes secret exposure more likely because the agent may follow it automatically.
cat .env | grep FEEDAX_SEARCH_API_KEY
The README instructs users to configure and use a third-party service API key, but it does not clearly warn that user search queries and related parameters will be transmitted to an external web-monitoring provider. In a skill focused on intelligence gathering and public-content monitoring, queries may contain sensitive business interests, investigation targets, or personal data, so the omission can cause unintended data disclosure and privacy/compliance risk.
Without declared permissions the skill's intent is opaque and cannot be validated.
This JSON file defines all category names and subcategories exclusively in Chinese, which can enforce a specific language/locale in downstream skill behavior. The file does not document that the taxonomy is intended only for Chinese-language use or offer any user opt-in or alternative locale.
The scene names are entirely specified in Chinese, which imposes a single language/locale in this configuration without any indication of user choice or documented regional justification. Under the policy, locale constraints should either be optional for the user or clearly justified as region-specific.
This code file contains natural-language strings that force a specific language/locale for the tool's description and usage examples. Under the policy, a skill should not impose a language without offering user choice or clearly documenting a justified locale constraint.
The client is configured to send API keys and search queries to a remote endpoint over plain HTTP, which provides no transport encryption or server authenticity. An attacker on the network path can intercept or modify requests and responses, exposing credentials and sensitive search activity or tampering with returned intelligence data.
The CLI persists normalized search results and also includes search metadata/request parameters in a local JSON file by default. In an intelligence or monitoring workflow, queries, filters, and returned URLs/titles may be sensitive, so writing them to the Desktop without explicit opt-in increases the risk of unintended local disclosure to other users, backup systems, or endpoint monitoring tools.
The script saves search results and request metadata to a JSON file on the user's Desktop without explicit consent or warning. In the context of public-opinion monitoring and intelligence analysis, even the existence of a query and its filters may reveal investigations, interests, or sensitive operational context to other local users or synced services.
The code performs external transmission of user-supplied search content and credentials to a third-party service. In this skill's context, external transmission is expected functionality, but it remains security-relevant because the transmitted material can contain sensitive monitoring targets, and here it is compounded by the use of insecure HTTP transport.
url = f"{self.base_url}{self.endpoint}"
try:
response = requests.post(
url,
json=payload,
headers={
The skill workflow states that complete search results are automatically saved to a desktop directory, but the description does not warn users about this local persistence. This can expose sensitive search topics, investigation subjects, or collected public-content datasets on disk without informed consent, especially on shared or monitored machines.
The JSON consists entirely of Chinese administrative region names, which reflects a fixed language/locale choice embedded in the asset. For a general-purpose skill asset, this can violate language/locale flexibility expectations because users are not offered any opt-in or alternative locale representation.
The dependency specification uses a lower-bound only constraint (requests>=2.28.0), which makes builds non-reproducible and allows installation of unexpected future versions. This is primarily a supply-chain hygiene weakness rather than an immediately exploitable flaw, but it can expose the skill to vulnerable or breaking releases depending on when it is installed.
requests>=2.28.0
python-dotenv>=1.0.0
No suspicious patterns detected.