unifi-mcp-shared@0.6.40
VERIFIED· install onlyPublisher claims: "Shared MCP server patterns: permissions, confirmation, lazy loading, config" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Verified here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
UNIFI_NETWORK_PASSWORDUNIFI_PREVIEW_TOKEN_TTL_SECONDSConfiguration, not credentials: CONFIG_PATH, OTEL_SDK_DISABLED, SystemRoot, UNIFI_MCP_PROTOCOL_REVISION, UNIFI_MCP_PROTOCOL_VERSION, UNIFI_TOOL_REGISTRATION_MODE- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- use of the skill by an agent
Connect it with a scoped credential, under the guard. It asks for UNIFI_NETWORK_PASSWORD, UNIFI_PREVIEW_TOKEN_TTL_SECONDS and talks to its vendor. Give the credential to the guard, not the server: the value never enters the server's environment and only travels to the host you bind. What the tools do with a real credential was not observed.
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 (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-12 and scored it 81/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
its ``.env`` would let that project choose credential destinations, policy,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."%s was supplied by a .env file, not by the environment the server was started with; "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return f"{var} (from a .env file)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""The variable name, tagged when a .env supplied it rather than the process environment."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.loads project ``.env`` files, so this is a second line rather than the first.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.server never discovers a project ``.env``, so the names it sets must notFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"- Codex or OpenClaw: run the {plugin_name}-setup skill. It writes ~/.config/unifi-mcp/{product}.env, "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(tmp_path / ".env").write_text(dotenv, encoding="utf-8")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert ".env" in caplog.textFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""A ``.env`` in the working directory must not be able to point the server at a file via ``_FILE``.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return (logging.WARNING, "with mode %04o; consider chmod 600 so other users cannot read it.", mode)Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.This is not project ``.env`` discovery: the path is set explicitly by theFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert not marker.exists(), "a .env-supplied _COMMAND was executed"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.Popen( # noqa: S603 -- argv from the operator's own environment, never a shellFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.so that a failed HTTP transport does not kill the stdio connection.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Simulate: process started without the variable, then a .env in the cwd set it.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."[credentials] %s points at %s with mode %04o; consider chmod 600 so other users cannot read it.",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""Both names are logged, the .env-supplied one tagged, and neither value."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Only the indirection is gated; a .env may still carry the value itself.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"- Codex or OpenClaw: run the {plugin_name}-setup skill. It writes ~/.config/unifi-mcp/{product}.env, "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return (logging.ERROR, "with mode %04o, which other users can write; ignoring it. Run chmod 600.", mode)Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""A ``.env`` in the working directory must not be able to make the server run a program.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.monkeypatch.setenv("UNIFI_NETWORK_PASSWORD", "plain") # left over in a copied .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.``.env`` may have just rewritten -- which would defeat the name filter.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(bundled_config / ".env").write_text("UNIFI_HOST=attacker.invalid\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(tmp_path / ".env").write_text("UNIFI_NETWORK_HOST=project.invalid\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.f"subprocess.Popen([sys.executable, '-c', {descendant!r}])\n"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert ".env" in caplog.textFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert any(level == logging.WARNING and "chmod 600" in message for level, message, _ in report.messages)Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.result = subprocess.run([sys.executable, str(probe)], capture_output=True, timeout=30, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""A .env arriving after the snapshot must not reach the helper's environment."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
No advisories in OSV for unifi-mcp-shared@0.6.40 as of 43 h ago. This is the package itself, not its dependencies.