T08 · Insecure Dependencies
- Location
SKILL.md:31- Finding
Unpinned Third-Party Dependencies Create a Supply-Chain Execution Risk
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a disclosed GUI automation skill with real control and privacy risks, but the inspected artifacts are coherent with that purpose and do not show hidden or malicious behavior.
Install and run this only for UI automation tasks where you are comfortable letting Qirabot view and act on the target screen. Use a virtual environment, consider pinning package versions yourself, avoid exposing privileged accounts, keep persistent browser profiles per site/task, and require explicit approval before purchases, posts, deletes, account changes, or other irreversible actions.
SKILL.md:31Unpinned Third-Party Dependencies Create a Supply-Chain Execution Risk
The description centers on GUI automation, but the skill content also performs local environment validation, dependency inspection, executable discovery, API key checks, and device enumeration. That hidden operational surface matters because users or reviewers may approve it expecting UI automation only, while it also probes the host system and connected devices.
The skill explicitly instructs the agent to run shell commands and rely on environment variables, but it declares no tool/permission scope. That mismatch can cause an orchestrator to invoke a skill with broader execution capability than reviewers or policy expect, increasing the risk of unintended command execution and environment inspection.
The trigger text is very broad (automate, scrape, click, verify what's on screen, desktop application, etc.), making accidental invocation more likely in contexts where users did not intend to authorize a high-capability automation skill. For a skill that can drive browsers, apps, and shell-assisted setup, overbroad routing increases the chance of misuse or surprise execution.
The skill encourages high-level goal delegation to bot.ai and later documents reuse of authenticated persistent profiles across runs. In combination, this can let an autonomous agent act inside an existing logged-in session and perform consequential user actions if confirmation boundaries are missed or bypassed.
**Keep the task string a concise goal, not a step-by-step script.** `bot.ai` is
smart enough to plan its own clicks — over-specifying ("click Search, then type
X, then click the first result, then…") fights the model, locks in a brittle
path, and burns extra steps. Write what success looks like, not how to get
there. Good: `"Add the cheapest in-stock item to the cart and check out"`.
Bad: a 6-step click-by-click recipe.
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.
bot.click(target, locate, *, timeout=0.0, interval=2.0, wait="", model_alias="", language="")
bot.type_text(target, locate, text, *, press_enter=False, clear_before_typing=False, timeout=0.0, ...)
bot.double_click(target, locate, ...)
bot.long_press(target, locate, *, duration=2.0, timeout=0.0, ...) # Appium/Airtest mobile only
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.
bot.click(target, locate, *, timeout=0.0, interval=2.0, wait="", model_alias="", language="")
bot.type_text(target, locate, text, *, press_enter=False, clear_before_typing=False, timeout=0.0, ...)
bot.double_click(target, locate, ...)
bot.long_press(target, locate, *, duration=2.0, timeout=0.0, ...) # Appium/Airtest mobile only
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.
bot.click(target, locate, *, timeout=0.0, interval=2.0, wait="", model_alias="", language="")
bot.type_text(target, locate, text, *, press_enter=False, clear_before_typing=False, timeout=0.0, ...)
bot.double_click(target, locate, ...)
bot.long_press(target, locate, *, duration=2.0, timeout=0.0, ...) # Appium/Airtest mobile only
The documentation explicitly recommends persistent Chromium profiles to retain cookies and login state across runs. In the context of a GUI automation skill, that increases the chance of long-lived sensitive session material being stored on disk where other local users, malware, or later automations could reuse it, especially if the profile path is shared, weakly permissioned, or used for high-privilege accounts.
import os
# Pass an ABSOLUTE path: qirabot forwards user_data_dir straight to Playwright's
# launch_persistent_context, and neither expands "~". A literal "~/..." would
# create a "./~/" dir in the CWD — always wrap with os.path.expanduser.
page = bot.open(url, user_data_dir=os.path.expanduser("~/.qira-profiles/<site>"))
if not bot.verify(page, "the user is logged in (avatar shown, no Login button)"):
... # first run only: do the login (e.g. QR scan), then it sticks
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
hard_ok = hard_ok and bool(adb)
if adb:
try:
out = subprocess.run([adb, "devices"], capture_output=True,
text=True, timeout=10).stdout
devs = [ln for ln in out.splitlines()[1:] if ln.strip() and "\tdevice" in ln]
line(OK if devs else NO, f"Android device connected ({len(devs)})",
The reference states language defaults to "en", which establishes a specific language/locale behavior by default. Under the policy, forcing a language without explicit user choice or opt-in can be a natural-language policy concern unless clearly justified as region-specific.
This code template includes direct handling of a sensitive credential via the QIRA_API_KEY environment variable, but provides no user-facing warning or guidance about protecting the key. Under the code-file criteria, access to sensitive environment variables should have some disclosure through comments, prompts, or documentation.
No suspicious patterns detected.