Skip to content

v5.4.0 — Release A: MQTT-Race-Fix + CSRF + OTA-Stall-Budget - #9

Merged
krobipd merged 1 commit into
mainfrom
fix/audit-release-a
Jun 20, 2026
Merged

krobipd merged 1 commit into
mainfrom
fix/audit-release-a

Conversation

@krobipd

@krobipd krobipd commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Release A — Audit-Fixes (Stabilität + Security), alle auth-frei

Behebt die drei wichtigsten Befunde aus dem internen Correctness- + Security-Audit.

F1 — MQTT-Subscription-Race (A1) + synchroner Publish reißt WDT (A2)

applyDo (Core 1) rief mqtt.subscribe/unsubscribe direkt auf → Data-Race mit der Iteration des lock-freien _topicSubscriptionList im esp-mqtt-Task (CRASH), per CSRF sogar remote auslösbar. Fix: subscribe/unsubscribe laufen nur noch in onMqttConnect (dem einzigen Kontext, der mit der Iteration serialisiert ist); ein Wildcard-Subscribe <prefix>/<dev>/+/set statt pro-Lüfter, Callback parst den Fan-Namen aus dem Topic. Rename/Delete fassen Subscriptions nie mehr an; applyDo marshallt nur publish-only Cleanup/Resync via g_mqttOpQ an Core 0 (löst A2).

F2 — CSRF (SEC-1)

Origin/Referer-Prüfung gegen den Host auf allen state-changing POSTs. curl/native Clients (kein Origin) bleiben erlaubt → /ota-Recovery unberührt; cross-origin Browser-POSTs → 403.

F3 — OTA-Stall-DoS (SEC-3)

Absolutes OTA-Transfer-Budget (5 min) gegen Trickle-Uploads, die den seriellen HTTP-Handler unbegrenzt blockieren (und damit die OTA-Recovery).

Verifiziert

  • Build grün (929.857 B / 70 %), Host-Tests grün.
  • Auf Zielhardware geflasht (v5.4.0): bootet, Anti-Brick committet (ota_pending true→false, kein Rollback), MQTT verbunden, Wildcard-Befehlspfad verarbeitet /set ohne Crash, 4 Lüfter ok, crash_streak:0, Dual-Core-Heartbeats ticken.

Interner Audit-Hintergrund: docs/audit-2026-06-20.md + docs/audit-security-2026-06-20.md (gitignored).

🤖 Generated with Claude Code

F1 (A1+A2): subscribe/unsubscribe nur noch in onMqttConnect; EIN Wildcard-Subscribe
<prefix>/<dev>/+/set statt pro-Luefter -> kein Vektor-Race mit dem esp-mqtt-Task.
applyDo (Core 1) marshallt nur publish-only CLEANUP/RESYNC via g_mqttOpQ an Core 0 (loest A2).
F2 (SEC-1): CSRF Origin/Referer-vs-Host auf state-changing POSTs; curl/OTA unberuehrt.
F3 (SEC-3): absolutes OTA-Transfer-Budget (5 min) gegen Trickle-DoS.
Geflasht+verifiziert auf Geraet: 5.4.0 bootet, Anti-Brick committet, MQTT ok, kein Crash.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@krobipd
krobipd merged commit 91fd15f into main Jun 20, 2026
1 check passed
@krobipd
krobipd deleted the fix/audit-release-a branch June 20, 2026 13:06
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