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:
Ş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:
- 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.) - 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. - Dosyadaki verinin türünü (örn. MP3 veya H.264 verileri) belirlemek için Binder IPC'yi çıkarıcıya çağırır.
- 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. - 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.