Dm-verity uygulayın

Android 4.4 ve sonraki sürümler, blok cihazların şeffaf bütünlük kontrolünü sağlayan isteğe bağlı device-mapper-verity (dm-verity) çekirdek özelliği aracılığıyla Doğrulanmış Başlatma'yı destekler. dm-verity, root ayrıcalıklarını koruyabilen ve cihazların güvenliğini ihlal edebilecek kalıcı rootkit'lerin önlenmesine yardımcı olur. Bu özellik, Android kullanıcılarının cihazı açtıklarında cihazın en son kullanıldığındaki durumda olduğundan emin olmalarını sağlar.

Kök ayrıcalıklarına sahip Potansiyel Zararlı Uygulamalar (PHA'lar), tespit programlarından gizlenebilir ve kendilerini başka şekilde maskeleyebilir. Köklendirme yazılımı, genellikle algılayıcılardan daha ayrıcalıklı olduğu için bunu yapabilir. Bu da yazılımın algılama programlarına "yalan söylemesine" olanak tanır.

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

Karma oluşturma değerleri bir sayfa ağacında depolandığından, ağacın geri kalanını doğrulamak için yalnızca üst düzey "kök" karma oluşturma değerine güvenilmelidir. Bloklardan herhangi birini değiştirmek, kriptografik karmanın kırılmasıyla eşdeğerdir. Bu yapının gösterimi 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, ilgili karma oluşturma işleminin imzasını doğrulamak ve cihazın sistem bölümünün korunduğunu ve değiştirilmediğini onaylamak için kullanılır.

İşlem

dm-verity koruması çekirdekte bulunur. Bu nedenle, köklendirme yazılımı çekirdek başlatılmadan önce sistemi tehlikeye atarsa bu erişimi korur. 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. Çekirdek doğrulanmışsa bir blok cihazı inceleyebilir ve monte edildiği sırada doğrulayabilir.

Bir blok cihazı doğrulamanın bir yolu, içeriğini doğrudan karma oluşturmak ve depolanan bir değerle karşılaştırmaktır. 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 başlatılması uzun sürer ve daha sonra kullanımdan önce pilleri önemli ölçüde boşalır.

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 oluşturma işlemi daha sonra ağaçta doğrulanır. Ayrıca, bloğu okumak çok pahalı bir işlem olduğundan bu blok düzeyinde doğrulamanın neden olduğu gecikme nispeten önemsizdir.

Doğrulama başarısız olursa cihaz, bloğun okunamadığını belirten bir G/Ç hatası oluşturur. Beklenen gibi, dosya sisteminin bozulduğu görülüyor.

Uygulamalar, elde edilen veriler olmadan devam etmeyi seçebilir (ör. bu sonuçlar uygulamanın birincil işlevi için gerekli olmadığında). Ancak uygulama, veriler olmadan devam edemezse başarısız olur.

İleriye doğru hata düzeltme

Android 7.0 ve sonraki sürümler, ileri hata düzeltmesi (FEC) ile dm-verity'nin sağlamlığını artırı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 görüntüsü 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 Verity meta verilerine bağlayın.
  6. Sistem görüntüsünü, doğrulama meta verilerini ve karma ağacını birleştirin.

Karma ağacı ve dm-verity tablosunun ayrıntılı açıklaması için Chromium Projeleri - Doğrulanmış Başlatma başlıklı makaleyi inceleyin.

Karma ağacı oluştur

Giriş bölümünde açıklandığı gibi, karma ağacı dm-verity'nin ayrılmaz bir parçasıdır. cryptsetup aracı sizin için bir karma ağacı oluşturur. Alternatif olarak, uyumlu bir sürüm burada 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ı. 1. katman, yalnızca bu SHA256 karmalarının 4K bloklar halinde birleştirilmesiyle oluşturulur. Bu da çok daha küçük bir resim elde edilmesini sağlar. 2. Katman 2. Katman aynı şekilde Katman 1'in SHA256 karmalarıyla değiştirin.

Bu işlem, önceki katmanın SHA256 karma değerleri tek bir bloğa sığana kadar devam eder. Bu bloğun SHA256 değerini aldığınızda ağacın kök karmasına sahip olursunuz.

Karma ağacının boyutu (ve karşılık gelen disk alanı kullanımı), doğrulanan bölümün boyutuna göre değişir. Pratikte karma ağaçlarının boyutu genellikle küçüktür (genellikle 30 MB'tan az).

Bir katmanda, önceki katmanın karma oluşturma işlemleriyle doğal olarak tamamen doldurulmamış bir blok varsa beklenen 4K'ya ulaşmak için bu bloğu sıfırlarla doldurmanız gerekir. Bu sayede, karma ağacının kaldırılmadığını ve bunun yerine boş verilerle doldurulduğunu anlayabilirsiniz.

Karma oluşturma ağacını oluşturmak için 2. katman karmalarını 1. katman karmalarıyla, 3. katman karmalarını 2. katman karmalarıyla vb. birleştirin. Tüm bunları diske yazın. 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 tuz (on altılık kodlama) seçin.
  2. Sistem görüntünüzü 4K bloklara ayırın.
  3. Her blok için (tuz eklenmiş) SHA256 karmasını alın.
  4. Bir seviye oluşturmak için bu karma oluşturma işlemlerini birleştirin
  5. Seviyeyi 4k blok sınırına kadar 0 ile doldurun.
  6. Seviyeyi karma ağacınızla birleştirin.
  7. 2-6 arasındaki adımları bir sonraki aşamaya kadar kaynak olarak önceki düzeyi kullanarak tekrar edin. tek bir karmanız var.

Bunun sonucunda tek bir karma oluşturma işlemi gerçekleşir. Bu, kök karmanızdır. Bu değer ve tuzunuz, dm-verity eşleme tablonuzun oluşturulması sırasında kullanılır.

dm-verity eşleme tablosunu 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ı).

Verity hedef eşleme tablosu alanlarının ayrıntılı açıklaması için cryptsetup bölümüne bakın.

Dm-verity tablosunu imzalayın

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, önyükleme görüntünüzde sabit bir konumdaki bir anahtara göre yapılır. Anahtarlar genellikle sabit bir konumdaki cihazlara otomatik olarak dahil edilmeleri için üreticilerin derleme sistemlerine dahil edilir.

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

  1. /verity_key adresindeki /boot bölümüne libmincrypt uyumlu biçimde bir RSA-2048 anahtarı ekleyin. Karma ağacını doğrulamak için kullanılan anahtarın konumunu belirleyin.
  2. İlgili girişin fstab'ine fs_mgr işaretlerine verify.

Tablo imzasını meta veriler olarak gruplandırma

Tablo imzasını ve dm-verity tablosunu verity meta verilerine bağlayın. Meta veri bloğunun tamamı, ikinci bir imza türü eklemek veya bazı sıralamaları değiştirmek gibi genişletilebilir olması için sürümlendirilir.

Sağlık kontrolü olarak her tablo meta verisi grubuyla bir sihirli sayı ilişkilendirilir yardımcı olan bir araçtır. Uzunluk, ext4 sistem resmi başlığına dahil edildiğinden, verilerin içeriğini bilmeden meta verileri aramanın bir yolu sağlanır.

Bu sayede, doğrulanmamış bir bölümü doğrulamayı seçmemiş olursunuz. Bu durumda, bu sihirli numaranın olmaması doğrulama sürecini durdurur. Bu sayı 0xb001b001 değerine benzer.

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

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

Aşağıdaki şemada, Verity meta verilerinin dökümü gösterilmektedir:

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

Bu tabloda söz konusu meta veri alanları açıklanmaktadır.

Tablo 1. Meta veri alanlarını doğrulama

Alan Amaç Boyut Değer
sihirli sayı fs_mgr tarafından doğrulama kontrolü olarak kullanılı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 baytları
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:

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