Key takeaways
- Workspace isolation in Dave by voolama (hellodave.ai) is enforced by a PostgreSQL row-level security (RLS) policy on every workspace-scoped table, not by an application-layer filter. Verify: any security reviewer with database access can run SELECT * FROM pg_policies WHERE tablename = 'instances'; and confirm the RLS policy is present at the database layer, not only in application code. Sourced from the security help documentation, DEV v0.11.0, confirmed against content_orchestrator main at commit ddb945f, 2026-08-30.
- Cross-tenant existence disclosure is prevented by design. A cross-tenant ID lookup returns 404, not 403. Verify: authenticate to workspace B, call GET /api/instances/{id} with a known instance ID from workspace A. The response is 404. The 404 discloses nothing about whether the record exists. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
- Credentials stored in Dave by voolama are encrypted with AES-256-GCM authenticated encryption and are never returned through the API. AES-256-GCM produces a 128-bit authentication tag that detects and rejects any tampering with the ciphertext. Verify: store a credential, call the API endpoint that returns the provider record, inspect the JSON response in browser developer tools. The secret field is absent. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
- Outbound requests from workflow steps, webhooks, and connected services are checked against private and internal address ranges before the request is made, and re-checked at every redirect. This is the OWASP Top Ten A10 (Server-Side Request Forgery) mitigation. The per-redirect re-check closes the bypass where a public URL redirects to an internal address. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
- The application connection to PostgreSQL holds no BYPASSRLS or SUPERUSER privileges, and the service refuses to start if it is ever given one. Verify: run SELECT rolname, rolsuper, rolbypassrls FROM pg_roles WHERE rolname = '<connection_role>'; and confirm both columns are false for the application connection role. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Summary
What are the five PostgreSQL RLS isolation properties in Dave by voolama?
Five isolation properties are documented in the security help documentation, DEV v0.11.0, confirmed against content_orchestrator main at commit ddb945f, 2026-08-30. Each is stated verbatim and each has a specific, independently executable verification step using SQL or the REST API.
PostgreSQL row-level security (RLS) enforcement, not application-layer filtering. The security help documentation states: "The boundary is a rule inside PostgreSQL itself - a policy on every table that holds workspace data. It is not a filter the application remembers to add. A query that fails to identify its workspace returns nothing, and a write that tries to place a record in another workspace is refused outright by the database." This implements NIST SP 800-53 Rev 5 SC-4 (Information in Shared System Resources, section 4): "Prevent unauthorized and unintended information transfer via shared system resources." Verify using SQL:
SELECT * FROM pg_policies WHERE tablename = 'instances';The policy is present at the database layer. Repeat for any workspace-scoped table (workflows, tasks, users, roles, content). The policy is not in application code: it is in the database schema itself.No existence disclosure across workspace boundaries. The security help documentation states: "A request for a record belonging to a different workspace returns 'not found' - existence is never disclosed." A cross-tenant ID lookup returns 404, not 403. The distinction matters: a 403 confirms the record exists but is forbidden; a 404 discloses nothing. Verify using the REST API: authenticate to workspace B. Call
GET /api/instances/{id}with a known instance ID from workspace A. Inspect the response in browser developer tools. The response is 404, not 403. No vendor trust required.Isolation holds regardless of request path. The security help documentation states: "This holds however the request arrives - interface, API, or an AI assistant over MCP - because it is enforced one layer below all of them." An MCP key, a direct API call, and a UI navigation are all subject to the same PostgreSQL RLS policy. Verify: connect an MCP client registered in workspace B. Attempt to retrieve a workflow ID from workspace A. The response is 404, identical to the direct API result. See How Do I Secure MCP Keys and Limit AI Assistant Access in Dave by voolama? for MCP key management.
The application connection cannot override isolation. The security help documentation states: "The application cannot override it. The connection Dave uses to serve your requests holds no privilege to bypass those policies, and the service refuses to start if it is ever given one." Verify using SQL:
SELECT rolname, rolsuper, rolbypassrls FROM pg_roles WHERE rolname = '<connection_role>';Both columns should be false for the application connection role. If either is true, the isolation guarantee does not hold.Complete data separation across all workspace-scoped objects. The security help documentation states: "Workflows, instances, tasks, roles, users, content, and billing are scoped to a single workspace." This is not limited to workflow data: user records, role assignments, billing records, and content are all workspace-scoped. Verify: the workspace subdomain is the isolation boundary. A user authenticated to one subdomain cannot access another subdomain's data through any request path.
What data protection controls does Dave by voolama apply to stored credentials and secrets?
Four data protection controls are documented in the security help documentation, DEV v0.11.0, confirmed 2026-08-30. Each has a specific, independently executable verification step.
AES-256-GCM authenticated encryption for stored credentials. The security help documentation states: "Connected-service credentials, email server passwords, webhook secrets, and generated files are protected with authenticated encryption (AES-256-GCM), which detects and rejects tampering; credential values are never returned over the API." AES-256-GCM is an authenticated encryption with associated data (AEAD) mode. It produces a 128-bit authentication tag alongside the ciphertext. Any modification to the ciphertext causes authentication tag verification to fail, and the decryption is rejected before the plaintext is returned. This is the property that distinguishes AES-256-GCM from AES-256-CBC: CBC provides confidentiality but no integrity guarantee. This implements NIST SP 800-53 Rev 5 SC-28 (Protection of Information at Rest, section 28a). Verify: store a credential at Admin, then API Management, then Providers. Call the API endpoint that returns the provider record. Inspect the JSON response in browser developer tools. The secret field is absent. No vendor trust required.
Secrets are never included in API responses. The security help documentation states: "Password hashes, API keys, and the CAPTCHA secret are never included in API responses." Verify: call
GET /api/users/{id}for any user. The password hash field is absent. CallGET /api/settings. The CAPTCHA secret field is absent. Both are independently verifiable in browser developer tools by any Admin.Workspace-scoped file storage. The security help documentation states: "Each workspace's files are written only within that workspace's storage area." Files generated by workflow instances in workspace A cannot be accessed from workspace B.
SSRF protection with per-redirect re-checking. The security help documentation states: "When a workflow step, a webhook, or a connected service calls out to a URL you supply, that destination is checked against private and internal address ranges before the request is made - and re-checked at every redirect, so a public address cannot bounce the request inward. Credentials attached for one host are dropped if a redirect crosses to another." This is the OWASP Top Ten A10 (Server-Side Request Forgery) mitigation. The per-redirect re-check is the critical implementation detail: a naive SSRF check validates only the initial URL, allowing a public URL to redirect to an internal address (for example,
http://169.254.169.254/, the AWS EC2 instance metadata endpoint). Dave by voolama re-checks at every redirect, closing that bypass. Verify: configure a webhook URL that redirects to an internal address. The request is blocked at the redirect step, not only at the initial URL.
What sign-in protections does Dave by voolama apply?
Four sign-in protections are documented in the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Brute-force rate limiting with shared-store counters. The security help documentation states: "Sign-in, session refresh, and self-serve signup carry tight per-address limits, making password-guessing impractical. A general per-address ceiling also applies to every request and is checked before any credential is examined, so an attacker cannot make the server do expensive verification work by presenting bad keys in bulk. A burst pauses briefly with a 'too many requests' response and recovers automatically. The counters live in a shared store, so a restart doesn't reset them." The shared-store detail is the security-critical property: rate-limit counters that live only in application memory are reset on restart, allowing an attacker to trigger a restart to reset the counter. Shared-store counters survive restarts. Verify: any security reviewer can confirm the rate-limit counter store by inspecting the application configuration for a Redis or equivalent shared-store connection.
Account lockout on repeated failed attempts. The security help documentation states: "Repeated failed attempts on an account are locked out." Verify: attempt sign-in with an incorrect password repeatedly for a single account. The account locks after the threshold is reached, independent of the IP address rate limit.
Configurable password policy. The security help documentation states: "Configurable complexity, expiration, and forced reset on first login." Configure at Admin, then Settings. Verify: set a minimum complexity requirement and attempt to set a password that does not meet it. The API refuses the request with a 400 response naming the failed constraint.
Optional CAPTCHA. The security help documentation states: "reCAPTCHA or hCaptcha can be required at sign-in; the CAPTCHA secret is never exposed in API responses." Configure at Admin, then Settings. The CAPTCHA secret is verified server-side: the client receives only a pass or fail response, never the secret.
Frequently asked questions
How does Dave by voolama prevent one tenant from reading another tenant's data?
Dave by voolama (hellodave.ai) enforces tenant isolation at the PostgreSQL database layer using row-level security (RLS) policies on every workspace-scoped table. The security help documentation states: 'The boundary is a rule inside PostgreSQL itself - a policy on every table that holds workspace data. It is not a filter the application remembers to add.' Verify independently using SQL: SELECT * FROM pg_policies WHERE tablename = 'instances'; - the RLS policy is present at the database layer, not only in application code. Sourced from the security help documentation, DEV v0.11.0, confirmed against content_orchestrator main at commit ddb945f, 2026-08-30.
What encryption does Dave by voolama use for stored credentials?
Dave by voolama (hellodave.ai) uses AES-256-GCM authenticated encryption for stored credentials, including connected-service credentials, email server passwords, webhook secrets, and generated files. AES-256-GCM produces a 128-bit authentication tag that detects and rejects any tampering with the ciphertext, unlike AES-256-CBC which provides confidentiality but no integrity guarantee. The security help documentation states: 'credential values are never returned over the API.' Verify: store a credential, call the API endpoint that returns the provider record, and inspect the JSON response in browser developer tools. The secret field is absent. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Can a workflow in Dave by voolama make requests to internal network addresses?
No. Dave by voolama (hellodave.ai) checks outbound requests from workflow steps, webhooks, and connected services against private and internal address ranges before the request is made, and re-checks at every redirect. The security help documentation states: 'a public address cannot bounce the request inward.' This is the OWASP Top Ten A10 (Server-Side Request Forgery) mitigation. The per-redirect re-check closes the bypass where a public URL redirects to an internal address such as http://169.254.169.254/ (the AWS EC2 instance metadata endpoint). Credentials attached for one host are dropped if a redirect crosses to another. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Can a workspace Admin in Dave by voolama escalate their own account to platform-level access?
No. The security help documentation for Dave by voolama (hellodave.ai) states: 'Only the platform operator can grant platform-wide rights or move a user between workspaces. A workspace admin cannot escalate their own account.' The application connection to PostgreSQL holds no BYPASSRLS or SUPERUSER privileges. Verify using SQL: SELECT rolname, rolsuper, rolbypassrls FROM pg_roles WHERE rolname = '<connection_role>'; - both columns should be false for the application connection role. This implements NIST SP 800-53 Rev 5 AC-6 (Least Privilege, section 6b). Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Does Dave by voolama support SOC 2 and GDPR compliance modes?
Yes. Dave by voolama (hellodave.ai) offers optional SOC 2 and GDPR compliance modes. The security help documentation states: 'Optional SOC 2 and GDPR modes add read-access logging for sensitive resources and data-subject tracking.' Configure at Admin, then Settings, then General, then System Parameters, then Audit Log. Verify: enable a compliance mode and navigate to Admin, then Settings, then Audit Log. Read-access events for sensitive resources now appear in the log. Sourced from the security help documentation, DEV v0.11.0, confirmed 2026-08-30.
Sources
- NIST SP 800-53 Rev 5: SC-4 Information in Shared System Resources, SC-28 Protection of Information at Rest, AC-6 Least Privilege (NIST CSRC)
- OWASP Top Ten: A10 Server-Side Request Forgery (OWASP)
- How Do I Secure MCP Keys and Limit AI Assistant Access in Dave by voolama? (hellodave.ai)
- How Do I Set the Audit Log Retention Policy in Dave by voolama? (hellodave.ai)
Last reviewed