Medya çerçevesi sertleştirme

Cihaz güvenliğini artırmak için Android 7.0, monolitik mediaserver sürecini, yalnızca her bir işlem için gerekli olanlarla sınırlı izinler ve yeteneklerle birden çok işleme böler. Bu değişiklikler, medya çerçevesi güvenlik açıklarını şu yollarla azaltır:

  • AV işlem hattı bileşenlerini uygulamaya özel korumalı işlemlere bölme.
  • Güncellenebilir medya bileşenlerini etkinleştirme (çıkarıcılar, kodekler vb.).

Bu değişiklikler, medyayla ilgili güvenlik açıklarının çoğunun ciddiyetini önemli ölçüde azaltarak, son kullanıcı cihazlarını ve verilerini güvende tutarak son kullanıcılar için güvenliği de iyileştirir.

OEM'ler ve SoC satıcıları, yeni mimariyle uyumlu hale getirmek için HAL ve çerçeve değişikliklerini güncellemelidir. Özellikle, satıcı tarafından sağlanan Android kodu genellikle her şeyin aynı süreçte çalıştığını varsaydığından, satıcılar, süreçler arasında anlamı olan yerel tanıtıcıları ( native_handle ) dolaşmak için kodlarını güncellemelidir. Ortam sağlamlaştırmayla ilgili değişikliklerin referans uygulaması için, frameworks/av ve frameworks/native native'e bakın.

Mimari değişiklikler

Android'in önceki sürümleri, çok sayıda izne (kamera erişimi, ses erişimi, video sürücüsü erişimi, dosya erişimi, ağ erişimi vb.) sahip tek bir monolitik mediaserver işlemi kullanıyordu. Android 7.0, mediaserver sürecini, her biri çok daha küçük izinler gerektiren birkaç yeni sürece böler:

medya sunucusu sertleştirme

Şekil 1. Medya sunucusu sertleştirmesi için mimari değişiklikler

Bu yeni mimari, bir işlemin güvenliği ihlal edilmiş olsa bile, kötü amaçlı kodun daha önce mediaserver tarafından tutulan izinlerin tamamına erişimi olmamasını sağlar. İşlemler SElinux ve seccomp ilkeleri tarafından kısıtlanır.

Not: Satıcı bağımlılıkları nedeniyle, bazı codec bileşenleri hala mediaserver çalışır ve sonuç olarak mediaserver fazla izin verir. Özellikle mediaserver Classic, Android 7.0 için medya sunucusunda çalışmaya devam ediyor.

MediaServer değişiklikleri

Android 7.0'da mediaserver işlemi, oynatma ve kaydı yönlendirmek, örneğin bileşenler ve işlemler arasında arabellekleri iletmek ve senkronize etmek için mevcuttur. İşlemler, standart Binder mekanizması aracılığıyla iletişim kurar.

Standart bir yerel dosya oynatma oturumunda, uygulama bir dosya tanıtıcısını (FD) mediaserver (genellikle MediaPlayer Java API aracılığıyla) ve mediaserver iletir:

  1. FD'yi, Binder IPC kullanarak dosyadan okumak için kullanan çıkarma işlemine geçirilen bir Binder DataSource nesnesine sarar. (Medya çıkarıcı mediaserver almaz, bunun yerine Binder'ı verileri almak için medya sunucusuna geri çağırır.)
  2. Dosyayı inceler, dosya türü için uygun ayıklayıcıyı oluşturur (örn. MP3Extractor veya MPEG4Extractor) ve çıkarıcı için mediaserver işlemine bir Binder arabirimi döndürür.
  3. Dosyadaki verinin türünü (örn. MP3 veya H.264 verileri) belirlemek için Binder IPC'yi çıkarıcıya çağırır.
  4. Gerekli türde codec bileşenleri oluşturmak için mediacodec sürecine çağrılar; bu kodekler için Binder arayüzlerini alır.
  5. Kodlanmış örnekleri okumak için çıkarıcıya tekrar tekrar Binder IPC çağrıları yapar, kodlanmış verileri kod çözme için mediacodec işlemine göndermek için Binder IPC'yi kullanır ve kodu çözülen verileri alır.

Bazı kullanım durumlarında, hiçbir codec bileşeni dahil değildir (kodlanmış verilerin doğrudan çıkış cihazına gönderildiği, yükten arındırılmış bir oynatma gibi) veya codec bileşeni, kodu çözülmüş verilerin bir arabelleğini (video oynatma) döndürmek yerine doğrudan kodu çözülmüş verileri işleyebilir.

MediaCodecService değişiklikleri

Codec hizmeti, kodlayıcıların ve kod çözücülerin yaşadığı yerdir. Satıcı bağımlılıkları nedeniyle, henüz tüm codec bileşenleri codec sürecinde yaşamamaktadır. Android 7.0'da:

  • Güvenli olmayan kod çözücüler ve yazılım kodlayıcılar codec sürecinde yaşar.
  • Güvenli kod çözücüler ve donanım kodlayıcılar mediaserver yaşar (değişmez).

Bir uygulama (veya medya sunucusu), gerekli türde bir codec bileşeni oluşturmak için codec sürecini çağırır, ardından bu codec'i kodlanmış verileri iletmek ve kodu çözülen verileri almak (kod çözme için) veya kodu çözülen verileri geçirmek ve kodlanmış verileri almak (kodlama için) için çağırır. . Codec bileşenlerine ve codec'lerden veri aktarımı zaten paylaşılan belleği kullanır, bu nedenle işlem değişmez.

MediaDrmServer değişiklikleri

DRM sunucusu, Google Play Filmler'deki filmler gibi DRM korumalı içerik oynatılırken kullanılır. Şifrelenmiş verilerin şifresinin çözülmesini güvenli bir şekilde gerçekleştirir ve bu nedenle sertifika, anahtar depolama ve diğer hassas bileşenlere erişime sahiptir. Satıcı bağımlılıkları nedeniyle, DRM süreci henüz her durumda kullanılmamaktadır.

AudioServer değişiklikleri

AudioServer işlemi, ses girişi ve çıkışı, ses yönlendirmesini belirleyen ilke yöneticisi hizmeti ve FM radyo hizmeti gibi sesle ilgili bileşenleri barındırır. Ses değişiklikleri ve uygulama kılavuzu hakkında ayrıntılar için, bkz. Sesi Uygulama .

Kamera Sunucusu değişiklikleri

CameraServer kamerayı kontrol eder ve kameradan video kareleri elde etmek için video kaydederken kullanılır ve daha sonra işlem için bunları mediaserver iletir. CameraServer değişiklikleri için değişiklikler ve uygulama kılavuzu hakkında ayrıntılar için, Camera Framework Sertleştirme bölümüne bakın.

ExtractorService değişiklikleri

Çıkarıcı hizmeti, medya çerçevesi tarafından desteklenen çeşitli dosya biçimlerini ayrıştıran bileşenleri, ayıklayıcıları barındırır. Çıkarıcı hizmeti, tüm hizmetler arasında en az ayrıcalıklı olanıdır; FD'leri okuyamaz, bunun yerine dosyalara erişmek mediaserver for bir Binder arabirimine (her oynatma oturumu için medya sunucusu tarafından sağlanan) çağrılar yapar.

Bir uygulama (veya mediaserver ), bir IMediaExtractor elde etmek için çıkarıcı işlemine bir çağrı yapar, dosyada bulunan iz için IMediaExtractor almak üzere IMediaSources çağırır ve ardından onlardan veri okumak için IMediaSources çağırır.

Verileri işlemler arasında aktarmak için, uygulama (veya mediaserver ), Bağlayıcı işleminin bir parçası olarak yanıt Parselindeki verileri içerir veya paylaşılan hafızayı kullanır:

  • Paylaşılan belleği kullanmak, paylaşılan belleği serbest bırakmak için fazladan bir Binder çağrısı gerektirir, ancak daha hızlıdır ve büyük arabellekler için daha az güç kullanır.
  • Paket içi kullanmak ekstra kopyalama gerektirir ancak daha hızlıdır ve 64 KB'den küçük arabellekler için daha az güç kullanır.

uygulama

MediaDrm ve MediaCrypto bileşenlerinin yeni mediadrmserver işlemine taşınmasını desteklemek için, satıcılar, arabelleklerin işlemler arasında paylaşılmasına izin vermek için güvenli arabellekler için ayırma yöntemini değiştirmelidir.

Önceki Android sürümlerinde, güvenli arabellekler mediaserver OMX::allocateBuffer tarafından tahsis edilir ve aşağıda gösterildiği gibi aynı işlemde şifre çözme sırasında kullanılır:

Şekil 2. Mediaserver'da Android 6.0 ve alt tampon ayırma.

Android 7.0'da, arabellek ayırma işlemi, mevcut uygulamalar üzerindeki etkiyi en aza indirirken esneklik sağlayan yeni bir mekanizmaya dönüşmüştür. Yeni mediadrmserver işlemindeki MediaDrm ve MediaCrypto yığınları ile, arabellekler farklı şekilde tahsis edilir ve satıcıların güvenli arabellek tutamaçlarını, MediaCodec MediaCrypto üzerinde bir şifre çözme işlemi başlattığında bağlayıcı arasında taşınabilmeleri için güncellemeleri gerekir.

Şekil 3. Mediaserver'da Android 7.0 ve üzeri tampon ayırma.

Yerel tanıtıcıları kullanma

OMX::allocateBuffer , dosya tanımlayıcılarını (FD'ler) ve ek tamsayı verilerini içeren native_handle bir işaretçi döndürmelidir. native_handle , serileştirme/seri hale getirme için mevcut bağlayıcı desteği de dahil olmak üzere FD'leri kullanmanın tüm avantajlarına sahiptir ve şu anda FD kullanmayan satıcılar için daha fazla esneklik sağlar.

Yerel tanıtıcıyı tahsis etmek için native_handle_create() kullanın. Çerçeve kodu, tahsis edilen native_handle yapısının sahipliğini alır ve hem native_handle orijinal olarak tahsis edildiği süreçte hem de seri durumdan çıkarıldığı süreçte kaynakları serbest bırakmaktan sorumludur. Çerçeve, native_handle_close() ve ardından native_handle_delete() native_handle_close() ile yerel tanıtıcıları serbest bırakır ve Parcel::writeNativeHandle()/readNativeHandle() kullanarak native_handle serileştirir/seri hale getirir.

Güvenli arabellekleri temsil etmek için FD'leri kullanan SoC satıcıları, native_handle . FD kullanmayan satıcılar, native_buffer içindeki ek alanları kullanarak güvenli arabellekleri temsil edebilir.

Şifre çözme konumunu ayarlama

Satıcılar, native_handle yeni işlem alanında kullanılabilir hale getirmek için gerekli satıcıya özel işlemleri gerçekleştirmek için native_handle üzerinde çalışan OEMCrypto şifre çözme yöntemini güncellemelidir (değişiklikler genellikle OEMCrypto kitaplıklarındaki güncellemeleri içerir).

allocateBuffer standart bir OMX işlemi olduğundan, Android 7.0, bu desteği sorgulamak için yeni bir OMX uzantısı ( OMX.google.android.index.allocateNativeHandle ) ve yerel tanıtıcıları kullanması gerektiğini OMX uygulamasını bildiren bir OMX_SetParameter çağrısı içerir.