T08 · Insecure Dependencies
- Location
SKILL.md:12- Finding
Installation Through an Unpinned Author-Controlled Homebrew Tap
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This browser automation skill is powerful and mostly coherent, but it includes under-scoped session, cookie, scraping, and browser-safety behavior that needs human review before installation.
Install only if you are comfortable giving this skill broad control over a Chrome session. Avoid using it with sensitive accounts until cookie export is protected, Chrome sandboxing remains enabled by default, loopback MCP transports require authentication, and the evasion/scraping guidance is removed or clearly restricted to authorized testing.
SKILL.md:12Installation Through an Unpinned Author-Controlled Homebrew Tap
src/bin/cli.rs:145Chrome Sandbox Disabled Across All CLI Browser Workflows
src/bin/cli.rs:242Authentication Cookies Exported to Plaintext Files Without Restrictive Permissions
src/bin/mcp_server.rs:154Unauthenticated Loopback MCP Endpoints Expose Sensitive Browser Capabilities
The documented 'Login & Cookie Heist' workflow normalizes capturing authenticated session state to disk and replaying it later, effectively enabling session theft or unauthorized reuse. Even if presented as convenience, the wording and example directly support account access persistence outside the original interactive login context.
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
ges to analyze for structure (default: 5)
#[arg(long, default_value = "5")]
max_pages: usize,
/// Maximum number of sitemaps to parse (default: 10)
#[arg(long, default_value = "10")]
max_sitemaps: usize,
/// Output file (JSON)
#[arg(long)]
output: Option<PathBuf>,
},
}
#[derive(Serialize, Deserialize)]
struct SessionData {
cookies: Vec<headless_chrome::protocol::cdp::Network::Cookie>,
// Local storage could be added here
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
let cli = Cli::parse();
match cli.command {
Commands::Navigate { url, human_emulation, wait_for_selector, load_session } => {
info!("Navigating to: {}", url);
let options = LaunchOptions::default().sandbox(false);
let session = BrowserSession::launch(optio
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
return true;
})()
"#;
self.tab()?
.evaluate(go_forward_js, false)
.map_err(|e| BrowserError::NavigationFailed(format!("Failed to go forward: {}", e)))?;
// Wait a moment for navigation
std::thread::sleep(std::time::Duration::from_millis(300));
Ok(())
}
/// Get cookies from the current session
pub fn get_cookies(&self) -> Result<Vec<headless_chrome::protocol::cdp::Network::Cookie>> {
self.tab()?
.get_cookies()
.map_err(|e| BrowserError::ChromeError(format!("Failed to get cookies: {}", e)))
}
/// Set cookies for the current session
pub fn set_cookies(&self, cookies: Vec<CookieParam>) -> Result<()> {
let tab = self.tab()?;
for cookie in cookies {
// Convert CookieParam to headless_chrome::protocol::cdp::Network::CookieParam
let param = CdpCookieParam {
name: cookie.name,
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
/// Get a reference to the browser session (blocking lock)
pub(crate) fn session(&self) -> std::sync::MutexGuard<'_, BrowserSession> {
self.session.lock().expect("Failed to lock browser session")
}
}
impl Default for BrowserServer {
fn default() -> Self {
Self::new().expect("Failed to create default browser server")
}
}
impl Drop for BrowserServer {
fn drop(&mut self) {
debug!("BrowserServer dropped");
}
}
#[tool_handler]
impl ServerHandler for BrowserServer {
fn get_info(&self) -> ServerInfo {
ServerInfo {
instructions: Some("Browser-use MCP Server".into()),
capabilities: ServerCapabilities::builder().enable_tools().build(),
..Default::default()
}
}
}
This tool allows unconditional clearing of all localStorage for the current origin with no visible warning, scoping, or safeguard. In an agent/browser automation context, that can silently destroy session state, preferences, cached app data, or anti-CSRF/session-related client data, causing denial of service to the user workflow and potentially forcing reauthentication or state reset.
This markdown file advertises an MCP server for AI-driven automation and features such as navigation, clicking, input, screenshots, and content extraction. Those behaviors can affect user data and privacy, but the README provides no caution, disclosure, or usage warning about interacting with live sites, entering data, or capturing page contents.
The skill declares powerful browser/network functionality but does not define any explicit tool scope, permissions, or allowed-tools boundaries. In an agent environment, that omission increases the chance the skill is invoked for unrestricted web access or abusive scraping workflows without policy guardrails.
The recipe explicitly frames the capability as bypassing bot detection through human emulation, which is an evasion of anti-abuse controls rather than ordinary automation. This materially increases misuse potential for scraping protected targets and defeating site defenses.
The phrase 'bypass bot detection via human emulation' is a direct semantic instruction to evade anti-automation protections. In a browser automation skill, this context makes the content more dangerous because it provides an operational recipe for defeating common abuse controls on protected sites.
The documentation instructs saving authenticated session data to a local file without warning that the file may contain reusable cookies or tokens. That omission can lead users to store sensitive auth material insecurely, exposing accounts if the file is copied, checked into source control, or read by other processes.
The narrative sequence guides the user from a legitimate login to saving and later replaying authenticated state under the label 'cookie heist,' which normalizes abusive session capture. This is dangerous because it lowers the barrier to credential/session misuse and can enable persistent unauthorized access if the session file is shared or stolen.
The harvesting examples encourage broad extraction from infinite-scroll pages and named social/content platforms without discussing authorization, privacy, or site-policy constraints. In context, that omission makes misuse for mass scraping or collection of personal/content data more likely.
The Navigate command reads cookies from disk and injects them into a live browser session without any trust check, validation, or user warning. This enables reuse of sensitive authenticated sessions from local files, which can lead to account/session takeover if the cookie file is stolen, shared, or loaded from an untrusted source.
The Login command serializes browser cookies and writes them to an arbitrary file path in cleartext. Cookies often represent authenticated session state, so anyone who can read that file may be able to hijack the user's logged-in browser session for the associated sites.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
});
// Start HTTP server with SSE router
let listener = tokio::net::TcpListener::bind(&bind_addr).await?;
axum::serve(listener, router.into_make_service()).await?;
}
Transport::Http => {
The HTTP transport uses a LocalSessionManager for streamable MCP sessions, which introduces session persistence/state retention across requests. In a browser automation server, retained session state can expose authenticated browser context, cookies, or prior client activity to later requests if session boundaries are weak or reused improperly. The risk is moderated because the listener is bound only to 127.0.0.1, but local untrusted processes could still interact with it.
info!("Ready to accept MCP connections at http://{}{}", bind_addr, cli.http_path);
let listener = tokio::net::TcpListener::bind(bind_addr).await?;
axum::serve(listener, router).await?;
}
}
The tab listener captures all page-generated console output and stores it centrally without any notice or minimization. Console logs often contain debugging data, tokens, PII, application state, or error details, so silent collection increases the risk of sensitive data exposure through the skill.
The code explicitly disables Chrome's normal automation indicators by removing --enable-automation and adding --disable-blink-features=AutomationControlled. In a generic browser automation skill, this is anti-detection behavior that can facilitate stealthy scraping, policy evasion, or interacting with sites under false pretenses, increasing abuse potential beyond normal automation needs.
The session can set arbitrary cookies directly into the active browser context without any confirmation, provenance check, or policy restriction. This can alter authentication state, impersonate users, bypass normal login flows, or inject tracking/session data into sites the agent visits.
The extractor intentionally serializes sensitive page data, including textbox contents and link targets, into a JSON structure for downstream AI consumption. In an agent/browser skill context, this can expose secrets such as passwords, personal data, tokens in URLs, search queries, or internal links without minimization, redaction, or user-consent controls, making data exfiltration materially more dangerous than a normal accessibility snapshot.
The tool description states that it can capture a screenshot of the current page, which may include sensitive on-screen data. In this file there is no confirmation prompt, warning text, or privacy disclosure associated with that capture operation.
The tool description explicitly exposes arbitrary JavaScript execution in the browser context, which is a safety-sensitive capability because it can alter page state and interact with user data. This file does not show any confirmation, cautionary description, or other disclosure about the risks of executing code in the page.
The tool writes an annotated screenshot to a caller-controlled filesystem path with no validation, restriction to a safe directory, or confirmation step. In an agent/skill context, this enables arbitrary file write within the process's permissions, which can overwrite user files, place sensitive screenshots in unexpected locations, or aid follow-on attacks if the path targets configuration or startup-loaded files.
The tool returns a success message claiming the browser was closed, while the surrounding comment indicates the implementation may only close tabs as a proxy. This can mislead higher-level agents or workflows into believing browser state was fully terminated when session resources, cookies, or background processes may still remain active.
This tool exposes direct cookie read and write capabilities through get_cookies and set_cookies without any visible consent checks, scope restrictions, or user-facing disclosure. In an agent/browser automation context, cookies can contain session identifiers and authentication state, so silent access or modification can enable account hijacking, impersonation, or cross-site session manipulation.
Detected: suspicious.dynamic_code_execution