poltertab@1.12.0
CAUTIONPublisher claims: "A local MCP server paired with a Chrome extension that lets any MCP-compatible AI agent drive the browser you're already signed into — navigating, clicking, filling forms, scraping and extracting structured records using your real profile, cookies and logged-in sessions. It exposes 28 browser_* tools over stdio and relays them to the extension on localhost, with capabilities like paginated record extraction, ref-tagged snapshots, screenshots, and opt-in file uploads." Observed in sandbox: calls registry.npmjs.org only, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso evil.example, kw.com, google.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · reached only registry.npmjs.org
- What we could not test
- what the tools do when called with real credentials
Connect it under the guard; read the third-party hosts first. The code names evil.example, kw.com, google.com as well as its own vendor. The guard pins the network to the hosts the honeypot saw.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-14 and scored it 61/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; References a credential file in the home directory; Collapsed <details> block carrying instructions. Summary: calls registry.npmjs.org only, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 25 s · 2 scenariosStatic findings
{ env: { PATH: process.env.PATH, ...env }, encoding: "utf8" },Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.log("\nUpload configuration (~/.poltertab/config.json)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(" – uploads skipped enable later: poltertab uploads allow <dir>");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(` ${c.green("✓")} uploads folder ${c.dim(folderPath)} (already set)`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(" – uploads skipped (poltertab uploads allow <dir> any time)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("\n No upload activity recorded.\n");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("\n Allowed folders: (none — uploads disabled)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(` ${c.green("✓")} uploads folder ${c.dim(folderPath)}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(" Upload config access is now enabled for this extension.");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// bypass the check (e.g. ~/Downloads/key.pem -> ~/.ssh/id_ed25519).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// All data is the server's ~/.poltertab/config.json and uploads.log.jsonl,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("\nD. mcp-server end-to-end (real processes, fake extension)");Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.// Attacker tries to allow ~/.ssh — still blockedFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// bypass the check (e.g. ~/Downloads/key.pem -> ~/.ssh/id_ed25519).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// `kill -INT` or a non-raw terminal), as a cancel; the returned functionFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.<summary>Or load it unpacked (developer / offline path)</summary> Use this when you are changing the extension or cannot reach the Web Store. An unpacked extensFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.console.log(`\n Let agents upload files from a folder? [${DEFAULT_UPLOAD_FOLDER}]`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// Version line. An unpacked extension never auto-updates, so a stale oneFix: Pin versions and sources; vendor anything fetched at install time.console.log(`\nUpload activity log (last ${entries.length} entries)`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log("\nY. upload permissions");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.<summary>Developer or offline? Load the unpacked zip instead.</summary> <ol class="step-list"> <li>Download the latest <a href="https://github.com/abhinav162/poFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.3. Enable **Developer mode** (top right toggle)Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.console.log("\nX. file upload feature");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// Y1 validateAllowlistEntry rejects ~/.ssh, /etc/foo, relative pathsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.… a summary (row count, field names, fill rates, two sample records). .jsonl and .csv are written in those formats when the payload carries records, anything else as JSON. A path is reduced to its basename — output cannot be written elsewhe…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.group("C CLAUDE.md update");Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// C CLAUDE.md update appends once, never twiceFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.<summary>Can the agent read my passwords or cookies?</summary> <div class="answer"><p>It can’t open your password manager or Chrome’s cookie store. It sees whatFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// Same shape as mcp-server/test/run.js — plain asserts, one file, real fs.Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.3. Enable **Developer mode** (top right toggle)Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.for (const need of ["bin/", "mcp-server/", "skills/", "assets/"]) {Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.await test("Y1 validateAllowlistEntry rejects ~/.ssh, /etc/foo, relative paths", () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
19 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim abhinav162: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- References a credential file in the home directory≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Auto-update or dynamic fetch configuration≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- Access to sensitive file paths≈ +2 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.