In routers_v1/groups.py binden die Schreib-Endpunkte für Gruppen die zu bearbeitende Schule nicht an die Schule des angemeldeten Nutzers (who.school), sondern übernehmen sie ungeprüft aus Query-Parameter oder Body:
delete_group (L94, L110): active_school = school if school else who.school
create_group (L116, L156): school = group_details.school or who.school
modify_group (L204, L228): dieselbe Zeile
add_members_to_group (L268, L290): active_school = school if school else who.school
remove_members_from_group (L306, L328): dieselbe Zeile
migrate_group (L344, L365): dieselbe Zeile
RoleChecker("GS") prüft nur die Rolle (global-administrator/school-administrator), nicht ob die angefragte school mit who.school übereinstimmt. get_group_or_404(group, active_school) und LMNGroup(group, school=active_school) erhalten who nicht und führen keine Nutzer-Bindung durch.
Ein school-administrator kann dadurch z. B. per DELETE /v1/groups/{group}?school=<andere_schule> oder POST /v1/groups/{group} mit "school": "<andere_schule>" im Body Gruppen einer fremden Schule anlegen, ändern, löschen oder deren Mitglieder verwalten.
Fix: school in diesen Endpunkten fest auf who.school binden für school-administrators (analog zum Muster in passwordconstraints.py, wo school für school-administrators explizit gegen who.school geprüft wird), und nur global-administrators die freie Schulwahl erlauben.
In
routers_v1/groups.pybinden die Schreib-Endpunkte für Gruppen die zu bearbeitende Schule nicht an die Schule des angemeldeten Nutzers (who.school), sondern übernehmen sie ungeprüft aus Query-Parameter oder Body:delete_group(L94, L110):active_school = school if school else who.schoolcreate_group(L116, L156):school = group_details.school or who.schoolmodify_group(L204, L228): dieselbe Zeileadd_members_to_group(L268, L290):active_school = school if school else who.schoolremove_members_from_group(L306, L328): dieselbe Zeilemigrate_group(L344, L365): dieselbe ZeileRoleChecker("GS")prüft nur die Rolle (global-administrator/school-administrator), nicht ob die angefragteschoolmitwho.schoolübereinstimmt.get_group_or_404(group, active_school)undLMNGroup(group, school=active_school)erhaltenwhonicht und führen keine Nutzer-Bindung durch.Ein school-administrator kann dadurch z. B. per
DELETE /v1/groups/{group}?school=<andere_schule>oderPOST /v1/groups/{group}mit"school": "<andere_schule>"im Body Gruppen einer fremden Schule anlegen, ändern, löschen oder deren Mitglieder verwalten.Fix:
schoolin diesen Endpunkten fest aufwho.schoolbinden für school-administrators (analog zum Muster inpasswordconstraints.py, woschoolfür school-administrators explizit gegenwho.schoolgeprüft wird), und nur global-administrators die freie Schulwahl erlauben.