[CRITICAL] Mandantentrennung: 5 History-/Log-Endpoints ohne Tenant-Scope (Cross-Tenant-Leak) #108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Schweregrad: CRITICAL (verifiziert gegen Code @
282b76e)Cluster aus 5 History-/Log-Endpoints ohne Mandanten-Scope. Sie filtern nur nach client-geliefertem
node_nameund haengen anget_current_user— keincheck_node_scope, keinrequire_read. Folge: ein User von Mandant A liest Befehls-Output/Historie von Mandant B; bei leeremnode_namealle Mandanten. Ein read-only-Account genuegt. Die RBAC-Helper (check_node_scope,list_user_accessible_nodes,require_read) existieren bereits und werden anderswo korrekt genutzt — hier fehlen sie.Tracking — Einzel-Issues
GET /api/command/logs— Befehls-STDOUT aller Nodes (output bis 50k)GET /api/audit/commands— CommandLog action/params/output aller TenantsGET /api/updates/history— UpdateLog aller TenantsGET /tunnels/history— Filter nur bei gesetztem Tenant + nach LIMITPOST /port-scan/bulk-bg— aktive Cross-Tenant-Aktion (node_name=null scannt alle)Verifiziert
command_router.py:244,audit_router.py:76,update_router.py:512,tunnel_router.py:203,security_router.py:488— alle ohne Scope bestaetigt.Einheitlicher Fix (Muster)
Tenant-Constraint immer in SQL-WHERE vor LIMIT.
bulk-bg:node_namePFLICHT +check_node_scope; None-Sammelscan nur Superadmin.Akzeptanz
node_name⇒ nur eigene Nodes (Superadmin: alle).Quelle
Code-Review 20.06.2026 (Branch refactor/dashboard-page-split), verifiziert.
Tenant-Scope-Cluster umgesetzt auf Branch
security/tenant-scope-108(off main @282b76e), ein Commit pro Endpoint:GET /api/command/logs—fb12f7d(#109)GET /api/audit/commands—8d1a5cb(#110)GET /api/updates/history—d634f79(#111)GET /tunnels/history—7c68f4b(#112) (beide Bugs: Filter ohne Tenant-Header + Python-Filter nach LIMIT)POST /port-scan/bulk-bg—3a7bc9c(node_name PFLICHT + check_node_scope; None-Sammelscan nur Superadmin)Einheitliches Muster:
list_user_accessible_nodes+require_read(), Tenant-Constraint in SQL-WHERE vor LIMIT.Tests:
c82c98e—server/tests/test_tenant_scope.py, 5 Cross-Tenant-Regressionstests (echtes Postgres, echte ORM-Modelle, keine Mocks). Verifiziert: alle 5 schlagen auf den pre-fix Routern fehl, bestehen auf den gefixten.Einzel-Issues #109–#112 bewusst NICHT automatisch geschlossen — Review durch Sebastian.
Cluster komplett gefixt + getestet, in main & deployed: #109
2608722, #11049d29a4, #111a6e324b, #11267a378a, bulk-bgecc1dd9, Tests3609f17(server/tests/test_tenant_scope.py, 5 Cross-Tenant-Regressionstests). Alle Checkboxen erledigt. Schließe Epic.Verifiziert @
6fabc1f→ kompletter Cluster gefixt, wird geschlossen.Alle 5 Endpoints zeilengenau geprüft — überall
require_read()/require_role+list_user_accessible_nodes, Tenant-Scope in der SQL-WHERE vor LIMIT, leerernode_name⇒ nur eigene Nodes (Superadmin: alle).bulk-bgmit Pflicht-node_name+check_node_scope, kollektiver Scan nur Superadmin.Einzel-Issues #109–#112 ebenfalls geschlossen. Empfehlung: Cross-Tenant-Regressionstests (User-A sieht keine Node-B-Daten) in
server/tests/nachziehen — gehört zu #55.