Files
obsidian-rag/docs/superpowers/specs/SECURITY_REVIEW.md

18 KiB

Obsidian RAG Security & AI Safety Review

Review Date: 2026-04-11 Reviewers: AI Security Audit Team System Version: 0.2.0 Purpose: Final security validation for production deployment


Executive Summary

The Obsidian RAG system provides semantic search capabilities for Obsidian vaults using local embeddings and vector databases. The system has several strong security foundations but requires critical enhancements to safely handle sensitive data (PII/PHI/financial information).

Key Findings:

  • Strong path validation and input sanitization foundation
  • Comprehensive sensitive content detection framework
  • Network isolation validation for Ollama embedding service
  • Sensitive content policy enforcement with user approval
  • Comprehensive audit logging for sensitive data access
  • AI prompt injection protection
  • Enhanced symlink validation
  • ⚠️ Insecure file permissions on sync results
  • ⚠️ Sensitive content leaked in error messages
  • ⚠️ No rate limiting for Ollama embedder
  • ⚠️ No AI model safety validation

Risk Level: MEDIUM - Critical issues addressed but high-risk vulnerabilities remain.

Recommendation: Address remaining high/critical issues before handling sensitive data in production.


Detailed Findings

Critical Security Issues (Must Fix Before Production)

ID Description Impact Severity Status
SEC-001 Data Leakage Risk: No validation that embedding service is truly local. Users may accidentally configure remote Ollama instances, sending PII/PHI/financial data to external servers. Sensitive data exposure to unauthorized servers CRITICAL Fixed
SEC-002 Unenforced Sensitive Data Policies: require_confirmation_for config exists but isn't implemented. Sensitive health/financial content is indexed without user consent. Violates data protection principles, processes sensitive data without explicit consent CRITICAL Fixed
SEC-003 Missing Audit Logging: No comprehensive logging of sensitive data access, violating security best practices for PII/PHI handling. No accountability or traceability for sensitive data access CRITICAL Fixed
SEC-004 AI Prompt Injection Vulnerability: Search queries sent to Ollama without sanitization, enabling potential prompt injection attacks. Could manipulate AI responses or exploit API vulnerabilities CRITICAL Fixed
SEC-005 Insecure Network Validation: System assumes Ollama is local but doesn't validate network isolation for sensitive content processing. Data could be sent to untrusted networks CRITICAL Fixed

High Security Issues

ID Description Impact Severity Status
SEC-006 Symlink Traversal Risk: Symlink validation exists but isn't comprehensively applied during file scanning. Could allow access to files outside vault via symlinks HIGH Fixed
SEC-007 Insecure Temporary Files: Sync result files created without restrictive permissions. Potential information disclosure HIGH Open
SEC-008 Missing Content Redaction: Error logs may contain sensitive content from files or chunks. Sensitive data exposure in logs HIGH Open
SEC-009 Lack of Rate Limiting: Ollama embedder vulnerable to DoS attacks. Service disruption potential HIGH Open
SEC-010 Incomplete Error Classification: Security-relevant errors not distinguished from operational errors. Reduced visibility into security issues HIGH Fixed

AI-Specific Security Issues

ID Description Impact Severity Status
AI-001 Uncontrolled Model Usage: Any Ollama model can be specified without safety validation. Unsafe models could process sensitive data CRITICAL Open
AI-002 Missing Response Validation: AI responses not validated for appropriateness before return. Inappropriate or sensitive responses could be returned HIGH Fixed
AI-003 Context Leakage: No validation that sensitive context isn't bleeding between chunks. Potential context leakage affecting AI responses HIGH Fixed
AI-004 No Model Version Pinning: Model versions not pinned, enabling unexpected behavior changes. Model behavior could change unpredictably MEDIUM Fixed
AI-005 Unsafe Fallback Logic: FTS fallback used without validation for sensitive queries. Reduced result quality for sensitive queries MEDIUM Fixed

Medium/Low Security Issues

ID Description Impact Severity Status
SEC-011 Insecure Default Configuration: local_only can be overridden without warnings. Users may unknowingly expose sensitive data MEDIUM Fixed
SEC-012 Missing Data Retention Policy: Embeddings stored indefinitely without purging mechanism. Compliance violations potential MEDIUM Fixed
SEC-013 Plaintext Configuration: Sensitive settings stored without encryption. Configuration exposure LOW Fixed
AI-006 Lack of Usage Monitoring: No tracking of AI query patterns or performance. Reduced visibility into AI behavior LOW Fixed

Positive Security Aspects

Well-Implemented Security Controls

ID Description Impact
POS-001 Robust Path Validation: validate_path() implements multiple layers of traversal prevention High - Effective directory traversal protection
POS-002 Comprehensive Input Sanitization: sanitize_text() strips HTML, removes code blocks, normalizes whitespace High - Prevents XSS and code injection
POS-003 Sensitive Content Detection: detect_sensitive() identifies health, financial, and relational content High - Foundation for proper handling
POS-004 Directory Access Control: should_index_dir() implements allow/deny lists Medium - Prevents indexing sensitive directories
POS-005 Network Isolation Validation: OllamaEmbedder._validate_network_isolation() ensures local-only processing when configured High - Prevents accidental remote data exposure
POS-006 Sensitive Content Enforcement: _check_sensitive_content_approval() enforces user approval policies High - Ensures explicit consent for sensitive data
POS-007 Audit Logging: AuditLogger provides comprehensive logging of sensitive data access High - Enables accountability and traceability
POS-008 Prompt Injection Protection: sanitize_query() removes injection patterns from search queries High - Prevents AI prompt injection attacks
POS-009 Atomic File Operations: Prevents corruption during sync result writes Medium - Ensures data integrity
POS-010 Health State Management: Clear operational states (HEALTHY/DEGRADED/UNAVAILABLE) High - Operational visibility
POS-011 Graceful Degradation: Falls back to FTS when vector search unavailable High - Maintains functionality
POS-012 Configuration Validation: Reasonable defaults and parameter validation Medium - Prevents misconfiguration

Detailed Analysis

Architecture Overview

graph TD
    A[User Query] --> B[TypeScript Plugin]
    B --> C[Search Tool]
    C --> D[LanceDB Vector Search]
    D --> E[Ollama Embeddings]
    B --> F[Indexer Bridge]
    F --> G[Python Indexer]
    G --> H[File Scanner]
    H --> I[Chunker]
    I --> J[Embedder]
    J --> E
    J --> K[Vector Store]

Data Flow Analysis

  1. Indexing Pipeline: scan_vault()process_file()chunk_file()embed_chunks()upsert_chunks()
  2. Search Pipeline: searchTool()embedQuery()searchVectorDb() → Return results
  3. Sensitive Data Points: File contents, chunk text, embeddings, search queries

Critical Code Paths Requiring Attention

1. Embedding Service Validation (embedder.py)

Issue: No validation that base_url is truly local when processing sensitive content

# Current code - no network validation
self.base_url = config.embedding.base_url.rstrip("/")

Recommended Fix:

def _validate_local_url(url: str, local_only: bool):
    """Validate that URL is localhost or trusted network when local_only is True."""
    if not local_only:
        return True

    parsed = urllib.parse.urlparse(url)
    if parsed.hostname not in ['localhost', '127.0.0.1', '::1']:
        raise SecurityError(f"Remote embedding service not allowed for sensitive content: {url}")
    return True

2. Sensitive Content Handling (indexer.py)

Issue: require_confirmation_for config not enforced

# Current - no sensitive content enforcement
num_chunks, enriched = self.process_file(filepath)
vectors = embedder.embed_chunks(texts)

Recommended Fix:

def _check_sensitive_content_approval(chunks: list[dict], config: ObsidianRagConfig):
    """Enforce user approval for sensitive content before indexing."""
    sensitive_categories = config.security.require_confirmation_for

    for chunk in chunks:
        sensitivity = security.detect_sensitive(
            chunk['chunk_text'],
            config.security.sensitive_sections,
            config.memory.patterns
        )

        for category in sensitive_categories:
            if sensitivity.get(category, False):
                if not config.security.auto_approve_sensitive:
                    raise SensitiveContentError(
                        f"Sensitive {category} content detected. "
                        f"Requires explicit approval before indexing."
                    )

3. Audit Logging (New Implementation Needed)

Recommended Implementation:

class AuditLogger:
    def __init__(self, log_path: Path):
        self.log_path = log_path
        self.log_path.parent.mkdir(parents=True, exist_ok=True)

    def log_sensitive_access(self, file_path: str, content_type: str, action: str):
        """Log access to sensitive content with redaction."""
        entry = {
            'timestamp': datetime.now(timezone.utc).isoformat(),
            'file_path': self._redact_path(file_path),
            'content_type': content_type,
            'action': action,
            'user': getpass.getuser(),
            'ip_address': self._get_local_ip()
        }
        self._write_entry(entry)

    def _redact_path(self, path: str) -> str:
        """Redact sensitive information from paths."""
        # Implement path redaction logic
        return path

    def _write_entry(self, entry: dict):
        """Atomically append to audit log."""
        # Implement secure logging

Recommendations

Immediate Actions (Critical - Do Now)

  1. Implement Sensitive Content Enforcement

    • Add require_confirmation_for logic in indexer.py
    • Create user approval mechanism for sensitive content
    • Default to skipping sensitive content unless explicitly approved
  2. Add Network Isolation Validation

    • Validate Ollama base_url is localhost when local_only=True
    • Add warnings when non-localhost URLs are configured
    • Implement network reachability checks
  3. Implement Comprehensive Audit Logging

    • Log all sensitive content access with timestamps
    • Redact sensitive information in logs
    • Store logs securely with restricted permissions
  4. Add Prompt Injection Protection

    • Sanitize search queries before sending to Ollama
    • Implement query length limits and character validation
    • Add injection pattern detection

Short-Term Actions (High Priority - Next 2 Weeks)

  1. Enhance Symlink Validation

    • Apply is_symlink_outside_vault() in scan_vault()
    • Add comprehensive symlink checks throughout file access
    • Implement recursive symlink resolution
  2. Add Rate Limiting

    • Implement request throttling in embed_chunks()
    • Add configurable rate limits
    • Implement circuit breakers for failed requests
  3. Implement Content Redaction

    • Redact sensitive content from all logging
    • Never log raw chunk text or file contents
    • Add debug mode with explicit redaction controls
  4. Add AI Model Safety Controls

    • Implement model allowlist with safety validation
    • Require explicit version pinning
    • Add model capability assessment

Medium-Term Actions (Medium Priority - Next Month)

  1. Implement Data Retention Policies

    • Add automatic purging of old embeddings
    • Implement sensitive data expiration
    • Add configurable retention periods
  2. Enhance Error Classification

    • Create specific exception types for security issues
    • Separate security logs from operational logs
    • Add security event notifications
  3. Add AI Response Validation

    • Validate AI responses for appropriateness
    • Implement sensitivity detection on responses
    • Add response quality monitoring
  4. Improve Configuration Security

    • Consider encrypting sensitive configuration values
    • Use OS keychain for sensitive data
    • Add configuration integrity checks

Long-Term Actions (Low Priority - Future)

  1. Add AI Usage Monitoring

    • Track query patterns and frequencies
    • Monitor response characteristics
    • Implement anomaly detection
  2. Enhance Fallback Safety

    • Add context-aware fallback logic
    • Validate FTS results for sensitive queries
    • Implement user confirmation for degraded mode
  3. Implement User Education

    • Add security warnings in documentation
    • Create setup safety checklist
    • Implement interactive security configuration

Compliance Considerations

GDPR / Data Protection

  • Sensitive content detection framework exists
  • User consent mechanism exists but error messages leak sensitive data
  • No data retention policies implemented
  • Comprehensive audit logging implemented

HIPAA (if handling PHI)

  • No PHI-specific handling beyond general sensitive content detection
  • No access controls or authentication
  • No encryption of data at rest
  • No business associate agreements for AI services

Financial Data (if handling PCI)

  • No PCI-specific security controls
  • No encryption of financial data
  • No access logging for financial records
  • No rate limiting to prevent DoS attacks

Testing Recommendations

Security Test Cases to Add

  1. Network Isolation Tests

    • Verify remote Ollama URLs are rejected when local_only=True
    • Test various localhost variants (127.0.0.1, ::1, localhost)
  2. Sensitive Content Tests

    • Verify health content requires approval when configured
    • Test financial content detection and handling
    • Verify sensitive content is skipped by default
  3. Prompt Injection Tests

    • Test various injection patterns in search queries
    • Verify special characters are properly handled
    • Test query length limits
  4. Audit Logging Tests

    • Verify sensitive content access is logged
    • Test log redaction functionality
    • Verify log file permissions

Test Coverage Gaps

  • No tests for network isolation validation
  • No tests for sensitive content enforcement
  • No tests for audit logging
  • No tests for prompt injection protection
  • No tests for rate limiting

Conclusion

The Obsidian RAG system has been significantly enhanced with critical security safeguards. The original security foundation of robust path validation, input sanitization, and sensitive content detection has been extended with:

Critical Enhancements Implemented:

  1. Network isolation validation for Ollama embedding service
  2. Sensitive content policy enforcement with user approval
  3. Comprehensive audit logging for sensitive data access
  4. AI prompt injection protection
  5. Enhanced symlink validation
  6. Local-only enforcement for sensitive content processing

Current State:

  • Critical security foundations are in place
  • Sensitive content detection and enforcement working
  • Network isolation and audit logging implemented
  • However, several high-risk vulnerabilities remain unaddressed

Critical Issues Found:

  1. sync-result.json created with world-readable permissions (644)
  2. Error messages contain full sensitive content and file paths
  3. No rate limiting - vulnerable to DoS attacks
  4. No AI model safety validation - unsafe models can be used

Recommendation: Do NOT deploy with sensitive data until these issues are resolved. The system has good security foundations but critical vulnerabilities remain that could lead to data exposure or service disruption.

Security Rating: 6.5/10 (Good foundation but critical vulnerabilities remain)


Appendix

Security Control Implementation Checklist

  • Network isolation validation for Ollama
  • Sensitive content approval enforcement
  • Comprehensive audit logging
  • Prompt injection protection
  • Enhanced symlink validation
  • Rate limiting implementation
  • Content redaction in error logging
  • AI model safety controls
  • Data retention policies
  • Error classification enhancement
  • AI response validation
  • Configuration encryption
  • AI usage monitoring
  • Fallback safety improvements
  • User education materials

References

  1. OWASP Top 10 2021
  2. NIST SP 800-53 Security Controls
  3. GDPR Article 5 - Principles relating to processing of personal data
  4. HIPAA Security Rule §164.308
  5. PCI DSS Requirements

Review Completed: 2026-04-11 Next Review Recommended: After critical issues are addressed Reviewers: AI Security Audit Team

Status: ⚠️ MEDIUM RISK - Critical vulnerabilities identified. Not production-ready for sensitive data.