fix(api): Origin-Guard — Browser erreichen nur POST /speak von gelisteten Origins
CORS allein verhindert nur das Lesen der Antwort, nicht die Wirkung: Ein POST mit text/plain-Body oder ein Formular-POST geht ohne Preflight raus, und talkd hat den Body trotzdem als JSON gelesen bzw. /mute, /cancel und /mcp ohne Body ausgeführt. Jede Webseite konnte so sprechen, muten und abbrechen. Neue Middleware vor dem Router: Anfragen mit Origin-Header kommen nur als OPTIONS /speak (Preflight, ohne Wirkung) oder POST /speak von gelisteter Origin durch; alles andere ist 403, bevor ein Body gelesen wird. CLI, curl und MCP-Clients senden keinen Origin und sind nicht betroffen. Prozesstests angepasst (ungelistete Origin auf /speak → 403, Steuer- Endpunkte aus dem Browser → 403) und TestBrowserKannNichtSteuern ergänzt, der den Angriff mit simple requests durchspielt und prüft, dass weder Provider noch Mute-State berührt werden. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
8909f37802
commit
46bd507fd8
4 files changed
+132
-20
No files matched your search
@@ -41,7 +41,9 @@ type HandlerConfig struct {
|
||||
}
|
||||
|
||||
// NewHandler liefert die HTTP-Routen des Daemons. Methoden-Bindung per
|
||||
// ServeMux-Muster: falsche Methode → 405, unbekannter Pfad → 404.
|
||||
// ServeMux-Muster: falsche Methode → 405, unbekannter Pfad → 404. Vor dem
|
||||
// Router steht der originGuard (cors.go): Browser-Anfragen (Origin-Header)
|
||||
// erreichen nur POST /speak von gelisteten Origins; alles andere ist 403.
|
||||
func NewHandler(cfg HandlerConfig) http.Handler {
|
||||
h := &handler{
|
||||
queue: cfg.Queue,
|
||||
@@ -63,7 +65,7 @@ func NewHandler(cfg HandlerConfig) http.Handler {
|
||||
mux.HandleFunc("POST /unmute", h.muteEndpoint(false))
|
||||
mux.HandleFunc("POST /mcp", h.serveMCP) // MCP Streamable HTTP (Task 06)
|
||||
mux.HandleFunc("GET /mcp", h.mcpGet) // 405: keine server-initiierten Streams
|
||||
return mux
|
||||
return h.originGuard(mux)
|
||||
}
|
||||
|
||||
// handler ist der interne Zustand der HTTP-Oberfläche.
|
||||
|
||||
Reference in new issue
Block a user