T09 · Insecure Skill Coding Practices
- Location
bin/daemon.js:164- Finding
Chromium Sandbox Is Automatically Disabled When Running as Root
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This hotel-price skill appears purpose-built, but it runs a powerful local browser daemon with several safety gaps users should review before installing.
Review this before installing if you run agents as root, in shared environments, or with broad filesystem access. Prefer running it as an unprivileged user, verify booking-link destinations before clicking, avoid custom `OPENTRAVEL_API_BASE_URL` values unless trusted, and be prepared to manually stop the PriceWin daemon if a search fails.
bin/daemon.js:164Chromium Sandbox Is Automatically Disabled When Running as Root
bin/search.js:103Untrusted Booking Links Are Not Restricted to Approved OTA Domains
bin/search.js:346Fatal Search Errors Can Leave the Detached Browser Daemon Running
If the implementation lacks the claimed hotel-comparison logic and instead provides generic DOM extraction/mapping, the skill description is materially deceptive. That can cause inappropriate invocation, overbroad trust, and execution of tooling that harvests arbitrary page content rather than performing the narrow user-facing task described.
If the implementation lacks the claimed hotel-comparison logic and instead provides generic DOM extraction/mapping, the skill description is materially deceptive. That can cause inappropriate invocation, overbroad trust, and execution of tooling that harvests arbitrary page content rather than performing the narrow user-facing task described.
If the implementation lacks the claimed hotel-comparison logic and instead provides generic DOM extraction/mapping, the skill description is materially deceptive. That can cause inappropriate invocation, overbroad trust, and execution of tooling that harvests arbitrary page content rather than performing the narrow user-facing task described.
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
cd {baseDir} && node bin/search.js "<city>" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us
Referenced artifact was not completely inspected
f your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Avoid hardcoding a `~/.hermes/...` or
Referenced artifact was not completely inspected
Let `search.js` do the scraping; don't scrape an OTA yourself.** Avoid calling `browse.js` directly, doing `goto`/`click`/`type` in the browser, building Agoda/
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
const args = [
'--disable-dev-shm-usage',
'--password-store=basic',
'--use-mock-keychain',
'--disable-blink-features=AutomationControlled',
];
const isLinuxRoot = process.platform === 'linux'
The skill explicitly instructs the agent to run shell commands, access environment variables, and make network requests, yet it declares no tool/permission scope. That creates an unnecessary trust gap where a runtime or reviewer cannot easily constrain execution to the minimum required capabilities, increasing the blast radius if the skill is modified or behaves unexpectedly.
The description uses broad trigger language like 'use whenever someone asks for hotel prices' and related travel queries, which encourages frequent automatic activation. Over-broad invocation increases the chance that a skill with shell, network, and browser automation capabilities runs in situations where a simpler or safer response would suffice.
The markdown instructs the agent to infer parameters and run the workflow with minimal clarification, which biases toward automatic execution. In the context of a skill that performs shell execution and external browsing, this reduces opportunities to validate user intent and increases the likelihood of unnecessary or mistaken network activity.
The installation command uses npx skills without a pinned version, so execution depends on whatever package version resolves at install time. This creates a supply-chain risk: a compromised or breaking upstream release could change behavior, execute unintended code, or silently widen capabilities.
The natural-language usage text mandates passing a locale code and gives specific examples, but does not indicate that locale selection should come from user preference or explain any policy-based reason for enforcing locale handling this way. Under the language/locale policy rule, hard requirements around locale should either be user-chosen or clearly justified.
This code sends user-supplied hotel search parameters (city, check-in/check-out dates, adults) to an external OpenTravel API endpoint, including a configurable base URL via an environment variable. Even though this is core functionality rather than overtly malicious behavior, there is no consent, disclosure, or trust-boundary validation in this file, so user travel data can be transmitted off-platform without clear user awareness and could be redirected to an untrusted endpoint if the environment is compromised.
No suspicious patterns detected.