Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Media Framework Güçlendirme

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

  • AV ardışık düzen bileşenlerini uygulamaya özel korumalı işlemlere bölme.
  • Güncellenebilir medya bileşenlerini etkinleştirme (ayıklayıcılar, kodekler, vb.).

Bu değişiklikler ayrıca, medya ile 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 artırır.

OEM'ler ve SoC satıcıları, yeni mimariyle uyumlu hale getirmek için HAL'lerini ve çerçeve değişikliklerini güncellemelidir. Spesifik olarak, satıcı tarafından sağlanan Android kodu genellikle her şeyin aynı işlemde çalıştığını varsaydığından, satıcılar, işlemler arasında anlamı olan yerel tutamaçları ( native_handle ) geçmek için kodlarını güncellemelidir. Ortam sağlamlaştırmayla ilgili değişikliklerin bir referans uygulaması için, frameworks/av ve frameworks/native .

Mimari değişiklikler

Android'in önceki sürümleri, pek çok izinle (kamera erişimi, ses erişimi, video sürücüsü erişimi, dosya erişimi, ağ erişimi vb.) Tek, monolitik bir mediaserver işlemi kullanıyordu. Android 7.0, mediaserver sürecini, her biri çok daha küçük izinler gerektiren birkaç yeni işleme ayırır:

mediaserver sertleştirme

Şekil 1. Ortam sunucusu sertleştirme için mimari değişiklikler

Bu yeni mimari, bir işlem tehlikeye atılsa bile, kötü amaçlı kodun daha önce mediaserver tarafından tutulan tüm izinlere erişememesini sağlar. Süreçler SElinux ve seccomp politikaları ile sınırlandırılmıştır.

Not: Satıcı bağımlılıkları nedeniyle, bazı kodekler hala mediaserver ve sonuç olarak mediaserver gerekenden daha fazla izin verir. Özellikle, Widevine Klasik içinde çalışmaya devam mediaserver Android 7.0 için.

MediaServer değişiklikleri

Android 7.0'da, mediaserver süreci, kayıttan yürütmeyi ve kaydı yönlendirmek için mevcuttur, örneğin, bileşenler ve işlemler arasında arabellekleri geçirmek ve senkronize etmek. İşlemler, standart Binder mekanizması aracılığıyla iletişim kurar.

Standart bir yerel dosya oynatma oturumda, uygulama için bir dosya tanıtıcı (FD) geçer mediaserver (genellikle MediaPlayer Java API üzerinden) ve mediaserver :

  1. FD'yi, çıkarıcı işlemine iletilen ve onu Binder IPC'yi kullanarak dosyadan okumak için kullanan bir Binder DataSource nesnesine sarar. (Mediaextractor FD almak yerine Bağlayıcı geri çağırır yapar, değil mediaserver verileri almak için.)
  2. İnceler dosyası (örneğin MP3Extractor veya MPEG4Extractor) dosyası türü için uygun çıkarıcı oluşturur ve çıkarıcı bir bağlayıcı arabirim verir mediaserver işlemi.
  3. Dosyadaki veri türünü (örneğin MP3 veya H.264 verileri) belirlemek için çıkarıcıya Binder IPC çağrıları yapar.
  4. Gerekli türde codec bileşenleri oluşturmak için mediacodec sürecini mediacodec ; bu codec bileşenleri için Bağlayıcı arabirimlerini alır.
  5. Kodlanmış örnekleri okumak için çıkarıcıya tekrarlanan Bağlayıcı IPC çağrıları yapar, kodlanmış verileri kod çözme için mediacodec işlemine göndermek için Bağlayıcı mediacodec kullanır ve kodu çözülmüş verileri alır.

Bazı kullanım durumlarında, hiçbir kodek dahil edilmez (kodlanmış verilerin doğrudan çıkış cihazına gönderildiği yüksüz oynatma gibi) veya kodek, kodu çözülmüş verilerin bir arabelleğini (video oynatma) döndürmek yerine kodu çözülmüş verileri doğrudan 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şamıyor. 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 (değişmeden).

Bir uygulama (veya mediaserver) gerekli türde bir codec oluşturmak için codec sürecini çağırır, ardından bu codec'i kodlanmış verileri geçirmek ve kodu çözülmüş verileri almak (kod çözme için) veya kodu çözülmüş verileri geçirmek ve kodlanmış verileri almak (kodlama için) için çağırır. . Codec bileşenlerine ve codec bileşenlerinden veri aktarımı zaten paylaşılan belleği kullanır, böylece 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 şifresini güvenli bir şekilde çözer ve bu nedenle sertifika, anahtar depolama ve diğer hassas bileşenlere erişim sağlar. Satıcı bağımlılıkları nedeniyle, DRM süreci henüz tüm durumlarda kullanılmamaktadır.

AudioServer değişiklikleri

AudioServer işlemi, ses girişi ve çıkışı gibi sesle ilgili bileşenleri, ses yönlendirmesini belirleyen politika yöneticisi hizmetini ve FM radyo hizmetini barındırır. Ses değişiklikleri ve uygulama kılavuzu ile ilgili ayrıntılar için Ses Uygulama bölümüne bakın.

CameraServer değişiklikleri

Kameradan gelen video karelerini almak ve daha sonra bunları geçmesine videoyu kaydederken CameraServer kontrolleri kamera ve kullanılır mediaserver nakledilmeye. CameraServer değişiklikleri için değişiklikler ve uygulama rehberliği hakkında ayrıntılar için, bkz. Kamera Çerçevesi Sertleştirme .

ExtractorService değişiklikleri

Ayıklayıcı hizmeti, ortam çerçevesi tarafından desteklenen çeşitli dosya biçimlerini ayrıştıran bileşenler olan çıkarı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 arayüzüne (her oynatma oturumu mediaserver for medya sunucusu tarafından sağlanan) çağrılar yapar.

Bir uygulama (veya mediaserver ) çıkarıcı sürecine yapılan bir çağrı, bir elde etmeyi mümkün kılan IMediaExtractor o, aramalar IMediaExtractor elde etmek IMediaSources parça dosyasında bulunan kalır ve ardından çağırır IMediaSources onlardan veri okumak için.

Verileri süreçler arasında aktarmak için, uygulama (veya mediaserver ), Binder işleminin bir parçası olarak yanıt Parselindeki verileri içerir veya paylaşılan hafızayı kullanır:

  • Paylaşılan hafızayı kullanmak, paylaşılan hafızayı serbest bırakmak için fazladan bir Bağlayıcı çağrısı gerektirir, ancak daha hızlıdır ve büyük tamponlar için daha az güç kullanır.
  • Parsel içi kullanımı fazladan kopyalama gerektirir ancak daha hızlıdır ve 64KB'den küçük tamponlar için daha az güç kullanır.

Uygulama

MediaDrm ve MediaCrypto bileşenlerinin yeni mediadrmserver sürecine 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 mediaserver tarafından OMX::allocateBuffer ve aşağıda gösterildiği gibi aynı işlemde şifre çözme sırasında kullanılır:

Şekil 2. Ortam sunucusunda Android 6.0 ve daha düşük arabellek tahsisi.

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

Şekil 3. Ortam sunucusunda Android 7.0 ve daha yüksek arabellek tahsisi.

Yerel tutamaçları kullanma

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

Yerel tutamacı 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 başlangıçta tahsis edildiği süreçte hem de serileştirilmesinin kaldırıldığı süreçte kaynakları serbest bırakmaktan sorumludur. Çerçeve bültenleri doğal kulplar native_handle_close() , ardından native_handle_delete() ve serializes / deserializes native_handle kullanılarak Parcel::writeNativeHandle()/readNativeHandle() .

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

Şifre çözme konumunu ayarlama

Satıcılar çalışır OEMCrypto şifresini yöntemi güncellemelidir native_handle yapmak için gerekli herhangi satıcıya özgü işlemleri gerçekleştirmek için native_handle yeni işlem alanında kullanılabilir (değişir genelde OEMCrypto kütüphanelere güncellemeler dahil).

As allocateBuffer standart OMX işlemdir, Android 7.0 yeni OMX uzantısı (içerir OMX.google.android.index.allocateNativeHandle bu destek ve bir için sorguya) OMX_SetParameter bildirdiğinde OMX uygulaması bu yerli kolları kullanması gerektiğini çağrı.