Spaces:
Paused
Paused
|
Download docs/security.md from mohammed978/teteffd: direct link, hf CLI and curl.
- Browser
- Download file 3.8 kB
-
https://huggingface.co/spaces/mohammed978/teteffd/resolve/main/docs/security.md
- Command line
-
hf download hf://spaces/mohammed978/teteffd/docs/security.md
-
curl -L -o security.md https://huggingface.co/spaces/mohammed978/teteffd/resolve/main/docs/security.md
3.8 kB
| # Security Model | |
| ## Threat model | |
| | Threat | Mitigation | | |
| |----------------------------------------------|----------------------------------------------------------------------------------| | |
| | Credential stuffing / brute force | bcrypt + account lockout after 8 failures (15 min) | | |
| | Session hijack | Short access TTL (30 min) + refresh rotation + device fingerprint + revoke UI | | |
| | CSRF | Double-submit cookie pattern; `CSRFMiddleware` blocks unsafe w/o header | | |
| | XSS via rich text | `rehype-sanitize` on all markdown + safe Prism highlighter + KaTeX | | |
| | Secret exfiltration to browser | API responses never include `apiKey` plaintext; only `hasApiKey` flag | | |
| | System prompt leakage | Admin-only endpoints; `SystemPromptOut` field names strip content for non-admins| | |
| | SSRF via web search | Only outbound GET to `http(s)` URLs; HTML cleaned, no JS executed | | |
| | Rate limit abuse | Redis fixed-window per (user\|IP) on all sensitive endpoints | | |
| | Mass assignment | Strict Pydantic models; `exclude_none` on updates; `extra=ignore` config | | |
| | Mongo injection | BSON ObjectId validation; no raw `$where`/`$function` | | |
| | Log injection | Structured `structlog` JSON, request ID propagated, secrets redacted in logger | | |
| | TLS downgrade | Nginx forces HSTS, TLS 1.2+ ciphers, HTTP → HTTPS redirect | | |
| | Clickjacking | `X-Frame-Options: DENY` + CSP `frame-ancestors 'none'` | | |
| | Open redirect | Login redirects stay on same origin via Next.js route guards | | |
| | Memory poisoning | Memory items stored per-user; only owners can list/delete; admins audit access | | |
| | Prompt injection | System prompt assembled server-side from admin-curated content + user memory; user message never injected into the system block; tool/function calls not yet exposed | | |
| ## Encryption at rest | |
| - **API keys** stored in `models.encryptedApiKey` as Fernet tokens. | |
| - **System prompts** stored in plaintext (they are not secrets) but **never sent** to non-admin clients. | |
| - **Refresh tokens** stored hashed (sha256) so DB leak does not enable session replay. | |
| ## Transport | |
| - TLS terminated at Nginx; backend listens plain HTTP behind the proxy. | |
| - Cookies: `Secure` (production), `HttpOnly` (refresh), `SameSite=Lax` by default. | |
| - Security headers: CSP, HSTS (1y, includeSubDomains), X-Content-Type-Options=nosniff, X-Frame-Options=DENY, Referrer-Policy=strict-origin-when-cross-origin, Permissions-Policy. | |
| ## Logging | |
| - `structlog` JSON to stdout. | |
| - `x-request-id` propagated from client or generated, returned in response. | |
| - Timing header `x-response-time-ms`. | |
| - `audit_logs` collection is append-only from the application's perspective; only superadmin can soft-archive (out of scope for v1). | |
| ## Rate limiting | |
| - Fixed-window per (user id, IP fallback), configurable via `RATE_LIMIT_PER_MIN`. | |
| - Default 120/min. | |
| - Returns `429` with `Retry-After`. | |
| ## Future hardening (out of scope for v1) | |
| - Argon2id migration path (config flag). | |
| - WebAuthn / passkeys. | |
| - mTLS for admin endpoints. | |
| - Per-IP WAF rules. | |
| - Vector-based prompt-injection classifier on user inputs. | |