T09 · Insecure Skill Coding Practices
- Location
scripts/jumpserver_api/jms_types.py:27- Finding
TLS Certificate Verification Is Disabled by Default
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a disclosed JumpServer query/reporting tool, but it needs Review because it handles credentials and privileged audit data with insecure transport defaults, automatic package installation, broad authenticated reads, and persistent local configuration writes.
Install only for authorized JumpServer administrators or auditors. Before use, pin and preinstall dependencies, enable TLS verification, require https, avoid password auth over insecure transport, store secrets outside the repository when possible, review .env writes and org changes, and limit queries/reports to the minimum organization, time range, and fields needed.
scripts/jumpserver_api/jms_types.py:27TLS Certificate Verification Is Disabled by Default
scripts/jumpserver_api/jms_bootstrap.py:95Formal Entrypoints Automatically Install an Unpinned Dependency
The skill encourages collecting credentials through natural-language conversation and writing them into a local .env file. Storing JumpServer access keys or passwords in plaintext local files increases the risk of credential leakage via logs, workspace exposure, source control mistakes, or other local tooling that can read the repository directory.
Manual method:
cp .env.example .env
Conversation method:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
手动方式:
cp .env.example .env
对话方式:
If the skill claims authoritative JumpServer querying and analysis but may rely on local metadata JSON rather than live JumpServer APIs, users can be misled into trusting stale or incomplete results. This is primarily an integrity and decision-risk issue: governance, audit, or incident-response conclusions could be wrong because the provenance of data is unclear.
If the skill claims authoritative JumpServer querying and analysis but may rely on local metadata JSON rather than live JumpServer APIs, users can be misled into trusting stale or incomplete results. This is primarily an integrity and decision-risk issue: governance, audit, or incident-response conclusions could be wrong because the provenance of data is unclear.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
-> 若为轻量失败,先升级到全量校验
-> 检查 Python 3 与自动依赖安装结果
-> 执行 config-status --json
-> 检查 .env / shell 环境变量
-> jms_diagnose.py ping
-> 选择组织 select-org
-> 精确解析对象 resolve / list / get
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
-> 若为轻量失败,先升级到全量校验
-> 检查 Python 3 与自动依赖安装结果
-> 执行 config-status --json
-> 检查 .env / shell 环境变量
-> jms_diagnose.py ping
-> 选择组织 select-org
-> 精确解析对象 resolve / list / get
The skill is described as a diagnostic/query tool, but config-write accepts arbitrary JSON and writes local environment configuration after only a confirmation flag. This introduces a state-changing capability that can alter authentication, endpoints, or runtime behavior, which is broader than read-only diagnostics and can be abused to redirect future API usage or weaken local security controls.
endpoint-verify permits caller-controlled paths and parameters for arbitrary GET/OPTIONS requests through the authenticated JumpServer client. In a diagnostic skill, this significantly expands the reachable API surface beyond declared use cases and can expose sensitive data from unintended endpoints or enable enumeration of privileged functionality using the skill's credentials and org context.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
SKILL_DIR = Path(__file__).resolve().parents[2]
LOCAL_ENV_FILE = SKILL_DIR / ".env"
GLOBAL_ORG_ID = "00000000-0000-0000-0000-000000000000"
DEFAULT_ORG_ID = "00000000-0000-0000-0000-000000000002"
DEFAULT_PAGE_SIZE = 100
The README explicitly instructs the agent/runtime to collect JumpServer credentials and write them into a local .env file, but it does not prominently warn that these are sensitive secrets requiring secure storage and exclusion from logs, version control, and report outputs. In an agent skill context, this increases the chance that credentials are persisted insecurely, echoed back in conversation, or left behind on shared workstations.
The skill advertises and operationalizes shell, file write, network, and environment-manipulation capabilities without declaring an explicit tool scope. That creates an authorization gap: a caller or reviewer cannot reliably tell that the skill may modify local configuration and invoke external systems, increasing the risk of unintended command execution or environment changes.
The invocation language is very broad and overlaps with generic requests for analysis, inspection, reports, and diagnosis. In an agent environment, this can cause over-triggering of a skill that has shell/network/write capabilities, expanding the number of situations where potentially sensitive JumpServer queries or local state changes are performed.
The manifest text and default prompt are written as mandatory Chinese instructions for handling requests, and there is no indication that users may choose another language. This creates a natural-language locale policy concern because the skill appears to impose a specific language without opt-in or justification.
This is a markdown file, so SQP-2 applies to missing user warnings in the skill description. The document instructs users to query login records, terminal sessions, command history, suspicious activity, and file transfer logs, but it does not include any caution about handling potentially sensitive personal, operational, or privacy-impacting audit data.
The document says each capability maintains a 'trigger description' field, but this human-facing index does not define concrete trigger phrases, scope limits, or disambiguation rules. In a skill that can query audit logs, sessions, accounts, permissions, and system settings, vague triggering increases the chance of over-broad capability invocation and unnecessary exposure of sensitive data.
The file enumerates capabilities for command logs, session records, file transfers, account inventories, permissions, and system settings without any warning that these may expose highly sensitive operational, identity, and configuration data. In the JumpServer context, such data can reveal privileged activity, internal topology, account relationships, and security control settings, making accidental over-collection or over-disclosure more dangerous.
The skill is designed to read sensitive access, audit, permission, system-setting, and license information, yet the documentation provides no privacy or sensitivity warning. In a privileged environment like JumpServer, these outputs may expose user access patterns, infrastructure inventory, and governance details that should be handled under least-privilege and need-to-know controls.
The documentation explicitly includes config-write, which writes collected runtime configuration into .env. That exceeds a pure query/analysis scope and introduces a state-changing local side effect that could persist sensitive connection details or alter future executions if invoked without strong guardrails.
The markdown describes writing runtime configuration to .env but does not prominently warn that local configuration files will be modified and may contain sensitive values. This can lead users or higher-level agents to perform persistent changes without understanding the security and operational consequences.
select-org is described as able to explicitly write JMS_ORG_ID, which changes execution context rather than only inspecting JumpServer state. Changing organization scope can redirect subsequent queries to a different tenant/org and may cause unintended data exposure or mis-scoped analysis.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
"trigger_description": "适用于按用户、资产、命令关键字、时间范围排查堡垒机命令执行记录,并输出明细与风险摘要。",
"examples": [
"查询近 7 天 root 在生产资产上执行过哪些命令",
"按命令关键字 sudo 排查某用户的高风险操作"
],
"endpoints": [
"/api/v1/terminal/commands/",
This JSON manifest uses Chinese-only natural-language descriptions such as "许可证归属公司" and continues that pattern throughout the file, with no indication that the skill is region-specific or that users can opt into this locale. Under the policy, forcing a specific language without user choice or clear justification is a natural-language policy concern.
The mapping table repeatedly uses broad '适用于' routing descriptions without clear exclusion criteria, preconditions, or escalation boundaries. In a security-sensitive JumpServer skill, that can cause over-broad skill selection and lead the agent to retrieve audit, permission, user, or governance data outside the user's actual need, increasing the risk of unnecessary exposure of sensitive operational information.
对 markdown 文件,SQP-2 关注是否缺少会影响用户数据、隐私或系统完整性的行为警示。L66 明确说明 README 与 references 不保留 preview/confirm 写流程描述,虽然本文件同时声称仓库不提供写操作,但这一表述会降低文档层面对高影响操作的显式提醒,尤其在技能边界演进或复用时容易造成误解。
This markdown file presents all operational guidance exclusively in Chinese, which can amount to a language/locale policy violation when users are not offered an explicit language choice. The rule for natural-language policy violations applies to all file types, and there is no indication here that the Chinese-only constraint is optional or justified as region-specific.