Beau ten BergeNeem contact op
Terug naar alle projecten

SovereignOS

Eigen Android-distributie op GrapheneOS

Een securitygerichte Android-distributie voor Google Pixel-toestellen. Ik bouw hem van broncode tot telefoon zelf, onderteken hem zelf en lever de updates zelf. Ik gebruik hem dagelijks op mijn eigen Pixel 10a.

  • Eigen projectPersoonlijk, geen opdracht van iemand anders
  • Actief in ontwikkelingDe broncode is nog niet openbaar
  • Twee Pixels7a om te ontwikkelen, 10a voor dagelijks gebruik
  • GrapheneOSAls basis, de beveiliging blijft intact

Waarom dit project

GrapheneOS is de beste basis voor een privacygerichte Android die ik ken. Ik wilde weten hoe zo'n systeem van binnen werkt en wat je erbovenop kunt bouwen zonder iets zwakker te maken. Daarom werk ik niet met een app, maar met het platform zelf: de broncode, de ondertekening, de boot-keten en de hardware.

Elke nieuwe functie moet aan dezelfde eis voldoen: de beveiliging van GrapheneOS mag er niet zwakker van worden. Wijzigingen houd ik klein, losstaand en gedocumenteerd, zodat een nieuwe GrapheneOS-versie te verwerken blijft.

Uitgangspunten

  • Geen account, geen telemetrie, geen advertentie-ID en geen verbinding met de cloud voor gewoon gebruik.
  • De telefoon werkt normaal zonder AI-model. Een model mag alleen vooraf geregistreerde acties voorstellen en heeft nooit root of een shell.
  • Geen omweg rond integriteitscontroles van banken, betalingen of identiteit.
  • Een claim over compatibiliteit of veiligheid komt pas na herhaalbaar bewijs.

Van broncode tot telefoon

Een build die groen draait bewijst niet dat hij klopt. Elke stap heeft een eigen controle, en een claim telt pas als hij op een echt toestel is gezien.

  1. BroncodeGrapheneOS vanaf een vastgelegde release, met mijn patches als losse, controleerbare pakketten.
  2. BuildOp een eigen buildserver, met vaste versies zodat het resultaat herhaalbaar is.
  3. SigningMet eigen sleutels, in een aparte omgeving die los staat van de buildserver.
  4. Verified bootElke image krijgt een AVB-handtekening. Op de 10a staat de bootloader weer op slot.
  5. Pixel-hardwareEerst geflasht op de 7a, daarna als echte update geïnstalleerd op de 10a.

De updates komen via een eigen updateserver. De Updater-app op de telefoon installeert ze zoals een gewone update, van ondertekening tot installatie op het toestel.

Wat ik erbovenop bouwde

Guardian

Getest op toestel

Een bewaker tegen misbruik van Android-permissies, zoals een app die op de achtergrond je locatie blijft opvragen. Guardian ziet alleen technische metadata van goedgekeurde events, nooit persoonlijke inhoud of exacte locatie.

Acties zijn vooraf geregistreerd, gecontroleerd, gelogd en omkeerbaar. Een antwoord van een model is nooit een commando.

Wat lastig was: op echte hardware bleek Android twee onafhankelijke kanalen te hebben om zulke events te melden. Een watcher die er maar één beluistert mist de helft. Dat zie je niet in een emulator.

Duress Unlock

Getest op toestel

Een tweede PIN schakelt de telefoon stil naar een apart decoy-profiel, terwijl je echte profiel op de achtergrond vergrendeld blijft. Geen dialoog, geen aankondiging. In Instellingen kun je het decoy instellen, wijzigen en weghalen.

Wat lastig was: niet de schakelaar, maar onzichtbaar zijn. Een decoy dat zich net anders gedraagt dan een gewone telefoon van één eigenaar verraadt zichzelf. Ik heb tientallen van zulke kleine verschillen gevonden en dichtgezet, zoals een gebruikerswisselaar die de echte naam liet zien.

Wat nog niet af is: het toetsscherm van het decoy vraagt om Enter, omdat die instelling per gebruiker geldt. Dat verschil wegwerken is een open ontwerpkeuze.

Atlas

Getest op toestel

Een wereldkaart van de bedrijven en landen waarmee je apps verbinden. Atlas kijkt alleen mee en blokkeert niets. De database kent 3.698 diensten en 310 eigenaren. Voor de overige verbindingen laat ik het hostingland en de aanbieder zien, uit open IP-gegevens.

Geschiedenis bewaren is een keuze die je zelf aanzet. Wat van vóór het aanzetten is, wordt nooit geschreven.

Wat lastig was: mijn eigen mutatietests bleken minder te bewijzen dan hun aantallen zeiden. Ik heb ze herschreven tot elke fout die ik opzettelijk inbouwde ook echt werd gevonden.

Identiteit van het toestel

In aanbouw, nog niet op een toestel getest

Apps kunnen zonder gevaarlijke permissie waarden lezen die uniek zijn voor jouw toestel. Ik heb dat gemeten met een testapp in twee apps en vond drie kanalen die overblijven: eigenschappen van het toestel zelf, afwijkingen van ongekalibreerde sensoren en een identiteit per opstart.

De afscherming voor twee van die kanalen is gebouwd en slaagt in de hosttest en de modulebuild. De nieuwe image is gebouwd, maar nog niet op een toestel gezet.

AirPods

Getest op toestel

Batterij, luistermodus, oordetectie met audio-routing en gespreksbewustzijn, zonder Apple-software. Er is een eigen pagina in Instellingen voor de instellingen van het paar.

Wat lastig was: een patch die compileerde, zou het Bluetooth-proces bij het eerste gebruik hebben laten afbreken en de identiteit van het paar naar andere apparaten hebben laten lekken. Dat vond ik pas door elke aanname in de broncode na te lezen. Compileren bewijst niets over wat een mechanisme doet.

App-lade en toetsenbord

Getest op toestel

De app-lade volgt de thema-iconen van het startscherm en groepeert apps in containers die als een matglazen kaart openen. Het toetsenbord heeft een nieuwe vormgeving en een gerepareerde liggende stand.

Schermafbeeldingen

Getest op toestel

Apps krijgen geen melding meer als je een schermafbeelding maakt. Een app met toegang tot je media ziet het opgeslagen bestand nog wel. Dat blijft een bekende grens.

Geheugendruk

Gemeten, effect op dagelijks gebruik nog niet bevestigd

Op de Pixel 10a liep het wisselgeheugen ongeveer 30 seconden na het ontgrendelen vol. De oorzaak is gemeten: veilig starten van apps kost ongeveer 3 GB extra over de circa 90 processen. Dat uitzetten verlaagt een beveiligingsstandaard van GrapheneOS en is dus nooit de oplossing.

In plaats daarvan vergroot ik het gecomprimeerde geheugen naar 100% van het werkgeheugen en begrens ik het aantal gecachte processen. Op de 7a daalde de vraag naar anoniem geheugen bij een limiet van 32 van 4449 naar 3143 MB, met de twaalf recent gebruikte apps nog open. Ik koos 48 om die twaalf zeker te behouden. Op de 10a loopt het wisselgeheugen nu niet meer vol, maar minder afgesloten apps of een hogere snelheid heb ik nog niet aangetoond.

Wat er misging

Een bootloop

Een flashset zonder het bestand dat het flashproces vertelt hoe het de partities bijwerkt, nam een oudere route die één stap oversloeg. Het toestel startte niet meer. Sindsdien vergelijk ik elke flashset met de vorige en de build-uitvoer voordat ik hem doorgeef.

Twee soorten vertrouwen

Verified boot en de ondertekening van een updatepakket zijn twee losse mechanismen. Alleen de AVB-handtekeningen opnieuw zetten loste het vertrouwen van updates niet op. Dat heb ik uitgezocht, vastgelegd en in de ondertekeningsscripts gecontroleerd.

Een groene build

Een build die slaagde, bleek een verplicht onderdeel zonder toestemmingslijst mee te leveren. Sinds die vondst controleert een script voordat ik iets onderteken of flash of alle verplichte pakketten echt in de uitvoer zitten.

Grenzen en wat nog openstaat

Wat dit nog niet is

  • Geen publieke release. Alle broncode staat nog privé.
  • Alleen getest op mijn eigen twee Pixel-toestellen.
  • Geen claim dat dit veiliger is dan GrapheneOS zelf. Het doel is dat niets zwakker wordt.

Wat nog open is

  • De identiteitsafscherming op een toestel testen.
  • Meten of de geheugenwijzigingen echt minder apps afsluiten op de 10a.
  • Het uiterlijk van het decoy-profiel nog dichter bij een gewone telefoon brengen.

Vragen over dit project?

Ik leg graag uit hoe het in elkaar zit, ook de dingen die nog niet werken.