Part III · Technical Docs
Chapter 7 - Security Review
Scope
This is a static code/configuration inspection. No penetration testing, dynamic scanning, or runtime testing was performed. Findings are prioritized accordingly.
Observed controls (good)
- Session authentication, email verification optional, password reset throttling.
- Security token based on signed URL for email verify.
- CSRF exceptions limited to external callbacks.
- SaaS/non-SaaS/Impersonation guards.
- Plan limits.
- Workspace suspension enforcement.
- Sensitive status controls by middleware.
- Model event audit.
- Mediators payment security (HTTPS normal - server responsibility).
Assets sensitive in project
- Email account passwords (encrypted on persist).
- API keys (Gemini via
Settingtable could be plaintext in DB; Stripe via settings UI may also be plaintext). - Client legal data inside email body/text + attachments + conversations.
- Project financial accounting figures (costs, budgets, invoices).
- Audit history containing IP and user actions.
- IMAP username/password + plaintext config fallback
config/imap.php.
Findings
High
- Database secret fallback in
config/imap.phphardcodes user/password (observed in repository code). - Missing
.envin repo and installer expects.env.example, so secrets may be shared over channels or versioned.
Medium
- No tenant global scope; isolation largely app-query-level. Must audit all repositories for conditions.
- Payment setting table (
payment_settings) appears to store values plaintext without visible encryption helper (verify row encryption). - Plan and AI key stored as "value" text in
settings, no visibility for encryption wrapper. - Tax/financial report exported way varies CSV includes client data.
Httpfacade used to fetch Gemini (LLM) external with API key in URL; possible query parameter leak relative.- Automatic 37 keyboard shortcuts, modal stacks (likely safe).
- CORS policy inherited from
config/cors.phpnot fully read; default doesn't support native API.
Low
- No password MFA/CAPTCHA on local login. (optional)
- No HTTPS enforcement in code (deployment-side).
DemoModeMiddlewaregives potential bypass only selectively for POSTs; standard only and testing use by default.- User password nullable means quick user creation row; product should govern.
- Rate limiting only Login and AI limited.
vendornot updated maybe aging 2026 year; queue options need.
Operational recommendations
- Store API keys in environment or encrypted columns rather than database text.
- Conduct manual permission segregation tests.
- Add tenant global scope or cross-tenant test suite.
- Add monitoring + rate limit for complaints.
- Use secrets management platform for Symfony.