Marshmallow şifrelemesi teknik olarak nasıl çalışır?


14

Marshmallow'u yeni bir güncellemeyle bir Nexus 5'e yükledim. Şifrelemenin çalışma şekli konusunda kafam karıştı. Bilgisayarlarda şifreleme konusunda iyi teknik bilgiye sahibim. Android 6 hakkında benzer bilgiler edinmek istiyorum.

Aşağıdakiler yaptığım ve nasıl kafam karıştı. Fabrika ayarlarına sıfırlama işleminden sonra bir PIN ayarladım ve cihazı şifreledim. Açılışta bana beklenen PIN kodumu istedi. Daha sonra PIN kodunu çıkardım ve cihazı yeniden başlattım. Önyükleme sırasında herhangi bir PIN sormadı, ancak cihaz yine de kurulum menüsünde şifreli olduğunu bildirdi. İkincisi, PIN'in şifre çözme anahtarının kilidini açmasını beklediğim için beni şaşırtan şey.

Sorular:

  • PIN olmadan şifreleme durumunda, şifre çözme anahtarı nereden geliyor? Bir TPM'ye benzer bir çipte saklandığını varsayıyorum, bu doğru mu? Öyleyse, bir bilgisayar korsanının bu anahtarı çipten istemesini ne engeller? Bellenimin karmasını kontrol ediyor mu? Başka herhangi bir şey? Teknik detaylar çok takdir edilecektir.
  • PIN ile şifreleme durumunda, PIN şifre çözme anahtarına erişmek için ekstra bir belirteç olarak kullanılıyor mu? Veya şifre çözme işlemi aynen PIN yokmuş gibi çalışır.

TL; DL cevabı:

Şifre çözme anahtarının kilidi aşağıdakilerin tümü ile açılır:

  • PIN (veya şifre vb.) Veya yoksa varsayılan bir şifre
  • TEE (ayıklanamayan anahtarlar kullanan donanım destekli bir imza üreteci)
  • Bir tuz (kolayca elde edilebilir ancak gökkuşağı tablolarının saldırılarını önler)

Teşekkürler. Lollipop için geçerli olsa da, bildiğim kadarıyla doğru cevap bu. M ve L arasında bir fark olduğunu düşündüm, çünkü L'de şifresiz şifreleme ayarlayabildiğimi veya şifrelemeden sonra PIN'imi kaldırabildiğimi hatırlamıyorum.
marcv81

Yanıtlar:


15

Burada Android Kılavuzundan alıntı yapıyorum , ancak:

NOT:

Kullandığım kaynak doğrudan Marshmallow ile ilgili değil, Lollipop ve üstü ile ilgilidir.

TP: DR

Şimdi OP'nin sorularını yanıtlayacağım. Teknik detaylar takip edilecektir.

  1. Varsayılan şifreleme anahtarı donanım kaynağından (TPM benzer bir çip) ve olarak tanımlanan AOSP varsayılan parola geliyor default_passwordyılında cryptfs.ckaynak dosyası, aşağıya bakın.

  2. Evet, sadece varsayılan değil, herhangi bir şifre bir anahtara yapılır ve TEE adı verilen TPM benzeri bir çipte saklanır ("Güvenilir Yürütme Ortamı" nın kısaltmasıdır, daha fazla bilgi için aşağıya bakın).

  3. Cihazın SoC'sindeki yongalara UART / JTAG erişimi olan bir hacker, TEE anahtarına teknik olarak erişebilir veya özel bir çekirdek bu bilgileri bir hacker'a sızdırabilir. Komplo teorilerindeki bazı 3 harfli ajanslar, üretim cihazlarında bu güvensiz çekirdekleri kullanmak için OEM ile ortaklık kurabilirler, ancak bunun için çok fazla mağaza bırakmam. Daha fazla ayrıntı için yine bu cevabın son bölümüne bakın.

Bir hacker'ın anahtara erişmesini engelleyen tek şey, bunun için gereken çok fazla çaba.

  1. Bellenimin ( Google tarafından "Doğrulanmış Önyükleme" olarak adlandırılır) karma değerini kontrol etmek aslında Lollipop üzerinde ve üstünde varsayılan olarak (ve JellyBean 4.3'ten itibaren kullanılabilir) denilen bir çekirdek modülü tarafından yapılır dm-verity. Ancak, bu şifreleme durumundan bağımsızdır.

Kaynak: AOSP güvenlik kılavuzu burada .

  1. Sistemin şifresini özel bir parola ile çözme işlemiyle ilgili süreç hakkında aşağıya bakın. Size burada sadece kullanıcı şifresinin şifreleme anahtarının hem oluşturulmasında hem de kullanımında yer aldığını söyleyeceğim.

genel bakış

İlk önyüklemede, aygıt rastgele oluşturulan 128 bitlik bir ana anahtar oluşturur ve ardından varsayılan bir parola ve depolanmış tuz ile karıştırır. Varsayılan parola: "default_password" Ancak, sonuçta elde edilen sağlama değeri, ana anahtarı şifrelemek için bir imza karma değeri kullanan bir TEE (TrustZone gibi) aracılığıyla da imzalanır.

Android Açık Kaynak Projesi cryptfs.c dosyasında tanımlanan varsayılan şifreyi bulabilirsiniz .

Kullanıcı cihazda PIN / parolayı veya parolayı ayarladığında, yalnızca 128 bit anahtar yeniden şifrelenir ve saklanır. (ör. kullanıcı PIN / geçiş / kalıp değişiklikleri kullanıcı verileri bölümünün yeniden şifrelenmesine neden OLMAZ.)

Varsayılan şifrelemeyle şifrelenmiş bir cihazı başlatma

Şifrelenmemiş şifreli bir cihazı açtığınızda bu olur. Android 5.0 cihazları ilk önyüklemede şifrelendiğinden, ayarlanmış bir şifre olmamalıdır ve bu nedenle bu varsayılan şifreleme durumudur.

  1. Şifrelenmemiş / şifrelenmemiş verileri algılama

/ Data bağlanamayacağı ve bayraklardan biri encryptableveya forceencryptayarlandığı için Android cihazının şifreli olduğunu tespit edin .

voldayarlar vold.decryptiçin trigger_default_encryptionbaşlar, hangi defaultcryptohizmeti. trigger_default_encryption/ verinin şifreyle veya şifresiz olarak şifrelenip şifrelenmediğini görmek için şifreleme türünü kontrol eder.

  1. Şifreyi çöz / veri

dm-cryptCihazı blok cihaz üzerinde oluşturur, böylece cihaz kullanıma hazır hale gelir.

  1. Montaj / veri

volddaha sonra şifresi çözülmüş gerçek / veri bölümünü bağlar ve yeni bölümü hazırlar. Bu özelliği ayarlar vold.post_fs_data_doneiçin 0ayarlar ve daha sonra vold.decryptiçin trigger_post_fs_data. Bu komutlarının init.rcçalışmasına neden olur post-fs-data. Onlar gerekli dizinleri veya bağlantılar oluşturmak ve sonra koyacaktır vold.post_fs_data_doneiçin 1.

Bir kez voldbu özelliğinde 1 görür, bu özelliğini ayarlar vold.decryptiçin: trigger_restart_framework. Bu init.rc, sınıfta hizmetlerin mainyeniden başlatılmasına ve önyüklemeden bu yana ilk seferde late_start sınıfında hizmetlerin başlatılmasına neden olur .

  1. Çerçeveyi başlat

Şimdi çerçeve şifresi çözülmüş / veri kullanarak tüm hizmetlerini önyükliyor ve sistem kullanıma hazır.

Varsayılan şifreleme olmadan şifreli bir cihazı başlatma

Şifresi ayarlanmış şifreli bir cihazı başlattığınızda olan şey budur. Cihazın şifresi bir pin, desen veya şifre olabilir.

  1. Şifrelenmiş cihazı bir şifre ile tespit etme

Bayrak nedeniyle Android cihazının şifreli olduğunu tespit edin ro.crypto.state = "encrypted"

vold/ data bir parola ile şifrelenmiş olduğu vold.decryptiçin ayarlanır trigger_restart_min_framework.

  1. Tmpfs Dağı

init/ data için verilen ilk bağlama seçeneklerini kaydetmek için beş özellik ayarlar init.rc. voldkripto eşlemesini ayarlamak için şu özellikleri kullanır:

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

ro.crypto.fs_flags (ASCII 8 basamaklı onaltılık sayıdan önce 0x gelir)

  1. Şifre istemek için çerçeveyi başlat

Çerçeve başlar ve vold.decryptayarlandığını görür trigger_restart_min_framework. Bu, çerçeveye bir tmpfs /datadiskte önyükleme yaptığını ve kullanıcı parolasını alması gerektiğini söyler .

Ancak, önce diskin düzgün bir şekilde şifrelenmiş olduğundan emin olunmalıdır. Komutu cryptfs cryptocompleteadresine gönderir vold. voldşifreleme başarıyla tamamlandıysa 0, dahili hatada -1 veya şifreleme başarıyla tamamlanmazsa -2 döndürür. voldBunu, CRYPTO_ENCRYPTION_IN_PROGRESSbayrak için kripto meta verilerine bakarak belirler . Ayarlanmışsa, şifreleme işlemi yarıda kesildi ve cihazda kullanılabilir veri yok.

Bir voldhata döndürürse, kullanıcı arayüzü, cihazı yeniden başlatmak ve fabrika ayarlarına sıfırlamak için kullanıcıya bir mesaj göstermeli ve kullanıcıya bunu yapmak için basması gereken bir düğme vermelidir.

  1. Parola ile verilerin şifresini çözme

cryptfs cryptocompleteBaşarılı olduktan sonra , çerçeve disk şifresini isteyen bir kullanıcı arayüzü görüntüler. UI kontrolleri komutunu göndererek şifre cryptfs checkpwiçin vold. Parola doğruysa (şifresi çözülen /datageçici bir konuma başarıyla monte edilerek ve ardından kaldırılarak belirlenir) vold, şifresi çözülen blok aygıtının adını mülke kaydeder ro.crypto.fs_crypto_blkdevve durum 0'ı kullanıcı arayüzüne döndürür. Şifre yanlışsa, kullanıcı arayüzüne -1 döndürür.

  1. Çerçeveyi durdur

Kullanıcı arabirimi bir kripto önyükleme grafiği oluşturur ve ardından komutla vold çağırır cryptfs restart. voldözelliğini ayarlar vold.decryptiçin trigger_reset_mainneden, init.rcyapmak class_reset main. Bu, mainsınıftaki tüm hizmetleri durdurur ve tmpfs /databu da bağlantısının kaldırılmasını sağlar .

  1. Montaj / veri

volddaha sonra şifresi çözülmüş gerçek /databölümü monte eder ve yeni bölümü hazırlar (ilk sürümde desteklenmeyen silme seçeneği ile şifrelenmişse asla hazırlanmamış olabilir). Bu özelliği ayarlar vold.post_fs_data_doneiçin 0ayarlar ve daha sonra vold.decryptiçin trigger_post_fs_data. Bu init.rconun çalışmasına neden olur post-fs-data commands. Onlar gerekli dizinleri veya bağlantılar oluşturmak ve sonra koyacaktır vold.post_fs_data_doneiçin 1. Bir kez voldgördüğü 1bu özelliğinde, bu özelliğini ayarlar vold.decryptiçin trigger_restart_framework. Bu init.rc, sınıfta hizmetlerin mainyeniden başlatılmasına ve late_startönyüklemeden beri ilk kez sınıfta hizmetlerin başlatılmasına neden olur .

  1. Tam çerçeve başlat

Şimdi, çerçeve tüm hizmetlerini şifresi çözülmüş / veri dosya sistemini kullanarak önyükliyor ve sistem kullanıma hazır.

Şifrelenmiş anahtarı saklama

Şifrelenmiş anahtar kripto meta verilerinde saklanır. Donanım desteği, Güvenilir Yürütme Ortamı (TEE) imzalama özelliği kullanılarak gerçekleştirilir. Önceden, ana anahtarı scrypt, kullanıcının şifresine ve depolanan tuzuna uygulayarak oluşturulan bir anahtarla şifrelemiştik .

Anahtarı kutu dışı saldırılara karşı dayanıklı hale getirmek için, sonuçta ortaya çıkan anahtarı depolanmış bir TEE anahtarıyla imzalayarak bu algoritmayı genişletiyoruz. Elde edilen imza daha sonra bir kez daha uygulanarak uygun bir uzunluk anahtarına dönüştürülür scrypt. Bu anahtar daha sonra ana anahtarı şifrelemek ve şifresini çözmek için kullanılır. Bu anahtarı saklamak için:

  1. Rastgele 16 bayt disk şifreleme anahtarı (DEK) ve 16 bayt tuz oluşturun.
  2. Uygulama scryptkullanıcı şifresi ve 32 baytlık ara anahtar 1 üretmek üzere tuz (IK1) için.
  3. IK1'i donanıma bağlı özel anahtarın (HBK) boyutuna sıfır bayt ile doldurun. Özellikle, biz ped olarak: 00 || IK1 || 00..00; bir sıfır bayt, 32 IK1 bayt, 223 sıfır bayt.
  4. 256 bayt IK2 üretmek için IK1'i HBK ile imzalayın.
  5. Uygulama scrypt32 bayt IK3 üretmek için IK2 ve tuz (aşama 2 ile aynı tuz) için.
  6. IK3'ün ilk 16 baytını KEK ve son 16 baytını IV olarak kullanın.
  7. DEK'i AES_CBC ile, KEK anahtarı ve başlatma vektörü IV ile şifreleyin.

Android N ne olacak? İş arkadaşları şifrelemenin Android 7'nin daha zayıf olduğu varsayımını yapmıştı çünkü cihazın başlangıcı daha önce olduğu gibi korunmuyor ve bu nedenle bir saldırgan öncekinden daha kolay olabilir, bunun doğru olduğunu düşünüyor musunuz?
David

@ Bu sorunun kapsamı dışında olan lütfen Android Nougat hakkında farklı bir soru sorun.
Tamoghna Chowdhury


Kurtarma modunda DATA bölümünün şifresini nasıl çözebilirim? init.recovery ile. <ro.hardware> .rc
Benny

@Benny lütfen bu konuda doğru bir soru sorun
Tamoghna Chowdhury
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.