T09 · Insecure Skill Coding Practices
- Location
submit-itsm.py:31- Finding
Hard-Coded Plaintext ITSM Credentials
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill does what it claims, but it exposes ITSM credentials and makes risky system and browser changes that require human review before use.
Only install this in a controlled test environment after removing and rotating the embedded ITSM credentials, disabling password logging and automatic screenshots, replacing automatic sudo/network bootstrap installs with reviewed prerequisites, and adding an explicit confirmation before any live ticket is submitted.
submit-itsm.py:31Hard-Coded Plaintext ITSM Credentials
submit-itsm.py:469Password Disclosure Through Command-Line Arguments and Debug Logging
start.sh:88Unverified Remote Bootstrap Execution and Unpinned Dependency Installation
start.sh:143Unauthenticated Chromium DevTools Interface with Unrestricted Origins
submit-itsm.py:51Unprotected Storage of Sensitive Authenticated-Page Screenshots
The documentation includes hardcoded default credentials for ITSM access, including a plaintext password. Embedding credentials in skill documentation encourages credential reuse, risks unauthorized ticket submission or account compromise, and normalizes unsafe secret handling for any user who installs or shares the skill.
The skill handles usernames, passwords, SKU data, remarks, and warehouse information, yet the documentation does not warn users that credentials and ticket content will be transmitted to an external ITSM system. This omission increases the likelihood of accidental disclosure of sensitive data and prevents informed consent about how secrets and business data are handled.
The script downloads get-pip.py from the network and executes it directly with Python, which is equivalent to executing remote code. If the download source, TLS trust chain, DNS, or network path is compromised, an attacker can run arbitrary code on the host under the user's account.
The configuration contains hardcoded login credentials, including a plaintext password, directly in source code. Anyone with access to the file, repository, backups, or screenshots of the code can reuse the credentials to access the ITSM system, and such secrets are difficult to rotate once copied.
The script prints raw command-line arguments and echoes parsed key/value pairs, which will expose a supplied password to stdout, logs, shell history, CI job logs, or orchestration telemetry. In an automation context, this is especially dangerous because secrets are commonly passed non-interactively and logs are often widely accessible.
The document emphasizes Chinese support with statements such as "中文正常" and presents all invocation examples and instructions only in Chinese, without indicating whether other languages are supported or allowing user opt-in. This can constitute a language policy issue when a skill implicitly forces a specific language without documented justification.
The trigger phrases are generic, such as '创建 ITSM 工单' and '提交 ITSM 工单', without constraints, confirmation requirements, or clear scoping. In an agent environment, broad activation can cause unintended invocation of a skill that handles credentials, opens browsers, and performs external actions on behalf of the user.
The skill explicitly states it will automatically install chromium-browser and Python packages on first run, which goes beyond the narrowly described purpose of submitting ITSM tickets. Allowing a skill to modify the host system and package state increases supply-chain and integrity risk, especially when these changes are automatic and not clearly gated by explicit user consent.
The documentation describes automatic installation of dependencies and elsewhere includes process-kill behavior for the browser, but it does not clearly warn users about these system-changing and potentially disruptive actions. Hidden or under-disclosed host modifications reduce user control and can break environments or terminate unrelated browser sessions matching the process pattern.
The documentation instructs the user to run sudo apt-get update, introducing privileged system modification as part of using the skill. Requiring elevation for a ticket-submission workflow increases the blast radius of mistakes or future script changes and can be abused if users are conditioned to grant admin rights without scrutiny.
脚本会自动安装,或手动运行:
sudo apt-get update
sudo apt-get install -y chromium-browser
The documentation instructs the user to run sudo apt-get install -y chromium-browser, which performs privileged package installation for a non-administrative business task. This expands attack surface, introduces supply-chain risk, and normalizes root execution for convenience rather than necessity.
脚本会自动安装,或手动运行:
sudo apt-get update
sudo apt-get install -y chromium-browser
L003 describes this as a startup script for launching the browser for an ITSM auto-submission skill. However, the script performs substantially more actions: it modifies PATH, installs Python dependencies, may install chromium-browser with sudo apt-get, and finally runs submit-itsm.py to submit a ticket. That is an active contradiction of the stated role as merely starting the browser.
The comment on L004 says the skill uses the system chromium browser with 'zero dependencies', implying no extra installation is needed. In reality, the script checks for missing Python modules, installs selenium and requests via pip, and if needed downloads get-pip.py from an external URL to bootstrap pip, which directly contradicts that claim.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
echo "请手动尝试以下命令之一:"
echo " pip3 install selenium requests"
echo " python3 -m pip install selenium requests --user"
echo " sudo apt-get install python3-pip && pip3 install selenium requests"
exit 1
fi
else
The script automatically performs sudo apt-get update/install without an explicit confirmation step, causing privileged system modification beyond merely launching a browser. In a skill context, this is more dangerous because users may not expect the action to alter the host or invoke privilege escalation during normal task execution.
The script invokes sudo apt-get update automatically, introducing privileged host changes during execution. While apt itself is legitimate, unprompted privilege escalation in an automation skill expands blast radius and can be abused or surprise users in environments where least privilege is expected.
# 检查 chromium-browser 是否安装
if ! command -v chromium-browser &> /dev/null; then
echo "📦 正在安装 chromium-browser..."
sudo apt-get update -qq
sudo apt-get install -y chromium-browser
echo "✅ chromium-browser 安装完成"
fi
The script invokes sudo apt-get install -y chromium-browser automatically, which performs privileged package installation without a clear consent step. In an agent skill, automatic root-level modifications are risky because they change the system state and increase consequences if the workflow or package source is tampered with.
if ! command -v chromium-browser &> /dev/null; then
echo "📦 正在安装 chromium-browser..."
sudo apt-get update -qq
sudo apt-get install -y chromium-browser
echo "✅ chromium-browser 安装完成"
fi
The script launches Chromium with a remote debugging port and allows all origins, then backgrounds it with nohup. This creates a locally reachable browser control interface that may persist long enough for other local processes to attach, inspect pages, or drive authenticated sessions, making the context more dangerous because the script is intended to automate a live ITSM login/session.
fi
# 启动 chromium-browser(可见窗口模式)
nohup chromium-browser --remote-debugging-port=$DEBUG_PORT --remote-allow-origins=* --no-first-run --window-size=1920,1080 --window-position=0,0 --force-device-scale-factor=1.0 --disable-blink-features=AutomationControlled > /tmp/chromium-$DEBUG_PORT.log 2>&1 &
sleep 3
The file-level natural-language description and all user-facing strings are written as Chinese-only operational guidance, with no indication that the user can choose another language or that the locale restriction is intentional and justified. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.
This code performs a potentially irreversible external action by clicking the final submit button and creating a real ticket. The file contains progress logging, but there is no explicit confirmation prompt or warning near the submit step to ensure the user understands that a live submission will occur.
The user-facing description and status messages are entirely in Chinese (for example, the comment at L03 and echo output at L07/L11/L13). This can violate a language/locale policy when the skill does not offer any language choice or explain that it is intended only for a Chinese-speaking environment.
The package description states "中文正常显示," which communicates an expectation or requirement around Chinese-language display. This can be read as a language/locale constraint without indicating user choice or opt-in, which falls under the policy check for forced language behavior.
The dependency is specified with a lower bound only (selenium>=4.0.0), which makes builds non-reproducible and allows future installs to pull unexpected versions. This is dangerous because a newly released or compromised upstream version could be introduced without review, and it also prevents confirming whether known-vulnerable versions are excluded.
selenium>=4.0.0
requests>=2.28.0
selenium has known advisories, but because the manifest does not pin an exact version, it is impossible to determine whether the installed package is affected or safely updated. In a skill context, Selenium often drives browsers or web sessions, so uncertainty around its version increases operational and supply-chain risk even if the manifest alone does not prove active exploitation.
The dependency is specified as requests>=2.28.0 rather than an exact version, so installs may resolve to different releases over time. This increases supply-chain risk and makes it harder to verify whether the environment is using a version affected by known advisories.
selenium>=4.0.0
requests>=2.28.0
No suspicious patterns detected.