Bandit performs static analysis on Python source code, identifying common security issues including hardcoded credentials, injection risks, weak cryptography, and unsafe function calls.
Command: bandit -r routes models services utils -f txt -o bandit_report_app.txt
Scope: 25,252 lines across routes/, models/, services/, utils/ | Files skipped: 0 | #nosec suppressions: 0
| Severity | Count | Status |
|---|---|---|
| High | 0 | CLEAR |
| Medium | 0 | CLEAR |
| Low | 16 | False Positives — documented below |
'pass': 'Pass', 'fail': 'Fail'. Bandit detects the string value "Pass" as a possible hardcoded password. These dicts contain no credentials, no tokens, and no secret material of any kind. Confirmed safe.pip-audit scans all Python dependencies declared in requirements.txt against the PyPA advisory database and OSV.dev for known CVEs.
Command: pip-audit
| Package | Version Scanned | CVE | Fix Version | Scope | Status |
|---|---|---|---|---|---|
python-dotenv | 1.2.1 | CVE-2026-28684 | 1.2.2 | Runtime | REMEDIATED — upgraded to 1.2.2 |
pip | 25.0.1 | CVE-2025-8869 | 25.3 | Local Tooling Only | NOT DEPLOYED — local dev tool, not on Render |
pip | 25.0.1 | CVE-2026-1703 | 26.0 | Local Tooling Only | NOT DEPLOYED — local dev tool, not on Render |
pip | 25.0.1 | CVE-2026-3219 | No fix available | Local Tooling Only | NOT DEPLOYED — local dev tool, not on Render |
pip package is the Python package manager used on the development machine only. It is not included in the application's runtime dependencies deployed to Render. CVEs in pip carry no risk to the production application or its users.Safety scans Python dependencies against the Safety DB, a separate advisory database from pip-audit's PyPA source. Cross-scanning with two advisory databases catches CVEs that may appear in one source before the other.
safety scan --key <API_KEY> in the next CI pipeline update.| Tool | Type | Cadence | Advisory Source |
|---|---|---|---|
| Bandit | Static Analysis (SAST) | Before every push to production | CWE / Bandit ruleset |
| pip-audit | Dependency CVE scan | Before every push to production | PyPA Advisory DB / OSV.dev |
| Safety | Dependency CVE scan | After every major sprint | Safety DB (separate advisory) |
| OWASP ZAP | Dynamic scan (DAST) | Before beta user onboards | OWASP attack signatures |
| Semgrep | SAST (Flask-specific rules) | Planned — GitHub Actions CI | Semgrep community rulesets |
| Control | Implementation | Status |
|---|---|---|
| CSRF Protection | Flask-WTF CSRFProtect globally active. Explicit token on every POST form and AJAX request. | ACTIVE |
| Tenant Isolation | All queries enforce company_id at the database query level. No post-fetch access checks. | ACTIVE |
| Authentication | Flask-Login session management. bcrypt password hashing. Invite-based user creation. | ACTIVE |
| Rate Limiting | Flask-Limiter on all unauthenticated public endpoints. Authenticated routes are not rate-limited. | ACTIVE |
| Secret Management | All API keys and credentials via environment variables only. No hardcoded secrets in codebase. | ACTIVE |
| Dependency Scanning | pip-audit run before every production push. python-dotenv CVE-2026-28684 remediated this cycle. | CURRENT |
| Transport Security | HTTPS enforced via Cloudflare. All R2 assets served via CDN-backed custom domain (assets.fixgrid.app). | ACTIVE |
| Permission Model | Role-based permissions with per-company override matrix. Module-level feature flags enforced at route level. | ACTIVE |