Kryptering af hele disken

Kryptering af hele disken er en proces, hvor alle brugerdata på en Android-enhed krypteres ved hjælp af en krypteret nøgle. Når en enhed er krypteret, krypteres alle data, der er oprettet af brugeren, automatisk, før de overføres til disken, og alle læste data dekrypteres automatisk, før de returneres til den kaldende proces.

Fuld disk-kryptering blev introduceret i Android i 4.4, men Android 5.0 introducerede disse nye funktioner:

  • Skabt hurtig kryptering, som kun krypterer de anvendte blokke på datapartitionen for at undgå, at første opstart tager lang tid. Kun ext4- og f2fs-filsystemerne understøtter i øjeblikket hurtig kryptering.
  • Tilføjede forceencrypt fstab-flaget til at kryptere ved første opstart.
  • Fuldført understøttelse af mønstre og kryptering uden adgangskode.
  • Tilføjede hardwareunderstøttet lagring af krypteringsnøglen ved hjælp af TEE-signeringsmuligheden (Trusted Execution Environment) (f.eks. i en TrustZone). Se Lagring af den krypterede nøgle for at få flere oplysninger.

Forsigtig: Enheder, der er opgraderet til Android 5.0 og derefter krypteret, kan returneres til en ukrypteret tilstand ved en fabriksdatareset. Nye Android 5.0-enheder, der er krypteret ved første opstart, kan ikke returneres til en ukrypteret tilstand.

Sådan fungerer Android-kryptering af hele disken

Android-kryptering af hele disken er baseret på dm-crypt, som er en kernefunktion, der fungerer i blok-enhedslaget. Derfor fungerer kryptering med Embedded MultiMediaCard (eMMC) og lignende flash-enheder, der præsenterer sig for kernen som blok-enheder. Kryptering er ikke mulig med YAFFS, som taler direkte til en råNAND-flashchip.

Krypteringsalgoritmen er 128 Advanced Encryption Standard (AES) med CBC-kobling (cipher-block chaining) og ESSIV:SHA256. Hovednøglen krypteres med128-bit AES via kald til OpenSSL-biblioteket. Du skal bruge 128 bit eller mere til nøglen (256 er valgfrit).

Bemærk: OEM’er kan bruge 128-bit eller mere til at kryptere hovednøglen.

I Android 5.0-udgaven er der fire former for krypteringstilstande:

  • default
  • PIN
  • password
  • pattern

Den første opstart opretter enheden en tilfældigt genereret 128-bit hovednøgle og hasher den derefter med en standardadgangskode og et gemt salt. Standardadgangskoden er: “default_password “Den resulterende hash er dog også signeret via en TEE (f.eks. TrustZone), som bruger en hash af signaturen til at kryptere hovednøglen.

Du kan finde standardadgangskoden defineret i Android Open Source Project cryptfs.cpp-filen.

Når brugeren indstiller pinkoden/passet eller adgangskoden på enheden, er det kun 128-bit-nøglen, der krypteres og gemmes igen. (dvs. ændringer af brugerens PIN-kode/pas/mønster forårsager IKKE genkryptering af brugerdata.) Bemærk, at forvaltede enheder kan være underlagt PIN-kode-, mønster- eller adgangskodebegrænsninger.

Kryptering forvaltes af init og vold.init kalder vold, og vold indstiller egenskaber til at udløse hændelser i init. Andre dele af systemet ser også på egenskaberne for at udføre opgaver som f.eks. at rapportere status, bede om et adgangskode eller bede om fabriksnulstilling i tilfælde af en fatal fejl. For at påkaldekrypteringsfunktioner i vold bruger systemet kommandolinjeværktøjetvdcs cryptfs-kommandoer: checkpw,restart, enablecrypto, changepw,cryptocomplete, verifypw, setfield,getfield, mountdefaultencrypted, getpwtype,getpw og clearpw.

For at kryptere, dekryptere eller slette /data, må /data ikke være monteret. For at kunne vise nogen brugergrænseflade (UI) skal rammen dog starte, og rammen kræver, at /data kører. For at løse dette problem monteres et midlertidigt filsystem på /data, så Android kan anmode om adgangskoder, vise fremskridt eller foreslå en datawipe efter behov. Det medfører dog den begrænsning, at systemet for at skifte fra det midlertidige filsystem til det rigtige /data-filsystem skal stoppe alle processer med åbne filer på det midlertidige filsystem og genstarte disse processer på det rigtige /data-filsystem. For at gøre dette skal alle tjenester være i en af tre grupper: core, main oglate_start.

  • core: Lukkes aldrig ned efter start.
  • main: Lukkes ned og genstartes derefter, efter at diskadgangskoden er indtastet.
  • late_start: Startes ikke før efter, at /data er blevet dekrypteret og monteret.

For at udløse disse handlinger indstilles vold.decrypt-egenskaben til forskellige strenge. for at dræbe og genstarte tjenester er init-kommandoerne:

  • class_reset: Stopper en tjeneste, men tillader, at den genstartes med class_start.
  • class_start: Genstarter en tjeneste.
  • class_stop: Stopper en tjeneste og tilføjer et SVC_DISABLED-flag. Stoppede tjenester reagerer ikke på class_start.

Flows

Der er fire flows for en krypteret enhed. En enhed krypteres kun én gang og følger derefter et normalt opstartsflow.

  • Krypter en tidligere ukrypteret enhed:
    • Krypter en ny enhed med forceencrypt: Obligatorisk kryptering ved første opstart (starter i Android L).
    • Krypter en eksisterende enhed: Brugerinitieret kryptering (Android K og tidligere).
  • Boot en krypteret enhed:
    • Start en krypteret enhed uden adgangskode: Opstart af en krypteret enhed, der ikke har nogen indstillet adgangskode (relevant for enheder, der kører Android 5.0 og nyere).
    • Start af en krypteret enhed med en adgangskode: Opstart af en krypteret enhed, der har en indstillet adgangskode.

Ud over disse strømme kan enheden også mislykkes med at kryptere /data Hver af strømmene forklares i detaljer nedenfor.

Krypter en ny enhed med forceencrypt

Dette er den normale første opstart for en Android 5.0-enhed.

  1. Opdag ukrypteret filsystem med forceencrypt-flag

    /data er ikke krypteret, men skal være det, fordi forceencrypt kræver det. afmontere /data.

  2. Start kryptering af /data

    vold.decrypt = "trigger_encryption" udløser init.rc,hvilket får vold til at kryptere /data uden adgangskode.(Ingen er indstillet, fordi dette skal være en ny enhed.)

  3. Mount tmpfs

    vold monterer en tmpfs /data (ved hjælp af tmpfs-indstillingerne fraro.crypto.tmpfs_options) og indstiller egenskaben vold.encrypt_progress til 0.vold forbereder tmpfs /data til opstart af et krypteret system og indstiller egenskaben vold.decrypt til: trigger_restart_min_framework

  4. Fremkald rammer for at vise fremskridt

    Da enheden stort set ingen data har at kryptere, vil fremskridtslinjen ofte faktisk ikke blive vist, fordi krypteringen sker så hurtigt. SeKrypter en eksisterende enhed for at få flere detaljer om fremskridtsbrugergrænsefladen.

  5. Når /data er krypteret, tages rammen ned

    vold sætter vold.decrypt tiltrigger_default_encryption, hvilket starter tjenestendefaultcrypto. (Dette starter nedenstående flow til montering af en standardkrypteret brugerdata.) trigger_default_encryption kontrollerer krypteringstypen for at se, om /data er krypteret med eller uden adgangskode. Da Android 5.0-enheder krypteres ved første opstart, bør der ikke være indstillet nogen adgangskode; derfor dekrypterer vi og monterer /data.

  6. Mount /data

    init monterer derefter /data på en tmpfs RAMDisk ved hjælp afparametre, som den henter fra ro.crypto.tmpfs_options, som er indstillet i init.rc.

  7. Start framework

    Sæt vold til trigger_restart_framework, somfortsætter den sædvanlige opstartsproces.

Krypter en eksisterende enhed

Det er det, der sker, når du krypterer en ukrypteret Android K- eller tidligere Android-enhed, der er blevet migreret til L.

Denne proces er brugerinitieret og kaldes “inplace-kryptering” ikoden. Når en bruger vælger at kryptere en enhed, sørger brugergrænsefladen for, at batteriet er fuldt opladet, og at vekselstrømsadapteren er tilsluttet, så der er nok strøm til at afslutte krypteringsprocessen.

Varsel: Hvis enheden løber tør for strøm og lukker ned, før den er færdig med at kryptere, efterlades fildata i en delvist krypteret tilstand. Enheden skal fabriksnulstilles, og alle data går tabt.

For at aktivere inplace-kryptering starter vold en løkke for at læse hver sektor i den reelle blokenhed og derefter skrive den til kryptoblok-enheden. vold kontrollerer, om en sektor er i brug, før den læses og skrives, hvilket gør krypteringen meget hurtigere på en ny enhed, der kun har få eller ingen data.

Status for enhed: Indstil ro.crypto.state = "unencrypted"og udfør on nonencrypted init-triggeren for at fortsætte opstart.

  1. Kontroller adgangskode

    UI kalder vold med kommandoen cryptfs enablecrypto inplacehvor passwd er brugerens låseskærmsadgangskode.

  2. Nedtag rammen

    vold kontrollerer for fejl, returnerer -1, hvis den ikke kan kryptere, og udskriver en årsag i loggen. Hvis den kan kryptere, indstiller den egenskaben vold.decrypttil trigger_shutdown_framework. Dette får init.rc til at stoppe tjenesterne i klasserne late_start og main.

  3. Opret en kryptofod
  4. Opret en brødkrummefil
  5. Reboot
  6. Detekterer brødkrummefil
  7. Start kryptering /data

    vold opretter derefter kryptotilknytningen, som opretter en virtuel kryptoblok enhed, der er knyttet til den rigtige blok enhed, men krypterer hver sektor, når den skrives, og dekrypterer hver sektor, når den læses. vold opretter og skriver derefter krypto-metadataene ud.

  8. Mens den krypterer, mount tmpfs

    vold monterer en tmpfs /data (ved hjælp af tmpfs-indstillingerne fra ro.crypto.tmpfs_options) og sætter egenskabenvold.encrypt_progress til 0. vold forbereder tmpfs/data til opstart af et krypteret system og sætter egenskabenvold.decrypt til: trigger_restart_min_framework

  9. Fremkalder rammen for at vise fremskridt

    trigger_restart_min_framework forårsager init.rc til at starte main klassen af tjenester. Når rammen ser, atvold.encrypt_progress er indstillet til 0, fremkalder den fremskridtsbarUI’en, som forespørger om denne egenskab hvert femte sekund og opdaterer en fremskridtslinje.Krypteringssløjfen opdaterer vold.encrypt_progress, hver gang den krypterer en anden procentdel af partitionen.

  10. Når /data er krypteret, opdateres krypto footer

    Når /data er krypteret med succes, sletter vold flag ENCRYPTION_IN_PROGRESS i metadataene.

    Når enheden er succesfuldt låst op, bruges adgangskoden derefter til at kryptere hovednøglen, og krypto footer opdateres.

    Hvis genstarten mislykkes af en eller anden grund, sætter vold egenskabenvold.encrypt_progress til error_reboot_failed, og brugergrænsefladen bør vise en meddelelse, der beder brugeren om at trykke på en knap for at genstarte. Dette forventes ikke nogensinde at forekomme.

Start af en krypteret enhed med standardkryptering

Dette er, hvad der sker, når du starter en krypteret enhed op uden adgangskode.Fordi Android 5.0-enheder krypteres ved første opstart, bør der ikke være noget setpassword, og derfor er dette standardkrypteringstilstanden.

  1. Detekter krypteret /data uden adgangskode

    Detekterer, at Android-enheden er krypteret, fordi /dataikke kan monteres, og et af flagene encryptable ellerforceencrypt er indstillet.

    vold indstiller vold.decrypt tiltrigger_default_encryption, hvilket starter tjenestendefaultcrypto. trigger_default_encryption kontrollerer krypteringstypen for at se, om /data er krypteret med eller uden adgangskode.

  2. Dekrypterer /data

    Opret dm-crypt-enheden over blokenheden, så enheden er klar til brug.

  3. Mount /data

    vold monterer derefter den dekrypterede reelle /data-partition og forbereder derefter den nye partition. Den indstiller egenskabenvold.post_fs_data_done til 0 og indstiller derefter vold.decrypttil trigger_post_fs_data. Dette får init.rc til at køre sine post-fs-data kommandoer. De vil oprette eventuelle nødvendige mappereller links og derefter sætte vold.post_fs_data_done til 1.

    Når vold ser 1 i denne egenskab, sætter den egenskabenvold.decrypt til: trigger_restart_framework. Dette får init.rc til at starte tjenester i klasse main igen og også til at starte tjenester i klasse late_start for første gang siden opstarten.

  4. Start framework

    Nu starter frameworket alle sine tjenester ved hjælp af den dekrypterede /data, og systemet er klar til brug.

Start af en krypteret enhed uden standardkryptering

Dette er, hvad der sker, når du starter en krypteret enhed op, der har et setpassword. Enhedens adgangskode kan være en pinkode, et mønster eller en adgangskode.

  1. Registrer krypteret enhed med adgangskode

    Detekterer, at Android-enheden er krypteret, fordi flagetro.crypto.state = "encrypted"

    vold indstiller vold.decrypt tiltrigger_restart_min_framework, fordi /data er krypteret med en adgangskode.

  2. Mount tmpfs

    init indstiller fem egenskaber for at gemme de oprindelige monteringsindstillinger, der er givet for /data med parametre, der er overført fra init.rc.vold bruger disse egenskaber til at opsætte kryptotilknytningen:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII 8-cifret hextal med 0x foran)
  3. Start rammen for at bede om adgangskode

    Rammen starter op og ser, at vold.decrypt er indstillet tiltrigger_restart_min_framework. Dette fortæller rammen, at den starter op på en tmpfs /data-disk, og at den skal hente brugerens adgangskode.

    Først skal den dog sikre sig, at disken er krypteret korrekt. Den sender kommandoen cryptfs cryptocomplete til vold.vold returnerer 0, hvis krypteringen blev gennemført med succes, -1 ved intern fejl, eller-2, hvis krypteringen ikke blev gennemført med succes. vold bestemmer dette ved at kigge i krypto metadata efter CRYPTO_ENCRYPTION_IN_PROGRESSflaget i krypto metadata. Hvis det er indstillet, blev krypteringsprocessen afbrudt, og der er nousable data på enheden. Hvis vold returnerer en fejl, skal brugergrænsefladen vise en meddelelse til brugeren om at genstarte og fabriksnulstille enheden og give brugeren en knap at trykke på for at gøre det.

  4. Dekrypter data med adgangskode

    Når cryptfs cryptocomplete er lykkedes, viser rammen en brugergrænseflade, der beder om diskadgangskoden. UI’en kontrollerer adgangskoden ved at sende kommandoen cryptfs checkpw til vold. Hvis adgangskoden er korrekt (hvilket bestemmes ved, at det lykkes at montere den dekrypterede /data på et midlertidigt sted og derefter afmontere den), gemmer vold navnet på den dekrypterede blokenhed i egenskaben ro.crypto.fs_crypto_blkdev og returnerer status 0 til UI’en. Hvispasswordet er forkert, returnerer den -1 til UI.

  5. Stop framework

    UI’en opstiller en krypto opstartsgrafik og kalder derefter vold med kommandoen cryptfs restart. vold indstiller egenskabenvold.decrypt til trigger_reset_main, hvilket fårinit.rc til at gøre class_reset main. Dette stopper alle tjenester i hovedklassen, hvilket gør det muligt at afmontere tmpfs /data.

  6. Mount /data

    vold monterer derefter den dekrypterede reelle /data-partition og forbereder den nye partition (som måske aldrig er blevet forberedt, hvis den blev krypteret med wipe-indstillingen, som ikke understøttes i førsteudgaven). Den sætter egenskaben vold.post_fs_data_done til 0 og sætter derefter vold.decrypt til trigger_post_fs_data. Dette fårinit.rc til at køre sine post-fs-data kommandoer. De vil oprette alle nødvendige mapper eller links og derefter sættevold.post_fs_data_done til 1. Når vold ser 1 i denne egenskab, sætter den egenskaben vold.decrypt tiltrigger_restart_framework. Dette får init.rc til at starte tjenester i klasse main igen og også til at starte tjenester i klasselate_start for første gang siden opstarten.

  7. Start full framework

    Nu starter rammen alle sine tjenester ved hjælp af det dekrypterede /datafilesystem, og systemet er klar til brug.

Svigt

En enhed, der ikke kan dekrypteres, kan være fejlbehæftet af flere årsager. Enheden starter med den normale række af trin for at starte op:

  1. Detekter krypteret enhed med en adgangskode
  2. Montér tmpfs
  3. Start ramme for at bede om adgangskode

Men efter at rammen er åbnet, kan enheden støde på nogle fejl:

  • Password matches but cannot decrypt data
  • Brugeren indtaster forkert password 30 gange

Hvis disse fejl ikke løses, skal brugeren opfordres til at slette på fabrikken:

Hvis vold registrerer en fejl under krypteringsprocessen, og hvis ingen data er blevet ødelagt endnu, og rammen er oppe, indstiller vold egenskaben vold.encrypt_progress til error_not_encrypted.Brugergrænsefladen beder brugeren om at genstarte og advarer brugeren om, at krypteringsprocessen aldrig er startet. Hvis fejlen opstår, efter at rammen er blevet revet ned, men før UI’en med statuslinjen er oppe, genstarter vold systemet. Hvis genstarten mislykkes, sætter den vold.encrypt_progress til error_shutting_down og returnerer -1; men der vil ikke være noget til at opfange fejlen. Dette forventes ikke at ske.

Hvis vold registrerer en fejl under krypteringsprocessen, sætter denvold.encrypt_progress til error_partially_encryptedog returnerer -1. Brugergrænsefladen skal derefter vise en meddelelse om, at krypteringen er mislykkedes, og give brugeren en knap til at nulstille enheden fra fabriksindstillingerne.

Lagring af den krypterede nøgle

Den krypterede nøgle gemmes i krypto metadata. Hardware backing er implementeret ved hjælp af Trusted Execution Environment’s (TEE) signeringsfunktion.Tidligere krypterede vi hovednøglen med en nøgle, der blev genereret ved at anvende scryptt på brugerens adgangskode og det lagrede salt. For at gøre nøglen modstandsdygtig over for off-box-angreb udvider vi denne algoritme ved at signere den resulterende nøgle med en lagret TEE-nøgle. Den resulterende signatur omdannes derefter til en nøgle af passende længde ved endnu en anvendelse af scrypt. Denne nøgle bruges derefter til at kryptere og dekryptere hovednøglen. Sådan lagres denne nøgle:

  1. Generer en tilfældig 16-byte disk-krypteringsnøgle (DEK) og 16-byte salt.
  2. Anvend scrypt på brugeradgangskoden og saltet for at fremstille 32-byte mellemliggende nøgle 1 (IK1).
  3. Pad IK1 med nul bytes til størrelsen af den hardwarebundne private nøgle (HBK).Specifikt padder vi som: 00 || IK1 || 00..00; en nulbyte, 32 IK1-byte, 223nulbyte.
  4. Sign paded IK1 med HBK for at producere 256-byte IK2.
  5. Anvend scrypt på IK2 og salt (samme salt som i trin 2) for at fremstille 32-byte IK3.
  6. Brug de første 16 bytes af IK3 som KEK og de sidste 16 bytes som IV.
  7. Krypter DEK med AES_CBC, med nøgle KEK og initialiseringsvektor IV.

Ændring af adgangskode

Når en bruger vælger at ændre eller fjerne sin adgangskode i indstillingerne, sender brugergrænsefladen kommandoen cryptfs changepw til vold, ogvold krypterer diskmasternøglen på ny med den nye adgangskode.

Krypteringsegenskaber

vold og init kommunikerer med hinanden ved at indstille egenskaber. Her er en liste over tilgængelige egenskaber for kryptering.

Vold egenskaber

Egenskab Beskrivelse
vold.decrypt trigger_encryption Krypter disken uden adgangskode.
vold.decrypt trigger_default_encryption Kontroller drevet for at se, om det er krypteret uden adgangskode. hvis det er, dekrypteres det, og det monteres, ellers sættes vold.decrypt til trigger_restart_min_framework.
vold.decrypt trigger_reset_main Sæt af vold til at lukke brugergrænsefladen, der beder om diskens adgangskode.
vold.decrypt trigger_post_fs_data Sæt af vold til at klargøre /data med nødvendige mapper, m.m.
vold.decrypt trigger_restart_framework Stillet af vold for at starte den rigtige ramme og alle tjenester.
vold.decrypt trigger_shutdown_framework Stillet af vold for at lukke den fulde ramme ned for at starte kryptering.
vold.decrypt trigger_restart_min_framework Sæt af vold for at starte en brugergrænseflade med statuslinje for kryptering eller for at anmode om adgangskode, afhængigt af værdien af ro.crypto.state.
vold.encrypt_progress Når rammen starter op, hvis denne egenskab er indstillet, indtræder UI-tilstanden for fremskridtslinjen.
vold.encrypt_progress 0 to 100 UI-tilstanden for fremskridtslinjen skal vise den indstillede procentvise værdi.
vold.encrypt_progress error_partially_encrypted Forløbsbjælkens brugergrænseflade bør vise en meddelelse om, at krypteringen mislykkedes, og give brugeren mulighed for at foretage en fabriksnulstilling af enheden.
vold.encrypt_progress error_reboot_failed Forløbsbjælkens brugergrænseflade bør vise en meddelelse om, at krypteringen er afsluttet, og give brugeren en knap til at genstarte enheden. Denne fejl forventes ikke at opstå.
vold.encrypt_progress error_not_encrypted Progressbar UI bør vise en meddelelse om, at der er opstået en fejl, at der ikke er krypteret eller tabt data, og give brugeren en knap til at genstarte systemet.
vold.encrypt_progress error_shutting_down Progressbar UI kører ikke, så det er uklart, hvem der vil reagere på denne fejl. Og det burde alligevel aldrig ske.
vold.post_fs_data_done 0 Stillet af vold lige før indstilling af vold.decrypt til trigger_post_fs_data.
vold.post_fs_data_done 1 Stillet af init.rc eller init.rc lige efter afslutning af opgave post-fs-data.

init properties

Property Description
ro.crypto.fs_crypto_blkdev Sæt af vold-kommando checkpw til senere brug af vold-kommando restart.
ro.crypto.state unencrypted Stillet af init for at sige, at dette system kører med en ukrypteret /data ro.crypto.state encrypted. Indstillet af init for at sige, at dette system kører med en krypteret /data.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

Disse fem egenskaber indstilles af init, når den forsøger at montere /data med parametre, der er overført fra init.rc. vold bruger disse til at opsætte krypto-tilknytningen.
ro.crypto.tmpfs_options Stilles af init.rc med de indstillinger, som init skal bruge, når tmpfs /data-filsystemet monteres.

Init-handlinger

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.