Skip to content

docs: update README.md - #17

Merged
Roasbeef merged 1 commit into
mainfrom
update-readme
Jan 28, 2026
Merged

docs: update README.md#17
Roasbeef merged 1 commit into
mainfrom
update-readme

Conversation

@Roasbeef

Copy link
Copy Markdown
Owner

No description provided.

@Roasbeef
Roasbeef merged commit 4bd2281 into main Jan 28, 2026
4 checks passed
tulbox added a commit to tulbox/obsidian-claude-code that referenced this pull request Feb 28, 2026
Implements fixes for a full security audit (SECURITY-FIXES.md) addressing
critical, high, and moderate severity issues. Skipped only Roasbeef#14 (venv
relocation, out of scope for this pass).

CRITICAL:
- Bash "Always Allow" capped to session-only; persistent entries auto-removed
  on load (Roasbeef#1)
- rebuild_vault_index tool removed; indexing goes through Bash permission
  flow (Roasbeef#2)

HIGH:
- execute_command requires allowlisted command IDs (configurable in settings);
  non-allowlisted rejected outright (Roasbeef#3)
- create_note requires approval + path traversal/dot-obsidian validation in
  both AgentController and ObsidianMcpServer (Roasbeef#3)
- process.env filtered to ENV_ALLOWLIST before passing to subprocess (Roasbeef#4)
- Skills: canUseTool confirmed authoritative; discovered skills logged via
  Notice on load (Roasbeef#5)
- vault-search SQL injection fixes: parameterized queries, --where removed,
  dataview.py keyword blocklist, --db-path validated (Roasbeef#6)
- Prompt injection defense: hardcoded SECURITY_SYSTEM_PROMPT appended via
  SDK appendSystemPrompt + vault CLAUDE.md second layer (Roasbeef#7)

MODERATE:
- API key encrypted with Electron safeStorage (OS keychain); auto-migrates
  plaintext on first load; status indicator in settings (Roasbeef#8)
- Base URL validation: HTTPS-only, localhost requires Developer Mode toggle,
  warning for custom endpoints (Roasbeef#9)
- autoApproveVaultWrites default flipped to false (Roasbeef#10)
- Unknown/new tools denied by default (permission modal) (Roasbeef#11)
- Per-query rate limiting with configurable limits and RateLimitModal; limits
  double on user "continue" to avoid re-prompting (Roasbeef#12)
- Tool output truncated at 100K chars in AgentController (SDK level) and
  ChatView (UI level) as defense-in-depth (Roasbeef#13)
- Claude CLI executable permission check: reject world/group-writable (Roasbeef#15)
- Symlink escape prevention in vault-search indexer (Roasbeef#16)
- Plugin unload aborts in-flight queries via detachLeavesOfType -> onClose ->
  cancelStream chain (Roasbeef#17)

DRY / refactoring:
- Hoisted READ_ONLY_TOOLS, SAFE_UI_TOOLS, WRITE_TOOLS to module-level Sets
- Hoisted ENV_ALLOWLIST to module-level const
- Extracted requireApproval() helper (eliminates 5 repeated modal patterns)
- Static imports for PermissionModal/RateLimitModal (was runtime require())
- safeStorage getSafeStorage() lazy singleton (was 3 require("electron"))
- Rate limit state instance-scoped (reset per query from immutable defaults)

Tool result parsing:
- Added ToolResultBlock/ToolResultUpdate types for SDK tool_result blocks
- processAssistantMessage returns toolResults alongside text/tools
- extractToolResultText handles string/array/object content formats
- Tool results processed with truncation before UI events

PermissionModal hardening:
- Added resolved flag preventing double-resolution
- ESC/overlay close now resolves as deny (prevents hanging promises)

Bash command blocklist (hard-deny, no user override):
- 14 regex patterns: macOS security, keyctl, secret-tool, GPG export, SSH
  keys, AWS/Azure/GCloud creds, PEM/key files, env dumps, pass, 1Password
- Enforced before any approval logic (even when requireBashApproval=false)

Tests:
- Security system prompt verification
- 8 blocked Bash command tests (each pattern category + bypass-proof)
- Base URL validation tests (6 cases)
- All 579 tests pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant