Review ID: 8a500dfc58ffGenerated: 2026-03-08T20:34:48.802Z
CHANGES REQUESTED
271
Total Findings
230
Critical
27
High
2
Medium
36 of 108 Agents Deployed
DiamondPlatinumGoldSilverBronzeHR Roasty
Agent Tier: Gold
apolloraines/openclaw →
main @ 14cd380
AIAI Threat Analysis
Loading AI analysis...
271 raw scanner findings — 230 critical · 27 high · 2 medium · 12 info
Raw Scanner Output — 15275 pre-cleanup findings
⚠ Pre-Cleanup Report
This is the raw, unprocessed output from all scanner agents before AI analysis. Do not use this to fix issues individually. Multiple agents attack from different angles and frequently report the same underlying vulnerability, resulting in significant duplication. Architectural issues also appear as many separate line-level findings when they require a single structural fix.

Use the Copy Fix Workflow button above to get the AI-cleaned workflow — it deduplicates findings, removes false positives, and provides actionable steps. This raw output is provided for transparency and audit purposes only.
Showing top 1000 of 15275 findings (sorted by severity). Full data available via the review API.
HIGHMissing tenant filtering in session data retrieval
apps/macos/Sources/OpenClaw/SessionData.swift:307
[AGENTS: Tenant]tenant_isolation
The SessionLoader.loadSnapshot() method fetches session data from the gateway without any tenant filtering parameters. It calls ControlChannel.shared.request(method: 'sessions.list', params: params) but the params only include 'includeGlobal', 'includeUnknown', 'activeMinutes', and 'limit' - no tenant_id or user authentication context. This could allow users to see sessions from other tenants.
Suggested Fix
Add tenant context to the session list request. Ensure the gateway endpoint validates the caller's tenant membership and only returns sessions belonging to that tenant.
HIGHDangerous force push recommendation
.agent/workflows/update_clawdbot.md:13
[AGENTS: Chaos - Cipher - Gateway - Lockdown - Mirage - Phantom - Razor - Sentinel - Siege - Specter - Supply - Syringe - Tripwire]command_injection, configuration, cryptography, data_exposure, dependencies, dos, edge_cases, edge_security, false_confidence, input_validation, security, supply_chain
**Perspective 1:** The workflow recommends 'git push origin main --force-with-lease' which can cause data loss and disrupt collaboration. Force pushing to main branch is dangerous and should be avoided in team environments. **Perspective 2:** The workflow syncs from upstream and runs 'pnpm install' without verifying dependency integrity or checking for compromised packages. No hash verification, signature checking, or SBOM comparison is performed before installing potentially malicious dependencies from upstream. **Perspective 3:** The workflow documentation includes a script that references 'YOUR_TELEGRAM_SESSION_ID' as a placeholder, suggesting credential handling but without proper security guidance. The script would execute agent commands with session IDs, creating a false sense of security about credential management. The documentation claims to be a 'workflow' but doesn't address secure credential storage or environment variable usage. **Perspective 4:** The workflow recommends 'git push origin main --force-with-lease' which could overwrite remote history. If automated without proper checks, this could cause data loss. **Perspective 5:** The workflow assumes `git status` is clean before rebase. If there are uncommitted changes, rebase will fail or cause conflicts with those changes. **Perspective 6:** The workflow documentation includes shell commands that could be vulnerable to command injection if variables are not properly escaped. While this is documentation, it could lead to insecure implementations. **Perspective 7:** The workflow documentation includes a command that passes a Telegram session ID as a command-line argument: `pnpm clawdbot agent --message "Verification: macOS app rebuild successful - agent is responding." --session-id YOUR_TELEGRAM_SESSION_ID`. Session IDs in command-line arguments may be visible in process listings and shell history, potentially exposing authentication tokens. **Perspective 8:** The workflow documentation includes multiple shell command examples that could be copy-pasted without understanding security implications. Commands like 'git push --force-with-lease' and 'pkill' operations could be misused if executed in wrong contexts or by unauthorized users. **Perspective 9:** The workflow suggests using `git log --oneline --left-right main...upstream/main | head -20` but doesn't limit the initial git log output. With many divergent commits, this could generate excessive output before being piped to head. **Perspective 10:** The workflow contains grep commands with search patterns that could be manipulated if file names contain special characters. While this is in documentation/scripts, it could be copy-pasted into production code. **Perspective 11:** The workflow recommends 'git push origin main --force-with-lease' which can overwrite remote history. While --force-with-lease is safer than --force, it still poses risks if not used carefully. **Perspective 12:** The morph-mcp_warpgrep_codebase_search commands use repo_path parameter without validation. If this comes from user input, it could contain path traversal attempts or shell metacharacters. **Perspective 13:** The documentation contains shell command examples that could be vulnerable to injection if variables are not properly quoted. While this is documentation and not executable code, it demonstrates patterns that could lead to vulnerabilities if implemented without proper sanitization.
Suggested Fix
Add dependency integrity checks: 1) Generate SBOM before sync, 2) Compare package-lock hashes after sync, 3) Use 'pnpm install --frozen-lockfile' to prevent unexpected dependency changes, 4) Verify package signatures if available.
HIGHUnsigned macOS application artifact
.agent/workflows/update_clawdbot.md:129
[AGENTS: Supply]supply_chain
The workflow moves the rebuilt Clawdbot.app to /Applications without code signing verification or notarization check. This allows potentially compromised builds to be installed system-wide.
Suggested Fix
Add code signing verification: 'codesign -dv --verbose=4 dist/Clawdbot.app' and notarization check before installation. Reject unsigned or improperly signed builds.
HIGHHardcoded Telegram session ID in automation script
.agent/workflows/update_clawdbot.md:152
[AGENTS: Deadbolt - Gatekeeper]auth, sessions
**Perspective 1:** The automation script contains a hardcoded reference to 'YOUR_TELEGRAM_SESSION_ID' which suggests sensitive session identifiers might be embedded in scripts. If actual session IDs are hardcoded, this could allow unauthorized access to Telegram bot functionality. **Perspective 2:** The workflow documentation includes a command with a hardcoded session ID placeholder (`YOUR_TELEGRAM_SESSION_ID`). If users copy this without replacing the placeholder or if real session IDs are committed to version control, it could lead to session token leakage.
Suggested Fix
Remove hardcoded session ID examples, use environment variables for session configuration, and add warnings about not committing session IDs to version control.
HIGHMulti-step attack chain: From git rebase to Telegram session hijacking
.agent/workflows/update_clawdbot.md:159
[AGENTS: Chaos - Provenance - Recon - Vector - Weights]ai_provenance, attack_chains, edge_cases, info_disclosure, model_supply_chain
**Perspective 1:** The workflow document provides a complete attack chain: 1) Compromise upstream repository or MITM git fetch, 2) Inject malicious code during rebase, 3) Rebuild and restart macOS app, 4) Execute arbitrary code with app privileges, 5) Access Telegram session ID from environment/configuration, 6) Send malicious messages via Telegram bot. This creates a supply chain attack vector. **Perspective 2:** `git push origin main --force-with-lease` after rebase could overwrite commits pushed by others if the lease check passes but local ref is outdated. This is destructive and could lose work. **Perspective 3:** The workflow mentions checking for OpenRouter API key requirements and updating model configurations. If model configurations are loaded from external sources or user input without verification, this could lead to loading compromised model configurations. **Perspective 4:** The workflow documentation includes example commands with placeholder session IDs ('YOUR_TELEGRAM_SESSION_ID'), which could lead developers to accidentally expose real session IDs in scripts or logs. Session IDs are sensitive credentials that should not be documented in example commands. **Perspective 5:** The workflow includes `pnpm clawdbot agent --message "Verification: macOS app rebuild successful - agent is responding." --session-id YOUR_TELEGRAM_SESSION_ID` but there's no evidence this command exists in the codebase. Likely AI-generated based on assumed functionality.
Suggested Fix
Remove session ID examples from documentation or use environment variable references instead (e.g., '$TELEGRAM_SESSION_ID'). Add warnings about protecting session IDs.
HIGHAutomated script creates persistent backdoor opportunity
.agent/workflows/update_clawdbot.md:315
[AGENTS: Vector]attack_chains
The provided sync script executes multiple build steps and agent verification. An attacker who compromises any step in this chain (dependencies, build tools, or the script itself) could establish persistence that survives future updates. The script's use of `--force-with-lease` could also be exploited to overwrite safety checks.
Suggested Fix
Add integrity verification for each step, use checksums for dependencies, and implement code signing for build artifacts.
HIGHSession file operations exposed via command
.pi/extensions/files.ts:29
[AGENTS: Chaos - Deadbolt - Pedant - Provenance - Recon - Warden]ai_provenance, correctness, edge_cases, info_disclosure, privacy, sessions
**Perspective 1:** The '/files' command exposes all files read/written/edited during the current session, including file paths and operation types. This reveals the application's internal file access patterns and could expose sensitive file locations or project structure. **Perspective 2:** The extension tracks all files read/written/edited during a session without explicit user consent. This creates a detailed audit trail of user activity that could contain sensitive information (e.g., configuration files with secrets, personal documents). No privacy notice or opt-out mechanism is provided. **Perspective 3:** `ctx.sessionManager.getBranch()` may return null or undefined, but the code proceeds to iterate over it without checking. This could cause a runtime error. **Perspective 4:** The code assumes `block.arguments?.path` exists and is a string, but tool calls could have malformed arguments, missing path, or path could be non-string. This could cause crashes when trying to use the path. **Perspective 5:** The code accesses session branch data directly via `ctx.sessionManager.getBranch()` without validating if the current user has permission to view this session's data. This could allow unauthorized access to session history if the UI context is compromised. **Perspective 6:** The handler accepts `_args` parameter with underscore prefix indicating intentional non-use, suggesting AI-generated code that copied a pattern without needing arguments.
Suggested Fix
Add a privacy notice when the extension is first used, allow users to opt-out of tracking, and implement data minimization by only tracking files within the project directory.
HIGHSession file access lacks tenant isolation
.pi/extensions/files.ts:129
[AGENTS: Tenant]tenant_isolation
The files extension reads all file operations from the session branch without tenant scoping. In a multi-tenant environment where multiple tenants share the same session manager, this could expose one tenant's file access history to another tenant. The extension shows files read/written/edited across all sessions without filtering by tenant context.
Suggested Fix
Add tenant context filtering when retrieving session entries. Only show files from sessions belonging to the current tenant. Implement tenant-aware session storage or add tenant_id filtering to session queries.
HIGHGitHub API responses parsed without validation may leak tokens
.pi/extensions/prompt-url-widget.ts:46
[AGENTS: Chaos - Cipher - Compliance - Egress - Gateway - Infiltrator - Lockdown - Mirage - Phantom - Razor - Recon - Sanitizer - Syringe - Tenant - Tripwire - Vector - Wallet - Weights]attack_chains, attack_surface, command_injection, cryptography, data_exfiltration, data_exposure, data_protection, denial_of_wallet, dependencies, edge_cases, edge_security, false_confidence, info_disclosure, input_validation, model_supply_chain, sanitization, security, tenant_isolation
**Perspective 1:** Lines 46-57 fetch GitHub metadata via `gh` CLI and parse JSON response. If the `gh` CLI includes authentication tokens in error output or if the response contains unexpected fields, sensitive data could be captured in logs or error messages. The JSON.parse may throw exceptions with full response content. **Perspective 2:** The code executes 'gh' command with user-provided URLs from prompts without validation. An attacker could craft a malicious URL containing command injection payloads (e.g., 'https://example.com; rm -rf /') that would be executed when fetching metadata. **Perspective 3:** The code executes 'gh' CLI command and parses its JSON output without validation of the JSON structure or content integrity. An attacker could potentially manipulate the 'gh' command output or environment to inject malicious JSON that could affect downstream processing. **Perspective 4:** The code passes a user-provided URL directly to `gh pr view` or `gh issue view` commands. While GitHub CLI likely validates these URLs, passing untrusted input to shell commands creates a potential injection vector if the URL contains shell metacharacters. **Perspective 5:** The code executes 'gh' command with user-controlled URL input from prompts. An attacker could inject shell metacharacters in the URL to execute arbitrary commands. **Perspective 6:** The code executes `gh pr view` and `gh issue view` with user-provided URLs from prompts. While GitHub CLI likely validates these, passing untrusted input directly to exec() could be risky if the URL contains shell metacharacters or if there are issues in the gh command. **Perspective 7:** The extension fetches GitHub metadata using the 'gh' CLI tool without tenant-specific rate limiting or authentication context. In a shared environment, multiple tenants making GitHub API calls through the same CLI could exhaust rate limits or expose one tenant's GitHub credentials to another tenant's operations. **Perspective 8:** The extension extracts URLs from prompts using regex patterns and passes them directly to 'gh pr view' and 'gh issue view' commands without URL validation. Malicious URLs could contain shell injection payloads or attempt to access unauthorized GitHub resources through the authenticated gh CLI. **Perspective 9:** The code parses JSON output from the 'gh' command without proper error handling or validation. Malicious output could cause JSON parsing errors or unexpected behavior. **Perspective 10:** The fetchGhMetadata function calls the GitHub CLI (gh) to fetch PR/issue metadata without any rate limiting, caching, or budget controls. An attacker could repeatedly trigger this extension to make unlimited GitHub API calls, potentially exhausting API rate limits or incurring costs if using GitHub Enterprise with API call limits. **Perspective 11:** The extension fetches GitHub PR/issue metadata (title, author) without rate limiting or authentication checks. This could expose the application's interaction patterns with GitHub and potentially leak information about internal repositories or projects being accessed. **Perspective 12:** The `fetchGhMetadata` function passes user-provided URLs directly to the `gh` CLI command without validation. While GitHub CLI likely validates URLs internally, an attacker could inject command-line arguments through specially crafted URLs containing spaces or shell metacharacters if the URL is not properly escaped. **Perspective 13:** The code executes 'gh pr view' or 'gh issue view' with user-provided URLs from prompts. While GitHub CLI likely validates these, the URL comes from untrusted prompt input and could contain shell injection payloads. **Perspective 14:** The prompt-url-widget extension executes `gh pr view` and `gh issue view` with user-provided URLs from prompts. While these are expected to be GitHub URLs, an attacker could craft a prompt with malicious arguments like `url; rm -rf /`. This could be chained with social engineering to get a user to paste malicious content. **Perspective 15:** The code assumes `gh` CLI is installed, authenticated, and in PATH. If not, exec will fail with non-zero exit code and empty stdout, causing JSON.parse error on undefined. **Perspective 16:** The code executes 'gh pr view' and 'gh issue view' commands with user-provided URLs from prompts. While the gh CLI likely has its own validation, the URL is passed directly without sanitization. The function claims to 'fetch Gh metadata' but doesn't validate that the input is a legitimate GitHub URL format before execution. **Perspective 17:** The regex patterns for PR and issue URLs (`PR_PROMPT_PATTERN` and `ISSUE_PROMPT_PATTERN`) capture any non-whitespace character after the prompt text. This could match malformed URLs or non-URL strings that might cause issues when passed to the GitHub CLI. **Perspective 18:** The extension fetches GitHub PR/issue metadata without proper error handling or data validation. While this fetches public data, it could potentially expose internal repository names or structures in error messages. This violates SOC 2 CC6.6 (Logical and Physical Access Security) regarding information leakage.
Suggested Fix
Validate that the URL matches expected GitHub PR/issue URL patterns before passing to `gh` CLI, or use a proper URL parsing library to extract the PR/issue number and construct a safe command.
HIGHDirect user input concatenated into LLM prompt without sanitization
.pi/prompts/is.md:4
[AGENTS: Prompt]llm_security
The prompt template uses '$ARGUMENTS' which directly concatenates user-provided GitHub issue references into the LLM prompt. This allows potential prompt injection where users could embed malicious instructions in issue titles, descriptions, or comments that would be executed by the LLM.
Suggested Fix
Use structured input separation: parse issue references first, fetch issue content via API, then pass as structured data with clear boundaries between system instructions and user content.
HIGHUser-controlled PR input directly influences LLM execution flow
.pi/prompts/landpr.md:8
[AGENTS: Prompt]llm_security
The prompt accepts '$1 <number|url>' as PR identifier which is used to fetch PR metadata and content. An attacker could craft a PR with malicious instructions in the title, description, or commit messages that would be processed by the LLM during the landing workflow.
Suggested Fix
Validate PR identifiers, sanitize fetched content, and use structured data formats with clear separation between system instructions and PR content.
HIGHDirect PR content injection into LLM review process
.pi/prompts/reviewpr.md:8
[AGENTS: Prompt]llm_security
The LLM reads PR diffs and descriptions directly without sanitization. Malicious actors could embed prompt injection attacks in PR titles, descriptions, or code comments that would be executed during the review process.
Suggested Fix
Implement content filtering for PR diffs, use structured data extraction, and separate review instructions from PR content with clear boundaries.
HIGHOutdated Swift dependencies with potential vulnerabilities
Swabble/Package.swift:1
[AGENTS: Supply - Tripwire]dependencies, supply_chain
**Perspective 1:** Commander dependency is pinned to exact version 0.2.1 which is outdated. Commander 0.2.1 may have security issues in argument parsing. swift-testing uses loose version range "from: '0.99.0'" which could pull in unstable or vulnerable versions. **Perspective 2:** The Swift package depends on Commander with 'exact: "0.2.1"' but other dependencies use version ranges. Missing comprehensive version pinning increases supply chain attack surface through dependency confusion. **Perspective 3:** Swift Package Manager should have Package.resolved file to lock transitive dependency versions. Missing resolved file leads to supply chain risks and inconsistent builds.
Suggested Fix
Update Commander to latest stable version and pin swift-testing to a specific version with integrity checks.
HIGHHook command execution without input sanitization
Swabble/Sources/SwabbleCore/Hooks/HookExecutor.swift:28
[AGENTS: Gateway]edge_security
HookExecutor runs arbitrary shell commands with user-provided text without sanitization. Could lead to command injection via crafted transcript text.
Suggested Fix
Sanitize hook text, use process arguments array properly, and implement allowlist for safe characters.
HIGHUnverified Apple Speech framework model loading
Swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift:1
[AGENTS: Chaos - Weights]edge_cases, model_supply_chain
**Perspective 1:** The SpeechPipeline uses Apple's Speech framework (SFSpeechRecognizer, SpeechAnalyzer, SpeechTranscriber) which loads proprietary speech recognition models from Apple's servers. These models are downloaded and loaded without explicit integrity verification, checksum validation, or version pinning. The models are loaded via opaque Apple APIs with no control over model provenance, training data, or potential backdoors. **Perspective 2:** SpeechPipeline starts AVAudioEngine but doesn't handle audio route changes, device disconnection, or interruptions. If user unplugs microphone or receives a phone call during recording, pipeline could hang or crash.
Suggested Fix
Implement model verification by checking Speech framework version, requiring specific locale support, and adding runtime validation of transcription outputs. Consider adding a fallback to locally-verified models if available.
HIGHPhantom API availability annotation
Swabble/Sources/SwabbleCore/Speech/SpeechPipeline.swift:16
[AGENTS: Provenance]ai_provenance
The file uses '@available(macOS 26.0, iOS 26.0, *)' annotations throughout, but iOS 26.0 and macOS 26.0 are non-existent versions. This suggests AI-generated code assuming future OS releases without verification.
Suggested Fix
Update to actual minimum supported versions based on the Speech framework's actual availability
HIGHVoice transcripts stored without encryption
Swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift:1
[AGENTS: Warden]privacy
**Perspective 1:** The TranscriptsStore class stores voice transcripts in plain text files (~/Library/Application Support/swabble/transcripts.log) without encryption. Voice transcripts may contain sensitive personal information, conversations, and potentially identifiable data. **Perspective 2:** The transcripts store maintains up to 100 entries but has no automatic deletion based on time (TTL). Sensitive voice data could accumulate indefinitely without proper data lifecycle management.
Suggested Fix
Implement encryption for stored transcripts using secure encryption libraries (CryptoKit on Apple platforms) and ensure transcripts are encrypted at rest.
HIGHUnencrypted speech transcript storage
Swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift:14
[AGENTS: Compliance - Mirage]false_confidence, regulatory
**Perspective 1:** Transcripts are stored in plaintext at ~/Library/Application Support/swabble/transcripts.log without encryption. This could contain PII or sensitive information, violating GDPR Article 32 (Security of processing) and HIPAA Security Rule §164.312(e)(2)(ii) (Transmission security). **Perspective 2:** The append(text:) function calls try? body.write(to: fileURL, atomically: false, encoding: .utf8) with try?, which silently ignores any write errors. This creates false confidence that transcripts are reliably persisted when they might fail silently.
Suggested Fix
Either propagate the error or log it: do { try body.write(to: fileURL, atomically: false, encoding: .utf8) } catch { print("Failed to write transcript: \\(error)") }
HIGHTranscripts store persists speech transcripts to disk
Swabble/Sources/SwabbleCore/Support/TranscriptsStore.swift:46
[AGENTS: Egress - Siege]data_exfiltration, dos
**Perspective 1:** The TranscriptsStore appends transcribed text to a file at ~/Library/Application Support/swabble/transcripts.log. This creates persistent storage of potentially sensitive conversation content on disk without encryption. The transcripts are stored indefinitely (up to limit of 100 entries), creating a data retention risk. **Perspective 2:** The TranscriptsStore appends text without validating length. An attacker could inject extremely large transcripts to exhaust disk space and memory.
Suggested Fix
Implement encrypted storage for transcripts. Add retention policies and automatic cleanup. Make transcript storage opt-in with user consent.
HIGHPhantom availability annotation
Swabble/Sources/swabble/CLI/CLIRegistry.swift:3
[AGENTS: Provenance]ai_provenance
The file uses '@available(macOS 26.0, *)' annotation but macOS 26.0 doesn't exist, suggesting AI-generated code with unverified version assumptions.
Suggested Fix
Replace with actual minimum macOS version or remove if not needed
HIGHHallucinated macOS version requirement
Swabble/Sources/swabble/Commands/ServeCommand.swift:3
[AGENTS: Provenance]ai_provenance
The command is annotated with '@available(macOS 26.0, *)' which references a non-existent macOS version, making the command unavailable on any real system.
Suggested Fix
Use actual minimum macOS version supported by Speech framework APIs used in the command
HIGHWake word detection bypass via text-only matching
Swabble/Sources/swabble/Commands/ServeCommand.swift:82
[AGENTS: Egress - Phantom - Prompt - Wallet]data_exfiltration, data_exposure, denial_of_wallet, llm_security
**Perspective 1:** The wake word detection uses simple text-only matching (`WakeWordGate.matchesTextOnly`) which is vulnerable to adversarial inputs. An attacker could craft audio that transcribes to text containing the wake word in a way that bypasses intended gating (e.g., 'Hey clawd' vs 'Heyclawd' or with punctuation). The system lacks robust phonetic or acoustic verification. **Perspective 2:** Serve command runs continuous speech transcription pipeline. No limits on audio duration, transcription frequency, or total usage could lead to unbounded compute costs if abused. **Perspective 3:** The wake word stripping uses simple string replacement which could be bypassed. For example, if the wake word is 'clawd', an input like 'cclawd' would strip to 'c' leaving 'c' as the command. An attacker could craft inputs that leave malicious commands after stripping. **Perspective 4:** The hook executor runs external commands with transcript text as arguments. There's no validation of the hook command's output, which could be executed by downstream systems. If the hook command is compromised or misconfigured, it could execute arbitrary commands. **Perspective 5:** The Swabble serve command logs transcribed speech content at info and debug levels. This includes potentially sensitive conversation content that could be captured in system logs. The logger outputs to stdout with timestamps and log levels, which could be redirected to external logging systems. **Perspective 6:** The wake word matching uses simple text comparison without proper normalization or security considerations. This could lead to false positives or be bypassed with clever formatting.
Suggested Fix
Use more robust pattern matching with word boundaries and normalize whitespace after stripping. Validate that the stripped command meets minimum length and content requirements.
HIGHFile transcription command without file size limits
Swabble/Sources/swabble/Commands/TranscribeCommand.swift:1
[AGENTS: Wallet - Warden]denial_of_wallet, privacy
**Perspective 1:** Transcribe command accepts arbitrary audio/video files for transcription. No file size limits or duration caps could allow attackers to submit extremely large files, consuming significant compute resources. **Perspective 2:** The transcribe command processes audio/video files without classifying the sensitivity of the content. Audio files may contain highly sensitive personal conversations, business meetings, or other confidential information.
Suggested Fix
Implement data classification for audio files, provide warnings about sensitive content, and offer options for local-only processing without cloud transmission.
HIGHFile transcription with unverified speech models
Swabble/Sources/swabble/Commands/TranscribeCommand.swift:62
[AGENTS: Weights]model_supply_chain
The TranscribeCommand loads audio files and transcribes them using Apple's Speech framework models without verifying the integrity of the models being used. The locale parameter is user-controlled and could trigger loading of different speech recognition models without validation. No checksum or hash verification of the underlying model artifacts.
Suggested Fix
Add model integrity checks before transcription, validate locale against allowlist, and implement output validation to detect anomalous transcription behavior.
HIGHHallucinated import statement for unavailable API
Swabble/Sources/swabble/main.swift:1
[AGENTS: Infiltrator - Provenance - Vector]ai_provenance, attack_chains, attack_surface
**Perspective 1:** The file imports '@available(macOS 26.0, *)' at the top level, but macOS 26.0 does not exist as a released version. This is a hallucinated version number that suggests AI-generated code assuming future macOS versions without verification. **Perspective 2:** The Swabble CLI includes a serve command that executes arbitrary hooks based on speech recognition. An attacker could manipulate the hook configuration or use audio injection to execute arbitrary commands. This creates a voice-activated remote code execution vector. **Perspective 3:** Swabble is a speech recognition daemon that executes arbitrary shell commands via hooks based on wake word detection. This creates a significant attack surface: 1) Speech input could be manipulated to trigger malicious hooks, 2) Hook commands are executed with user privileges, 3) Configuration files control command execution.
Suggested Fix
Implement command allowlisting for hooks. Sanitize speech input before command matching. Run hooks in a restricted sandbox. Implement audit logging for all hook executions.
HIGHDead code branch due to impossible version check
Swabble/Sources/swabble/main.swift:152
[AGENTS: Provenance - Razor - Specter]ai_provenance, injection, security
**Perspective 1:** The condition 'if #available(macOS 26.0, *)' will never evaluate to true since macOS 26.0 doesn't exist, making the entire main execution path unreachable. This is a classic AI hallucination of future version numbers. **Perspective 2:** The code creates a Process with executableURL and arguments from config.hook.command and config.hook.args. If an attacker can control the config file, they could inject commands. **Perspective 3:** The code checks for macOS 26.0 availability and exits with error if not met, without providing alternative functionality or clear error messages for older systems.
Suggested Fix
Implement feature detection instead of version checking, or provide clear migration paths for users on older systems.
HIGHMissing URL validation for gateway connection
apps/ios/ShareExtension/ShareViewController.swift:170
[AGENTS: Chaos - Gateway - Infiltrator - Phantom - Provenance - Razor - Specter - Tenant - Vault - Vector]ai_provenance, api_security, attack_chains, attack_surface, edge_cases, edge_security, secrets, security, ssrf, tenant_isolation
**Perspective 1:** The code loads a gateway URL from user configuration without proper validation. Line 170 uses `URL(string: config.gatewayURLString)` directly, which could allow malicious URLs (like `ws://evil.com`) if the configuration is compromised. No scheme validation, host whitelisting, or path normalization is performed. **Perspective 2:** The code contains a hardcoded client ID 'moltbot-ios' used as a fallback when the primary client ID 'openclaw-ios' fails. This creates a predictable authentication pattern that could be exploited by attackers to bypass authentication mechanisms or perform client impersonation. **Perspective 3:** The share extension connects to a gateway using stored credentials (token/password) without certificate pinning or proper TLS validation. The URL is loaded from user defaults without validation, potentially allowing SSRF or man-in-the-middle attacks. The connection uses hardcoded client IDs ('openclaw-ios', 'moltbot-ios') and lacks proper authentication flow. **Perspective 4:** The share extension connects to a gateway URL loaded from user settings without certificate validation. An attacker who can modify the saved gateway URL or perform a MITM attack could intercept all shared content (including images, text, URLs) from iOS devices. This creates a data exfiltration path where sensitive user data shared via the extension could be captured. **Perspective 5:** The code contains a hardcoded client ID 'moltbot-ios' used as a fallback when the primary client ID fails. While this is not a traditional secret like an API key, client IDs can be used for authentication and tracking purposes. Having hardcoded client IDs makes the application less flexible and could potentially be used in fingerprinting or authentication bypass scenarios. **Perspective 6:** The share extension sends attachments to the gateway without enforcing size limits at the edge. While there's a 5MB limit for images in `normalizedJPEGData`, the overall payload size isn't validated before sending to the gateway, which could lead to DoS via large payloads. **Perspective 7:** The `sendMessageToGateway` function loads a gateway URL from `ShareGatewayRelaySettings.loadConfig()`. This URL comes from app storage that could potentially be manipulated. If an attacker can write to this storage, they could redirect the share extension to a malicious gateway, potentially leaking shared content. **Perspective 8:** The authentication retry logic (shouldRetryWithLegacyClientId) automatically retries with a different client ID when authentication fails, but lacks rate limiting or anti-brute-force protections. This could allow attackers to probe authentication mechanisms. **Perspective 9:** The share extension connects to the gateway with clientId "openclaw-ios" (or fallback "moltbot-ios") but doesn't include tenant context. Shared content could be sent to the wrong tenant's agent. **Perspective 10:** The share extension connects to a gateway with hardcoded client IDs ('openclaw-ios' and 'moltbot-ios') and minimal authentication validation. The gateway connection accepts token/password from user settings without verifying their validity before attempting connection. This could allow an attacker to redirect the share extension to a malicious gateway if they can modify the saved gateway URL. **Perspective 11:** The code calls `gateway.request(method: "node.event", paramsJSON: nodeEventParams, timeoutSeconds: 25)` but there's no verification that the GatewayNodeSession class actually supports this method or that 'node.event' is a valid gateway method. This appears to be an AI-generated API call pattern without validation. **Perspective 12:** The share extension uses hardcoded client IDs ('openclaw-ios' and 'moltbot-ios') when connecting to the gateway. This allows network observers to fingerprint and track OpenClaw usage across networks, potentially identifying users of the application. Combined with the unencrypted gateway URL, this creates a privacy leak. **Perspective 13:** The loadImageAttachment method loads raw image data into memory without size limits before compression. If a user shares a very large image (e.g., 50MB RAW photo), this could cause memory pressure and crashes in the share extension's limited memory environment.
Suggested Fix
Implement certificate pinning, validate gateway URL against allowlist, use secure keychain storage for credentials, and add proper authentication flow with OAuth or device registration.
HIGHDirect LLM message injection via iOS share extension
apps/ios/ShareExtension/ShareViewController.swift:239
[AGENTS: Prompt]llm_security
The iOS share extension directly passes user-controlled text and attachments to the LLM agent via the 'agent.request' event without any sanitization or structural separation. The 'message' parameter is concatenated from user input and attachments, allowing potential prompt injection attacks. The agent processes this message with thinking level 'low' and can deliver it to various channels (WhatsApp, Telegram, etc.), enabling indirect prompt injection through the LLM.
Suggested Fix
Implement structural separation between system instructions and user content. Use clear delimiters or separate message roles. Consider adding a content filter for adversarial patterns before passing to LLM.
HIGHImage data extraction without user consent tracking
apps/ios/ShareExtension/ShareViewController.swift:549
[AGENTS: Warden]privacy
The share extension extracts and encodes image data from shared content without explicit consent tracking for data processing. This could violate GDPR requirements for processing personal data in images.
Suggested Fix
Implement consent tracking for image processing and provide clear information about data handling in the share interface.
HIGHCamera and microphone permissions not validated against regulatory requirements
apps/ios/Sources/Camera/CameraController.swift:37
[AGENTS: Compliance]access_control
Camera and microphone access checks don't validate against specific regulatory requirements (e.g., HIPAA for healthcare applications, PCI-DSS for payment processing). The permission model is binary without granular controls for different data sensitivity levels.
Suggested Fix
Implement permission tiers based on data sensitivity and regulatory context. Add validation that camera/microphone usage complies with applicable regulations for the data being captured.
HIGHCamera and microphone data handling without explicit consent tracking
apps/ios/Sources/Camera/CameraController.swift:354
[AGENTS: Fuse - Warden]error_security, privacy
**Perspective 1:** The camera controller captures photos and videos, including audio, but there's no explicit consent tracking or audit logging for when these permissions are used. This creates GDPR compliance issues for recording personal data. **Perspective 2:** Detailed permission error messages ('Camera permission denied', 'Microphone permission denied') could help attackers enumerate which permissions are granted/denied.
Suggested Fix
Implement consent tracking for camera/microphone usage with timestamps and purpose. Add audit logging for when media capture occurs.
HIGHContacts access without proper consent tracking
apps/ios/Sources/Contacts/ContactsService.swift:1
[AGENTS: Compliance - Infiltrator - Passkey - Trace - Wallet - Warden]attack_surface, credentials, denial_of_wallet, logging, privacy, regulatory
**Perspective 1:** The ContactsService accesses and modifies the user's contacts database but doesn't appear to track when consent was obtained or log these accesses for audit purposes. The error messages reference 'CONTACTS_PERMISSION_REQUIRED' but there's no logging of when permissions were granted or which contacts were accessed. **Perspective 2:** The ContactsService accesses and modifies iOS contacts data without implementing HIPAA-required safeguards for Protected Health Information (PHI) that may be stored in contacts. The service lacks: 1) Access logging for contact reads/writes, 2) Encryption of contact data at rest, 3) Access controls based on user roles, 4) Data minimization controls. HIPAA Security Rule 164.312 requires access controls and audit controls for PHI. **Perspective 3:** The ContactsService accesses and modifies user contacts but doesn't log which contacts were accessed, modified, or by which agent/user. This creates a significant privacy audit gap. **Perspective 4:** The ContactsService accesses the user's contacts but doesn't validate that the requesting entity has proper credentials or authorization beyond the system permission. This could allow unauthorized access to contact data. **Perspective 5:** ContactsService provides search and add functionality for device contacts. This API is likely exposed to the gateway or remote commands, allowing remote entities to query or modify the user's contacts if they have appropriate permissions. **Perspective 6:** ContactsService.search() and .add() interact with the device's Contacts database. While they require Contacts permission, once granted, an attacker could call these endpoints repeatedly with large queries or many additions, causing CPU and memory usage spikes. This could indirectly affect battery life and performance, but direct cloud costs are low unless the device is part of a cloud service (e.g., a mobile device farm).
Suggested Fix
Implement audit logging for contacts access operations, including timestamp, operation type, and contact identifiers (hashed). Track consent acquisition time and provide mechanism for users to review access history.
HIGHGateway discovery and connection lacks tenant isolation
apps/ios/Sources/Gateway/GatewayConnectionController.swift:0
[AGENTS: Syringe - Tenant]db_injection, tenant_isolation
**Perspective 1:** The GatewayConnectionController discovers and connects to gateways without tenant context. If multiple tenants share the same network, a device could connect to another tenant's gateway, potentially accessing cross-tenant data. **Perspective 2:** GatewaySettingsStore stores tokens and passwords keyed only by instanceId without tenant context. If multiple tenants share the same device instance, credentials could be leaked between tenants. **Perspective 3:** The buildGatewayURL() function constructs URLs from user-provided host and port values. While this isn't SQL injection, improper URL construction could lead to SSRF or other injection attacks if user input isn't properly validated.
Suggested Fix
Add tenant-specific discovery filtering. Include tenant context in gateway discovery and validate tenant membership before connecting.
HIGHTLS fingerprint pinning without certificate revocation checks
apps/ios/Sources/Gateway/GatewayConnectionController.swift:1
[AGENTS: Blacklist - Compliance - Deadbolt - Egress - Gatekeeper - Gateway - Harbor - Infiltrator - Mirage - Passkey - Phantom - Razor - Recon - Sanitizer - Supply - Tripwire - Vault - Vector]access_control, api_security, attack_chains, attack_surface, audit_logging, auth, containers, credentials, data_exfiltration, dependencies, edge_security, encryption, false_confidence, info_disclosure, output_encoding, sanitization, secrets, security, sessions, supply_chain
**Perspective 1:** The code implements TLS fingerprint pinning for gateway connections but doesn't check for certificate revocation (CRL/OCSP). If a gateway's certificate is compromised and revoked, the app would still accept it based on the stored fingerprint. **Perspective 2:** The gateway connection code performs TLS fingerprint verification but doesn't verify the gateway software artifact signatures or check for tampered gateway binaries. This could allow compromised gateway software to connect to the iOS app. **Perspective 3:** The GatewayTLSFingerprintProbe validates TLS connections by checking certificate fingerprints but doesn't perform proper certificate chain validation. This could allow man-in-the-middle attacks if an attacker can present a certificate with the expected fingerprint but from an untrusted CA. **Perspective 4:** The `GatewayTLSFingerprintProbe` uses `URLSessionWebSocketTask` without setting any request size limits. An attacker could send large WebSocket frames to exhaust memory. **Perspective 5:** The GatewayConnectionController stores TLS fingerprints locally and uses them for TOFU (Trust On First Use) authentication. This approach is vulnerable to man-in-the-middle attacks if the initial connection is compromised. The fingerprint verification lacks proper certificate chain validation. **Perspective 6:** The GatewayConnectionController sends detailed device capabilities, commands, and permissions to the gateway server. This includes camera status, location access, screen recording permissions, contacts, calendar, photos access, and motion sensor availability. This represents a significant privacy leak of device state and user permissions. **Perspective 7:** The GatewayConnectionController implements TOFU for TLS certificates - it accepts and stores the first certificate seen for a gateway. This makes it vulnerable to MITM attacks on the first connection. The code stores fingerprints in GatewayTLSStore without proper validation of certificate chain. **Perspective 8:** The GatewayConnectionController implements TLS fingerprint pinning for gateway connections. When connecting to a new gateway, it probes the TLS fingerprint and prompts the user for approval (pendingTrustPrompt). This TOFU model is vulnerable to MITM attacks on the first connection. The code stores the fingerprint via GatewayTLSStore.saveFingerprint for future connections. **Perspective 9:** The manual connection flow (connectManual) allows users to bypass TLS certificate validation by manually accepting fingerprints. An attacker could perform a MITM attack, present their certificate, and trick the user into accepting it. Once accepted, the fingerprint is stored persistently (GatewayTLSStore.saveFingerprint), allowing future connections to the malicious gateway. **Perspective 10:** The TLS fingerprint verification uses SHA256 fingerprints but doesn't implement proper certificate chain validation or revocation checking. The probeTLSFingerprint function only checks the leaf certificate and doesn't validate the entire chain. **Perspective 11:** The currentPermissions() function checks authorization status at a point in time but doesn't implement ongoing validation or re-validation of permissions. If permissions are revoked while the app is running, the app may continue to operate with previously granted permissions. **Perspective 12:** The code implements TLS fingerprint pinning but appears to bypass standard certificate validation (cancelAuthenticationChallenge). This could allow man-in-the-middle attacks if the fingerprint check is compromised. **Perspective 13:** The TrustPrompt struct displays gatewayName and host values in UI without HTML escaping. These values come from network discovery and could contain malicious content. **Perspective 14:** GatewayTLSStore.loadFingerprint and saveFingerprint store TLS certificate fingerprints for TOFU (Trust On First Use) authentication. These are stored without encryption and could be tampered with. **Perspective 15:** GatewaySettingsStore.loadGatewayClientIdOverride stores client ID overrides without encryption. Client IDs can be used for tracking and impersonation. **Perspective 16:** Gateway authentication tokens and passwords are stored in UserDefaults which is not encrypted by default on iOS. These credentials could be extracted from the device if an attacker gains physical access or through other vulnerabilities. **Perspective 17:** When connecting to discovered gateways, the code only checks for TLS fingerprints but doesn't require explicit user authentication for the gateway itself. This could allow connecting to malicious gateways that have valid TLS certificates. **Perspective 18:** The controller connects to gateways without any rate limiting on connection attempts. An attacker could repeatedly attempt connections to exhaust resources. **Perspective 19:** The gateway token and password are stored locally and transmitted without proper validation of their format or strength. There's no mechanism to detect compromised or weak tokens. **Perspective 20:** The TLS fingerprint verification implements certificate pinning but may not properly handle Trust On First Use (TOFU) scenarios. If the initial connection is intercepted, subsequent connections will trust the attacker's certificate. **Perspective 21:** Gateway TLS fingerprints are stored locally using GatewayTLSStore. While this provides TOFU (Trust On First Use) security, the storage mechanism may not be adequately protected. If compromised, an attacker could replace legitimate fingerprints with malicious ones. **Perspective 22:** Gateway connections appear to be persistent without explicit session timeout mechanisms. While there's auto-reconnect logic, there's no maximum session lifetime, which could lead to long-lived sessions that remain valid indefinitely. **Perspective 23:** The resolvedDisplayName function sends device names (UIDevice.current.name) and interface idiom information to the gateway. The clientId can be overridden via settings, potentially containing identifying information. This creates a persistent device fingerprint. **Perspective 24:** The isAllowedPeer function only checks that the peer's UID matches the effective UID. This provides some protection but doesn't verify the full certificate chain or implement proper certificate pinning. The TLS fingerprint probe only checks the first certificate in the chain. **Perspective 25:** The buildGatewayURL, resolveManualUseTLS, and isLoopbackHost functions perform basic host validation but don't comprehensively validate against DNS injection attacks or malformed hostnames. The manualStableID function creates identifiers from host and port without sanitizing special characters. **Perspective 26:** Gateway tokens and passwords are stored in UserDefaults via GatewaySettingsStore. UserDefaults is not encrypted and can be accessed by other apps with the same app group or through device backups. **Perspective 27:** The connectManual function allows connections without TLS based on hostname heuristics (isLoopbackHost). An attacker on the same network could intercept plaintext WebSocket connections to localhost if they can redirect traffic. **Perspective 28:** The resolveBonjourServiceToHostPort function uses NetService to resolve Bonjour services to host/port pairs. This creates a network-based attack surface where malicious mDNS responses could redirect connections to attacker-controlled endpoints. The function has a timeout but doesn't validate the resolved endpoints beyond basic format checks. **Perspective 29:** Gateway credentials (token and password) are stored persistently via GatewaySettingsStore. An attacker with physical access to the device or ability to read app storage could extract these credentials. Combined with the ability to connect to the gateway manually (bypassing discovery), this allows complete account takeover. The credentials are not encrypted with device-specific keys. **Perspective 30:** The gateway connection controller doesn't maintain comprehensive audit logs for connection attempts, including success/failure, authentication attempts, and TLS verification results. This is required for SOC 2 and PCI-DSS compliance. **Perspective 31:** The `buildGatewayURL` function constructs URLs from user-provided host and port without validating the host against a allowlist. This could lead to SSRF if the host is attacker-controlled. **Perspective 32:** The resolveBonjourServiceToHostPort function performs network discovery which could reveal local network topology and services to the gateway. While this is intentional for discovery, it could be abused if the gateway is compromised. **Perspective 33:** The currentPermissions function checks various authorization statuses but doesn't handle all possible states (e.g., .notDetermined, .restricted). It returns boolean values that might not accurately reflect the actual permission state. **Perspective 34:** The GatewayTLSFingerprintProbe.certificateFingerprint function extracts SHA256 fingerprints but doesn't validate certificate chain or perform proper canonicalization before comparison. The fingerprint comparison is string-based without normalization. **Perspective 35:** The GatewayConnectionController maintains and exposes discovery debug logs that could contain network scanning details, service discovery information, and connection attempts.
Suggested Fix
1) Provide clear warnings to users about MITM risks during first connection, 2) Consider alternative verification methods (e.g., comparing fingerprints through out-of-band channels), 3) Implement certificate transparency logging checks where available, 4) Allow users to view and verify the full certificate chain.
HIGHMissing hostname validation
apps/ios/Sources/Gateway/GatewayConnectionController.swift:106
[AGENTS: Sentinel]input_validation
The connectManual function accepts host parameter without validating it's a valid hostname or IP address. Could allow injection attacks.
Suggested Fix
Add validation: guard isValidHostname(host) || isValidIPAddress(host) else { return }
HIGHTLS fingerprint and connection details in logs
apps/ios/Sources/Gateway/GatewayConnectionController.swift:176
[AGENTS: Trace]logging
**Perspective 1:** The GatewayTLSFingerprintProbe logs TLS fingerprint information and connection details which could be used by an attacker to fingerprint the gateway or monitor connection attempts. **Perspective 2:** Gateway connection attempts don't use correlation IDs, making it difficult to trace the complete connection lifecycle across multiple log entries.
Suggested Fix
Only log connection success/failure without exposing fingerprint details, or hash the fingerprint before logging.
HIGHDevice capabilities and permissions exposed without user consent tracking
apps/ios/Sources/Gateway/GatewayConnectionController.swift:1072
[AGENTS: Fuse - Lockdown - Siege - Specter - Warden]configuration, dos, error_security, injection, privacy
**Perspective 1:** The GatewayConnectionController collects and transmits detailed device capabilities and permissions (camera, microphone, location, contacts, calendar, photos, etc.) to the gateway without explicit user consent tracking for each data category. There's no record of when consent was given or for what specific purposes. **Perspective 2:** The GatewayTLSFingerprintProbe builds URLs from user-controlled host and port parameters. An attacker could inject malicious URL schemes or components that might bypass TLS validation or cause unexpected behavior. **Perspective 3:** The code implements a TOFU model for TLS certificates where the first connection's fingerprint is stored and trusted for future connections. While this is common for self-signed certificates, it's vulnerable to MITM attacks on the first connection. **Perspective 4:** The TLS fingerprint probe exposes detailed error information through the onComplete callback, which could reveal network configuration details to callers. **Perspective 5:** The probeTCP function creates TCP connections without limiting concurrent probes. An attacker could trigger many simultaneous probes to exhaust network resources. **Perspective 6:** The system reports extensive device information including platform details, model identifiers, capabilities, and permissions which can be used for device fingerprinting. This creates a unique identifier that could track users across sessions or services. **Perspective 7:** The resolveManualUseTLS function allows TLS to be disabled for loopback hosts. While this might be acceptable for development, it could lead to insecure configurations if users manually connect to localhost in production. **Perspective 8:** Multiple functions resolve hostnames via NetService without validating DNS response sizes. Malicious DNS responses could cause memory exhaustion.
Suggested Fix
Implement granular consent tracking for each capability category with timestamps and purpose descriptions. Store consent records locally and provide mechanisms for users to review and revoke consent.
HIGHHardcoded service identifiers in Keychain
apps/ios/Sources/Gateway/GatewaySettingsStore.swift:26
[AGENTS: Cipher - Egress - Gatekeeper - Passkey - Razor - Vault]auth, credentials, cryptography, data_exfiltration, secrets, security
**Perspective 1:** The code uses hardcoded service strings ('ai.openclaw.gateway', 'ai.openclaw.node', 'ai.openclaw.talk') for Keychain storage. While not directly exploitable, this creates a predictable pattern that could be targeted in attacks. More concerning is the talkProviderApiKeyAccountPrefix constant which includes 'provider.apiKey.' - this could expose API keys if not properly secured. **Perspective 2:** The GatewaySettingsStore stores gateway tokens, passwords, and API keys in the iOS Keychain with service identifiers like 'ai.openclaw.gateway' and 'ai.openclaw.talk'. While Keychain is secure storage, the service identifiers could be enumerated, and if the app is compromised, these credentials could be exfiltrated. **Perspective 3:** The code uses hardcoded service identifiers ('ai.openclaw.gateway', 'ai.openclaw.node', 'ai.openclaw.talk') for Keychain storage. While not cryptographic keys themselves, these identifiers are part of the key management system and could be targeted if an attacker gains code access. **Perspective 4:** Service identifiers like 'ai.openclaw.gateway' are hardcoded and predictable. This could make keychain items easier to target in attacks. **Perspective 5:** The hardcoded service identifiers 'ai.openclaw.gateway', 'ai.openclaw.node', and 'ai.openclaw.talk' reveal internal service architecture and could be used for targeted attacks. **Perspective 6:** The hardcoded account prefix 'provider.apiKey.' reveals the structure of how API keys are stored in the keychain, which could aid attackers in understanding the application's security model. **Perspective 7:** The code uses hardcoded service strings ('ai.openclaw.gateway', 'ai.openclaw.node', 'ai.openclaw.talk') for keychain storage. While not a direct vulnerability, this could lead to credential collisions if multiple apps use the same identifiers.
Suggested Fix
Consider using dynamic service identifiers or additional protection layers. Ensure Keychain items have appropriate protection classes (kSecAttrAccessibleWhenUnlocked).
HIGHGateway credentials stored in Keychain but diagnostic logs may expose them
apps/ios/Sources/Gateway/GatewaySettingsStore.swift:520
[AGENTS: Chaos - Compliance - Egress - Gateway - Harbor - Mirage - Phantom - Recon - Sanitizer - Siege - Tenant - Warden]api_security, containers, data_exfiltration, dos, edge_cases, edge_security, false_confidence, info_disclosure, privacy, regulatory, sanitization, tenant_isolation
**Perspective 1:** While gateway tokens and passwords are stored in Keychain, the GatewayDiagnostics class logs gateway activities to a plain text file that could potentially expose sensitive connection information or error messages containing credential hints. **Perspective 2:** Gateway tokens and passwords are stored in Keychain but the code doesn't specify accessibility or protection level constraints. Default accessibility might allow access when device is unlocked. **Perspective 3:** Multiple functions like `saveGatewayToken`, `saveGatewayPassword`, etc., return boolean success values but don't propagate errors. The calling code assumes security is ensured when tokens/passwords are saved, but failures are silently ignored. This creates false confidence in secure storage. **Perspective 4:** The KeychainStore is used to store sensitive data (tokens, passwords, API keys) but the code doesn't show proper access control flags (kSecAttrAccessible) which could leave data vulnerable if device is compromised. **Perspective 5:** The GatewayDiagnostics class maintains log files without a clear retention policy or automatic cleanup mechanism, potentially accumulating sensitive diagnostic information over time. **Perspective 6:** The logger is initialized with subsystem 'ai.openclaw.ios' and category 'GatewayDiag', revealing the application's reverse domain identifier, platform, and internal component structure. **Perspective 7:** Various functions accept stable ID strings without validation. These IDs are used as keys in Keychain and UserDefaults and could potentially contain problematic characters or be excessively long. **Perspective 8:** Gateway diagnostics logs are stored with FileProtectionType.completeUntilFirstUserAuthentication, which means logs are accessible after first unlock. Sensitive gateway connection details might be logged. **Perspective 9:** The diagnostic logging system writes to files without proper log rotation in a production sense. While it has some truncation logic, it doesn't implement comprehensive log management suitable for containerized environments. **Perspective 10:** GatewayDiagnostics logs to a single file path ('openclaw-gateway.log') without tenant separation. Diagnostic information from multiple tenants would be intermingled, potentially exposing sensitive connection details or errors across tenant boundaries. **Perspective 11:** The GatewayDiagnostics.log function writes detailed gateway connection information, errors, and timestamps to a log file in the caches directory. This file could contain sensitive connection details, error messages, and timing information that could be accessed by other apps or extracted from device backups. **Perspective 12:** The `GatewayDiagnostics.log` function appends to a log file without rotation. The file is truncated when it exceeds `maxLogBytes`, but only the tail is kept. However, frequent logging could still cause disk I/O exhaustion. **Perspective 13:** The `GatewayDiagnostics.log` function performs file I/O on a background queue, but if the queue is overwhelmed, it could lead to resource contention. **Perspective 14:** Keychain save/load operations don't handle all error cases (e.g., keychain locked, item not found). Failure could cause data loss. **Perspective 15:** Gateway diagnostics logs are stored with minimal protection (completeUntilFirstUserAuthentication) and lack documented retention policies, violating PCI-DSS requirement 10.5 (Secure Audit Trail) and SOC 2 CC7.1.
Suggested Fix
Implement stronger file protection, document log retention policies, and ensure logs are tamper-evident. Add log rotation and secure disposal procedures.
HIGHCamera and screen recording without data classification
apps/ios/Sources/Model/NodeAppModel.swift:1
[AGENTS: Compliance - Deadbolt - Fuse - Gateway - Harbor - Infiltrator - Pedant - Specter]PCI-DSS, SOC 2, attack_surface, containers, correctness, edge_security, error_security, sessions, ssrf
**Perspective 1:** The NodeAppModel handles camera snapshots, screen recording, and clipboard access which could capture payment card data or sensitive authentication data. No data classification or filtering mechanisms to prevent capture of PCI-DSS regulated data. No logging of what data is captured or accessed. **Perspective 2:** In beginBackgroundConnectionGracePeriod(), backgroundGraceTaskID is set but may not be invalidated if the task completes normally before the timer fires. In endBackgroundConnectionGracePeriod(), the ID is invalidated, but if begin is called twice without end, the first task ID could leak. **Perspective 3:** The handleCanvasInvoke function accepts arbitrary URLs for canvas navigation without validation, which could be used to load malicious content or probe internal network resources from the iOS app context. **Perspective 4:** The beginBackgroundConnectionGracePeriod function starts background tasks but may not handle all cleanup paths if the app is terminated unexpectedly. This could leave resources allocated. **Perspective 5:** The NodeAppModel manages gateway connections (nodeGateway and operatorGateway) but doesn't implement proper session timeout mechanisms. While there's a gateway health monitor, there's no explicit session timeout for idle connections, which could lead to stale sessions remaining active indefinitely. **Perspective 6:** The application allows multiple gateway connections (nodeGateway and operatorGateway) but doesn't enforce any limits on concurrent sessions. This could allow session exhaustion attacks or resource consumption attacks. **Perspective 7:** APNS device tokens are stored in UserDefaults with key 'push.apns.deviceTokenHex'. While this is for iOS app storage, if this pattern is replicated in containerized environments, it could lead to insecure secret storage. UserDefaults is not appropriate for sensitive data in shared container environments. **Perspective 8:** The application handles configuration updates (gateway connections, agent selection, voice wake settings) without proper change management controls. No audit trail of configuration changes, no approval workflows for sensitive changes, and no rollback mechanisms. **Perspective 9:** The NodeAppModel includes error messages like 'NODE_BACKGROUND_UNAVAILABLE: canvas/camera/screen commands require foreground', 'CAMERA_DISABLED: enable Camera in iOS Settings → Camera → Allow Camera', 'LOCATION_DISABLED: enable Location in Settings', etc. These messages reveal system capabilities and configuration details to potential attackers. **Perspective 10:** Manages gateway connections, device capabilities (camera, location, contacts, calendar, etc.), voice wake, talk mode, and deep link handling. Acts as a bridge between iOS device capabilities and the OpenClaw gateway. **Perspective 11:** NotificationInvokeLatch uses a lock and resumed flag to prevent double-resume, but there's a race condition between checking resumed and setting cont. If two threads call resume simultaneously, both might pass the resumed check before either sets resumed = true. **Perspective 12:** cameraFlashNonce is an Int that gets incremented. In Swift, Int is platform-dependent (32 or 64 bit). While unlikely to overflow in practice, continuous incrementing could theoretically overflow. **Perspective 13:** Gateway sessions are not bound to specific device characteristics or fingerprints. This makes it easier for session hijacking if tokens are compromised, as there's no additional validation of the client environment.
Suggested Fix
Implement data classification for captured images/screenshots, add PCI-DSS data detection filters, log all capture events with metadata (but not the sensitive data itself), and implement user warnings when potentially sensitive data might be captured.
HIGHAPNS device token stored in UserDefaults without encryption
apps/ios/Sources/Model/NodeAppModel.swift:93
[AGENTS: Warden]privacy
APNS device tokens are stored in UserDefaults (apnsDeviceTokenHex) which is not encrypted storage. Device tokens are sensitive identifiers that could be used to send push notifications to the device. Storing them in plain text violates privacy best practices for sensitive identifiers.
Suggested Fix
Store APNS device tokens in iOS Keychain with appropriate access controls, or use encrypted storage solutions instead of UserDefaults.
HIGHBackground location tracking without proper consent verification
apps/ios/Sources/Model/NodeAppModel.swift:232
[AGENTS: Warden]privacy
The location service is used in background mode with 'always' authorization, but there's no verification that the user has provided explicit consent for background location tracking. The code checks authorization status but doesn't validate that consent was obtained with proper disclosure about background usage.
Suggested Fix
Implement explicit consent verification for background location tracking, provide clear disclosure about background usage patterns, and regularly reconfirm consent for continuous background tracking.
HIGHCanvas A2UI actions directly trigger LLM agent requests
apps/ios/Sources/Model/NodeAppModel.swift:1096
[AGENTS: Blacklist - Exploit - Prompt - Recon - Sanitizer - Sentinel - Siege - Syringe - Tenant]business_logic, db_injection, dos, info_disclosure, input_validation, llm_security, output_encoding, sanitization, tenant_isolation
**Perspective 1:** The handleCanvasA2UIAction function extracts user actions from canvas interactions and formats them into agent messages that are sent directly to LLMs. User-controlled content from canvas actions is incorporated into LLM prompts without structural separation, creating a prompt injection vector through UI interactions. **Perspective 2:** The code directly injects user-controlled action data into JavaScript via eval() without proper sanitization. The `userAction` dictionary contains user-controlled values that are concatenated into JavaScript strings and executed via `screen.eval(javaScript: js)`. This could lead to JavaScript injection if an attacker can control action parameters. **Perspective 3:** The code constructs JavaScript strings with user-controlled error messages (`errorText`) and executes them via `screen.eval(javaScript: js)`. If `errorText` contains malicious JavaScript, it could be executed in the browser context. **Perspective 4:** The code uses `eval(javaScript: js)` where `js` is constructed by concatenating user-controlled data (`actionId`, `ok`, `errorText`) into a JavaScript string without proper escaping. This could allow injection of malicious JavaScript code if any of these values contain quotes or special characters. **Perspective 5:** The code constructs JavaScript strings by concatenating user-controlled data (`messagesJSON`) without proper escaping. The `messagesJSON` variable contains serialized messages that could contain malicious JavaScript if not properly sanitized. **Perspective 6:** The handleCanvasA2UIInvoke function evaluates JavaScript from untrusted sources via screen.eval(javaScript: js). The JavaScript string is constructed by concatenating user-controlled messagesJSON without proper sanitization, potentially allowing JavaScript injection. **Perspective 7:** The handleInvoke function returns detailed error messages like 'NODE_BACKGROUND_UNAVAILABLE: canvas/camera/screen commands require foreground' and 'CAMERA_DISABLED: enable Camera in iOS Settings → Camera → Allow Camera' which reveal system capabilities, restrictions, and architecture to potential attackers. **Perspective 8:** Multiple status text fields (gatewayStatusText, nodeStatusText, operatorStatusText) expose detailed system state including connection status, pairing state, and operational modes. This information could help attackers understand the system's current state and vulnerabilities. **Perspective 9:** The handleDeepLink function (called via screen.onDeepLink) processes URLs without comprehensive validation. Malformed or malicious URLs could cause crashes or security issues. **Perspective 10:** The NodeAppModel manages device state (camera, location, contacts, etc.) without tenant context. In a multi-tenant mobile app scenario, different tenants' data could be mixed in shared device resources. **Perspective 11:** The beginBackgroundConnectionGracePeriod function creates background tasks but relies on proper cleanup in endBackgroundConnectionGracePeriod. If the app crashes or the task isn't properly ended, system resources could be leaked. **Perspective 12:** The NodeAppModel implements a background connection grace period with lease system to manage reconnections. This includes logic to suppress reconnections after grace periods expire. While not a direct payment flow issue, this could affect service availability and user experience.
Suggested Fix
Use parameterized JavaScript execution or validate/sanitize all user inputs before constructing JavaScript strings. Consider using a safer communication channel like message passing instead of eval().
HIGHGateway credentials stored in UserDefaults without encryption
apps/ios/Sources/Onboarding/OnboardingWizardView.swift:1
[AGENTS: Blacklist - Compliance - Deadbolt - Infiltrator - Passkey - Phantom - Sanitizer - Vault]access_control, api_security, attack_surface, credentials, data_protection, output_encoding, sanitization, secrets, sessions
**Perspective 1:** The onboarding wizard stores gateway tokens and passwords in UserDefaults (@AppStorage) which are not encrypted by default on iOS. This exposes sensitive authentication credentials to potential extraction from the device. **Perspective 2:** Gateway tokens and passwords are stored in AppStorage which may not provide sufficient protection for sensitive credentials. The credentials are persisted without apparent encryption at rest. **Perspective 3:** The scannerError string is displayed in UI alerts without HTML escaping. This error could contain user-controlled content from QR code parsing that might include HTML-like content. **Perspective 4:** Gateway tokens and passwords are stored in UserDefaults via GatewaySettingsStore. UserDefaults is not encrypted and can be accessed by other apps with the same app group or through device backups. **Perspective 5:** The QR code parsing functionality accepts arbitrary URLs and data without proper validation. This could lead to injection attacks if malicious QR codes are scanned. **Perspective 6:** The gateway token and password are saved using GatewaySettingsStore which appears to use UserDefaults/AppStorage. These credentials are persisted locally but may not be stored in the iOS Keychain, leaving them vulnerable to extraction if the device is compromised. **Perspective 7:** The detectQRCode function extracts messages from images without validating the content structure. The handleScannedLink function parses URLs and deep links from QR codes but doesn't sanitize the extracted values before using them in connection parameters. An attacker could craft a QR code with malicious content that bypasses validation. **Perspective 8:** The onboarding wizard supports QR code scanning from both camera and photo library. The detectQRCode function uses CIDetector to extract messages from images. This creates an attack surface where malicious QR codes or images could contain malformed data that might cause parsing issues or lead to unexpected gateway connections. The code validates the parsed link through GatewayConnectDeepLink.fromSetupCode, but the validation logic is not shown. **Perspective 9:** The QR code scanning functionality accepts and processes scanned codes without proper validation of the content format or source. This could allow malicious QR codes to inject unexpected configuration or credentials. **Perspective 10:** The handleScannedLink function processes URLs from QR codes without validating the URL scheme or sanitizing the host/port values before using them in network connections. **Perspective 11:** The gateway connection establishes sessions using tokens and passwords, but there's no binding of these sessions to device characteristics (device ID, instance ID, etc.). This could allow session tokens to be used from different devices if stolen. **Perspective 12:** The manualHost, manualPortText, and other connection fields accept user input with minimal validation. While there's some validation in resolveManualPort and shouldRequireTLS functions, the host field could contain injection attacks or malformed data that affects subsequent network operations.
Suggested Fix
1) Implement strict validation of parsed URLs/links, 2) Add size limits on image processing, 3) Consider sandboxing the QR detection process, 4) Validate that gateway connection parameters are within expected ranges (ports, hostnames).
HIGHGateway credentials stored in UserDefaults without encryption
apps/ios/Sources/Onboarding/OnboardingWizardView.swift:885
[AGENTS: Warden]privacy
**Perspective 1:** Gateway authentication tokens and passwords are stored in UserDefaults (AppStorage) which is not encrypted by default on iOS. These credentials provide access to the gateway and potentially sensitive data. The code also saves these to GatewaySettingsStore without clear encryption mechanisms. **Perspective 2:** The onboarding process scans QR codes that contain gateway connection details including host, port, tokens, and passwords. These QR codes could be captured or intercepted, exposing sensitive connection credentials. The system doesn't validate the source or integrity of scanned QR codes.
Suggested Fix
Implement QR code source validation, use one-time codes, or implement challenge-response authentication instead of embedding permanent credentials in QR codes.
HIGHBackground task identifier hardcoded and predictable
apps/ios/Sources/OpenClawApp.swift:20
[AGENTS: Razor]security
The wakeRefreshTaskIdentifier is hardcoded as 'ai.openclaw.ios.bgrefresh'. Predictable task identifiers could allow other apps to interfere with background tasks.
Suggested Fix
Use a dynamically generated identifier or include a random component. Register the task identifier in the Info.plist as required.
HIGHAPNs device token handling may expose device identifiers
apps/ios/Sources/OpenClawApp.swift:542
[AGENTS: Chaos - Compliance - Gatekeeper - Gateway - Harbor - Phantom - Prompt - Recon - Siege - Warden]api_security, auth, containers, dos, edge_cases, edge_security, info_disclosure, llm_security, privacy, regulatory
**Perspective 1:** The application registers for and handles APNs device tokens which are device identifiers. While necessary for push notifications, there's no clear documentation of how these tokens are used, stored, or whether they're shared with third parties. **Perspective 2:** The handleDeepLink function accepts URLs with message parameters that are passed directly to LLM agents. Attackers could craft malicious deep links with prompt injection payloads that influence agent behavior. **Perspective 3:** The handleDeepLink method checks for a valid key to bypass confirmation prompts. The _test_currentDeepLinkKey() method is not shown, but if this key can be guessed or extracted, it could allow unauthorized agents to send commands without user confirmation. **Perspective 4:** The APNs device token is stored and used without validation that it comes from a legitimate source. A malicious app could potentially spoof this. **Perspective 5:** Background wake refresh tasks execute gateway operations without proper isolation or validation of the operations being performed. **Perspective 6:** The WatchPromptNotificationBridge mirrors watch notifications to iOS notifications, potentially exposing message content and action data in the iOS notification system without explicit user consent for this cross-device data sharing. **Perspective 7:** The logger is initialized with subsystem 'ai.openclaw.ios' and category 'Push', revealing the application's reverse domain identifier, platform, and internal component structure. **Perspective 8:** The background wake refresh task identifier 'ai.openclaw.ios.bgrefresh' reveals the application's reverse domain identifier and platform to the system's background task scheduler. **Perspective 9:** The app receives APNs device tokens and forwards them to the gateway without validating the source or ensuring the gateway connection is authenticated. **Perspective 10:** Background wake refresh tasks execute gateway operations without re-validating user authorization or session validity. **Perspective 11:** The uncaught exception handler logs exceptions but doesn't implement proper error containment or recovery mechanisms suitable for containerized environments where process crashes should be handled gracefully. **Perspective 12:** The background wake refresh task schedules itself repeatedly. If the task fails to complete or is rescheduled too frequently, it could keep the app in a background state, consuming resources. **Perspective 13:** Background wake refresh tasks don't monitor their execution time and could be terminated by iOS if they exceed allowed limits. **Perspective 14:** Watch prompt actions are processed without comprehensive audit logging, violating PCI-DSS requirement 10.2 and SOC 2 CC7.1. There's no logging of who initiated actions, when, and with what outcome. **Perspective 15:** Watch prompt notifications are processed without validating that they originated from a trusted source (the paired watch or authorized gateway). **Perspective 16:** The `WatchPromptNotificationBridge` creates a new notification category for each prompt ID. Over time, this could lead to an unbounded number of categories, potentially affecting system performance.
Suggested Fix
Validate and sanitize deep link message parameters before passing to LLM agents. Implement rate limiting and confirmation prompts for untrusted deep links.
HIGHiOS app enables background execution and gateway takeover via deep links
apps/ios/Sources/RootCanvas.swift:1
[AGENTS: Infiltrator - Sentinel - Vector]attack_chains, attack_surface, input_validation
**Perspective 1:** The iOS app maintains background connections, handles deep links, and can execute agent commands. Attackers can chain: 1) Use deep links with valid keys to bypass confirmation, 2) Maintain background execution via preventSleep and background tasks, 3) Combine with gateway connections for remote control, 4) Use voice wake for command injection. The deep link key system lacks proper rotation and the background execution enables persistent access. **Perspective 2:** The RootCanvas view handles deep links via handleDeepLink that can trigger agent commands. While there's some validation (message size limits, confirmation prompts), this creates an attack surface where malicious apps could attempt to invoke agent functionality via URL schemes. **Perspective 3:** AppStorage values are used without validation. Corrupted or malicious values in UserDefaults could cause app crashes.
Suggested Fix
Implement deep link key rotation, add time-based expiration for background tasks, and require biometric authentication for sensitive operations.
HIGHScreen recording without proper consent mechanisms
apps/ios/Sources/Screen/ScreenRecordService.swift:352
[AGENTS: Warden]privacy
Screen recording functionality captures potentially sensitive information without explicit, granular consent mechanisms for each recording session. The service doesn't track consent or provide audit trails.
Suggested Fix
Implement explicit consent prompts for screen recording with purpose disclosure. Add audit logging for recording sessions including duration and purpose.
HIGHSetup code injection leading to gateway compromise
apps/ios/Sources/Settings/SettingsTab.swift:1
[AGENTS: Blacklist - Compliance - Deadbolt - Egress - Exploit - Gatekeeper - Infiltrator - Mirage - Passkey - Phantom - Provenance - Razor - Recon - Sanitizer - Supply - Tripwire - Vault - Vector]ai_provenance, api_security, attack_chains, attack_surface, audit_logging, auth, business_logic, credentials, data_exfiltration, data_protection, dependencies, false_confidence, info_disclosure, output_encoding, sanitization, secrets, security, sessions, supply_chain
**Perspective 1:** The setup code parsing (applySetupCode) doesn't adequately validate URLs or sanitize input. An attacker could craft a malicious setup code that points to a controlled server. Once accepted, the app connects to the malicious gateway, potentially exposing credentials and sensitive data. The user may not realize they're connecting to the wrong server. **Perspective 2:** The settings tab displays and allows modification of gateway configuration including tokens, passwords, and connection details without proper access controls. This could allow unauthorized configuration changes or credential exposure. **Perspective 3:** The applySetupCode function parses setup codes from user input without rigorous validation of the payload structure, which could lead to injection or parsing vulnerabilities. **Perspective 4:** The setup code parsing in applySetupCode() accepts arbitrary input and attempts to parse URLs and parameters. Malformed or malicious setup codes could cause parsing errors or unexpected behavior. **Perspective 5:** Gateway status text and error messages are displayed in UI without HTML escaping. These could contain user-controlled content from network responses or configuration. **Perspective 6:** The iOS app integrates with Tailscale for network connectivity but doesn't verify the integrity of Tailscale components or check for tampered network configurations. This could allow network-level attacks. **Perspective 7:** Setup codes containing tokens and passwords are processed from user input and stored. The codes may contain sensitive credentials that are handled in plain text. **Perspective 8:** The code checks for Tailscale IPv4 addresses (100.64-127.x.x) which could reveal information about the user's network configuration and VPN usage. **Perspective 9:** The applySetupCode function parses setup codes from user input without sufficient validation. Maliciously crafted setup codes could potentially bypass authentication or inject unexpected parameters. **Perspective 10:** The setup code parsing accepts arbitrary URLs and host/port combinations without validating they point to legitimate OpenClaw gateways. An attacker could provide a malicious gateway URL that intercepts credentials. **Perspective 11:** The SettingsTab stores sensitive credentials like gateway tokens and passwords in UserDefaults, which is not secure storage. These credentials could be extracted from the device by malicious apps or through device backups. **Perspective 12:** The SettingsTab displays gateway tokens and passwords in plain text fields. While this is convenient for users, it exposes sensitive credentials in the UI where they could be captured by screen recording or shoulder surfing. **Perspective 13:** The SettingsTab displays and manages gateway connection details including setup codes, host information, ports, and authentication tokens. While this is necessary for configuration, it exposes sensitive connection details in the UI that could be captured through screenshots or device backups. **Perspective 14:** The file imports 'OpenClawKit' which doesn't appear to be a legitimate dependency in the iOS project. This is a common AI-generated artifact of inventing framework names. **Perspective 15:** The applySetupCode function parses setup codes without comprehensive validation. URL parsing from setup codes doesn't validate all components, and host/port extraction could be vulnerable to injection attacks. The applySetupURL function trusts URL components without sanitization. **Perspective 16:** The applySetupCode function parses setup codes without proper validation. Malformed codes could cause crashes or unexpected behavior. The function also applies URLs directly without sanitization. **Perspective 17:** The SettingsTab processes gateway setup codes via applySetupCodeAndConnect and applySetupCode functions. These codes can contain connection parameters (host, port, TLS settings, tokens, passwords). Malformed or malicious setup codes could potentially cause issues in the parsing logic or lead to connections to attacker-controlled endpoints. **Perspective 18:** The SettingsTab on iOS exposes debug information including gateway discovery logs, debug canvas status, and detailed gateway debug text showing status, discovery, server, address, and discovery log details. **Perspective 19:** The location mode can be changed from 'While Using' to 'Always' without re-prompting the user for permission (line 800-810). An attacker who gains temporary access to the device could enable always-on location tracking without user knowledge. Combined with background execution, this enables persistent surveillance. **Perspective 20:** Changes to security-sensitive settings (location access, camera permissions, gateway configuration) are not logged or audited. This violates change management requirements in SOC 2 and other frameworks. **Perspective 21:** The friendlyGatewayMessage function attempts to map raw error messages to user-friendly ones, but uses simple string contains checks that could match incorrectly. This creates the appearance of helpful error messages but might mislead users about the actual error. **Perspective 22:** The displayName field accepts arbitrary text without validation for special characters or length limits. Display names are used in UI and potentially in network communications without sanitization. **Perspective 23:** The gatewayDebugText function assembles debug information including status texts and log messages that could contain sensitive information about the network configuration and gateway state. **Perspective 24:** The hasTailnetIPv4 function uses getifaddrs to enumerate network interfaces and check for Tailscale IPv4 addresses (100.64-127.x.x). While this is a detection mechanism, it involves low-level network interface enumeration which could potentially leak information about network configuration.
Suggested Fix
1) Minimize the information collected from interface enumeration, 2) Consider higher-level APIs for network connectivity checks, 3) Ensure no sensitive interface data is logged or exposed, 4) Implement proper error handling for interface enumeration failures.
HIGHUnbounded ElevenLabs TTS API calls without rate limiting or cost caps
apps/ios/Sources/Voice/TalkModeManager.swift:0
[AGENTS: Wallet]denial_of_wallet
The talk mode feature can trigger ElevenLabs TTS API calls (streamSynthesize) with no rate limiting, per-user quotas, or maximum token limits. An attacker could repeatedly trigger voice synthesis via the gateway or push-to-talk functionality, generating unlimited audio synthesis costs. The API key is loaded from configuration or environment variables with no spending controls.
Suggested Fix
Implement per-user rate limiting, enforce maximum characters per TTS request, add daily/monthly cost caps, and consider using a cheaper fallback TTS provider for unauthenticated or high-volume usage.
HIGHVoice data processing without explicit PHI handling
apps/ios/Sources/Voice/TalkModeManager.swift:1
[AGENTS: Compliance - Fuse - Harbor - Infiltrator - Passkey - Pedant - Vector]HIPAA, SOC 2, attack_chains, attack_surface, containers, correctness, credentials, error_security
**Perspective 1:** The TalkModeManager processes voice data including speech recognition and transcription, which could contain Protected Health Information (PHI). There are no documented safeguards for PHI handling, no audit logging of voice data processing, and no mechanisms for user consent or data minimization. **Perspective 2:** The audioEngine is created but may not be properly stopped in all code paths. In stopRecognition(), the engine is stopped, but if an exception occurs before this point or in other error paths, the engine might remain running. There's also no deinit to ensure cleanup. **Perspective 3:** In playAssistant(), the code does 'let client = ElevenLabsTTSClient(apiKey: apiKey)' where apiKey is force-unwrapped with 'let apiKey = resolvedKey?.trimmingCharacters(in: .whitespacesAndNewlines)'. If resolvedKey is nil, this will crash. Also, voiceId is force-unwrapped in 'let voiceId: String? = if let apiKey, !apiKey.isEmpty { await self.resolveVoiceId(preferred: preferredVoice, apiKey: apiKey) } else { nil }' but then used in 'if canUseElevenLabs, let voiceId, let apiKey {' which properly unwraps, but the force-unwrap in the conditional could crash. **Perspective 4:** The code contains a debug-only fallback for ElevenLabs API key retrieval: `let resolvedKey = configuredKey ?? ProcessInfo.processInfo.environment["ELEVENLABS_API_KEY"]`. This creates an attack chain where an attacker could exploit debug builds to extract API keys from environment variables, potentially leading to unauthorized API usage and financial impact. **Perspective 5:** In debug builds, the code falls back to reading API keys from process environment variables, which could lead to credential exposure if debug builds are accidentally deployed. **Perspective 6:** The code contains a debug-only fallback to read ElevenLabs API key from environment variable 'ELEVENLABS_API_KEY'. While this is gated by #if DEBUG, it creates a pattern where secrets could be inadvertently exposed in development containers or CI/CD environments. **Perspective 7:** The voice processing system lacks comprehensive audit logging for access control events. While there are some diagnostic logs, there's no logging of who accesses voice features, when, and for what purpose. Missing logs for permission changes, feature enablement/disablement, and user consent tracking. **Perspective 8:** Multiple error messages in the TalkModeManager expose internal implementation details to users, such as 'Gateway not connected', 'Microphone permission denied', 'Speech recognition permission denied', 'Talk mode is not supported on the iOS simulator', 'Invalid audio input format', and specific error descriptions from speech recognition. These messages could help attackers understand the system's state and capabilities. **Perspective 9:** In the playAssistant method, there's a catch-all error handler that falls back to system voice synthesis. While this provides resilience, it could mask security-relevant failures like authentication errors with the ElevenLabs API or network issues that should be handled differently. **Perspective 10:** Handles microphone access, speech recognition, and text-to-speech functionality. Includes permission checks, audio session management, and integration with gateway for AI responses. Processes user speech and generates AI responses with voice output. **Perspective 11:** The StreamFailureBox class uses NSLock for thread safety but is marked as @unchecked Sendable. While NSLock provides synchronization, the class contains mutable state (valueInternal) that could be accessed concurrently from multiple threads. The set() and value getter lock properly, but there's no guarantee callers will use these methods exclusively. Additionally, the class is used in a context where it could be accessed from multiple threads simultaneously. **Perspective 12:** Several optional properties (defaultVoiceId, currentVoiceId, defaultModelId, currentModelId, apiKey, etc.) are declared but not initialized. While Swift optionals default to nil, the code assumes these will be properly set before use. If reloadConfig() fails or isn't called, these properties remain nil and could cause unexpected behavior or crashes when force-unwrapped or accessed. **Perspective 13:** In the audio tap callback, noiseFloorSamples.append(raw) is called, then checked if noiseFloorSamples.count >= 22. However, the code then takes sorted.prefix(take) where take = max(6, sorted.count / 2). If sorted.count is less than 6, this could cause an issue. Also, the calculation uses slice.reduce(0.0, +) / Double(slice.count) without checking if slice.count > 0. **Perspective 14:** Several Task instances are created (silenceTask, pttTimeoutTask, incrementalSpeechTask, etc.) but not all have proper cancellation handling. For example, the silenceTask checks 'while self.isEnabled || (self.isPushToTalkActive && self.pttAutoStopEnabled)' but doesn't check Task.isCancelled. If the task is cancelled while sleeping, it might continue executing. **Perspective 15:** In the audio tap callback: 'let next = (self.micLevel * 0.80) + (raw * 0.20)'. This assumes micLevel has been initialized. On first call, micLevel is 0, so this is fine, but if the smoothing factors don't sum to 1.0, it's not a true weighted average. **Perspective 16:** In pruneReplayCache(), the code iterates over cache.seenUntil and deletes expired entries. Then while cache.seenUntil.size > REPLAY_CACHE_MAX_ENTRIES, it does 'const oldest = cache.seenUntil.keys().next().value; if (!oldest) { break; } cache.seenUntil.delete(oldest);'. However, Map keys are iterated in insertion order, not access order. The 'oldest' by insertion may not be the least recently used. **Perspective 17:** The audio session configuration lacks proper security controls, allowing potential eavesdropping or injection attacks. The code uses `AVAudioSession.sharedInstance()` without validating session categories or checking for background audio access permissions, which could enable audio data exfiltration.
Suggested Fix
Use generic error messages for user-facing errors while logging detailed information internally. For example, instead of 'Gateway not connected', use 'Connection unavailable'. Instead of exposing speech recognition errors directly, use 'Speech service unavailable'.
HIGHSpeech recognition transcripts stored without encryption or retention limits
apps/ios/Sources/Voice/TalkModeManager.swift:104
[AGENTS: Warden]privacy
The TalkModeManager stores speech recognition transcripts in plain text variables (lastTranscript, lastSpokenText) without encryption. These transcripts may contain sensitive personal information and there's no defined data retention policy or automatic cleanup mechanism. The transcripts persist in memory while the app is active and could be exposed in memory dumps or debugging sessions.
Suggested Fix
Implement encryption for stored transcripts using iOS Keychain or encrypted storage, add automatic cleanup after processing, and implement data retention limits with secure deletion.
HIGHElevenLabs API key potentially logged in debug mode
apps/ios/Sources/Voice/TalkModeManager.swift:112
[AGENTS: Egress]data_exfiltration
**Perspective 1:** In debug mode, the code resolves API keys from environment variables (ProcessInfo.processInfo.environment["ELEVENLABS_API_KEY"]). If debug logging is enabled and logs include API key resolution details, this could leak sensitive credentials to logging systems. **Perspective 2:** The code uses ElevenLabs API keys for TTS functionality. If error messages include API responses or configuration details, they could leak the API key or partial key information to error reporting systems or logs. **Perspective 3:** GatewayDiagnostics.log() calls throughout the file could potentially log sensitive information including voice transcripts, API responses, and configuration details. These logs could be sent to external monitoring systems.
Suggested Fix
Review all GatewayDiagnostics.log() calls to ensure they don't include PII, voice transcripts, or sensitive configuration data. Implement log redaction for sensitive fields.
HIGHUnverified ElevenLabs TTS model loading from external API
apps/ios/Sources/Voice/TalkModeManager.swift:114
[AGENTS: Weights]model_supply_chain
**Perspective 1:** The code loads TTS models from ElevenLabs API without verifying model integrity, checksums, or version pinning. The modelId parameter (line 114) is passed to external API calls without validation, allowing potentially malicious model identifiers to be used. **Perspective 2:** The resolveVoiceId() function (line 114) calls external APIs to resolve voice IDs without integrity verification. This could allow loading of compromised or malicious voice models from untrusted sources.
Suggested Fix
Maintain an allowlist of verified voice IDs, implement checksum verification for voice model downloads, and validate API responses against expected schemas.
HIGHGateway chat history access without user consent or data minimization
apps/ios/Sources/Voice/TalkModeManager.swift:387
[AGENTS: Warden]privacy
The code fetches chat history from the gateway (fetchLatestAssistantText) to retrieve assistant responses. This accesses potentially sensitive conversation history without explicit user consent for this specific data access pattern. The code doesn't implement data minimization - it retrieves all messages and processes them without filtering for only necessary data.
Suggested Fix
Implement explicit consent for chat history access, apply data minimization by only retrieving necessary message data, and add audit logging for chat history access events.
HIGHVoice input directly passed to LLM without injection protection
apps/ios/Sources/Voice/TalkModeManager.swift:1177
[AGENTS: Prompt - Recon - Sentinel - Siege - Tenant - Trace]dos, info_disclosure, input_validation, llm_security, logging, tenant_isolation
**Perspective 1:** The TalkModeManager processes voice transcripts and sends them directly to the LLM via chat.send. The buildPrompt function concatenates the transcript with potential interruption context, creating a classic prompt injection vector where voice input could contain adversarial instructions like 'ignore all previous instructions'. **Perspective 2:** The code returns detailed error messages like 'Start failed: [error.localizedDescription]' and 'Talk failed: [error.localizedDescription]' which can reveal internal system state, error conditions, and implementation details to potential attackers. **Perspective 3:** Multiple GatewayDiagnostics.log() calls expose detailed internal metrics including audio levels, noise floor calculations, speech recognition states, and timing information. This information could help attackers fingerprint the system and understand its operational characteristics. **Perspective 4:** The playAssistant function takes LLM-generated text and passes it directly to TTS systems (ElevenLabs or system voice). There's no filtering for potentially harmful content, PII leakage, or adversarial audio generation. **Perspective 5:** The TalkModeManager uses AVAudioSession.sharedInstance() which is a device-wide singleton. In a multi-tenant app, audio from one tenant could interrupt or mix with another tenant's audio sessions. **Perspective 6:** In debug mode, the code reads API key from environment variable 'ELEVENLABS_API_KEY' which could be logged or exposed in debug output. While this is in a debug-only section, it creates a pattern where sensitive credentials could be logged. **Perspective 7:** The noiseFloorSamples array accumulates samples without a maximum size limit (currently adds up to 22 samples). While this specific case is small, the pattern of accumulating data in arrays without bounds checking could lead to memory issues if extended or misused. **Perspective 8:** The code logs detailed configuration information including API key availability, voice/model IDs, and provider selection logic. This information could help attackers understand the system's capabilities and dependencies. **Perspective 9:** The handleTranscript function processes transcript text without validation for length or content. Very long transcripts could cause memory issues or processing delays. **Perspective 10:** The code logs various operations with privacy: .public markers, but there's no audit trail for when API keys are accessed or used. Missing correlation between TTS requests and credential usage.
Suggested Fix
Implement structural separation: use separate message roles for system instructions vs user input. For voice interfaces, consider prefixing all user input with a clear marker like 'USER: ' and ensuring the LLM understands this is untrusted input.
HIGHVoice wake word triggers LLM commands without validation
apps/ios/Sources/Voice/VoiceWakeManager.swift:1
[AGENTS: Mirage - Prompt]false_confidence, llm_security
**Perspective 1:** The VoiceWakeManager processes speech recognition and extracts commands based on trigger words. Recognized speech is forwarded to the LLM without content validation, creating a voice-based prompt injection vector. **Perspective 2:** The VoiceWakeManager loads trigger words from UserDefaults via VoiceWakePreferences.loadTriggerWords(). While there's sanitization mentioned (VoiceWakePreferences.sanitizeTriggerWords), the actual sanitization implementation is not shown. This could create false confidence that trigger words are being securely validated when the actual validation logic is hidden.
Suggested Fix
Implement speech content validation, use delimiters between wake word and command, or require additional confirmation for sensitive commands.
HIGHVoice command processing with trigger word injection
apps/ios/Sources/Voice/VoiceWakeManager.swift:57
[AGENTS: Vector]attack_chains
The VoiceWakeManager loads trigger words from user defaults without validation. An attacker could inject malicious trigger words through configuration manipulation or other vulnerabilities. Combined with the speech recognition capability, this could allow remote command execution through audio input.
Suggested Fix
Validate trigger words against an allowlist. Implement cryptographic signatures for configuration. Add rate limiting for voice command processing.
HIGHVoice data processing without proper consent and retention controls
apps/ios/Sources/Voice/VoiceWakeManager.swift:477
[AGENTS: Compliance - Fuse - Infiltrator - Pedant - Provenance - Wallet - Warden]ai_provenance, attack_surface, correctness, data_protection, denial_of_wallet, error_security, privacy
**Perspective 1:** VoiceWakeManager processes voice data including transcriptions and trigger words. There's no clear consent tracking for voice data collection, no data retention limits, and potentially sensitive voice commands are processed and stored. **Perspective 2:** Voice wake-word processing handles potentially sensitive voice data without classification or appropriate protection measures. Under HIPAA and other regulations, voice data may contain protected health information requiring specific safeguards. **Perspective 3:** The `#if DEBUG` extension defines `_test_handleRecognitionCallback` but this test function is not used elsewhere in the codebase. This appears to be AI-generated test scaffolding without integration. **Perspective 4:** VoiceWakeManager performs continuous speech recognition when enabled, consuming CPU resources and potentially triggering downstream LLM/agent processing for recognized commands. No limits on recognition duration or command frequency. **Perspective 5:** The VoiceWakeManager maintains continuous microphone access for voice wake functionality, which could be used to eavesdrop if the app is compromised. **Perspective 6:** The `AudioBufferQueue` enqueues buffers without a size limit. If the drain task is cancelled or slow, buffers could accumulate and cause memory exhaustion. **Perspective 7:** Detailed speech recognition error messages reveal whether permissions are denied, restricted, or not determined, helping attackers understand the app's permission state.
Suggested Fix
Implement explicit consent for voice data processing with clear purpose statements. Add data retention policies for voice transcripts and trigger word logs.
HIGHShared workspace bootstrap without tenant isolation
apps/macos/Sources/OpenClaw/AgentWorkspace.swift:30
[AGENTS: Tenant]tenant_isolation
**Perspective 1:** AgentWorkspace methods (bootstrap, hasIdentity, etc.) operate on workspaceURL without tenant context. If multiple tenants share the same filesystem path, they could access each other's workspace files (AGENTS.md, IDENTITY.md, etc.). **Perspective 2:** The loadTemplate method loads template files from bundle resources without tenant-specific overrides. If tenants require different templates (e.g., for compliance), they could receive the wrong template.
Suggested Fix
Implement tenant-specific template directories and fallback chain: tenant_templates -> default_templates -> fallback.
HIGHSensitive configuration storage without encryption
apps/macos/Sources/OpenClaw/AppState.swift:732
[AGENTS: Compliance - Siege - Warden]access_control, data_protection, dos, privacy
**Perspective 1:** The app stores sensitive configuration including gateway tokens, passwords, SSH identities, and voice wake settings in UserDefaults without encryption. Some chime data is encoded but overall configuration lacks proper encryption at rest. **Perspective 2:** Voice wake trigger words are stored in UserDefaults without encryption. While not highly sensitive, these could be used in social engineering attacks. This violates SOC 2 confidentiality criteria (CC6.6) for protecting configuration data that could impact security. **Perspective 3:** The applyGlobalVoiceWakeTriggers() function accepts trigger words from the gateway without verifying the gateway's authorization to modify local security settings. This violates SOC 2 change management controls (CC8.1) and creates a potential vector for unauthorized configuration changes. **Perspective 4:** The scheduleVoiceWakeGlobalSyncIfNeeded function cancels previous tasks but creates new ones without limiting the total number of tasks that could be created over time. Frequent changes to trigger words could lead to many pending tasks.
Suggested Fix
Implement authorization checks before accepting global configuration changes, requiring user consent or admin privileges.
HIGHShared canvas manager without tenant isolation
apps/macos/Sources/OpenClaw/CanvasManager.swift:30
[AGENTS: Tenant]tenant_isolation
**Perspective 1:** CanvasManager is a singleton that manages canvas sessions and WebView controllers. It stores panelController and panelSessionKey without tenant context, potentially allowing Tenant A to access Tenant B's canvas sessions. **Perspective 2:** The show method uses sessionKey alone to identify canvas sessions. If two tenants use the same sessionKey value, they could access each other's canvas data since CanvasManager doesn't validate tenant ownership.
Suggested Fix
Add tenant_id parameter to all CanvasManager methods and maintain separate controllers per tenant. Key panelController by (tenant_id, sessionKey).
HIGHJavaScript injection via eval function
apps/macos/Sources/OpenClaw/CanvasManager.swift:123
[AGENTS: Razor - Sentinel]input_validation, security
**Perspective 1:** The `eval` function executes arbitrary JavaScript in a web view. If the JavaScript string comes from an untrusted source (e.g., gateway messages), it could lead to XSS or privilege escalation within the web view context. **Perspective 2:** The `eval` function passes user-supplied JavaScript directly to web view without sanitization, allowing potential XSS or privilege escalation.
Suggested Fix
Restrict JavaScript execution to a sandboxed environment. Validate and sanitize JavaScript input. Use message passing instead of direct eval.
HIGHCanvas eval function executes JavaScript from LLM responses
apps/macos/Sources/OpenClaw/CanvasManager.swift:129
[AGENTS: Prompt - Sentinel]input_validation, llm_security
**Perspective 1:** The CanvasManager.eval function executes JavaScript code in a webview based on LLM input. This creates a direct code execution vector where a compromised LLM could run arbitrary JavaScript in the user's browser context. **Perspective 2:** The `snapshot` function accepts `outPath` parameter without validating it's within allowed directories, potentially allowing writing to arbitrary locations.
Suggested Fix
Restrict output to temporary directory or user's documents: let safePath = (outPath as NSString).standardizingPath; guard safePath.hasPrefix(NSTemporaryDirectory()) || safePath.hasPrefix(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.path) else { throw error }
HIGHWebView loading arbitrary URLs without validation
apps/macos/Sources/OpenClaw/CanvasManager.swift:329
[AGENTS: Gateway - Infiltrator]attack_surface, edge_security
**Perspective 1:** The CanvasManager loads URLs into WebViews without proper validation of the URL scheme or origin. This could allow loading malicious content or cross-origin attacks. **Perspective 2:** The CanvasManager can load files from arbitrary paths including direct file:// URLs and local filesystem paths, potentially exposing sensitive files through the canvas interface.
Suggested Fix
Implement URL validation and allowlisting. Restrict loaded URLs to specific schemes and domains. Use Content Security Policy for WebViews.
HIGHMissing tenant isolation in canvas file serving
apps/macos/Sources/OpenClaw/CanvasSchemeHandler.swift:56
[AGENTS: Fuse - Gateway - Mirage - Razor - Sentinel - Specter - Syringe - Tenant - Vector]attack_chains, db_injection, edge_security, error_security, false_confidence, injection, input_validation, security, tenant_isolation
**Perspective 1:** The CanvasSchemeHandler serves files from session directories without validating that the requesting user has access to that session. The code extracts the session from the URL host component and serves files from the corresponding directory, but there's no authentication or tenant isolation check. Any user with access to the canvas scheme could potentially access files from any session by manipulating the URL. **Perspective 2:** The resolveFileURL function attempts to prevent directory traversal but uses basic checks that could be bypassed. The check for '..' in session names and path components may not catch all traversal attempts, especially with encoded paths or symlinks. **Perspective 3:** The resolveFileURL function attempts to prevent directory traversal but may be bypassed. The check uses standardizedFileURL.path.hasPrefix(standardizedRoot.path) which could be vulnerable to symlink attacks or path normalization issues. Additionally, the session parameter from URL host is not properly validated against traversal characters beyond '/' and '..'. **Perspective 4:** The CanvasSchemeHandler checks for '..' in session names but this is incomplete path traversal protection. It doesn't check for encoded traversal sequences ('%2e%2e%2f'), double encoding, or other bypass techniques. The validation gives false confidence about path traversal security. **Perspective 5:** The resolveFileURL function attempts to prevent directory traversal but uses string prefix checking which could be bypassed with symlinks or case-insensitive filesystems. The check standardizedFileURL.path.hasPrefix(standardizedRoot.path) could be insufficient if the attacker controls symlinks. **Perspective 6:** The code checks if session contains '/' or '..' but only does a simple string containment check. This is insufficient to prevent path traversal attacks. An attacker could use encoded path traversal sequences like '%2e%2e%2f' or other bypass techniques. **Perspective 7:** The CanvasSchemeHandler resolves file paths by concatenating session root with request path without proper normalization. While there's a check for '..' in the session component, the path resolution logic could allow directory traversal through encoded characters or symlinks. The standardizedFileURL check helps but may not catch all edge cases. **Perspective 8:** The error response includes the raw session root path in the welcome page, which could expose internal directory structure to an attacker. **Perspective 9:** The `resolveFileURL` function attempts to prevent directory traversal but only checks for '..' in the session parameter, not in the request path. An attacker could potentially craft a request path like '../../../../etc/passwd' which would pass the session validation but still traverse outside the session directory. Combined with improper session validation, this could lead to arbitrary file read.
Suggested Fix
Implement strict path validation using URL.standardizedFileURL and ensure resolved path is contained within sessionRoot using hasPrefix check on canonical paths. Consider using secure-by-design APIs like realpath() or URL.resolvingSymlinksInPath().
HIGHPath traversal vulnerability in canvas file resolution
apps/macos/Sources/OpenClaw/CanvasSchemeHandler.swift:76
[AGENTS: Tenant]tenant_isolation
The code attempts to prevent directory traversal by checking if session contains '/' or '..', but this check is insufficient. The session is extracted from the URL host component, but the path component could still contain traversal sequences. While there's a check that standardizedFile.path has prefix standardizedRoot.path, this relies on path standardization which may not catch all traversal attempts.
Suggested Fix
Implement more robust path traversal prevention using URL path normalization and explicit checks. Use secure methods like `realpath()` or `canonicalPath` to resolve absolute paths before checking containment.
HIGHWebView with custom scheme handlers and JavaScript execution
apps/macos/Sources/OpenClaw/CanvasWindowController.swift:57
[AGENTS: Infiltrator]attack_surface
The CanvasWindowController sets up a WKWebView with custom scheme handlers (CanvasScheme) and allows JavaScript execution via eval(). This creates a potential cross-site scripting vector if untrusted content is loaded.
Suggested Fix
Implement Content Security Policy, sanitize JavaScript inputs, and validate scheme handler URLs.
HIGHChannel status and configuration shared across tenants
apps/macos/Sources/OpenClaw/ChannelsSettings+ChannelState.swift:1
[AGENTS: Sentinel - Tenant]input_validation, tenant_isolation
**Perspective 1:** ChannelsSettings accesses channel status through ChannelsStore which appears to use a global snapshot. Channel IDs like 'whatsapp', 'telegram', etc. are not tenant-scoped, so multiple tenants sharing a gateway would see and potentially modify each other's channel configurations. **Perspective 2:** Channel IDs are used without validation. Invalid channel IDs could cause crashes or data corruption.
Suggested Fix
Add tenant prefix to channel IDs or implement tenant-specific channel configuration storage.
HIGHShared channels store without tenant isolation
apps/macos/Sources/OpenClaw/ChannelsStore.swift:297
[AGENTS: Gatekeeper - Phantom - Siege - Tenant - Vector]api_security, attack_chains, auth, dos, tenant_isolation
**Perspective 1:** The ChannelsStore is a singleton (shared = ChannelsStore.shared) that stores channel status snapshots, configuration data, and channel metadata without tenant isolation. All users share the same store instance, which could lead to cross-tenant data leakage if the store contains tenant-specific channel configurations or status information. **Perspective 2:** The `ChannelsStore` loads and applies channel configuration from the gateway. An attacker with access to modify gateway configuration could inject malicious configuration that gets applied to the client. This could be chained with gateway compromise to achieve client-side code execution or data exfiltration. **Perspective 3:** The ChannelsStore exposes detailed channel configuration and status information that could reveal sensitive configuration details if accessed by unauthorized users. **Perspective 4:** The ChannelsStore interacts with backend APIs but doesn't include versioning in requests, which could lead to breaking changes or security issues when APIs evolve. **Perspective 5:** The ChannelsStore uses a fixed interval polling task. If the gateway is unavailable, it will continue polling at the same rate, wasting resources.
Suggested Fix
Implement tenant-aware storage or separate store instances per tenant. Add tenant context to all channel operations and ensure data is properly scoped.
HIGHSSH command execution without resource constraints
apps/macos/Sources/OpenClaw/CommandResolver.swift:0
[AGENTS: Sanitizer - Sentinel - Wallet]denial_of_wallet, input_validation, sanitization
**Perspective 1:** The CommandResolver can execute SSH commands on remote hosts with potentially unbounded operations. The sshNodeCommand function constructs and executes shell scripts on remote systems without validation of the commands being run. **Perspective 2:** Based on the test at line 172 in CommandResolverTests.swift, the code builds SSH commands with user-controlled targets. While there's some validation shown in tests, the actual implementation isn't in the diff, so we can't verify it handles all edge cases like SSH options injection. **Perspective 3:** Based on test file reference, CommandResolver.parseSSHTarget appears to reject unsafe SSH targets with ProxyCommand, but may not catch all SSH injection patterns.
Suggested Fix
Implement stricter SSH target validation: only allow alphanumeric characters, dots, hyphens, colons (for port), and @ symbol for user. Reject any target containing shell metacharacters or suspicious patterns.
HIGHMissing integrity verification for remote SSH commands
apps/macos/Sources/OpenClaw/CommandResolver.swift:1
[AGENTS: Compliance - Harbor - Infiltrator - Lockdown - Sentinel - Supply - Tripwire - Vector]attack_chains, attack_surface, configuration, containers, dependencies, input_validation, regulatory, supply_chain
**Perspective 1:** The CommandResolver can execute commands over SSH to remote hosts, but there's no verification of the integrity or authenticity of the commands being executed on the remote side. An attacker could compromise the remote host and execute arbitrary code. **Perspective 2:** The CommandResolver can construct and execute SSH commands for remote operations. This is essentially remote code execution capability that, if containerized, would require extensive host access and pose significant security risks. **Perspective 3:** SSH target strings are parsed without proper validation. Malformed SSH targets could cause command injection. **Perspective 4:** The CommandResolver searches for executables in multiple paths including user-controlled directories. Attackers can chain: 1) Hijack PATH to inject malicious binaries, 2) Exploit project root configuration for local file inclusion, 3) Use SSH command generation for remote execution, 4) Combine with runtime resolution for Node.js injection. The preferred paths include user-writable directories that could be compromised. **Perspective 5:** The CommandResolver builds SSH commands with user-controlled inputs (remote target, identity path) without sufficient validation, which could lead to SSH command injection attacks. **Perspective 6:** CommandResolver builds and executes shell commands for gateway operations. It searches for executables in various paths including user-controlled directories (~/.openclaw, project directories). An attacker could potentially inject malicious executables in these paths. **Perspective 7:** Project root paths are expanded from user input without validation. Path traversal attacks could occur. **Perspective 8:** SSH command execution lacks documented security controls, authentication requirements, and audit logging, violating SOC 2 CC6.1 and PCI-DSS requirement 8.1 (Unique IDs). **Perspective 9:** The preferredPaths function modifies the PATH search order, inserting project-local paths in debug builds. This could lead to executing unexpected binaries if the project directory contains malicious executables.
Suggested Fix
Implement command signing and verification for remote SSH commands, use SSH certificates instead of raw keys, and add integrity checks for scripts executed on remote hosts.
HIGHShell command injection via SSH target parsing
apps/macos/Sources/OpenClaw/CommandResolver.swift:307
[AGENTS: Specter]command_injection
The `parseSSHTarget` function does not properly validate or sanitize SSH target strings before constructing SSH commands. User-controlled input from `settings.target` is passed through `sshArguments` and ultimately used in shell command construction. An attacker could inject additional SSH options or commands through crafted target strings.
Suggested Fix
Implement strict validation of SSH target format using regex patterns and escape shell metacharacters. Use allowlist validation for hostnames and usernames.
HIGHShell command injection via SSH identity file path
apps/macos/Sources/OpenClaw/CommandResolver.swift:365
[AGENTS: Specter]command_injection
The `sshArguments` function uses `identity` parameter directly in SSH command construction without proper sanitization. An attacker controlling the identity file path could inject additional SSH options or commands.
Suggested Fix
Validate identity file path against allowlisted characters and ensure it's an absolute path within expected directories.
HIGHShell command injection via remote command execution
apps/macos/Sources/OpenClaw/CommandResolver.swift:383
[AGENTS: Specter]command_injection
The `sshNodeCommand` function constructs a shell script that's executed on the remote host via SSH. User-controlled `extraArgs` are passed to `shellQuote` but the quoting may not handle all edge cases. Additionally, the script includes multiple command execution paths that could be manipulated.
Suggested Fix
Use parameterized commands or execve-style execution instead of shell command construction. Implement stricter validation of all arguments.
HIGHPath traversal in SSH target parsing
apps/macos/Sources/OpenClaw/CommandResolver.swift:467
[AGENTS: Razor]security
The parseSSHTarget function doesn't properly validate hostnames, allowing potential path traversal or injection through specially crafted SSH targets.
Suggested Fix
Implement strict hostname validation using regular expressions. Reject targets with special characters or unusual formatting.
HIGHSSH command injection vulnerability
apps/macos/Sources/OpenClaw/CommandResolver.swift:579
[AGENTS: Chaos - Egress - Gateway - Harbor - Mirage - Phantom - Razor - Sanitizer - Siege - Warden]api_security, containers, data_exfiltration, dos, edge_cases, edge_security, false_confidence, privacy, sanitization, security
**Perspective 1:** User-provided SSH target, identity, and project root values are concatenated into shell commands without proper escaping, allowing command injection. **Perspective 2:** The `sshTargetValidationMessage` function performs basic format checks but doesn't actually validate the SSH target's security properties. It checks for spaces and basic format but doesn't verify host keys, validate certificates, or ensure proper authentication. The function returns error messages for format issues but gives a false sense of security validation. **Perspective 3:** The sshNodeCommand() function constructs SSH commands by concatenating user-controlled inputs (target, identity, projectRoot, cliPath) without proper sanitization. This could allow command injection if an attacker controls these values. **Perspective 4:** The SSH target parsing function validates basic format but doesn't comprehensively validate all components. The 'isValidSSHComponent' function checks for whitespace and control characters but may miss other problematic characters. **Perspective 5:** SSH commands are constructed by concatenating user-provided target strings without sufficient sanitization. The parseSSHTarget function has some validation but may not cover all edge cases. **Perspective 6:** When executing commands on remote hosts via SSH, there's no comprehensive audit logging of what commands were executed and by whom. **Perspective 7:** The code manipulates PATH environment variable and searches for executables in various locations. In a containerized environment, this could lead to unexpected executable resolution and potential PATH injection attacks. **Perspective 8:** The preferredPaths function manipulates the PATH environment variable, potentially allowing execution of untrusted binaries if an attacker can write to certain directories. **Perspective 9:** The `sshNodeCommand` function constructs a shell script with user-provided arguments. While arguments are shell-quoted, complex inputs could still cause issues. **Perspective 10:** The identity parameter in sshArguments() is used directly without validating it's a safe path, potentially allowing path traversal or access to sensitive files. **Perspective 11:** The SSH command construction includes user project paths and home directory information in command strings that could be exposed in process listings or logs. **Perspective 12:** The sshNodeCommand function constructs SSH commands with remote host details, project paths, and CLI paths. While these are executed locally, the command strings could appear in process listings or shell history, revealing infrastructure details. **Perspective 13:** The `preferredPaths` function builds a PATH list from various sources. If any directory contains a large number of executables, searching could be slow.
Suggested Fix
Use stricter validation for SSH target components and consider using NSTask or Process with argument arrays instead of shell command concatenation.
HIGHShared control channel without tenant isolation
apps/macos/Sources/OpenClaw/ControlChannel.swift:30
[AGENTS: Tenant]tenant_isolation
**Perspective 1:** ControlChannel is a singleton that manages WebSocket connections to gateways and processes agent events. It routes work activity and agent events without tenant context, potentially mixing data from multiple tenants in WorkActivityStore and AgentEventStore. **Perspective 2:** The routeWorkActivity method processes agent events and routes them to WorkActivityStore based on sessionKey without tenant validation. If sessionKey is not tenant-scoped, events from Tenant A could affect Tenant B's activity store.
Suggested Fix
Add tenant context to ControlChannel methods and maintain separate connection state per tenant. Filter agent events by tenant before routing to stores.
HIGHGateway connection accepts arbitrary methods without authorization
apps/macos/Sources/OpenClaw/ControlChannel.swift:85
[AGENTS: Infiltrator]attack_surface
The request() method allows calling arbitrary gateway methods with any parameters. While there's some token/password authentication, there's no method-level authorization or validation of what methods can be called.
Suggested Fix
Implement method allowlisting, parameter validation, and role-based access control for gateway methods.
HIGHMissing request size limits for gateway requests
apps/macos/Sources/OpenClaw/ControlChannel.swift:156
[AGENTS: Gateway]edge_security
The ControlChannel.request method accepts arbitrary parameters without size validation. This could allow an attacker to send large payloads that could overwhelm the gateway or cause memory exhaustion.
Suggested Fix
Implement maximum request size limits for both individual parameters and total request size. Add validation before processing requests.
HIGHGateway authentication error messages may leak information
apps/macos/Sources/OpenClaw/ControlChannel.swift:189
[AGENTS: Egress - Gatekeeper - Lockdown - Recon]auth, configuration, data_exfiltration, info_disclosure
**Perspective 1:** The error handling in friendlyGatewayMessage() reveals specific authentication failure details that could help attackers enumerate valid tokens or understand authentication mechanisms. For example, the message 'Gateway rejected token; set gateway.remote.token or clear it on the gateway' indicates that token authentication is being used and was rejected. **Perspective 2:** The `friendlyGatewayMessage` function returns detailed error messages that could expose port numbers, connection modes, and authentication token configuration details. These messages are surfaced to users and could be logged elsewhere. **Perspective 3:** The friendlyGatewayMessage function returns detailed error explanations that reveal internal port configurations, SSH tunnel status, and gateway connectivity details that could help attackers map the infrastructure. **Perspective 4:** The friendlyGatewayMessage function returns detailed error messages that could reveal internal network configuration (ports, SSH targets, etc.) to users or through logs.
Suggested Fix
Use generic error messages for authentication failures to prevent information leakage. Instead of revealing specific token issues, use a generic message like 'Authentication failed'.
HIGHGateway authentication failure with information disclosure
apps/macos/Sources/OpenClaw/ControlChannel.swift:200
[AGENTS: Egress - Fuse - Recon - Vector]attack_chains, data_exfiltration, error_security, info_disclosure
**Perspective 1:** The friendlyGatewayMessage function reveals detailed error information about authentication failures, including token configuration details. An attacker could use this information to enumerate valid tokens, understand authentication mechanisms, and craft targeted attacks. Combined with other vulnerabilities, this could lead to privilege escalation from unauthenticated to authenticated access. **Perspective 2:** Error messages explicitly mention token configuration keys like 'gateway.remote.token' and 'gateway.auth.token', which could help attackers understand the authentication scheme and target specific configuration files. **Perspective 3:** The friendlyGatewayMessage() function returns detailed error messages that reveal internal configuration like port numbers, SSH tunnel status, and gateway process details. This could help attackers map the network topology. **Perspective 4:** Specific error handling for port occupation reveals that localhost:port is being used by another process, helping attackers understand the local network configuration.
Suggested Fix
Return generic error messages in production while logging detailed information internally. For example: 'Gateway connection failed' instead of specific port and process details.
HIGHMissing validation for cron expressions
apps/macos/Sources/OpenClaw/CronJobEditor.swift:1
[AGENTS: Blacklist - Exploit - Sentinel]business_logic, input_validation, output_encoding
**Perspective 1:** User can input arbitrary cron expressions without validation. Malformed expressions could cause parsing errors or unexpected scheduling behavior. **Perspective 2:** The CronJobEditor SwiftUI view contains multiple TextField components that accept user input (name, description, agentId, systemEventText, agentMessage, etc.) but doesn't appear to sanitize or encode this input before potentially displaying it elsewhere in the UI or sending it to backend services. This could lead to injection attacks if the data is rendered in web views or other contexts. **Perspective 3:** The cron job editor UI accepts user-input schedule expressions (cronExpr, everyText) but there's no visible server-side validation in the provided code. An attacker could submit malicious or malformed schedule expressions that might cause denial of service or unexpected behavior in the cron scheduler. **Perspective 4:** Text fields like name, description, agentMessage, etc. have no length limits, allowing potential memory exhaustion attacks. **Perspective 5:** The cronTz field accepts arbitrary timezone strings without validation. Invalid timezone strings could cause scheduling errors.
Suggested Fix
Add input validation and sanitization for all user-controlled fields. Consider using Swift's String escaping functions or a dedicated sanitization library before processing user input.
HIGHUnsanitized user input in agent message field
apps/macos/Sources/OpenClaw/CronJobEditor.swift:44
[AGENTS: Prompt]llm_security
The agentMessage field in CronJobEditor accepts user input without sanitization and will be passed to an agent turn. This could allow prompt injection attacks where malicious instructions are embedded in the cron job message, potentially influencing agent behavior or tool execution.
Suggested Fix
Implement input validation and sanitization for the agentMessage field, potentially using allowlists for safe characters or escaping mechanisms for LLM prompts.
HIGHCron job management without tenant isolation
apps/macos/Sources/OpenClaw/CronSettings+Rows.swift:247
[AGENTS: Tenant]tenant_isolation
The cron settings UI displays and manages cron jobs without tenant context. Jobs are loaded, edited, and executed without tenant validation. The store.runJob(), store.setJobEnabled(), and other operations don't include tenant context, potentially allowing cross-tenant cron job manipulation.
Suggested Fix
Add tenant context to all cron operations. Ensure cron jobs are scoped to tenants and users can only manage jobs within their tenant.
HIGHDebug actions expose session manipulation without authentication
apps/macos/Sources/OpenClaw/DebugActions.swift:1
[AGENTS: Deadbolt - Infiltrator - Recon - Trace - Warden]attack_surface, info_disclosure, logging, privacy, sessions
**Perspective 1:** DebugActions provides functions to manipulate sessions (updateSession, restartGateway, sendTestHeartbeat) without proper authentication checks. While these may be intended for debugging, they could be abused if accessible in production builds. **Perspective 2:** The DebugActions class provides numerous debugging functions including opening log files, config folders, session stores, and sending test notifications. These debug endpoints could be accessible in production and leak sensitive information about the application's internal state, file structure, and configuration. **Perspective 3:** Debug actions like openLog(), openConfigFolder(), and openSessionStore() expose file system paths in logs and potentially to users. These paths could reveal system structure and sensitive locations. **Perspective 4:** DebugActions provides various debug functions including restarting gateway, sending test notifications, opening logs/config folders, and killing processes. These are likely accessible through some debug interface and could be exploited if the debug interface is exposed. **Perspective 5:** Debug actions expose log file paths, session store paths, and configuration directories. While intended for debugging, this functionality could leak sensitive system information if accessed by unauthorized users or if debug mode is accidentally enabled in production.
Suggested Fix
Ensure debug functions are only available in development builds or protected by additional authentication. Remove or disable debug endpoints in production builds.
HIGHDebug functionality exposes sensitive configuration without proper access controls
apps/macos/Sources/OpenClaw/DebugSettings.swift:1
[AGENTS: Blacklist - Compliance - Egress - Harbor - Infiltrator - Mirage - Provenance - Razor - Recon - Sanitizer - Supply - Tripwire - Vault - Vector]access_control, ai_provenance, attack_chains, attack_surface, containers, data_exfiltration, data_protection, dependencies, false_confidence, info_disclosure, output_encoding, sanitization, secrets, security, supply_chain
**Perspective 1:** The DebugSettings view exposes sensitive configuration options, paths, and diagnostic information without proper authentication or authorization checks. This could allow unauthorized access to sensitive system information. **Perspective 2:** Various status messages (canvasStatus, canvasError, debugSendStatus) are displayed in UI without HTML escaping. These could contain user-controlled or system-generated content with HTML-like syntax. **Perspective 3:** The DebugSettings view displays extensive debugging information including gateway logs, process IDs, file paths, and configuration details. While this is a debug feature, it could expose sensitive system information if screenshotted or accessed by unauthorized users. **Perspective 4:** The file imports 'OpenClawIPC' which doesn't appear to be a real dependency in the project. This is a common AI-generated pattern of inventing framework names. **Perspective 5:** The DebugSettings view displays sensitive information including gateway logs, process IDs, file paths, and configuration details. This debug information could be accessed if an attacker gains access to the application UI. **Perspective 6:** The DebugSettings view provides extensive diagnostic information including gateway logs, session store paths, model catalog paths, CLI installation location, binary path, and debug actions. This interface could be accessible in production builds and would expose internal file system structure, configuration details, and debugging capabilities to users. **Perspective 7:** Debug settings and tools are accessible in the production app. An attacker could use these to: 1) Enable debug logging to capture sensitive information, 2) Use port checking tools to map internal network services, 3) Access canvas debugging to intercept web traffic. Combined with other vulnerabilities, this provides reconnaissance capabilities. **Perspective 8:** The debug functionality displays gateway logs and other diagnostic information that may contain sensitive data (credentials, configuration details, etc.) without proper redaction. **Perspective 9:** The debug settings allow loading model catalog files from arbitrary paths. While this is a debug feature, it could be abused to load malicious files if an attacker gains access to the debug interface. **Perspective 10:** The debug settings allow loading model catalog files from arbitrary paths without verifying file integrity or digital signatures. This could allow loading tampered model configurations. **Perspective 11:** The debug settings display various configuration paths and status information that could reveal system structure and potentially sensitive deployment details. **Perspective 12:** The DebugSettings view provides access to various diagnostic and control features including port killing, gateway restart, and canvas operations. While intended for debugging, these could be abused if accessible in production builds. **Perspective 13:** The DebugSettings view includes buttons like 'Kill Process' and 'Reset SSH tunnel' that perform security-sensitive operations without confirmation dialogs (except for some cases). The UI presents these as simple debug tools without adequate warnings. **Perspective 14:** The modelCatalogPath and sessionStorePath fields accept user input for file paths without comprehensive validation against path traversal attacks. The chooseCatalogFile function uses NSOpenPanel but doesn't validate the selected path before use. **Perspective 15:** The DebugSettings view includes functionality to check gateway ports and kill processes (runPortCheck, killConfirmed). This debug functionality could be misused if accessible to unauthorized users. The code shows an alert asking for confirmation before killing processes, but this is a UI-level protection only.
Suggested Fix
1) Restrict debug functionality to development builds only, 2) Require additional authentication for destructive operations, 3) Log all debug actions with user context, 4) Consider removing or disabling these features in production builds.
HIGHDevice pairing without tenant validation
apps/macos/Sources/OpenClaw/DevicePairingApprovalPrompter.swift:257
[AGENTS: Phantom - Razor - Tenant - Vector]api_security, attack_chains, security, tenant_isolation
**Perspective 1:** The DevicePairingApprovalPrompter handles device pairing requests and approvals without tenant validation. It loads pending requests from the gateway and presents approval dialogs, but doesn't verify that the pairing request belongs to the current tenant. This could allow approving devices for other tenants. **Perspective 2:** The device pairing system accepts requests without rate limiting, allowing potential denial of service through flooding of pairing requests. **Perspective 3:** The pairing approval system has a race condition where a request can be resolved while the alert is active (`resolvedByRequestId` check). An attacker could spam pairing requests and potentially bypass approval by timing the resolution to occur during the alert display. This could be chained with social engineering to trick users into approving malicious devices. **Perspective 4:** The describe function concatenates multiple device attributes (platform, role, scopes, IP) into a descriptive string shown to users. If an attacker controls any of these fields (e.g., through a malicious pairing request), they could inject misleading information or social engineering content.
Suggested Fix
Add tenant validation to device pairing operations. Ensure pairing requests are scoped to the current tenant and users can only approve requests within their tenant.
HIGHLLM-triggered command execution without proper validation
apps/macos/Sources/OpenClaw/ExecApprovals.swift:0
[AGENTS: Prompt - Specter - Weights]deserialization, llm_security, model_supply_chain
**Perspective 1:** The ExecApprovals system allows LLM agents to execute commands on the host system. While there's an approval mechanism, the command arguments and paths are passed from LLM responses to system execution without schema validation against declared tool parameters. This creates a tool/function-calling injection vulnerability where the LLM could bypass intended restrictions. **Perspective 2:** The `ExecApprovalsStore` reads and deserializes JSON from `~/.openclaw/state/exec-approvals.json`. This file could be manipulated by an attacker (if they have filesystem access) to inject malicious objects during deserialization. While Swift's `JSONDecoder` is generally safe, custom `Codable` implementations could have vulnerabilities. **Perspective 3:** The SkillBinsCache loads skill binary requirements from the gateway without verification of the binaries' integrity or provenance. These binaries could be compromised and execute arbitrary code.
Suggested Fix
Implement strict schema validation for all tool calls. Validate command arguments against expected types and ranges. Use allowlists for executable paths rather than patterns.
HIGHHardcoded security token generation
apps/macos/Sources/OpenClaw/ExecApprovals.swift:1
[AGENTS: Blacklist - Cipher - Exploit - Gatekeeper - Harbor - Lockdown - Mirage - Passkey - Supply - Tripwire]auth, business_logic, configuration, credentials, cryptography, dependencies, false_confidence, output_encoding, permissions, secrets, supply_chain
**Perspective 1:** The code generates authentication tokens using SecRandomCopyBytes but stores them in a local file without encryption. The token is used for socket authentication and could be exposed if the file permissions are insufficient or if the file is accessed by unauthorized processes. **Perspective 2:** The generateToken() function uses SecRandomCopyBytes but falls back to UUID().uuidString if the secure random generation fails. UUIDs are not cryptographically secure and could be predictable, potentially allowing unauthorized access to the exec approvals socket. **Perspective 3:** The exec approval system allows clients to modify security settings (security, ask, askFallback, autoAllowSkills) and allowlist patterns via the ExecApprovalsStore.updateFile() method. These settings control whether commands can be executed without approval. The system relies on client-side configuration files that could be manipulated by an attacker to bypass security controls. There's no server-side validation of these settings, and the socket token generation uses SecRandomCopyBytes but could be predictable if the state directory permissions are compromised. **Perspective 4:** The exec approvals socket is created with default permissions that may be too permissive. While the code sets permissions to 0o600 for the socket file, the directory permissions (0o700) may still allow other users on the same system to potentially interfere with the socket if they have access to the parent directory structure. **Perspective 5:** The generateToken() function falls back to UUID().uuidString when SecRandomCopyBytes fails. UUIDs are not cryptographically random and have predictable patterns, making them unsuitable for security tokens. This could allow token prediction or brute-force attacks. **Perspective 6:** In the generateToken function, if SecRandomCopyBytes fails, the code falls back to using UUID().uuidString as a token. UUIDs are not cryptographically secure random values and may have predictable patterns, reducing token entropy. **Perspective 7:** The ExecApprovals system displays command patterns, resolved paths, and command output in the UI. These values come from external processes and could contain malicious content. While likely displayed in plain text views, if any output is ever rendered in HTML contexts or interpreted as code, it could lead to injection issues. **Perspective 8:** The code sets directory permissions to 0700 but doesn't verify that parent directories have secure permissions. An attacker with access to parent directories could potentially manipulate the state directory. **Perspective 9:** The skills installation mechanism (skillsInstall method) downloads and installs skills without verifying their integrity. Skills can be installed from external sources without cryptographic verification, making the system vulnerable to malicious skill injections. **Perspective 10:** The ExecApprovalHelpers.validateAllowlistPattern function claims to validate allowlist patterns but only checks for empty strings and path component presence. It doesn't actually validate that patterns are safe or properly formed - it just checks if they contain '/', '~', or '\'. This creates a false sense of security that patterns are being validated when they're only superficially checked. **Perspective 11:** The ExecApprovalsStore.generateToken() function has a fallback to UUID().uuidString if SecRandomCopyBytes fails. This creates a false sense of cryptographic security - the function appears to generate secure tokens but can fall back to predictable UUIDs. The error handling silently continues with less secure tokens. **Perspective 12:** The validateAllowlistPattern function only checks if a pattern contains '/', '~', or '\\' to determine if it's a path pattern. An attacker could bypass this by using patterns like './malicious' or '../../bin/bash' which would pass validation but could allow execution of unintended commands. The validation is too simplistic and doesn't prevent directory traversal or other path manipulation attacks. **Perspective 13:** The SkillBinsCache uses a simple time-based cache refresh mechanism. If multiple concurrent requests check currentBins() when the cache is stale, they could all trigger refresh() simultaneously, causing redundant API calls to GatewayConnection.shared.skillsStatus(). While not directly exploitable for financial gain, this could lead to increased load and potential denial of service if abused. **Perspective 14:** File imports CryptoKit, Security frameworks for cryptographic operations and secure storage. These are critical security components that should have strict version constraints to prevent cryptographic vulnerabilities. **Perspective 15:** The token generation falls back to UUID().uuidString if SecRandomCopyBytes fails, which provides less entropy than cryptographic random bytes. UUIDs are not designed for use as security tokens. **Perspective 16:** The allowlist pattern validation only checks for path components (containing '/', '~', or '\\') but doesn't validate against potentially dangerous patterns or path traversal attempts. Malicious patterns could potentially be added to the allowlist. **Perspective 17:** The token generation uses base64 encoding with URL-safe replacements but doesn't ensure sufficient entropy. The token length (24 bytes = 192 bits) is adequate, but the encoding could be improved. **Perspective 18:** The ensureSecureStateDirectory() function attempts to set secure permissions (0o700) but catches and logs any errors, then continues. This creates a false sense that directory permissions are hardened when they might not be. The try? operator and error swallowing means failures are silently ignored.
Suggested Fix
Implement server-side validation of exec approval configurations, sign configuration files with HMAC, and enforce that security settings can only be tightened (not loosened) without proper authentication.
HIGHMissing tenant isolation in exec approvals configuration
apps/macos/Sources/OpenClaw/ExecApprovals.swift:233
[AGENTS: Tenant]tenant_isolation
The `ExecApprovalsStore` reads and writes to a global file (`exec-approvals.json`) without tenant separation. All agents across all tenants would share the same exec approval settings, allowing cross-tenant policy leakage.
Suggested Fix
Include tenant ID in the file path or file structure to isolate exec approval configurations per tenant.
HIGHCross-tenant exec allowlist sharing
apps/macos/Sources/OpenClaw/ExecApprovals.swift:287
[AGENTS: Tenant]tenant_isolation
The `resolve(agentId:)` method merges allowlist entries from wildcard (`*`) and specific agent configurations without tenant context. This could allow allowlist patterns from one tenant to apply to another tenant's agents.
Suggested Fix
Include tenant ID in the agent key or filter allowlist entries by tenant.
HIGHCommand Execution Allowlist Bypass via Pattern Validation
apps/macos/Sources/OpenClaw/ExecApprovals.swift:780
[AGENTS: Chaos - Razor]edge_cases, security
**Perspective 1:** The allowlist pattern validation in 'validateAllowlistPattern' only checks for path components but doesn't validate against dangerous patterns like wildcards, relative paths, or command injection sequences. This could allow unauthorized command execution. **Perspective 2:** The SkillBinsCache only updates lastRefresh on successful refresh. If the gateway is temporarily unavailable, the cache will remain stale indefinitely, potentially causing incorrect security decisions.
Suggested Fix
Implement strict allowlist validation with exact path matching or limited wildcards. Sanitize patterns to prevent directory traversal and command injection.
HIGHExec approval socket lacks authentication for local connections
apps/macos/Sources/OpenClaw/ExecApprovals.swift:814
[AGENTS: Compliance - Provenance - Siege - Wallet - Warden]access_control, ai_provenance, audit_logging, data_protection, denial_of_wallet, dos, privacy
**Perspective 1:** The exec approvals system uses a local Unix domain socket without authentication for local connections. This violates SOC 2 logical access controls (CC6.1) as any local process could connect to the socket and influence execution approvals. **Perspective 2:** The exec approvals system logs command execution details including full commands, exit codes, and output without data minimization principles. This could capture sensitive information in command output. **Perspective 3:** The SkillBinsCache refresh method can be called frequently (currentBins with force: true) without any rate limiting. This could lead to excessive gateway requests and CPU usage if called in a tight loop. **Perspective 4:** The exec approvals system records allowlist usage but doesn't capture comprehensive audit trails required for regulatory compliance. Missing: decision rationale, approver identity, timestamp with timezone, and command context. Violates PCI-DSS requirement 10.2 and SOC 2 monitoring criteria (CC7.2). **Perspective 5:** The exec approvals configuration file stores sensitive security settings without encryption. While permissions are set to 0o600, the file contents are not encrypted at rest. This violates SOC 2 confidentiality criteria (CC6.6) for protecting security configuration data. **Perspective 6:** The SkillBinsCache tracks executable binaries from skills, but there's no enforcement of execution timeouts, resource limits, or cost controls for skill executions that might trigger external API calls. **Perspective 7:** The SkillBinsCache actor is defined but has a very simplistic implementation that just caches skill binaries. The refresh method has minimal error handling and the cache is never actually used in the provided code, suggesting it's AI-generated scaffolding.
Suggested Fix
Implement data minimization for command logging, redacting sensitive information and limiting output capture.
HIGHPath pattern validation can be bypassed
apps/macos/Sources/OpenClaw/ExecApprovals.swift:1016
[AGENTS: Sanitizer]sanitization
The validateAllowlistPattern function checks if pattern contains '/', '~', or '\\' but doesn't validate the actual path format. This could allow patterns like '/../../../etc/passwd' or '~/../../etc/passwd'. The function also doesn't canonicalize paths before validation.
Suggested Fix
Implement proper path canonicalization and validation. Restrict patterns to prevent directory traversal. Consider using URL or Path APIs for proper normalization.
HIGHUnix socket authentication lacks tenant isolation
apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift:0
[AGENTS: Cipher - Prompt - Syringe - Tenant]cryptography, db_injection, llm_security, tenant_isolation
**Perspective 1:** The ExecApprovalsSocketServer uses a single token for all connections and validates peers only by UID equality (isAllowedPeer). This allows any process with the same UID to access all approval requests and decisions, potentially exposing cross-tenant data if multiple tenants share the same UID or if the socket is accessible across tenant boundaries. **Perspective 2:** The ExecApprovalsSocket code handles command execution requests where user-controlled input (command strings) are passed to shell execution functions. While not direct SQL injection, this represents a command injection risk where unvalidated command strings could lead to arbitrary command execution. The code uses ShellExecutor.runDetailed() which likely executes shell commands with user-provided parameters. **Perspective 3:** The HMAC verification in handleExecRequest() compares the expected and received HMAC values using direct string comparison (expected != request.hmac), which is vulnerable to timing attacks. An attacker could use timing differences to gradually guess the correct HMAC. **Perspective 4:** The HMAC key is derived directly from the token string using SymmetricKey(data: Data(self.token.utf8)). This doesn't use proper key derivation functions (like HKDF) and may not provide sufficient cryptographic strength if the token is not sufficiently random or long enough. **Perspective 5:** The ExecApprovalsPromptPresenter shows command details to users for approval decisions. If these commands originate from LLM-influenced processes, there's a risk of social engineering where the LLM could craft convincing command descriptions to bypass user scrutiny. **Perspective 6:** The ExecApprovalsStore.addAllowlistEntry and ExecApprovalsStore.recordAllowlistUse functions accept agentId but don't enforce tenant isolation. If agentId is not properly scoped to tenants, allowlist patterns could be shared across tenants, potentially leaking execution patterns between tenants. **Perspective 7:** The TLS fingerprint verification in GatewayTLSFingerprintProbe only checks the SHA256 fingerprint but doesn't implement proper certificate pinning with fallback mechanisms or certificate chain validation. **Perspective 8:** The exec request validation checks timestamp freshness (abs(nowMs - request.ts) > 10000) but doesn't include mechanisms to prevent replay attacks within the 10-second window. **Perspective 9:** The socket is created with permissions 0o600 (owner read/write only), which is good for security. However, the parent directory permissions are set to 0o700, which might be overly restrictive in some deployment scenarios.
Suggested Fix
Implement strict command validation and parameterization. Use allowlists for allowed commands, validate command arguments, and consider using execve() with separate arguments instead of shell execution.
HIGHInsecure HMAC-based authentication for exec requests
apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift:1
[AGENTS: Blacklist - Compliance - Deadbolt - Egress - Exploit - Gatekeeper - Gateway - Harbor - Infiltrator - Mirage - Passkey - Phantom - Provenance - Razor - Recon - Sanitizer - Supply - Tripwire - Vault - Vector]access_control, ai_provenance, api_security, attack_chains, attack_surface, audit_logging, auth, business_logic, containers, credentials, data_exfiltration, data_protection, dependencies, edge_security, false_confidence, info_disclosure, output_encoding, sanitization, secrets, security, sessions, supply_chain
**Perspective 1:** The ExecApprovalsSocketServer uses HMAC-SHA256 with a static token for authenticating exec requests. The token is stored locally and used as the HMAC key. This is vulnerable to token extraction attacks if an attacker gains access to the local filesystem. Additionally, the HMAC verification only checks if the expected HMAC matches the provided one, without additional authentication factors. **Perspective 2:** The socket server reads lines with `readLineFromHandle` up to 256,000 bytes without any configurable limit. An attacker could send extremely large payloads to exhaust memory or cause denial of service. **Perspective 3:** The exec approval socket uses a simple token for authentication, but there's no rate limiting, no verification of request source beyond token match, and no protection against token brute-forcing. An attacker who can guess or intercept the token could send arbitrary exec requests. **Perspective 4:** The ExecApprovalsSocketServer uses a simple token-based authentication that can be intercepted by local processes. The token is transmitted in plaintext over the Unix socket, and the server only checks if the token matches without additional validation. Local attackers could potentially sniff or brute-force the token to gain unauthorized access to command execution. **Perspective 5:** The ExecHostExecutor.handle function accepts arbitrary command arrays and executes them on the host system. While there's some validation through ExecHostRequestEvaluator, the code doesn't appear to have comprehensive validation of command arguments, which could lead to command injection vulnerabilities. **Perspective 6:** The ExecApprovalsSocketClient sends command execution requests (including full command strings, working directories, host information, and security context) to an external Unix domain socket. This could leak sensitive command-line data, environment variables, and system information to any process that can connect to the socket. The socket path and token are used for authentication, but the data flow itself represents potential exfiltration of sensitive execution context. **Perspective 7:** The ExecApprovalsSocketServer accepts commands via Unix socket and executes them on the host system. While there's token-based authentication, the socket is created with 0o600 permissions and uses getpeereid() to verify the connecting user matches the effective user ID. However, this only provides process-level isolation, not user-level authentication. Any process running as the same user could connect to the socket and execute arbitrary commands. Additionally, the HMAC verification uses a token that appears to be stored locally, which could be extracted by other processes running as the same user. **Perspective 8:** The ExecHostExecutor.runCommand function executes shell commands with user-controlled parameters (command, cwd, env). While there's an approval system, once approved, the command is executed via ShellExecutor.runDetailed which likely uses Process or NSTask. If the approval system can be bypassed or if approved commands contain shell metacharacters, this could lead to command injection. **Perspective 9:** The ExecApprovalsSocketServer creates a Unix domain socket at a configurable path with token-based authentication. While it checks peer UID (isAllowedPeer), the token is transmitted in plaintext in the JSON request. An attacker with local filesystem access could potentially sniff or intercept the token if they can access the socket path. The socket permissions are set to 0o600, but parent directory hardening may not prevent all local attacks. **Perspective 10:** The ExecApprovalsSocketServer uses a static token for authentication (line 570-571). An attacker who can read the token from the socket configuration file or intercept it during initial setup can impersonate legitimate clients. Combined with the ability to connect to the Unix socket (which only checks UID equality via getpeereid), this allows unauthorized command execution. The socket path is predictable (based on approvals.socketPath), making it easier to locate. **Perspective 11:** The exec approval system allows arbitrary command execution with user approval. An attacker could chain: 1) Social engineering to get user to approve a malicious command once, 2) The 'allowAlways' decision persists the pattern (line 384-385), 3) Future similar commands auto-execute without prompting. Combined with weak pattern matching in allowlist patterns, this could lead to privilege escalation. **Perspective 12:** The ExecApprovalsSocketServer accepts connections via Unix domain sockets but only performs basic peer UID validation (uid == geteuid()). This does not provide sufficient authentication for privileged operations like command execution approvals. An attacker with local access could potentially connect to the socket and bypass approval prompts. **Perspective 13:** The ExecHostExecutor.handle function processes command execution requests but relies on approval decisions that may not have proper authorization context. There's no validation of the requesting user's identity or their authorization to execute specific commands on the host. **Perspective 14:** The code uses a token for HMAC authentication in exec approvals socket communication, but there's no evidence of token rotation, expiration, or secure generation. The token appears to be stored and used as-is without proper lifecycle management. **Perspective 15:** The isAllowedPeer function only checks if the peer UID matches the effective UID. This provides minimal security as any process running under the same user can connect to the socket. **Perspective 16:** The code implements Unix domain socket communication for exec approvals without proper authentication beyond token matching. While it uses HMAC for exec requests, the approval socket only checks token equality, which could be vulnerable to token leakage or replay attacks if the socket permissions are compromised. **Perspective 17:** The ExecApprovalsPromptPresenter.prompt function displays user-controlled command strings in an NSAlert without HTML escaping. The request.command value is directly assigned to NSTextView.string, which could contain HTML-like content that might be interpreted by the text view's rendering engine. **Perspective 18:** The socketPath parameter is used directly in system calls without proper validation or encoding. While it's validated for length, there's no sanitization against directory traversal or special characters that could affect the filesystem path resolution. **Perspective 19:** The macOS application code includes multiple dependencies (CryptoKit, Foundation, OpenClawKit, etc.) but there's no evidence of Software Bill of Materials generation or dependency tracking. This makes it difficult to track vulnerabilities in third-party dependencies and verify the integrity of the software supply chain. **Perspective 20:** The ExecApprovalsSocketServer stores a token string in memory that's used for HMAC authentication. While this token is passed in via initialization, it's kept in plain text in the class instance and used directly for HMAC key generation without any secure storage or memory protection. **Perspective 21:** The hmacHex function creates a SymmetricKey directly from the token UTF-8 data without any key derivation function (KDF). This weakens the cryptographic security as the token may not have sufficient entropy for a proper cryptographic key. **Perspective 22:** The isAllowedPeer function only checks if the peer's UID matches the effective UID of the process. This allows any process running under the same user to connect to the socket and potentially execute commands. In a multi-user system or if other applications run under the same user, this could lead to unauthorized command execution. **Perspective 23:** The exec approval socket server doesn't implement rate limiting on incoming requests. An attacker could repeatedly send exec requests to potentially bypass approval mechanisms through timing attacks or denial of service. **Perspective 24:** The socket server accepts connections without any rate limiting based on client IP or peer UID. An attacker could flood the socket with connection attempts or requests. **Perspective 25:** The socket server decodes JSON requests but does not validate the structure or content length before processing. Malformed or excessively nested JSON could cause resource exhaustion. **Perspective 26:** The system has two paths: approval prompts via 'request' type and direct exec via 'exec' type. The 'exec' path validates HMAC but if an attacker can obtain valid HMAC (e.g., by intercepting a legitimate request), they could bypass the approval prompt entirely. **Perspective 27:** The ExecApprovalsSocketServer accepts connections without rate limiting, which could allow denial-of-service attacks by flooding the socket with connection requests or authentication attempts. **Perspective 28:** The ExecApprovalPromptRequest structure includes potentially sensitive information like command details, working directory, agent ID, and session key. This information is transmitted over the Unix socket and could be exposed to unauthorized local processes. **Perspective 29:** The code creates Unix sockets with permissions 0o600 (line 594) and parent directories with 0o700 (line 528). While these are restrictive, they may still allow access to other users on the same system if the socket is created in a shared directory. The socket path appears to be user-specific but could be targeted if predictable. **Perspective 30:** The ExecHostExecutor.runCommand function executes shell commands with user-provided environment variables and working directory. While there's an approval system, once approved, commands run with the same privileges as the host process, which could be a container escape vector if the app runs in a privileged context. **Perspective 31:** The ExecApprovalPromptRequest structure includes a sessionKey field that is passed through the approval system. This session key is used to identify sessions for command execution but is transmitted over Unix domain sockets without encryption. While the socket is protected by file permissions (0o600), there's no additional encryption of the session key in transit, and the token-based authentication may not provide sufficient protection against session hijacking if the socket is compromised. **Perspective 32:** The ExecApprovalsSocketClient.requestDecision function has a default timeout of 15000ms (15 seconds), but there's no session timeout mechanism for the approval decision itself. Once a request is made, the session remains active until a decision is returned, which could lead to session exhaustion if clients don't properly clean up. **Perspective 33:** In the handleClient method, when token validation fails, the function simply returns a deny decision without invalidating the client session or logging the failed attempt. This could allow brute force attacks against the token. **Perspective 34:** Error messages in the ExecApprovalsSocketServer include detailed error descriptions that could contain sensitive information about command execution failures, socket paths, and system errors. These are logged using OSLog with privacy: .public which could expose them in system logs. **Perspective 35:** The file imports 'OpenClawKit' which appears to be a framework that doesn't exist in the dependency tree. This is a common AI-generated artifact where the model creates plausible-sounding framework names that aren't actually part of the project. **Perspective 36:** The ExecApprovalsSocketPathGuard class has functions named 'hardenParentDirectory' and 'removeExistingSocket' that perform basic checks but don't fully validate socket security. The 'hardenParentDirectory' sets permissions to 0o700 but doesn't verify ownership or prevent symlink attacks. The 'removeExistingSocket' only checks file type but doesn't validate socket ownership or prevent TOCTOU attacks. **Perspective 37:** The hmacHex function constructs the message as 'nonce:ts:requestJson' without proper canonicalization or length encoding. This could lead to injection attacks if any component contains colons. The function claims to provide authentication but uses simple string concatenation. **Perspective 38:** The ExecApprovalPromptRequest and ExecHostRequest structures accept command strings and arrays without proper sanitization. While there is some validation in ExecHostRequestEvaluator.validateRequest, the raw command input from socket connections could contain malicious content that bypasses validation. The code relies on ExecApprovalEvaluator.evaluate for security decisions, but the initial parsing of JSON requests doesn't sanitize inputs before passing them to evaluation functions. **Perspective 39:** The ExecApprovalsSocketPathGuard.pathKind function uses lstat to check socket paths but doesn't validate path traversal attacks or symlink attacks thoroughly. The removeExistingSocket function checks for socket type but doesn't prevent TOCTOU race conditions. Path validation occurs after socket connection establishment in some cases. **Perspective 40:** The code executes commands with potential output redirection but doesn't show how temporary files are handled. If stdout/stderr are written to temporary files without secure creation (O_EXCL, proper permissions), there could be race conditions or symlink attacks. **Perspective 41:** Error responses in handleExecRequest include detailed error messages like 'invalid auth', 'expired request', 'invalid payload' which could help an attacker understand the validation logic and craft better attacks. **Perspective 42:** The ExecHostExecutor.handle function processes ExecHostRequest which contains command execution parameters. While there's an approval system (ExecApprovalsPromptPresenter), the actual command execution via ShellExecutor.runDetailed could be vulnerable to command injection if the command array is not properly sanitized. The code shows validation through ExecHostRequestEvaluator.validateRequest, but the validation logic is not shown in this diff. **Perspective 43:** The handleExecRequest function verifies HMAC signatures using a nonce, timestamp, and request JSON. While this provides some protection against replay attacks (10-second window), the implementation relies on the token being kept secret. If the token is compromised, an attacker could forge requests. The HMAC uses SHA256 which is cryptographically sound, but the overall security depends on token secrecy. **Perspective 44:** The exec approvals system exposes detailed command execution context including working directory, agent ID, executable path, host, security mode, and ask mode in approval prompts and logs. **Perspective 45:** The socket path handling doesn't adequately validate that the socket is created in a secure directory. An attacker with write access to parent directories could create symlinks or manipulate socket files. Combined with the UID-based peer verification, this could lead to privilege escalation if the socket is moved to a less secure location. **Perspective 46:** While the code logs some events, there's no comprehensive audit trail for command execution approvals. SOC 2 requires detailed audit logs for privileged operations including who approved what command, when, and the outcome. The current logging doesn't capture all necessary details for compliance. **Perspective 47:** The command execution system processes user-provided commands and arguments but doesn't have mechanisms to redact or protect sensitive data that might be included in command arguments (e.g., passwords, API keys). This could lead to sensitive data exposure in logs or error messages. **Perspective 48:** While this is a Unix socket server, if it were behind a reverse proxy, there's no mechanism to validate or sanitize proxy headers like X-Forwarded-For. This could lead to IP spoofing if the socket is exposed via a proxy. **Perspective 49:** The ExecApprovalSocketRequest uses UUID().uuidString for request IDs, which while random, could be predictable in certain environments. More importantly, there's no binding of request IDs to the originating client session, making replay attacks possible if an attacker can intercept socket communications. **Perspective 50:** In ExecApprovalsSocketClient.requestDecision, when a timeout occurs, the function returns nil without logging or propagating the error. This creates the appearance of error handling but silently fails, making debugging difficult. **Perspective 51:** The readLineFromHandle function reads up to maxBytes (256,000) but doesn't validate JSON structure size before parsing. An attacker could send malformed JSON that consumes excessive memory during parsing. The JSONDecoder is used directly on potentially untrusted data from socket connections. **Perspective 52:** The socket server accepts connections without rate limiting, making it vulnerable to denial-of-service attacks where an attacker could flood the socket with connections.
Suggested Fix
Implement additional security measures such as: 1) Use a cryptographically secure random token of sufficient length, 2) Consider adding a challenge-response mechanism instead of plaintext token transmission, 3) Ensure socket path is in a protected directory (e.g., user's private tmp), 4) Add rate limiting on failed authentication attempts.
HIGHCommand injection via exec approvals socket
apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift:89
[AGENTS: Sentinel - Siege - Specter]dos, injection, input_validation
**Perspective 1:** The ExecApprovalsSocketServer accepts commands via socket and passes them to ExecHostExecutor.handle() which eventually executes them via ShellExecutor.runDetailed(). The socket authentication uses a token and HMAC, but if an attacker can obtain the token or bypass authentication, they could execute arbitrary commands. The command validation happens in ExecHostRequestEvaluator.validateRequest() but the actual execution path allows command injection. **Perspective 2:** The readLineFromHandle function reads up to 256,000 bytes per line without proper streaming or size validation. An attacker could send a single line with 256KB of data, causing excessive memory allocation and potential DoS. **Perspective 3:** The readLineFromHandle function reads up to maxBytes but doesn't validate that maxBytes is reasonable. An attacker could pass a very large maxBytes value causing memory exhaustion.
Suggested Fix
Implement strict command validation, whitelist allowed commands, and use parameterized execution with proper escaping.
HIGHJSON deserialization without type validation
apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift:430
[AGENTS: Specter]injection
The handleClient method deserializes JSON data from socket connections without strict type validation. Line 430 uses JSONSerialization.jsonObject(with: data) which could allow an attacker to inject unexpected object types that might lead to type confusion or other deserialization issues.
Suggested Fix
Use JSONDecoder with strict type definitions instead of JSONSerialization, or implement proper type checking after deserialization.

Summary

Consensus from 3744 reviewer(s): Entropy, Deadbolt, Syringe, Cipher, Blacklist, Recon, Passkey, Supply, Weights, Harbor, Trace, Tripwire, Gateway, Warden, Vault, Egress, Tenant, Lockdown, Specter, Prompt, Sentinel, Vector, Exploit, Fuse, Wallet, Provenance, Phantom, Sanitizer, Mirage, Siege, Compliance, Gatekeeper, Infiltrator, Chaos, Razor, Pedant, Syringe, Vault, Entropy, Blacklist, Specter, Harbor, Wallet, Deadbolt, Gateway, Prompt, Cipher, Vector, Phantom, Gatekeeper, Siege, Fuse, Supply, Egress, Sentinel, Trace, Recon, Passkey, Sanitizer, Infiltrator, Tripwire, Warden, Pedant, Weights, Mirage, Provenance, Tenant, Exploit, Chaos, Compliance, Lockdown, Razor, Blacklist, Compliance, Tripwire, Cipher, Specter, Exploit, Warden, Provenance, Mirage, Tenant, Entropy, Deadbolt, Recon, Passkey, Harbor, Egress, Siege, Trace, Supply, Fuse, Phantom, Weights, Lockdown, Wallet, Sanitizer, Syringe, Gatekeeper, Vector, Gateway, Infiltrator, Sentinel, Prompt, Pedant, Chaos, Vault, Razor, Lockdown, Vector, Warden, Tenant, Provenance, Entropy, Recon, Gateway, Siege, Tripwire, Trace, Weights, Cipher, Wallet, Prompt, Deadbolt, Passkey, Sanitizer, Fuse, Egress, Compliance, Blacklist, Infiltrator, Supply, Gatekeeper, Mirage, Phantom, Sentinel, Specter, Harbor, Syringe, Razor, Vault, Chaos, Pedant, Exploit, Deadbolt, Harbor, Blacklist, Entropy, Syringe, Pedant, Siege, Vault, Recon, Egress, Gatekeeper, Compliance, Phantom, Exploit, Supply, Tripwire, Prompt, Tenant, Fuse, Sanitizer, Specter, Lockdown, Weights, Cipher, Trace, Mirage, Chaos, Passkey, Gateway, Wallet, Infiltrator, Warden, Sentinel, Vector, Razor, Provenance, Blacklist, Syringe, Cipher, Gatekeeper, Tenant, Prompt, Egress, Deadbolt, Harbor, Fuse, Weights, Mirage, Trace, Siege, Compliance, Supply, Specter, Lockdown, Wallet, Sanitizer, Gateway, Tripwire, Passkey, Phantom, Vector, Vault, Warden, Exploit, Entropy, Recon, Sentinel, Provenance, Infiltrator, Razor, Pedant, Chaos, Weights, Blacklist, Recon, Syringe, Entropy, Prompt, Tripwire, Sanitizer, Cipher, Provenance, Lockdown, Gatekeeper, Vault, Deadbolt, Gateway, Tenant, Specter, Egress, Passkey, Exploit, Mirage, Trace, Warden, Wallet, Razor, Phantom, Harbor, Chaos, Supply, Compliance, Sentinel, Siege, Infiltrator, Pedant, Fuse, Vector, Specter, Sanitizer, Compliance, Syringe, Entropy, Harbor, Wallet, Lockdown, Gateway, Siege, Supply, Exploit, Blacklist, Tripwire, Tenant, Gatekeeper, Deadbolt, Warden, Cipher, Infiltrator, Recon, Provenance, Mirage, Prompt, Vector, Egress, Weights, Sentinel, Vault, Passkey, Trace, Phantom, Razor, Chaos, Fuse, Pedant, Vault, Sanitizer, Wallet, Tenant, Syringe, Entropy, Deadbolt, Weights, Cipher, Tripwire, Blacklist, Siege, Prompt, Specter, Supply, Recon, Provenance, Infiltrator, Mirage, Razor, Exploit, Passkey, Trace, Vector, Phantom, Harbor, Compliance, Lockdown, Sentinel, Gateway, Fuse, Chaos, Warden, Egress, Pedant, Gatekeeper, Phantom, Sanitizer, Syringe, Recon, Gatekeeper, Supply, Warden, Wallet, Deadbolt, Lockdown, Tenant, Entropy, Weights, Exploit, Cipher, Siege, Passkey, Harbor, Tripwire, Infiltrator, Gateway, Fuse, Prompt, Mirage, Provenance, Specter, Egress, Compliance, Vector, Blacklist, Pedant, Trace, Razor, Sentinel, Vault, Chaos, Supply, Gatekeeper, Recon, Weights, Cipher, Deadbolt, Warden, Vault, Syringe, Blacklist, Lockdown, Siege, Mirage, Harbor, Exploit, Entropy, Fuse, Wallet, Sanitizer, Tripwire, Phantom, Passkey, Compliance, Prompt, Trace, Specter, Gateway, Tenant, Egress, Provenance, Vector, Infiltrator, Chaos, Sentinel, Pedant, Razor, Vault, Compliance, Siege, Tripwire, Vector, Warden, Sanitizer, Mirage, Gatekeeper, Specter, Wallet, Recon, Gateway, Deadbolt, Phantom, Blacklist, Provenance, Lockdown, Syringe, Entropy, Cipher, Harbor, Passkey, Exploit, Egress, Trace, Prompt, Weights, Tenant, Sentinel, Chaos, Supply, Infiltrator, Razor, Pedant, Fuse, Sanitizer, Vault, Cipher, Supply, Vector, Recon, Phantom, Weights, Warden, Compliance, Entropy, Mirage, Wallet, Harbor, Deadbolt, Egress, Lockdown, Syringe, Siege, Tripwire, Gateway, Trace, Passkey, Gatekeeper, Exploit, Provenance, Tenant, Pedant, Prompt, Fuse, Specter, Infiltrator, Blacklist, Sentinel, Razor, Chaos, Blacklist, Vault, Syringe, Sanitizer, Phantom, Lockdown, Entropy, Vector, Warden, Compliance, Harbor, Infiltrator, Provenance, Tripwire, Tenant, Egress, Fuse, Cipher, Supply, Gateway, Weights, Gatekeeper, Passkey, Specter, Trace, Wallet, Mirage, Prompt, Deadbolt, Recon, Sentinel, Siege, Razor, Exploit, Pedant, Chaos, Fuse, Cipher, Provenance, Vector, Gatekeeper, Entropy, Deadbolt, Weights, Gateway, Trace, Blacklist, Harbor, Vault, Egress, Supply, Sanitizer, Warden, Tenant, Phantom, Tripwire, Recon, Wallet, Siege, Lockdown, Syringe, Passkey, Sentinel, Infiltrator, Prompt, Specter, Exploit, Razor, Compliance, Mirage, Pedant, Chaos, Specter, Lockdown, Provenance, Exploit, Passkey, Weights, Harbor, Cipher, Gatekeeper, Gateway, Mirage, Syringe, Vault, Supply, Entropy, Tenant, Sanitizer, Recon, Pedant, Siege, Blacklist, Deadbolt, Warden, Wallet, Phantom, Razor, Infiltrator, Sentinel, Fuse, Egress, Prompt, Trace, Vector, Compliance, Chaos, Tripwire, Vault, Compliance, Gateway, Exploit, Weights, Entropy, Deadbolt, Passkey, Gatekeeper, Lockdown, Blacklist, Recon, Warden, Cipher, Supply, Siege, Mirage, Syringe, Harbor, Egress, Trace, Tenant, Prompt, Tripwire, Phantom, Fuse, Specter, Provenance, Sanitizer, Infiltrator, Wallet, Sentinel, Chaos, Vector, Razor, Pedant, Compliance, Warden, Tenant, Weights, Entropy, Syringe, Deadbolt, Specter, Cipher, Recon, Passkey, Supply, Wallet, Harbor, Gateway, Blacklist, Sanitizer, Siege, Provenance, Prompt, Tripwire, Trace, Mirage, Lockdown, Gatekeeper, Infiltrator, Exploit, Fuse, Vector, Pedant, Razor, Phantom, Vault, Chaos, Sentinel, Egress, Vault, Cipher, Supply, Vector, Provenance, Compliance, Harbor, Phantom, Weights, Deadbolt, Sanitizer, Lockdown, Gatekeeper, Warden, Passkey, Egress, Trace, Recon, Syringe, Gateway, Wallet, Specter, Tenant, Mirage, Siege, Fuse, Blacklist, Entropy, Prompt, Infiltrator, Tripwire, Razor, Pedant, Exploit, Sentinel, Chaos, Compliance, Syringe, Specter, Tenant, Vault, Cipher, Recon, Weights, Passkey, Entropy, Exploit, Tripwire, Deadbolt, Gatekeeper, Harbor, Fuse, Wallet, Blacklist, Lockdown, Egress, Trace, Siege, Prompt, Phantom, Mirage, Gateway, Sanitizer, Vector, Supply, Razor, Infiltrator, Warden, Provenance, Pedant, Sentinel, Chaos, Blacklist, Weights, Vault, Entropy, Syringe, Cipher, Supply, Recon, Specter, Passkey, Phantom, Warden, Sanitizer, Tripwire, Gateway, Gatekeeper, Compliance, Egress, Siege, Harbor, Tenant, Trace, Prompt, Lockdown, Exploit, Deadbolt, Wallet, Infiltrator, Pedant, Vector, Mirage, Provenance, Fuse, Chaos, Razor, Sentinel, Vault, Blacklist, Gatekeeper, Specter, Lockdown, Passkey, Cipher, Provenance, Gateway, Sanitizer, Syringe, Harbor, Warden, Deadbolt, Entropy, Tripwire, Weights, Exploit, Tenant, Trace, Wallet, Egress, Supply, Compliance, Fuse, Prompt, Phantom, Recon, Sentinel, Infiltrator, Razor, Vector, Chaos, Pedant, Siege, Mirage, Warden, Vault, Provenance, Tripwire, Deadbolt, Harbor, Cipher, Passkey, Gateway, Fuse, Phantom, Specter, Entropy, Gatekeeper, Exploit, Razor, Blacklist, Sanitizer, Trace, Recon, Supply, Tenant, Compliance, Lockdown, Prompt, Vector, Weights, Mirage, Siege, Egress, Infiltrator, Wallet, Syringe, Pedant, Sentinel, Chaos, Syringe, Vault, Cipher, Blacklist, Sanitizer, Provenance, Tripwire, Entropy, Gatekeeper, Deadbolt, Passkey, Lockdown, Phantom, Gateway, Recon, Specter, Supply, Fuse, Infiltrator, Mirage, Sentinel, Egress, Weights, Razor, Siege, Trace, Prompt, Harbor, Compliance, Warden, Tenant, Exploit, Vector, Wallet, Chaos, Pedant, Blacklist, Specter, Cipher, Compliance, Provenance, Mirage, Tenant, Syringe, Deadbolt, Passkey, Entropy, Vault, Sanitizer, Warden, Harbor, Recon, Exploit, Lockdown, Gateway, Tripwire, Supply, Siege, Wallet, Egress, Weights, Fuse, Gatekeeper, Prompt, Pedant, Razor, Phantom, Chaos, Sentinel, Vector, Infiltrator, Trace, Specter, Blacklist, Syringe, Vault, Provenance, Vector, Egress, Passkey, Tripwire, Gatekeeper, Supply, Entropy, Gateway, Phantom, Weights, Deadbolt, Harbor, Siege, Warden, Sentinel, Prompt, Infiltrator, Exploit, Tenant, Lockdown, Trace, Sanitizer, Fuse, Wallet, Razor, Recon, Mirage, Pedant, Chaos, Cipher, Compliance, Sanitizer, Passkey, Wallet, Mirage, Vault, Syringe, Cipher, Entropy, Blacklist, Harbor, Siege, Deadbolt, Lockdown, Fuse, Supply, Gatekeeper, Specter, Compliance, Tripwire, Gateway, Weights, Exploit, Egress, Phantom, Prompt, Warden, Razor, Tenant, Trace, Infiltrator, Pedant, Provenance, Recon, Vector, Sentinel, Chaos, Provenance, Vault, Entropy, Blacklist, Weights, Cipher, Passkey, Specter, Recon, Warden, Supply, Wallet, Tripwire, Trace, Syringe, Prompt, Mirage, Gateway, Gatekeeper, Siege, Deadbolt, Sanitizer, Egress, Harbor, Phantom, Exploit, Tenant, Compliance, Lockdown, Razor, Vector, Infiltrator, Pedant, Fuse, Sentinel, Chaos, Vault, Compliance, Prompt, Warden, Fuse, Vector, Entropy, Sanitizer, Cipher, Blacklist, Syringe, Passkey, Gateway, Tripwire, Weights, Specter, Siege, Recon, Mirage, Lockdown, Supply, Deadbolt, Tenant, Provenance, Phantom, Razor, Gatekeeper, Exploit, Harbor, Wallet, Trace, Pedant, Infiltrator, Sentinel, Egress, Chaos, Vault, Harbor, Vector, Entropy, Gatekeeper, Tripwire, Passkey, Sanitizer, Siege, Syringe, Cipher, Recon, Lockdown, Weights, Supply, Warden, Blacklist, Specter, Deadbolt, Trace, Egress, Mirage, Phantom, Fuse, Compliance, Razor, Prompt, Infiltrator, Wallet, Gateway, Tenant, Provenance, Sentinel, Exploit, Chaos, Pedant, Vault, Syringe, Recon, Passkey, Cipher, Specter, Supply, Harbor, Warden, Deadbolt, Lockdown, Sanitizer, Siege, Sentinel, Fuse, Weights, Gateway, Trace, Exploit, Phantom, Prompt, Gatekeeper, Blacklist, Razor, Wallet, Infiltrator, Egress, Tripwire, Tenant, Mirage, Vector, Compliance, Provenance, Pedant, Entropy, Chaos, Tenant, Entropy, Mirage, Weights, Vault, Gatekeeper, Specter, Passkey, Cipher, Phantom, Deadbolt, Lockdown, Supply, Blacklist, Sentinel, Gateway, Warden, Sanitizer, Syringe, Prompt, Siege, Egress, Tripwire, Wallet, Exploit, Infiltrator, Fuse, Recon, Compliance, Harbor, Razor, Trace, Vector, Pedant, Chaos, Provenance, Cipher, Vector, Vault, Blacklist, Gateway, Gatekeeper, Syringe, Sanitizer, Siege, Passkey, Entropy, Supply, Deadbolt, Harbor, Wallet, Tripwire, Warden, Lockdown, Pedant, Trace, Specter, Mirage, Exploit, Compliance, Prompt, Weights, Sentinel, Egress, Razor, Chaos, Phantom, Fuse, Tenant, Provenance, Infiltrator, Recon, Specter, Vault, Phantom, Provenance, Prompt, Mirage, Weights, Entropy, Syringe, Cipher, Gatekeeper, Blacklist, Deadbolt, Tripwire, Sanitizer, Lockdown, Recon, Gateway, Fuse, Harbor, Passkey, Tenant, Supply, Exploit, Trace, Wallet, Warden, Compliance, Egress, Vector, Razor, Infiltrator, Siege, Sentinel, Pedant, Chaos, Vault, Blacklist, Passkey, Syringe, Deadbolt, Lockdown, Gateway, Entropy, Cipher, Gatekeeper, Exploit, Sanitizer, Phantom, Prompt, Weights, Tripwire, Fuse, Razor, Infiltrator, Harbor, Provenance, Tenant, Specter, Wallet, Sentinel, Trace, Egress, Mirage, Siege, Warden, Supply, Recon, Pedant, Vector, Chaos, Compliance, Syringe, Vault, Cipher, Gatekeeper, Entropy, Weights, Lockdown, Recon, Sanitizer, Harbor, Tripwire, Compliance, Warden, Specter, Deadbolt, Passkey, Prompt, Blacklist, Sentinel, Supply, Egress, Provenance, Phantom, Gateway, Wallet, Siege, Tenant, Trace, Exploit, Pedant, Infiltrator, Mirage, Razor, Chaos, Fuse, Vector, Cipher, Blacklist, Syringe, Gatekeeper, Vault, Deadbolt, Passkey, Gateway, Siege, Lockdown, Specter, Recon, Weights, Supply, Sanitizer, Fuse, Prompt, Sentinel, Razor, Phantom, Harbor, Infiltrator, Warden, Mirage, Entropy, Egress, Provenance, Wallet, Tripwire, Vector, Chaos, Compliance, Exploit, Trace, Tenant, Pedant, Lockdown, Deadbolt, Specter, Entropy, Gatekeeper, Blacklist, Phantom, Cipher, Syringe, Passkey, Warden, Fuse, Sanitizer, Razor, Siege, Trace, Tripwire, Vault, Harbor, Infiltrator, Sentinel, Tenant, Wallet, Exploit, Gateway, Compliance, Prompt, Egress, Weights, Provenance, Mirage, Recon, Supply, Vector, Chaos, Pedant, Blacklist, Vault, Recon, Passkey, Cipher, Gatekeeper, Lockdown, Weights, Tripwire, Specter, Entropy, Trace, Harbor, Supply, Gateway, Fuse, Deadbolt, Tenant, Phantom, Provenance, Prompt, Warden, Syringe, Infiltrator, Siege, Egress, Compliance, Exploit, Mirage, Sanitizer, Wallet, Sentinel, Razor, Chaos, Pedant, Vector, Deadbolt, Entropy, Blacklist, Sanitizer, Phantom, Supply, Weights, Specter, Harbor, Recon, Gateway, Syringe, Gatekeeper, Warden, Prompt, Tripwire, Egress, Provenance, Sentinel, Cipher, Mirage, Exploit, Fuse, Lockdown, Razor, Compliance, Tenant, Vector, Siege, Infiltrator, Wallet, Vault, Chaos, Passkey, Pedant, Trace, Deadbolt, Vault, Cipher, Specter, Syringe, Gatekeeper, Passkey, Tripwire, Gateway, Supply, Weights, Harbor, Sentinel, Sanitizer, Lockdown, Prompt, Wallet, Trace, Mirage, Razor, Blacklist, Entropy, Phantom, Siege, Chaos, Exploit, Vector, Tenant, Egress, Fuse, Provenance, Warden, Infiltrator, Pedant, Compliance, Recon, Cipher, Syringe, Entropy, Vault, Specter, Sanitizer, Deadbolt, Warden, Tripwire, Harbor, Blacklist, Passkey, Trace, Prompt, Supply, Gateway, Weights, Siege, Lockdown, Phantom, Fuse, Gatekeeper, Sentinel, Exploit, Compliance, Wallet, Recon, Egress, Vector, Infiltrator, Chaos, Razor, Provenance, Mirage, Tenant, Pedant, Vault, Syringe, Specter, Warden, Tripwire, Blacklist, Phantom, Sanitizer, Entropy, Harbor, Gatekeeper, Passkey, Lockdown, Supply, Weights, Sentinel, Mirage, Exploit, Trace, Razor, Prompt, Wallet, Deadbolt, Cipher, Fuse, Siege, Tenant, Infiltrator, Gateway, Recon, Vector, Compliance, Pedant, Chaos, Egress, Provenance, Syringe, Gatekeeper, Entropy, Siege, Deadbolt, Harbor, Vault, Specter, Weights, Exploit, Supply, Cipher, Lockdown, Blacklist, Tripwire, Sanitizer, Gateway, Egress, Warden, Passkey, Phantom, Trace, Provenance, Fuse, Wallet, Mirage, Vector, Tenant, Infiltrator, Sentinel, Prompt, Razor, Recon, Chaos, Pedant, Compliance, Deadbolt, Entropy, Passkey, Blacklist, Syringe, Cipher, Specter, Recon, Vault, Sanitizer, Supply, Sentinel, Egress, Gatekeeper, Razor, Compliance, Weights, Vector, Tripwire, Gateway, Prompt, Tenant, Wallet, Mirage, Lockdown, Fuse, Siege, Trace, Warden, Infiltrator, Harbor, Exploit, Phantom, Pedant, Chaos, Provenance, Passkey, Mirage, Gateway, Phantom, Warden, Sanitizer, Recon, Cipher, Vault, Lockdown, Wallet, Weights, Syringe, Razor, Supply, Deadbolt, Siege, Tripwire, Harbor, Entropy, Gatekeeper, Exploit, Specter, Prompt, Egress, Trace, Sentinel, Infiltrator, Provenance, Blacklist, Compliance, Vector, Pedant, Chaos, Fuse, Tenant, Syringe, Sentinel, Lockdown, Gatekeeper, Entropy, Deadbolt, Passkey, Cipher, Weights, Phantom, Harbor, Gateway, Blacklist, Warden, Specter, Recon, Supply, Razor, Sanitizer, Fuse, Tripwire, Exploit, Prompt, Siege, Vault, Infiltrator, Vector, Wallet, Egress, Compliance, Pedant, Trace, Chaos, Provenance, Mirage, Tenant, Deadbolt, Syringe, Gateway, Sanitizer, Cipher, Supply, Blacklist, Siege, Harbor, Recon, Entropy, Passkey, Vault, Tripwire, Tenant, Weights, Lockdown, Specter, Exploit, Gatekeeper, Prompt, Fuse, Vector, Egress, Wallet, Infiltrator, Sentinel, Phantom, Razor, Warden, Pedant, Chaos, Compliance, Provenance, Trace, Mirage, Syringe, Cipher, Weights, Passkey, Entropy, Tripwire, Gatekeeper, Blacklist, Specter, Lockdown, Gateway, Siege, Harbor, Wallet, Phantom, Deadbolt, Recon, Sanitizer, Warden, Infiltrator, Razor, Vault, Mirage, Tenant, Exploit, Compliance, Vector, Fuse, Prompt, Egress, Provenance, Trace, Supply, Chaos, Sentinel, Pedant, Vault, Harbor, Cipher, Gatekeeper, Blacklist, Deadbolt, Sanitizer, Recon, Lockdown, Weights, Fuse, Passkey, Gateway, Tripwire, Trace, Tenant, Supply, Phantom, Warden, Razor, Vector, Specter, Wallet, Mirage, Siege, Infiltrator, Egress, Compliance, Chaos, Syringe, Entropy, Exploit, Provenance, Sentinel, Prompt, Pedant, Entropy, Specter, Gateway, Syringe, Deadbolt, Supply, Lockdown, Passkey, Blacklist, Egress, Trace, Tenant, Harbor, Cipher, Tripwire, Gatekeeper, Recon, Vault, Exploit, Siege, Fuse, Phantom, Wallet, Compliance, Provenance, Weights, Warden, Sanitizer, Infiltrator, Prompt, Vector, Mirage, Razor, Sentinel, Pedant, Chaos, Blacklist, Passkey, Syringe, Entropy, Weights, Deadbolt, Recon, Harbor, Sanitizer, Lockdown, Tenant, Cipher, Siege, Supply, Tripwire, Phantom, Vault, Gatekeeper, Gateway, Wallet, Trace, Prompt, Sentinel, Fuse, Egress, Specter, Provenance, Exploit, Razor, Chaos, Mirage, Infiltrator, Warden, Compliance, Vector, Pedant, Entropy, Blacklist, Syringe, Passkey, Cipher, Vault, Deadbolt, Lockdown, Sanitizer, Supply, Specter, Warden, Weights, Gateway, Recon, Gatekeeper, Egress, Phantom, Tripwire, Prompt, Harbor, Razor, Siege, Wallet, Infiltrator, Mirage, Compliance, Exploit, Sentinel, Fuse, Pedant, Tenant, Chaos, Provenance, Vector, Trace, Entropy, Syringe, Sanitizer, Lockdown, Passkey, Cipher, Vault, Harbor, Blacklist, Vector, Specter, Siege, Tripwire, Weights, Warden, Recon, Provenance, Compliance, Egress, Gatekeeper, Deadbolt, Supply, Mirage, Exploit, Gateway, Wallet, Prompt, Infiltrator, Trace, Razor, Sentinel, Phantom, Pedant, Chaos, Fuse, Tenant, Blacklist, Syringe, Gatekeeper, Vault, Passkey, Warden, Gateway, Cipher, Tenant, Weights, Lockdown, Siege, Phantom, Entropy, Specter, Wallet, Tripwire, Harbor, Deadbolt, Egress, Fuse, Recon, Sentinel, Sanitizer, Infiltrator, Razor, Exploit, Compliance, Chaos, Supply, Prompt, Vector, Provenance, Mirage, Trace, Pedant, Entropy, Blacklist, Specter, Tripwire, Passkey, Trace, Deadbolt, Lockdown, Egress, Gatekeeper, Razor, Compliance, Recon, Supply, Harbor, Syringe, Phantom, Weights, Warden, Siege, Tenant, Wallet, Provenance, Gateway, Exploit, Cipher, Prompt, Fuse, Mirage, Infiltrator, Vector, Sentinel, Vault, Chaos, Pedant, Sanitizer, Specter, Entropy, Harbor, Sanitizer, Gatekeeper, Recon, Syringe, Vault, Passkey, Cipher, Warden, Phantom, Razor, Deadbolt, Lockdown, Gateway, Sentinel, Tripwire, Blacklist, Egress, Wallet, Weights, Prompt, Supply, Siege, Vector, Exploit, Tenant, Trace, Mirage, Fuse, Chaos, Compliance, Infiltrator, Provenance, Pedant, Syringe, Cipher, Weights, Passkey, Deadbolt, Entropy, Supply, Gatekeeper, Harbor, Tripwire, Blacklist, Gateway, Prompt, Trace, Mirage, Specter, Vault, Infiltrator, Sanitizer, Sentinel, Egress, Wallet, Fuse, Recon, Siege, Warden, Tenant, Phantom, Exploit, Compliance, Vector, Chaos, Provenance, Razor, Lockdown, Pedant, Syringe, Weights, Passkey, Deadbolt, Vault, Tripwire, Wallet, Mirage, Entropy, Fuse, Gateway, Supply, Prompt, Lockdown, Gatekeeper, Recon, Exploit, Harbor, Siege, Warden, Cipher, Trace, Phantom, Tenant, Egress, Blacklist, Specter, Compliance, Infiltrator, Sanitizer, Razor, Sentinel, Pedant, Chaos, Vector, Provenance, Cipher, Vector, Syringe, Vault, Exploit, Blacklist, Specter, Passkey, Gatekeeper, Sanitizer, Wallet, Deadbolt, Phantom, Harbor, Lockdown, Recon, Weights, Supply, Prompt, Trace, Mirage, Gateway, Warden, Entropy, Fuse, Egress, Tripwire, Compliance, Siege, Razor, Tenant, Infiltrator, Provenance, Chaos, Sentinel, Pedant, Harbor, Entropy, Syringe, Sanitizer, Cipher, Blacklist, Warden, Gateway, Supply, Specter, Deadbolt, Weights, Egress, Vault, Tripwire, Recon, Siege, Prompt, Compliance, Gatekeeper, Wallet, Passkey, Exploit, Fuse, Pedant, Trace, Phantom, Mirage, Infiltrator, Vector, Tenant, Razor, Provenance, Sentinel, Chaos, Lockdown, Vault, Specter, Deadbolt, Passkey, Phantom, Sanitizer, Blacklist, Entropy, Supply, Siege, Harbor, Gatekeeper, Cipher, Gateway, Syringe, Warden, Recon, Wallet, Tripwire, Razor, Weights, Exploit, Lockdown, Provenance, Infiltrator, Egress, Vector, Mirage, Trace, Sentinel, Pedant, Fuse, Prompt, Tenant, Compliance, Chaos, Entropy, Passkey, Blacklist, Lockdown, Deadbolt, Vault, Gatekeeper, Cipher, Sanitizer, Gateway, Specter, Tripwire, Syringe, Egress, Phantom, Weights, Harbor, Warden, Prompt, Supply, Provenance, Siege, Recon, Mirage, Tenant, Fuse, Wallet, Compliance, Vector, Exploit, Chaos, Infiltrator, Trace, Razor, Sentinel, Pedant, Syringe, Entropy, Passkey, Gatekeeper, Cipher, Specter, Vault, Blacklist, Lockdown, Deadbolt, Weights, Gateway, Razor, Supply, Fuse, Tripwire, Provenance, Wallet, Phantom, Recon, Exploit, Siege, Compliance, Prompt, Infiltrator, Harbor, Warden, Sanitizer, Vector, Tenant, Egress, Trace, Mirage, Sentinel, Chaos, Pedant, Specter, Entropy, Blacklist, Gatekeeper, Vault, Syringe, Passkey, Deadbolt, Sanitizer, Phantom, Recon, Supply, Weights, Prompt, Pedant, Siege, Mirage, Razor, Cipher, Gateway, Wallet, Infiltrator, Tenant, Sentinel, Tripwire, Provenance, Warden, Harbor, Trace, Egress, Compliance, Vector, Fuse, Exploit, Lockdown, Chaos, Gateway, Blacklist, Syringe, Deadbolt, Cipher, Gatekeeper, Specter, Phantom, Vault, Supply, Entropy, Weights, Passkey, Tripwire, Compliance, Lockdown, Harbor, Recon, Trace, Wallet, Pedant, Warden, Sanitizer, Tenant, Razor, Chaos, Fuse, Provenance, Prompt, Siege, Infiltrator, Egress, Exploit, Sentinel, Vector, Mirage, Deadbolt, Syringe, Gatekeeper, Passkey, Cipher, Harbor, Lockdown, Specter, Gateway, Entropy, Vault, Siege, Sanitizer, Recon, Warden, Sentinel, Supply, Tripwire, Phantom, Weights, Blacklist, Fuse, Compliance, Infiltrator, Trace, Provenance, Wallet, Egress, Prompt, Exploit, Razor, Chaos, Tenant, Vector, Mirage, Pedant, Vault, Blacklist, Specter, Deadbolt, Cipher, Lockdown, Gatekeeper, Phantom, Syringe, Recon, Sentinel, Entropy, Sanitizer, Tripwire, Weights, Fuse, Gateway, Warden, Razor, Prompt, Harbor, Wallet, Provenance, Siege, Vector, Compliance, Exploit, Supply, Egress, Chaos, Mirage, Trace, Tenant, Infiltrator, Pedant, Passkey, Provenance, Vault, Syringe, Blacklist, Passkey, Entropy, Cipher, Gateway, Deadbolt, Weights, Lockdown, Phantom, Prompt, Sanitizer, Gatekeeper, Tripwire, Fuse, Razor, Compliance, Harbor, Supply, Chaos, Siege, Sentinel, Trace, Exploit, Warden, Egress, Recon, Mirage, Tenant, Wallet, Infiltrator, Specter, Vector, Pedant, Syringe, Specter, Weights, Passkey, Vault, Pedant, Blacklist, Entropy, Sanitizer, Tripwire, Deadbolt, Egress, Cipher, Harbor, Gatekeeper, Prompt, Recon, Warden, Siege, Gateway, Infiltrator, Lockdown, Compliance, Provenance, Sentinel, Wallet, Razor, Supply, Trace, Exploit, Fuse, Phantom, Chaos, Tenant, Mirage, Vector, Vault, Entropy, Passkey, Blacklist, Gatekeeper, Deadbolt, Wallet, Sanitizer, Prompt, Harbor, Lockdown, Weights, Warden, Specter, Exploit, Razor, Tripwire, Supply, Siege, Phantom, Tenant, Gateway, Cipher, Trace, Provenance, Fuse, Egress, Compliance, Vector, Mirage, Recon, Sentinel, Syringe, Chaos, Infiltrator, Pedant, Sanitizer, Sentinel, Chaos, Pedant, Razor, Compliance, Deadbolt, Syringe, Warden, Cipher, Vault, Passkey, Gateway, Blacklist, Trace, Supply, Gatekeeper, Specter, Prompt, Wallet, Mirage, Provenance, Phantom, Tenant, Recon, Lockdown, Tripwire, Entropy, Infiltrator, Egress, Harbor, Weights, Fuse, Vector, Siege, Exploit, Sentinel, Sanitizer, Gatekeeper, Gateway, Siege, Specter, Vault, Blacklist, Razor, Passkey, Pedant, Deadbolt, Chaos, Vector, Harbor, Entropy, Provenance, Syringe, Supply, Mirage, Fuse, Lockdown, Exploit, Trace, Egress, Recon, Wallet, Infiltrator, Compliance, Warden, Tripwire, Weights, Phantom, Prompt, Cipher, Tenant, Specter, Blacklist, Sanitizer, Vault, Syringe, Razor, Gatekeeper, Gateway, Warden, Compliance, Sentinel, Pedant, Passkey, Chaos, Fuse, Harbor, Deadbolt, Cipher, Lockdown, Recon, Trace, Tripwire, Provenance, Entropy, Tenant, Phantom, Vector, Supply, Wallet, Siege, Mirage, Prompt, Weights, Infiltrator, Exploit, Egress, Sentinel, Gatekeeper, Razor, Deadbolt, Specter, Entropy, Gateway, Blacklist, Lockdown, Sanitizer, Vault, Pedant, Passkey, Warden, Chaos, Siege, Cipher, Syringe, Compliance, Vector, Prompt, Phantom, Mirage, Harbor, Exploit, Infiltrator, Fuse, Recon, Trace, Tenant, Tripwire, Egress, Wallet, Provenance, Supply, Weights, Razor, Vault, Gatekeeper, Sanitizer, Pedant, Specter, Sentinel, Blacklist, Cipher, Warden, Chaos, Gateway, Compliance, Deadbolt, Fuse, Provenance, Siege, Passkey, Harbor, Phantom, Vector, Trace, Lockdown, Supply, Prompt, Tripwire, Entropy, Syringe, Egress, Exploit, Weights, Infiltrator, Recon, Wallet, Mirage, Tenant, Sentinel, Gatekeeper, Razor, Vault, Pedant, Specter, Blacklist, Cipher, Compliance, Chaos, Lockdown, Warden, Deadbolt, Passkey, Sanitizer, Gateway, Tripwire, Phantom, Entropy, Supply, Syringe, Recon, Harbor, Vector, Fuse, Trace, Provenance, Egress, Prompt, Weights, Wallet, Mirage, Infiltrator, Siege, Tenant, Exploit, Blacklist, Supply, Tripwire, Cipher, Vault, Syringe, Passkey, Lockdown, Gatekeeper, Razor, Mirage, Specter, Sanitizer, Entropy, Sentinel, Phantom, Harbor, Siege, Deadbolt, Gateway, Prompt, Fuse, Warden, Compliance, Recon, Weights, Exploit, Trace, Provenance, Vector, Tenant, Wallet, Egress, Pedant, Infiltrator, Chaos, Syringe, Passkey, Cipher, Deadbolt, Blacklist, Siege, Phantom, Vault, Lockdown, Tripwire, Gatekeeper, Harbor, Specter, Egress, Supply, Exploit, Sanitizer, Entropy, Provenance, Fuse, Weights, Recon, Warden, Gateway, Compliance, Wallet, Mirage, Infiltrator, Trace, Pedant, Razor, Sentinel, Prompt, Vector, Chaos, Tenant, Syringe, Vault, Blacklist, Entropy, Specter, Gatekeeper, Mirage, Weights, Fuse, Cipher, Passkey, Deadbolt, Tripwire, Gateway, Warden, Prompt, Recon, Wallet, Sanitizer, Supply, Exploit, Phantom, Trace, Harbor, Lockdown, Razor, Tenant, Egress, Siege, Infiltrator, Sentinel, Chaos, Vector, Compliance, Pedant, Provenance, Vault, Cipher, Syringe, Passkey, Entropy, Weights, Blacklist, Harbor, Gateway, Gatekeeper, Deadbolt, Sanitizer, Specter, Wallet, Supply, Phantom, Mirage, Exploit, Recon, Tripwire, Prompt, Razor, Tenant, Siege, Infiltrator, Lockdown, Compliance, Warden, Provenance, Vector, Chaos, Sentinel, Pedant, Fuse, Egress, Trace, Syringe, Entropy, Cipher, Weights, Passkey, Wallet, Tripwire, Prompt, Blacklist, Supply, Specter, Vault, Gatekeeper, Gateway, Exploit, Phantom, Lockdown, Fuse, Harbor, Siege, Tenant, Deadbolt, Egress, Provenance, Sentinel, Mirage, Sanitizer, Warden, Trace, Razor, Infiltrator, Recon, Vector, Compliance, Pedant, Chaos, Blacklist, Cipher, Syringe, Passkey, Vault, Specter, Gateway, Sanitizer, Supply, Siege, Deadbolt, Harbor, Tripwire, Recon, Weights, Prompt, Sentinel, Gatekeeper, Tenant, Exploit, Wallet, Egress, Razor, Compliance, Lockdown, Fuse, Trace, Warden, Phantom, Infiltrator, Pedant, Mirage, Vector, Chaos, Entropy, Provenance, Lockdown, Compliance, Phantom, Blacklist, Fuse, Vector, Mirage, Syringe, Vault, Entropy, Deadbolt, Specter, Recon, Sanitizer, Gateway, Harbor, Siege, Razor, Cipher, Passkey, Trace, Warden, Sentinel, Tenant, Gatekeeper, Supply, Tripwire, Prompt, Weights, Infiltrator, Chaos, Pedant, Exploit, Egress, Wallet, Provenance, Specter, Blacklist, Warden, Vault, Gatekeeper, Deadbolt, Compliance, Phantom, Trace, Supply, Vector, Mirage, Provenance, Wallet, Syringe, Lockdown, Sanitizer, Entropy, Tripwire, Sentinel, Cipher, Harbor, Recon, Prompt, Egress, Weights, Passkey, Siege, Infiltrator, Tenant, Razor, Fuse, Gateway, Exploit, Pedant, Chaos, Vault, Prompt, Vector, Tenant, Wallet, Exploit, Entropy, Blacklist, Specter, Syringe, Supply, Siege, Sanitizer, Fuse, Weights, Harbor, Passkey, Deadbolt, Recon, Sentinel, Lockdown, Warden, Compliance, Tripwire, Razor, Gatekeeper, Gateway, Cipher, Infiltrator, Trace, Egress, Provenance, Phantom, Mirage, Pedant, Chaos, Blacklist, Provenance, Syringe, Entropy, Passkey, Gatekeeper, Warden, Cipher, Weights, Deadbolt, Supply, Specter, Vault, Recon, Sanitizer, Gateway, Egress, Phantom, Exploit, Compliance, Prompt, Siege, Tenant, Trace, Tripwire, Razor, Harbor, Wallet, Vector, Lockdown, Sentinel, Infiltrator, Pedant, Mirage, Chaos, Fuse, Exploit, Blacklist, Passkey, Cipher, Syringe, Gatekeeper, Sanitizer, Deadbolt, Lockdown, Entropy, Warden, Recon, Harbor, Weights, Specter, Prompt, Wallet, Siege, Tripwire, Provenance, Infiltrator, Trace, Tenant, Supply, Compliance, Vector, Vault, Mirage, Razor, Gateway, Phantom, Fuse, Egress, Pedant, Sentinel, Chaos, Vault, Vector, Entropy, Specter, Deadbolt, Gatekeeper, Warden, Weights, Passkey, Supply, Syringe, Mirage, Fuse, Trace, Cipher, Lockdown, Gateway, Siege, Recon, Sanitizer, Harbor, Prompt, Phantom, Wallet, Pedant, Razor, Exploit, Tenant, Infiltrator, Compliance, Provenance, Tripwire, Blacklist, Egress, Sentinel, Chaos, Entropy, Blacklist, Vault, Sanitizer, Tripwire, Weights, Cipher, Syringe, Passkey, Deadbolt, Warden, Prompt, Trace, Recon, Compliance, Lockdown, Razor, Specter, Siege, Tenant, Gateway, Supply, Phantom, Harbor, Wallet, Egress, Provenance, Exploit, Infiltrator, Mirage, Vector, Gatekeeper, Pedant, Sentinel, Chaos, Fuse, Syringe, Sanitizer, Blacklist, Entropy, Gateway, Passkey, Specter, Weights, Harbor, Wallet, Vault, Deadbolt, Tripwire, Cipher, Prompt, Mirage, Lockdown, Exploit, Warden, Gatekeeper, Recon, Compliance, Phantom, Sentinel, Trace, Tenant, Supply, Egress, Siege, Infiltrator, Razor, Provenance, Pedant, Fuse, Vector, Chaos, Syringe, Specter, Entropy, Vault, Blacklist, Lockdown, Sanitizer, Weights, Deadbolt, Cipher, Passkey, Tripwire, Phantom, Harbor, Gateway, Sentinel, Fuse, Compliance, Gatekeeper, Egress, Trace, Razor, Siege, Warden, Wallet, Tenant, Infiltrator, Prompt, Supply, Exploit, Vector, Provenance, Mirage, Chaos, Recon, Pedant, Entropy, Syringe, Specter, Cipher, Harbor, Passkey, Deadbolt, Recon, Gatekeeper, Lockdown, Gateway, Vault, Prompt, Siege, Weights, Warden, Blacklist, Tripwire, Sanitizer, Razor, Infiltrator, Wallet, Phantom, Egress, Provenance, Exploit, Fuse, Mirage, Tenant, Vector, Supply, Compliance, Sentinel, Trace, Pedant, Chaos, Entropy, Blacklist, Deadbolt, Gatekeeper, Passkey, Cipher, Specter, Harbor, Vault, Recon, Gateway, Pedant, Sanitizer, Siege, Fuse, Egress, Sentinel, Warden, Lockdown, Tripwire, Chaos, Tenant, Syringe, Razor, Trace, Phantom, Prompt, Exploit, Supply, Wallet, Mirage, Vector, Compliance, Weights, Infiltrator, Provenance, Vault, Syringe, Gatekeeper, Lockdown, Specter, Blacklist, Razor, Cipher, Entropy, Sanitizer, Passkey, Gateway, Deadbolt, Exploit, Prompt, Siege, Supply, Tenant, Fuse, Harbor, Mirage, Phantom, Weights, Tripwire, Infiltrator, Egress, Warden, Compliance, Chaos, Recon, Wallet, Vector, Trace, Pedant, Sentinel, Provenance, Cipher, Passkey, Entropy, Vault, Harbor, Tripwire, Blacklist, Sanitizer, Specter, Mirage, Trace, Exploit, Gateway, Deadbolt, Weights, Lockdown, Recon, Warden, Siege, Infiltrator, Phantom, Egress, Fuse, Razor, Sentinel, Prompt, Provenance, Gatekeeper, Supply, Syringe, Tenant, Vector, Compliance, Pedant, Wallet, Chaos, Vault, Specter, Warden, Syringe, Entropy, Cipher, Sanitizer, Blacklist, Fuse, Deadbolt, Gatekeeper, Sentinel, Supply, Tripwire, Gateway, Pedant, Razor, Weights, Siege, Phantom, Compliance, Passkey, Lockdown, Trace, Exploit, Prompt, Recon, Egress, Harbor, Chaos, Wallet, Mirage, Tenant, Provenance, Vector, Infiltrator, Specter, Cipher, Syringe, Weights, Gatekeeper, Entropy, Gateway, Passkey, Vault, Lockdown, Deadbolt, Siege, Blacklist, Sanitizer, Harbor, Warden, Phantom, Recon, Supply, Razor, Egress, Compliance, Sentinel, Tripwire, Mirage, Prompt, Trace, Infiltrator, Exploit, Vector, Pedant, Fuse, Wallet, Chaos, Provenance, Tenant, Vault, Entropy, Passkey, Deadbolt, Gatekeeper, Syringe, Sanitizer, Cipher, Specter, Warden, Blacklist, Compliance, Lockdown, Harbor, Phantom, Gateway, Siege, Recon, Tripwire, Mirage, Weights, Razor, Supply, Sentinel, Prompt, Pedant, Vector, Wallet, Infiltrator, Egress, Exploit, Trace, Chaos, Fuse, Provenance, Tenant, Vault, Compliance, Syringe, Harbor, Deadbolt, Entropy, Gatekeeper, Passkey, Specter, Blacklist, Sanitizer, Gateway, Recon, Mirage, Siege, Warden, Prompt, Weights, Trace, Wallet, Phantom, Fuse, Tripwire, Lockdown, Cipher, Supply, Pedant, Infiltrator, Exploit, Sentinel, Tenant, Razor, Egress, Provenance, Chaos, Vector, Syringe, Cipher, Deadbolt, Gatekeeper, Blacklist, Siege, Entropy, Warden, Razor, Recon, Specter, Harbor, Vault, Fuse, Supply, Passkey, Weights, Gateway, Tripwire, Trace, Compliance, Exploit, Prompt, Lockdown, Tenant, Egress, Wallet, Provenance, Phantom, Mirage, Sanitizer, Sentinel, Vector, Infiltrator, Chaos, Pedant, Syringe, Gatekeeper, Blacklist, Entropy, Prompt, Deadbolt, Cipher, Weights, Lockdown, Harbor, Vault, Recon, Passkey, Warden, Sanitizer, Gateway, Exploit, Siege, Supply, Trace, Infiltrator, Wallet, Mirage, Tenant, Compliance, Tripwire, Egress, Phantom, Provenance, Sentinel, Vector, Specter, Fuse, Razor, Pedant, Chaos, Cipher, Entropy, Syringe, Sanitizer, Pedant, Specter, Lockdown, Recon, Siege, Blacklist, Provenance, Sentinel, Harbor, Gateway, Passkey, Phantom, Mirage, Fuse, Trace, Weights, Chaos, Deadbolt, Prompt, Tripwire, Vault, Tenant, Supply, Compliance, Wallet, Gatekeeper, Exploit, Egress, Warden, Infiltrator, Razor, Vector, Harbor, Entropy, Passkey, Fuse, Gatekeeper, Exploit, Phantom, Weights, Syringe, Tripwire, Cipher, Warden, Tenant, Deadbolt, Gateway, Siege, Vault, Specter, Lockdown, Wallet, Mirage, Blacklist, Sanitizer, Supply, Prompt, Trace, Recon, Infiltrator, Compliance, Razor, Sentinel, Egress, Vector, Pedant, Provenance, Chaos Total findings: 15505 Severity breakdown: 398 critical, 3107 high, 8724 medium, 3039 low, 237 info

Note: Fixing issues can create a domino effect — resolving one finding often surfaces new ones that were previously hidden. Multiple scan-and-fix cycles may be needed until you’re satisfied no further issues remain. How deep you go is your call.