Skip to main content
Glama

DollhouseMCP

by DollhouseMCP
SONARCLOUD_HOTSPOT_SECURITY_REVIEW.mdโ€ข11.6 kB
# SonarCloud Security Hotspot Review **Date**: September 30, 2025 **Reviewer**: Claude Code (Alex Sterling persona) + Sonar Guardian **Scope**: Comprehensive review of 46 DOS security hotspots in production code **Status**: All hotspots reviewed and determined SAFE ## Executive Summary Reviewed 46 security hotspots across 12 production files, all flagged for potential ReDoS (Regular Expression Denial of Service) vulnerabilities. After comprehensive analysis, **all patterns were determined to be SAFE** due to: - Use of linear complexity patterns (negated character classes) - Non-greedy quantifiers bounded by specific delimiters - Defensive security patterns that detect dangerous regex (meta-programming) - Already fixed with SafeRegex timeout protection (PR #1187) - Static code analysis patterns operating on small files, not user input ## Methodology Each hotspot was analyzed for: 1. **Pattern complexity**: Linear vs exponential backtracking potential 2. **Input source**: User-controlled vs static/bounded input 3. **Bounding**: Anchors, delimiters, and maximum input size 4. **Context**: Runtime vs compile-time, production vs test code 5. **Prior fixes**: SafeRegex protection or PR #552 ReDoS review ## Files Reviewed ### Category 1: Defensive Security Patterns (21 hotspots) #### Template.ts (2 hotspots) - Lines 512-513 **Pattern Type**: ReDoS detection patterns **Purpose**: Identifies dangerous regex in user validation rules **Finding**: SAFE ```typescript /[+*]{2,}/ // Detects multiple consecutive quantifiers /\(.{0,50}\+\)[+*]/ // Detects quantified groups (BOUNDED) ``` **Rationale**: - Patterns used to DETECT dangerous regex, not execute against user input - Input: Regex pattern strings (max 200 chars via sanitization) - Line 513 explicitly bounded to 50 chars to prevent the issue it detects - Ironic: SonarCloud's ReDoS detector flagging ReDoS detection patterns! #### ContentValidator.ts (11 hotspots) - Lines 39-42, 64-66, 93, 97, 157, 161-162 **Pattern Type**: Prompt injection and security threat detection **Purpose**: Validates user content for security threats **Finding**: SAFE **Key Evidence**: ```typescript // Line 87 comment: // SECURITY FIX (PR #552 review): Simplified patterns to reduce ReDoS risk ``` **Pattern Analysis**: - Lines 39-42: Non-greedy `.*?` bounded by closing `]` ```typescript /\[SYSTEM:\s*.*?\]/gi // Non-greedy, bounded ``` - Lines 64, 66: Negated character classes (linear complexity) ```typescript /`[^`]*(?:...)[^`]*`/gi // [^`]* is linear, no exponential backtracking ``` - Line 93: Anchored with specific YAML structure - Line 97: Explicitly designed to avoid backtracking per comment **Rationale**: - All patterns use linear complexity techniques - Prior security review in PR #552 - Used for validation, not processing untrusted regex #### RegexValidator.ts (8 hotspots) - Lines 177-178, 184, 189, 202 (3x), 212 **Pattern Type**: Regex complexity analysis **Purpose**: Analyzes user-provided regex for safety **Finding**: SAFE **Pattern Analysis**: ```typescript /\([^)]+[+*]\)[+*]/ // Line 177: [^)] = linear /\([^)]+\{[^}]+\}\)[+*]/ // Line 178: [^)] and [^}] = linear /\([^)]*\|[^)]*\)[+*]/ // Line 184: [^)] = linear /\(([^|)]+)\|([^)]+)\)/ // Line 189: [^|)] and [^)] = linear /\([^)]*\.\+[^)]*\)\+/ // Line 202: [^)] = linear (detects (.+)+) /[+*?]|\{\d*,?\d*\}/ // Line 212: Simple char class ``` **Rationale**: - **All patterns use negated character classes** - this is LINEAR complexity by design - Defensive meta-programming: Using safe patterns to analyze potentially unsafe patterns - Operating on regex pattern strings, not arbitrary user content #### SecurityRules.ts (5 hotspots) - Lines 31, 51, 61, 109, 147 **Pattern Type**: Static code analysis rules **Purpose**: Scans source code files for security issues **Finding**: SAFE **Context**: These are OWASP/CWE security audit patterns that scan static code files **Pattern Analysis**: - Line 31: SQL injection detection - uses `[^}]+` (linear), bounded by quotes - Line 51: Path traversal - uses `[^(]*` and `[^)]*` (linear negated char classes) - Line 61: XSS detection - uses `[^'"`]*` (linear), bounded by `${` - Line 109: SQL concatenation - bounded by quotes and SQL keywords - Line 147: Persona validation - uses `[^)]*` (linear), negative lookahead fails fast **Rationale**: - All patterns use negated character classes or clear boundaries - Operate on code files (small, static input) not user-generated content - Security audit tools, not runtime processors ### Category 2: Already Fixed with SafeRegex (9 hotspots) #### FeedbackProcessor.ts (9 hotspots) - Lines 84-89, 208, 225, 445 **Pattern Type**: Natural language feedback parsing **Purpose**: Extracts suggestions and ratings from user feedback **Finding**: SAFE - Already fixed in PR #1187 **Code Evidence**: ```typescript // Line 205: "FIX: Use SafeRegex for DOS protection (PR #1187)" // Line 220-222: "FIX: Use SafeRegex.match instead of String.match" // Line 446-449: "FIX: ReDoS vulnerability... SonarCloud: Resolves DOS vulnerability hotspot" ``` **Pattern Analysis**: - Lines 84-89: Non-greedy `.+?` bounded by punctuation `(?:\.|,|;|$)` ```typescript /(?:should|could|would|might)\s+(?:be\s+)?(.+?)(?:\.|,|;|$)/g ``` - Lines 208, 225, 445: Now use `SafeRegex.match()` with 100ms timeout **Rationale**: - Natural language patterns inherently bounded by sentence structure - Critical patterns now protected with SafeRegex timeout wrapper - Comprehensive fix documented in PR #1187 ### Category 3: Simple Utility Patterns (11 hotspots) #### BaseElement.ts (1 hotspot) - Line 474 ```typescript /(\d+)\s*(stars?|\/5|out of 5)/ ``` **Finding**: SAFE - Simple rating extraction, bounded by specific strings #### MemoryManager.ts (1 hotspot) - Line 939 ```typescript /(\d+)\s*days?/i ``` **Finding**: SAFE - Trivial pattern, no complexity #### ConfigWizard.ts (1 hotspot) - Line 430 ```typescript /^[^\s@]+@[^\s@]+\.[^\s@]+$/ ``` **Finding**: SAFE - Email validation with negated char classes (linear), anchored #### index.ts (1 hotspot) - Line 3913 ```typescript /^[+-]?\d*\.?\d+([eE][+-]?\d+)?$/ ``` **Finding**: SAFE - Scientific notation validation, anchored, no nested quantifiers #### PersonaElementManager.ts (1 hotspot) - Line 382 ```typescript /(^-+)|(-+$)/g ``` **Finding**: SAFE - Removes leading/trailing hyphens, anchored alternation #### PortfolioRepoManager.ts (1 hotspot) - Line 625 ```typescript /-+$/ ``` **Finding**: SAFE - Removes trailing dashes, simple anchored pattern #### submitToPortfolioTool.ts (1 hotspot) - Line 739 ```typescript /\s+$/ ``` **Finding**: SAFE - Trailing whitespace detection, anchored #### GitHubPortfolioIndexer.ts (4 hotspots) - Lines 529, 532, 535, 538 **Pattern Type**: YAML frontmatter parsing ```typescript /^name:\s*(.+)$/m /^description:\s*(.+)$/m /^version:\s*(.+)$/m /^author:\s*(.+)$/m ``` **Finding**: SAFE - All anchored with `^$`, greedy `.+` bounded by EOL, multiline mode ## Key Security Patterns Identified ### 1. Negated Character Classes (Linear Complexity) The most common safe pattern found: ```typescript [^X]* // Matches anything except X - linear time complexity [^)]+ // Matches anything except ) - linear time complexity ``` **Why safe**: Cannot backtrack exponentially because each character either matches or doesn't. ### 2. Non-Greedy with Clear Boundaries ```typescript .*?(?:\.|,|;|$) // Non-greedy, bounded by punctuation or EOL ``` **Why safe**: Non-greedy with specific terminator prevents excessive backtracking. ### 3. Anchored Patterns ```typescript /^pattern$/ // Start and end anchors /pattern$/ // End anchor only ``` **Why safe**: Anchors limit where pattern can match, reducing backtracking paths. ### 4. SafeRegex Wrapper ```typescript SafeRegex.match(input, pattern, { context: 'ComponentName.methodName', timeout: 100 }); ``` **Why safe**: Hard timeout kills regex execution after 100ms, preventing DOS. ## Patterns NOT Found (Good News) โŒ **None of these dangerous patterns were found**: - Nested quantifiers: `(.+)+`, `(.*)*` - Overlapping alternation: `(a+|a)*` - Unbounded greedy with alternation: `(a|ab)*` - Unanchored greedy patterns on user input without bounds ## Recommendations ### Immediate Actions (None Required) All reviewed patterns are safe. No code changes needed. ### Future Best Practices 1. **Continue using negated character classes** (`[^X]*`) instead of greedy wildcards (`.*`) where possible 2. **Maintain SafeRegex wrapper** for user-provided regex execution 3. **Keep PR #552 patterns** - they were designed with ReDoS prevention in mind 4. **Document intent** when patterns might appear complex but are actually safe ### Test Files & Archived Scripts (4 remaining hotspots - LOW PRIORITY) **Not reviewed in this audit**: - `test/__tests__/ci-environment.test.ts` (1 command injection hotspot) - `test/__tests__/unit/portfolio/metadata-edge-cases.test.ts` (1 command injection) - `archive/debug-scripts/debug/test-synchronous-init.js` (1 ReDoS) - `scripts/update-readme-version.js` (1 ReDoS) **Rationale for deferral**: - Test files: Controlled environment, not production risk - Archived scripts: Not in active use - Command injection hotspots: Likely test fixtures, need context review ## SonarCloud Marking Status **Authentication Issue**: SonarCloud API token lacks permissions to change hotspot status (HTTP 401). **Options**: 1. Update token permissions in SonarCloud settings 2. Manually mark hotspots in SonarCloud UI using this document 3. Accept that hotspots will show until next code change triggers re-analysis **Recommendation**: Option 2 - Use this document as reference to manually review in SonarCloud UI. ## Conclusion After comprehensive security review of 46 production code hotspots: โœ… **All patterns determined SAFE** โœ… **Zero actionable security vulnerabilities found** โœ… **Strong defensive coding patterns throughout** โœ… **Prior security reviews (PR #552, #1187) effective** The codebase demonstrates mature security awareness with: - Defensive meta-programming (safe patterns detecting unsafe patterns) - Proper use of linear complexity techniques - SafeRegex timeout protection where needed - Clear documentation of security considerations **No code changes required.** --- ## Appendix: Technical References ### Linear vs Exponential Regex Complexity **Linear (Safe)**: ```typescript [^X]* // O(n) - each char checked once \w+ // O(n) - simple character class a{1,10} // O(n) - bounded repetition ``` **Exponential (Dangerous)**: ```typescript (.+)+ // O(2^n) - nested quantifiers (a|a)* // O(2^n) - overlapping alternation (a+)+ // O(2^n) - quantified group with quantifier ``` ### SonarCloud Rule S5852 **Rule**: "Using slow regular expressions is security-sensitive" **Category**: DOS (Denial of Service) **Severity**: MEDIUM **CWE**: CWE-1333 (Inefficient Regular Expression Complexity) ### Related Documentation - `docs/development/SESSION_NOTES_2025-09-30-EVENING-PR1187-MERGE-SUCCESS.md` - SafeRegex implementation - `docs/security/dosProtection.ts` - SafeRegex utility source - PR #552 - ContentValidator ReDoS review - PR #1187 - FeedbackProcessor SafeRegex implementation --- **Review conducted by**: Claude Code with Alex Sterling persona (evidence-based verification) and Sonar Guardian persona (SonarCloud expertise) **Tools used**: SonarCloud API, manual code inspection, pattern analysis **Time invested**: ~2.5 hours comprehensive review **Files read**: 12 production files, ~5000 lines analyzed

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DollhouseMCP/DollhouseMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server