Dm-verity'yi uygulama

Android 4.4 ve sonraki sürümler, isteğe bağlı olanak sağlayan ve şeffaf bir deneyim sağlayan, Bütünlük kontrolü gibi araçlar bulunur. dm-verity, kalıcı rootkit'leri önlemeye yardımcı olur ve cihazların güvenliğinin ihlal edilmesine neden olabilen bir sorun. Bu özelliği, Android kullanıcılarının bir cihazı başlatırken cihazın aynı olduğundan emin olmalarına yardımcı olur. bunu belirten bir e-posta alırsınız.

Kök ayrıcalıkları olan Zararlı Olabilecek Uygulamalar (PHA'lar) şu konumlarda gizlenebilir: kendilerini maskeleyebilirler. Rootlama yazılımı şunları yapabilir: çünkü genellikle algılayıcılardan daha önceliklidir ve “yalan” yapmak için bir yazılım Google Analytics 4'te yer alır.

DV-verity özelliği, bir blok cihaza bakmanıza olanak sağlar. Bu cihaz, katmanı ve beklenen dosya sistemiyle yapılandırma. Bu işlemi, kriptografik bir karma ağacı kullanarak yapar. Her blok için (tipik olarak 4k) varsa bir SHA256 karması vardır.

Karma değerleri sayfa ağacında depolandığından, yalnızca üst düzey "kök" karma değerine güvenilmesi gerekir. Şu kabiliyeti: kriptografik karmayı kırmaya eşdeğer olacaktır. Bu yapının tasviri için aşağıdaki şemaya bakın.

dm-verity-karma-tablo

Şekil 1. dm-verity karma tablosu

Başlatma bölümünde doğrulanması gereken bir ortak anahtar yer alır cihaz üreticisi tarafından harici olarak devre dışı bırakılır. Bu anahtar, imzayı doğrulamak için kullanılır cihazın sistem bölümünün korunduğunu ve değişmedi.

İşlem

dm-verity koruması çekirdekte bulunur. Örneğin, rootlama yazılımı erişimi koruyacaktır. Bu sorunun etkisini azaltmak için: birçok üretici, çekirdeği cihazda yerleşik olarak bulunan bir anahtarla doğrular. Cihaz fabrikadan çıktıktan sonra bu anahtar değiştirilemez.

Üreticiler bu anahtarı ilk düzeyde imzayı doğrulamak için kullanır. bootloader'ı tıklayın. Bu işlem, imzayı sonraki düzeylerde doğrular. uygulama bootloader'ını kullanın ve son olarak da çekirdeğe gidin. Teklif vermek isteyen her üretici, doğrulanmış özelliklerinden başlatma, çekirdeğin bütünlüğünü doğrulamak için bir yönteme sahip olmalıdır. Çekirdeğin doğrulandığı varsayıldığında, çekirdek, bir blok cihaza bakabilir. ve monte edildiğini doğrulayın.

Blok cihazları doğrulamanın bir yolu da, doğrudan bu blokun içeriklerine karma oluşturma işlemi uygulamak ve depolanan bir değere dönüştürebilirsiniz. Ancak bir blok cihazın tamamını doğrulamaya çalışmak uzun zaman alabilir ve cihazın gücünün büyük bir kısmını tüketir. Cihazların ve kullanım öncesinde önemli ölçüde boşalmasını gerektirir.

Bunun yerine, dm-verity engellemeleri tek tek ve yalnızca her biri erişilebilir. Hafızaya okunduğunda bloğa paralel olarak karma oluşturma işlemi uygulanır. Karma ağacı doğruladım. Blok okumak çok pahalı olduğu için, işlemi, bu blok düzeyinde doğrulamanın neden olduğu gecikme göreceli olarak nominal hale getirebilirsiniz.

Doğrulama başarısız olursa cihaz, bloku belirten bir G/Ç hatası oluşturur. okunamıyor. Dosya sistemi bozulmuş gibi görünür. bekleniyor.

Uygulamalar, sonuçta elde edilen veriler olmadan devam etmeyi tercih edebilir. Örneğin, bu sonuçlar, uygulamanın birincil işlevi için gerekli değildir. Ancak, uygulama veriler olmadan devam edemezse başarısız olur.

Yönlendirme hatası düzeltmesi

Android 7.0 ve sonraki sürümler yönlendirme hatası ile dm-verity dayanıklılığını iyileştiriyor düzeltme (FEC) kapsamındadır. AOSP uygulaması, Reed-Solomon hata düzeltme kodunu kullanır ve ve zamanla dikey geçişlerin sayısını azaltarak kurtarılabilecek bozuk blok sayısı. FEC hakkında daha fazla bilgi için bkz. Hata Düzeltme ile Katı Zorunlu Doğrulanmış Başlatma.

Uygulama

Özet

  1. ext4 sistem resmi oluşturun.
  2. Bu resim için karma ağacı oluşturun.
  3. Bu karma ağacı için bir dm-verity tablosu oluşturun.
  4. Tablo oluşturmak için dm-verity tablosunu imzalayın imzası var.
  5. Tablo imzasını ve dm-verity tablosunu paketleyin meta verisine dönüştürmeye ne dersiniz?
  6. Sistem görüntüsünü, doğrulama meta verilerini ve karma ağacını birleştirin.

Chromium Projeleri - Doğrulanmış Başlatma sayfasına göz atın ile ilgili daha fazla bilgi edinin.

Karma ağacı oluşturma

Giriş bölümünde açıklandığı gibi, karma ağacı, dm-verite'nin ayrılmaz bir parçasıdır. İlgili içeriği oluşturmak için kullanılan cryptsetup aracı sizin için bir karma ağacı oluşturalım. Alternatif olarak, burada da uyumlu bir sürüm tanımlanmıştır:

<your block device name> <your block device name> <block size> <block size> <image size in blocks> <image size in blocks + 8> <root hash> <salt>

Karma oluşturma işlemi oluşturmak için sistem görüntüsü, 0. katmanda 4.000'lik bloklara bölünür ve her biri SHA256 karması atandı. Katman 1, yalnızca bu SHA256 karmalarının birleştirilmesiyle oluşturulur 4K bloklara dönüştürerek çok daha küçük bir resim elde ediyor. 2. Katman 2. Katman aynı şekilde Katman 1'in SHA256 karmalarıyla birleştirin.

Bu işlem, önceki katmanın SHA256 karmaları tek bir katmana sığabilene kadar yapılır engelleyebilirsiniz. Bu bloğun SHA256'sını aldığınızda ağacın kök karmasını elde edersiniz.

Karma ağacının boyutu (ve buna karşılık gelen disk alanı kullanımı), doğrulanmış bölümün boyutu. Pratikte, karma ağaçlarının boyutları ve genellikle 30 MB'tan küçüktür.

Bir katmanda, karmalarını içeriyorsa, sonuca ulaşmak için üzerine sıfırlarla 4K olması bekleniyor. Bu, karma ağacının kaldırılmadığını ve yerine boş verilerle tamamlanır.

Karma ağacı oluşturmak için katman 2 karmalarını katmana ait karmalara birleştirin 1. katman 3. katman 2. katmana ve bu şekilde devam eder. Bunların tümünü yaz çıkar. Bunun, kök karmanın 0. katmanına referans vermediğini unutmayın.

Özetle, karma ağacını oluşturmak için genel algoritma aşağıdaki gibidir:

  1. Rastgele bir takviye değer seçin (onaltılık kodlama).
  2. Sistem görüntünüzü 4K bloklara ayırın.
  3. Her blok için (sallı) SHA256 karmasını alın.
  4. Bir seviye oluşturmak için bu karmaları birleştirin
  5. Seviyeyi 0'larla, 4K blok sınırıyla tamamlayın.
  6. Düzeyi karma ağacınızla birleştirin.
  7. 2-6 arasındaki adımları bir sonraki aşamaya kadar kaynak olarak önceki seviyeyi kullanarak tekrar edin. tek bir karmanız var.

Bunun sonucunda, kök karmanız olan tek karma oluşturulur. Bu ve takviye değer dm-verity haritalama tablonuzun oluşturulması sırasında kullanılır.

Dm-verity eşleme tablosu oluşturma

Blok cihazı (veya hedefi) tanımlayan dm-verity eşleme tablosunu oluşturma için karma oluşturma ağacının konumunu görüntüler. Bu eşleme, fstab oluşturma ve başlatma için kullanılır. Tabloda ayrıca, blokların boyutu ve hash_start, karma ağacının başlangıç konumu (özellikle resmin başlangıcındaki blok numarası).

Ayrıntılı bilgi için cryptsetup sürüm hedefi eşleme tablosu alanlarının ayrıntılı açıklaması

Dm-verity tablosunu imzalama

Tablo imzası oluşturmak için dm-verity tablosunu imzalayın. Doğrulama sırasında bölümü varsa önce tablo imzası doğrulanır. Bu işlem, sabit bir konuma yerleştirin. Anahtarlar genellikle üreticilerinin cihazlara otomatik olarak dahil edilecek sabit bir konum.

Bölümü bu imza ve tuş kombinasyonuyla doğrulamak için:

  1. libmincrypt uyumlu biçimde bir RSA-2048 anahtarı /boot bölüm /verity_key adlı yerde Doğrulama için kullanılan anahtarın konumunu belirleme üç yöntem var.
  2. İlgili girişin fstab'ine fs_mgr işaretlerine verify.

Tablo imzasını meta verilerde gruplandırma

Tablo imzasını ve dm-verity tablosunu verim meta verileri olarak gruplayın. Tüm meta veri bloğunun sürümü olduğu için bu blok uzatılabilir. Örneğin daha sonra ikinci bir ya da sıralamayı değiştirebilirsiniz.

Sağlık kontrolü olarak her tablo meta verisi grubuyla bir sihirli sayı ilişkilendirilir yardımcı olan bir araçtır. Uzunluk, ext4 sistemine dahil edildiği için Bu özellik, veri içeriğini değiştirebilirsiniz.

Böylece, doğrulanmamış bir bölümü doğrulamayı seçmemiş olursunuz. Öyleyse, bu sihirli sayı olmadığında doğrulama süreci durdurulur. Bu numara şuna benzer:
0xb001b001

Onaltılık değerdeki bayt değerleri şunlardır:

  • ilk bayt = b0
  • ikinci bayt = 01
  • üçüncü bayt = b0
  • dördüncü bayt = 01

Aşağıdaki şemada, sürüm meta verilerinin dökümü gösterilmiştir:

<magic number>|<version>|<signature>|<table length>|<table>|<padding>
\-------------------------------------------------------------------/
\----------------------------------------------------------/   |
                            |                                  |
                            |                                 32K
                       block content

Bu tabloda bu meta veri alanları açıklanmaktadır.

Tablo 1. Verity meta veri alanları

Alan Amaç Boyut Değer
sihirli sayı fs_mgr tarafından doğruluk kontrolü olarak kullanılmıştır 4 bayt 0xb001b001
sürüm meta veri bloğunun sürümünü oluşturmak için kullanılır. 4 bayt şu anda 0
signature PKCS1.5 dolgulu biçimde tablo imzası 256 bayt
masa uzunluğu dm-verity tablosunun bayt cinsinden uzunluğu 4 bayt
masa daha önce açıklanan dm-verity tablosu tablo uzunluğu baytı
padding 32k uzunluğundaki bu yapının uzunluğu 0 ile 32k arasında 0

Dm-verity'yi optimize etme

Dm-verity'den en iyi performansı elde etmek için şunları yapmanız gerekir:

  • Çekirdekte, ARMv7 ve SHA-2 için NEON SHA-2'yi etkinleştirin uzantıları bulunuyor.
  • Farklı Read-ahead ve prefetch_cluster ile denemeler yapın en iyi yapılandırmalarını ve en iyi uygulamaları bulmalarını sağlar.