Skip to content

Threat Model

INFO

This threat model was last reviewed for Bayanat v3.0.0.

Goal

  • Recognize, measure, and manage security risks related to Bayanat
  • Safeguard confidentiality, integrity, and availability of data
  • Mitigate vulnerabilities to minimize potential risks

Out of Scope

  • Hosting infrastructure security (follow industry best practices, restrict access to port 443)
  • Third-party component security (keep all components updated)
  • DDoS protection (address separately)

Threat Surfaces

Evaluated

  • Databases and storage
  • Codebase (manual review, continuous static analysis via SemGrep and CodeQL)
  • Configuration files
  • Web UI (vulnerability assessment via Tenable Nessus)

Not Evaluated (Out of Scope)

Hosting infrastructure, Nginx, Flask, Flask extensions, Vue/Vuetify, Redis, PostgreSQL, Celery, and third-party libraries.

Access Control

Roles

  • Data Analyst (DA): Read and conditional write on assigned items
  • Moderator: DA permissions plus Labels, Sources, Event Types, Locations, and bulk updates
  • Administrator: Unrestricted access, Activity Monitor, user management

System Users

Following the official installation guide, the www-data/nginx user does not have direct access to PostgreSQL databases, limiting the impact of web server compromise.

Authentication

Multi-factor authentication with:

  • Recaptcha
  • Google OAuth
  • Hardware Keys (WebAuthn/FIDO, recommended)

Trust Levels

  1. Anonymous Web User
  2. User with valid login credentials
  3. Administrator
  4. Data Analyst
  5. Moderator
  6. Root local user
  7. Bayanat local user
  8. Nginx local user
  9. Postgres local user

Implemented Security Controls

AreaControl
LoginMinimum 8-character passwords
LoginNon-revealing failed login messages
LoginActivity logging for logins
LoginNo password recovery via UI
LoginPassword complexity enforcement
Login2FA via authenticator apps
SecretsRandom generation per Flask recommendations
SecretsCritical secrets masked during transmission
SessionsHTTP-only cookies
SessionsCSRF tokens with rate limiting
SessionsAdmin-managed session tracking
DataActivity logging for all CRUD operations
DataPer-request authentication and authorization
DataNo direct DB access from www-data user
DataAutomatic export cleanup
DataEnforced authentication for sensitive operations
DataInput sanitization (Bleach) and validation (Pydantic)
CodebaseContinuous static analysis (SemGrep)
CodebaseNon-privileged dependency installation
CodebaseDependency scanning (Dependabot)
ControlCostImpactLikelihoodScore
Account lockout after failed attempts45731
Secrets Vault for third-party keys89755
Content Security Policy (CSP)87848
Clean up unused media imports57316
Full input sanitization89973
Restrict .env access to required users39760
Disable or protect Flask CLI58319
Server-side MIME type validation34621
Disable PUT/DELETE HTTP methods38753
POST for recovery codes endpoint16635
Disallow * on robots.txt12815
Validate uploaded JSON settings2246

Known Risks

RiskImpactProbabilityScore
.env accessible if any trust-level user is compromisedHighHigh9