- ChatBubble: useActionSheet replaces custom Modal (native iOS popup, Android bottom sheet) - DM mode (isDM prop): hides like-count, shows Insta-style heart badge under bubble when liked - Group chat unchanged - Cleanup: remove unused Modal/Platform imports, sheet styles, actionsOpen state - deploy.sh: auto-detect ANDROID_HOME + auto-create local.properties for local Gradle - NEXT_RELEASE.md: DM reactions release note - Includes other staged work across binder-mac, marketing, ops/mdm, ios/
6.0 KiB
ReBreak MDM Profiles
Stand 2026-05-26 — NEFilter-Pivot. iOS-Schutz-Architektur in 2 Schichten:
| Schicht | Was | Wie deployed | Removable? |
|---|---|---|---|
| Sideload-Protect | App-Removal-Lock + DNS-Backstop | AirDrop → Settings → Profil installieren | NEIN (Apple Configurator + USB nötig) |
| MDM-Supervised | App-Branch-Signal (NEFilter statt PacketTunnel) | NanoMDM Settings-Command (API-Push) |
JA (User-Enrollment) |
Sicherheit ergibt sich aus der Kombination: wenn der User das MDM-Profile entfernt → App fällt still auf PacketTunnel-Pfad zurück (VPN+FC), App selbst bleibt aber gesperrt (Sideload-Protect-Profile blockt Removal).
Files
rebreak-iphone-protect.mobileconfig (Sideload, non-removable)
Pure Restrictions + DNS. Kein MDM-Payload, kein VPN-Payload.
Payloads:
com.apple.applicationaccess—allowAppRemoval=false,allowEraseContentAndSettings=false,allowUIConfigurationProfileInstallation=falsecom.apple.dnsSettings.managed— DoH zudns.rebreak.org/dns-query(Belt+Suspenders falls NEFilter ausfällt)
Voraussetzung: iPhone supervised mit Apple Configurator 2.
Install-Flow:
- Datei AirDrop ans iPhone
- Settings → Allgemein → VPN & Geräteverwaltung → Profil installieren
- Consent + 6-stelliger Geräte-Code
Entfernung: nur via cfgutil remove-profile über USB-Kabel (Mac + Apple Configurator). Settings.app zeigt kein „Profil entfernen"-Button (PayloadRemovalDisallowed).
rebreak-iphone-take-management.json (NanoMDM, Step 1 von 2)
MUSS VOR rebreak-iphone-mdm-supervised.json gepushed werden — sonst wird der Settings-Command vom System ignoriert.
JSON-Payload für InstallApplication mit ChangeManagementState: Managed. Konvertiert eine bereits via TestFlight/AppStore installierte ReBreak-App in den managed State. Erst dann liefert iOS ManagedAppConfiguration an die App.
Auf supervised Geräten (Apple Configurator): KEIN User-Dialog, läuft silent durch.
rebreak-iphone-mdm-supervised.json (NanoMDM, Step 2 von 2)
JSON-Payload für Settings-Command. Setzt mdmSupervised=true in der App-ManagedAppConfiguration (UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed")).
Wirkung: App's isMdmSupervised()-Helper liest true → activateUrlFilter() startet NEFilterDataProvider statt NEPacketTunnelProvider. KEIN VPN-Eintrag in iOS-Settings, kein User-Toggle.
Vollständiger Push-Flow (NanoMDM)
# Auf rebreak-mdm (178.105.101.137) als root:
ssh rebreak-mdm
# Device-UDID des Test-iPhones (steht im NanoMDM-DB oder Apple Configurator):
DEVICE_UDID="00008140-001A... "
# Step 1: Take Management of existing TestFlight-App
curl -u nanomdm:$NANO_MDM_API_KEY \
-X POST "http://localhost:9000/v1/enqueue/$DEVICE_UDID" \
-H "Content-Type: application/json" \
-d @rebreak-iphone-take-management.json
# Warte ~5-30s bis APNs ankommt + iPhone das Command processed
# Verify: iPhone → Settings → Allgemein → VPN & Geräteverwaltung →
# [MDM-Profil] → 'Verwaltete Apps' → ReBreak listed
# Step 2: Push mdmSupervised=true an die jetzt managed App
curl -u nanomdm:$NANO_MDM_API_KEY \
-X POST "http://localhost:9000/v1/enqueue/$DEVICE_UDID" \
-H "Content-Type: application/json" \
-d @rebreak-iphone-mdm-supervised.json
# Force-Quit ReBreak (App-Switcher → swipe up) und neu starten —
# iOS injiziert ManagedAppConfiguration erst beim nächsten App-Launch.
Apple-Doku:
- InstallApplication: https://developer.apple.com/documentation/devicemanagement/installapplicationcommand
- Settings: https://developer.apple.com/documentation/devicemanagement/settings
Verifikation in der App
Nach Step 2 + Force-Quit-Restart:
- ReBreak öffnen
- Beim Aktivieren des Schutzes: System-Dialog sollte „ReBreak möchte Web-Inhalte filtern" zeigen (NEFilter), NICHT „ReBreak möchte einen VPN konfigurieren"
- Settings → VPN: kein ReBreak-Eintrag
- Settings → Allgemein → VPN & Geräteverwaltung → Filters → ReBreak Content Filter sichtbar (kein User-Toggle, MDM-managed)
Reversal
Step 2 rückgängig: gleiches Settings-Command mit leerer Configuration:
{"RequestType": "Settings", "Settings": [{"Item": "ApplicationConfiguration", "Identifier": "org.rebreak.app", "Configuration": {}}]}
Step 1 rückgängig (App un-manage): RequestType: RemoveApplication mit Identifier: org.rebreak.app — Vorsicht: löscht die App vom Gerät, je nach ManagementFlags. Für nur „un-manage ohne uninstall" gibt's leider keinen sauberen Apple-Pfad — Reinstall via TestFlight reset's auf unmanaged.
Migration vom alten Profile
Das alte rebreak-iphone-protection.mobileconfig (PayloadIdentifier .20260525) kann nach erfolgreicher Migration entfernt werden:
# Auf dem iPhone via cfgutil:
cfgutil --ecid <ECID> remove-profile "org.rebreak.protection.iphone.20260525"
# Dann neues Profile via AirDrop + Settings installieren.
# Plus MDM-Settings-Command pushen für mdmSupervised=true.
Die alte rebreak-iphone-protection.DEV-removable.mobileconfig bleibt für Dev-Testing erhalten.
NanoMDM Enrollment Generator (per-device)
Wenn mehrere iPhones enrollt werden, darf das gleiche Identity-Cert nicht wiederverwendet werden.
NanoMDM blockt das sonst mit cert re-use not permitted (HTTP 500 beim Check-in).
Nutze dafuer den Generator:
ssh rebreak-mdm
cd /srv/rebreak/ops/mdm/profiles
python3 generate-mdm-enrollment-profile.py \
--device-label iphone-olfa \
--template /opt/nanomdm/enrollment/rebreak-enrollment.mobileconfig \
--ca-cert /opt/nanomdm/certs/ca.crt \
--ca-key /opt/nanomdm/certs/ca.key \
--out-dir /opt/nanomdm/enrollment/generated \
--keep-artifacts
Output:
- Neues
.mobileconfigmit frischem PKCS12-Identity-Payload - Neue UUIDs fuer alle Payloads
.meta.txtmit cert-sha256 + p12-Passwort- optional
.key/.csr/.crt/.p12(bei--keep-artifacts)
Wichtig:
.meta.txt,.keyund.p12enthalten sensitive Daten -> auf Server behalten, Rechte600.- Pro Geraet immer ein eigenes generiertes Enrollment-Profil verwenden.