SECURITY AUDIT
Internal
Keypad or type your PIN
SECURITY AUDIT
Hermes Security · 10 Aug 2026

Full Security Audit

Background tasks, network egress, scheduled jobs, and prompt-injection history. Audit only — nothing was changed.

FACTS in normal text. SPECULATION in italics.
Zeus · 10 Aug 2026 · Internal
Section 01

Executive Summary

No suspicious background tasks, no unknown outbound connections, no evidence of prompt injection. Two credential files are world-readable and one injection defense gap exists.

Critical
2
World-readable OAuth credential files
High
3
Web-injection gap, state.db perms, key in config
Medium
6
Hardening opportunities
Passing
14
Processes, network, cron, defenses verified clean
Bottom line: nothing is leaking. All outbound traffic is accounted for (Telegram, Ollama cloud, Qwen provider). The fixes needed are local file permissions and one code-level injection gap — all fixable in minutes.
Section 02

Background Processes & Launch Agents

Every running process and launch agent was enumerated and attributed. All are expected infrastructure.

ProcessPIDWhat it isVerdict
hermes gateway (default)615Main Telegram gateway, venv python✅ Expected
hermes gateway (aigov)610AIGov profile gateway✅ Expected
hermes gateway (opencode25jul)618OpenCode profile gateway✅ Expected
gbrain serve ×23461/3465Knowledge-graph MCP servers (bun)✅ Expected
mcp_stdio_watchdog ×23460/3464MCP supervision scripts✅ Expected
ollama serve616Local model server, binds 127.0.0.1 only✅ Expected
Telegram / Finder / Activity MonitorUser apps✅ Expected
All other processesApple system daemons (opendirectoryd, WindowServer, etc.)✅ Expected

Launch agents: only 3 Hermes gateway plists, Google Updater (standard), and Ollama. No system LaunchDaemons, no /etc/cron.d, no user crontab, no screen/tmux sessions, no SSH authorized keys, no unknown binaries.

Section 03

Network & Outbound Connections

Every live connection was captured and attributed. Nothing connects anywhere unexpected.

EndpointOwnerUsed byVerdict
91.108.56.199:443Telegram (MTProto)Telegram desktop app✅ Expected
149.154.166.110:443Telegram (MTProto)Hermes gateway (bot polling)✅ Expected
34.36.133.15:443ollama.com (Google Cloud)Hermes gateways — model API✅ Expected
2001:67c:4e8:f004::9:443Model provider IPv6 endpointHermes gateways only✅ Expected
api.aiand.com:443Cloudflare-fronted (Qwen3.6 provider)Hermes gateways — custom provider✅ Expected

Listening ports: only rapportd (macOS system service, *:49161) and ollama (127.0.0.1:11434 — localhost only). Firewall: enabled. No webhook listeners. No SSH server exposure.

MCP servers: gbrain + gbrain-knqx — both local binaries, no remote endpoints, no keys in MCP env. ✅

Section 04

Scheduled Tasks (Cron)

19 Hermes cron jobs exist; only 4 are enabled. All deliver to origin (this chat) or local. No exfiltration patterns in any script.

Enabled jobScheduleDeliverVerdict
Macro Watch — AI Bubble09:00 dailyorigin✅ Benign
gbrain nightly dream cycle02:00 dailyorigin✅ Benign
SG AI Pulse WeeklySun 09:00origin✅ Benign
Zeus Index Daily Auto-Sync06:00 dailyorigin✅ Benign

Script review (zeus-digest.py, pipeline_runner.py, zeus-index-daily-sync.sh): no curl/wget/nc/scp/rsync/base64/eval patterns — nothing that could ship data out. 15 disabled jobs are dormant. No system crontab exists.

Section 05

Prompt Injection — History & Defenses

Checked logs, the session database, and the defense wiring. No evidence of a successful injection. One defense gap found.

INJECTION_BLOCKED events
0
No blocks ever fired — also no attempts detected
Suspicious user messages
0
40 keyword hits were all compaction handoffs, not attacks
Defense gap
1
web_tools.py sanitizer patch missing
Tirith
ON
Binary installed + enabled, fail-closed

History check: grepped all logs for injection markers (0 hits) and scanned the session DB for classic injection phrases ("ignore previous instructions", "you are now", "jailbreak", "DAN mode"). The 40 keyword matches were all [CONTEXT COMPACTION — REFERENCE ONLY] handoff summaries and legitimate study content — not injection attempts. No session shows a role-hijack or tool-abuse pattern.

Defenses active: Tirith (installed at ~/.hermes/bin/tirith, enabled, fail-closed) ✅ · context-file scan in prompt_builder.py ✅ · strict scan on memory writes ✅ · tool results wrapped in <untrusted_tool_result> tags ✅ · approvals manual + cron deny ✅ · allow_private_urls false ✅.

GAP (High): the sanitize_web_results() patch in tools/web_tools.py is not present (0 matches). Web search/extract results flow raw into context — the one layer where a hostile page could attempt injection. The patch exists in the web-injection-hardening skill and takes ~10 minutes to apply.
Section 06

Credentials & File Permissions

Two OAuth credential files are world-readable (644). Everything else is correctly locked down.

FilePermsRiskFix
google_token.json644 ⚠️🔴 Live OAuth access + refresh tokens readable by any local userchmod 600
google_client_secret.json644 ⚠️🔴 OAuth client secret readable by any local userchmod 600
state.db644 ⚠️🟠 Full conversation history readable by any local userchmod 600
config.yaml.bak644 ⚠️🟡 Config backup (may contain the provider key)chmod 600
kanban.db / SOUL.md / hermes_state.db644 ⚠️🟡 Data + persona files world-readablechmod 600
.env600 ✅All API keys — correctly locked
.env.cfoat-broken backup600 ✅Backup copy — correctly locked

Config keys: one provider API key (Qwen3.6, 67 chars) is stored in config.yaml instead of .env — 🟠 High. It should live only in HERMES_QWEN36_API_KEY in .env (which already exists). Git: .env never committed; history shows only security-hardening commits. ✅

Section 07

Config Posture — Hardening Opportunities

Medium-severity items. None are active leaks; all reduce attack surface.

SettingCurrentRecommendation
redact_piifalse🟡 Enable — redacts personal data in tool output
allowed_chatsempty🟡 Restrict to known chat IDs — bot currently accepts any chat from allowed users
allow_lazy_installstrue🟡 Set false — blocks auto-installs of packages mid-task
website_blocklistempty🟡 Add known-hostile domains
approvals.modemanual ✅Only destructive commands prompt; consider smart for LLM risk assessment
cron_modedeny ✅Cron cannot run destructive commands
tirithenabled + installed ✅Fail-closed injection guard
allow_private_urlsfalse ✅SSRF protection on
Section 08

Prioritized Fix List

All fixes are local, fast, and non-destructive. Nothing here requires a rebuild or restart of services.

#FindingSeverityEffortFix
1google_token.json + google_client_secret.json world-readable🔴1 minchmod 600 ~/.hermes/google_*.json
2state.db + config.yaml.bak + kanban.db + SOUL.md world-readable🟠1 minchmod 600 ~/.hermes/state.db ~/.hermes/config.yaml.bak* ~/.hermes/kanban.db* ~/.hermes/SOUL.md
3web_tools.py injection sanitizer missing🟠10 minApply web-injection-hardening skill patches
4Qwen3.6 API key in config.yaml🟠2 minRemove from config; keep only in .env
5redact_pii off, allowed_chats empty, lazy installs on, blocklist empty🟡5 minhermes config set per item
Verdict: no data exfiltration, no suspicious background tasks, no prompt-injection history. The machine is clean; the fixes are hygiene, not emergency surgery.