Skip to content

fix(security): SOPS-Regel reparieren + Session-Secret fail-closed - #1

Merged
mariogregor merged 1 commit into
mainfrom
fix/security-findings-sops-secret
Aug 4, 2026
Merged

fix(security): SOPS-Regel reparieren + Session-Secret fail-closed#1
mariogregor merged 1 commit into
mainfrom
fix/security-findings-sops-secret

Conversation

@mariogregor

Copy link
Copy Markdown
Collaborator

Behebt zwei Findings aus einem Review des Commits e4b2621 ("non-root securityContext + FLASK_SECRET_KEY via SOPS").

.sops.yaml — ungültige Regex

creation_rules[0].path_regex: ^*.$ ist keine gültige Go-Regex (* ohne vorangehendes Atom → missing argument to repetition operator). Folge: neue Secret-Dateien und sops updatekeys greifen nicht. Das bestehende mayflowerDeploy/production/values.sops.yaml funktioniert nur deshalb, weil die Empfänger bereits in dessen Metadaten stehen — eine Key-Rotation wäre ins Leere gelaufen.

Ersetzt durch \.sops\.ya?ml$, bewusst eng gehalten, damit nicht das ganze Repo als zu verschlüsseln gilt. Trifft die vorhandene Datei und künftige *.sops.yml/*.sops.yaml.

app.py — Session-Secret war fail-open

_load_app_secret() fiel auf os.urandom(32).hex() zurück, sobald FLASK_SECRET_KEY fehlte — auch in Production. Bei einem Tippfehler im values-Merge wäre die App kommentarlos mit einem Zufallskey gestartet: Sessions sterben bei jedem Restart und der Zweck des SOPS-Commits ist still ausgehebelt. Der Docstring forderte das korrekte Verhalten bereits, erzwungen wurde es nicht.

Jetzt fail-closed: bei FLASK_ENV == "production" (dieselbe Bedingung wie bei SESSION_COOKIE_SECURE) und fehlendem oder leerem Secret bricht der Start mit RuntimeError ab. Der Zufalls-Fallback bleibt der lokalen Entwicklung vorbehalten. Der Secret-Wert landet in keiner Meldung und in keinem Log.

Hinweis für das Deployment: Der Start schlägt jetzt fehl, wenn FLASK_SECRET_KEY in Production nicht ankommt. Genau das ist gewollt — vor dem Rollout bitte prüfen, dass das Secret über values.sops.yaml sauber im Pod landet.

Tests

Neu: tests/unit/test_app_secret.py mit 6 Tests — Key gesetzt (mit und ohne Production), fehlender Key in Production, leerer Key in Production, Dev-Fallback nicht deterministisch, und kein Secret-Leak in der Fehlermeldung. Isolation über monkeypatch.setenv/delenv nach dem Muster aus test_app_workers.py.

Volle Unit-Suite: 133 passed.

Nicht in diesem PR

Beim Review fiel zusätzlich auf, dass /api/tests/status und /api/reports/<name> keine Ownership-Prüfung haben — ein Nutzer kann Läufe und Reports anderer abrufen. Bewusst außerhalb des Scopes dieses PRs.

🤖 Generated with Claude Code

Zwei Findings aus dem Review von e4b2621:

.sops.yaml: path_regex `^*.$` ist keine gueltige Go-Regex (`*` ohne
vorangehendes Atom). Neue Secret-Dateien und `sops updatekeys` griffen
dadurch nicht; values.sops.yaml funktionierte nur, weil die Empfaenger
bereits in dessen Metadaten stehen. Ersetzt durch `\.sops\.ya?ml$` —
bewusst eng, damit nicht das ganze Repo verschluesselt wird.

app.py: `_load_app_secret()` war fail-open — fehlte FLASK_SECRET_KEY,
startete die App kommentarlos mit einem Zufallskey. Sessions starben
dann bei jedem Restart und der Zweck des SOPS-Commits war still
ausgehebelt. Jetzt fail-closed: bei FLASK_ENV == "production" und
fehlendem oder leerem Secret bricht der Start mit RuntimeError ab.
Der Zufalls-Fallback bleibt der lokalen Entwicklung vorbehalten; der
Secret-Wert landet in keiner Meldung.

Abgesichert durch tests/unit/test_app_secret.py (6 Tests: Key gesetzt
mit/ohne Production, fehlender und leerer Key in Production, Dev-
Fallback nicht deterministisch, kein Secret-Leak in der Fehlermeldung).
Volle Unit-Suite: 133 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@data-sonarqube

data-sonarqube Bot commented Aug 4, 2026

Copy link
Copy Markdown

Passed Quality Gate passed

Issues

Measures

Project ID: mayflower_UI-Testing-Tool_3e72663b-760e-423c-ad27-1ec99911135b

View in SonarQube

@mariogregor
mariogregor merged commit 4fd3e09 into main Aug 4, 2026
2 checks passed
@mariogregor
mariogregor deleted the fix/security-findings-sops-secret branch August 4, 2026 06:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant