moodle-obsidian-mcp@0.8.2
CAUTION· static onlyPublisher claims: "MCP server for Moodle with server-side prompt-injection defenses, SSO login and Obsidian vault sync" Observed in sandbox: static analysis only — behavior not yet observed.
Coverage
Static only; nothing was run yet.The label rests on the code, the instruction files and the publisher. The honeypot run replaces this verdict when it completes.
Before you give it your token
- It will ask for
MOODLE_TOKENConfiguration, not credentials: MOODLE_MCP_CONFIG_DIR, MOODLE_MCP_LOG_LEVEL, MOODLE_URL- Where it talks to
- no vendor host named in the codeAlso uab.pt, utad.pt, evil.example — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- nothing has run yet
- What we could not test
- everything: the server has not run yet
Run it before you trust it. Nothing has run yet: the code was read, the server was not. `vet-skills try` runs this exact version in the honeypot in about a minute.
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 analysed it statically (a sandbox run is pending) on 2026-11-11 and scored it 52/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; Access to sensitive file paths; References a credential file in the home directory. Summary: static analysis only — behavior not yet observed.
Behavior trace
Queued for honeypot run · static analysis onlyThis version has not been detonated yet. The score above counts behavior as unknown (50/100), so it cannot read Verified until the honeypot run completes and replaces this verdict.
Static findings
"""Caminho do `.env` legado, ao lado do código."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.4. O `.env` legado ao lado do código — lido para retrocompatibilidade e migradoFix: 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.seria um canal de exfiltração (p.ex. `~/.ssh/id_rsa`). Coloca o e-fólio noFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(argv, check=True, capture_output=True, text=True, timeout=60)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.data["dashboard"] = "../../etc/passwd"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."text", ["a < b e c > d", "Avaliação contínua — ½ das notas, 10 m² 👩🎓", "plain ascii", ""]Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.result = subprocess.run([osacompile, "-o", str(bundle), str(source)], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.logger.debug("'%s' veio do .env legado; será migrado na próxima escrita.", key)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.reg = subprocess.run([lsregister, "-f", str(bundle)], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.text = "Até breve" + SMUGGLED + "\U000e0101fim"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls."<!-- instrução escondida --> Até breve" + SMUGGLED + "</p>"Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.".env.example",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return Path(__file__).resolve().parent.parent / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(argv, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.out = subprocess.run([sys.executable, "-I", "-c", code], capture_output=True, text=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.poderia de outra forma dirigir uma escrita para `~/.ssh/authorized_keys` ouFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Lê o `.env` legado sem depender do python-dotenv.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.expected = text.replace("", "") # o ZWJ é Cf e sai; o resto fica igualFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.teste o importar. O `.env` legado do repositório é desligado para que um tokenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.warnings.append(f"{path} é legível por outros utilizadores: chmod 600 '{path}'")Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.seria um canal de exfiltração (p.ex. `~/.ssh/id_rsa`). Coloca o e-fólio noFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.text = "Até breve" + SMUGGLED + "\U000e0101fim"Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent."O token foi gravado, mas outro definido no ambiente ou no .env legado tem precedência "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."file:///etc/passwd",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.legacy = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.legacy = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."https://user:[email protected]/webservice/pluginfile.php/1/a.pdf",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.["http://moodle.novo.example", "ftp://x.example", "https://user:[email protected]", "https://x.example/?a=1"],Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert any("chmod 600" in w and "credentials.json" in w for w in warnings)Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.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 moodle-obsidian-mcp@0.8.2 as of 3d ago. This is the package itself, not its dependencies.
What would make this Verified
28 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim carlosandreferreira: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- 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.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Hidden zero-width characters detected≈ +2 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Bidirectional text override characters detected≈ +2 on the totalReplace encoded or assembled strings with plain literals and remove undeclared network calls.