SELinux'u doğrulama

Android, OEM'lerin SELinux uygulamalarını test etmesini önemle tavsiye eder ayrıntılı bir şekilde ele alalım. Üreticiler SELinux'u uyguladıkça yeni test amaçlı bir cihaz havuzuna eklemeniz gerekir.

Yeni bir politika uyguladıktan sonra SELinux'un doğru getenforce komutunu vererek cihaz üzerinde kontrol sahibi olmanızı sağlar.

Bu işlem genel SELinux modunu yazdırır: Enforcing veya Permissive. Alıcı: her alan adı için SELinux modunu belirledikten sonra, dosyasını yükleyin veya sepolicy-analyze uygulamasının en son sürümünü uygun (-p) işareti, mevcut /platform/system/sepolicy/tools/.

Okuma retleri

Olay günlükleri olarak dmesg öğesine yönlendirilen hataları kontrol edin logcat ve cihazda yerel olarak görüntülenebilir. Üreticileri bu cihazlarda dmesg için SELinux çıkışını incelemeli ve İzinli modda ve nihai geçişte herkese açık olarak yayınlanmadan önce ayarları hassaslaştırın uygulamaya geçelim. SELinux günlük iletileri avc: içerir ve bu nedenle grep ile kolayca bulunabilir. Devam etmekte olan cat /proc/kmsg çalıştırarak ret günlüklerini çalıştırın veya ret günlüklerini yakalayın. önceki başlatıldıktan sonra cat /sys/fs/pstore/console-ramoops.

SELinux hata mesajları, bataklıktan kaçınmak için önyükleme tamamlandıktan sonra hız sınırlaması yapar günlükler. Alakalı tüm mesajları görmek için bu ayarı devre dışı bırakabilirsiniz. adb shell auditctl -r 0 çalıştırarak kontrol edin.

Bu çıkış sayesinde üreticiler, sistem kullanıcılarının veya sorunların ne zaman bileşenleri SELinux politikasını ihlal ediyor. Üreticiler daha sonra veya her ikisinde birden yapılan değişiklikler nedeniyle bu kötü davranışa neden olabilir.

Özellikle, bu günlük mesajları hakkında daha fazla bilgi edineceksiniz. Örnek:

avc: denied  { connectto } for  pid=2671 comm="ping" path="/dev/socket/dnsproxyd"
scontext=u:r:shell:s0 tcontext=u:r:netd:s0 tclass=unix_stream_socket

Bu çıkışı şu şekilde yorumlayın:

  • Yukarıdaki { connectto }, yapılan işlemi gösterir. Sonda tclass (unix_stream_socket), kabaca ne yapıldığını anlatıyor neye benzetebiliriz. Bu durumda, bir unix akış yuvasına bağlanmaya çalışılıyordu.
  • scontext (u:r:shell:s0), işlemi hangi bağlamın başlattığını gösterir. İçinde Bu örnekte, kabuk olarak çalışan bir şey söz konusudur.
  • tcontext (u:r:netd:s0), işlemin hedefinin bağlamını belirtir. İçinde Bu örnekte, netd kuruluşuna ait bir unix_stream_socket olabilir.
  • En üstteki comm="ping" gösterilen şey hakkında ek bilgi verir. ret işleminin oluşturulduğu anda çalışır. Bu örnekte oldukça iyi bir ipucudur.

Başka bir örnek:

adb shell su root dmesg | grep 'avc: '

Ses çıkışı:

<5> type=1400 audit: avc:  denied  { read write } for  pid=177
comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0
tcontext=u:object_r:kmem_device:s0 tclass=chr_file

Bu reddin temel unsurları şunlardır:

  • İşlem: Yapılmak istenen işlem köşeli parantez içinde vurgulanır read write veya setenforce.
  • İşlemi yapan kullanıcı: scontext (kaynak bağlam) girişi şunu temsil eder: oyuncu, bu örnekte rmt_storage arka plan programıdır.
  • Nesne: tcontext (hedef bağlam) girişi, (bu örnekte kmem).
  • Sonuç: tclass (hedef sınıf) girişi, türü belirtir bu örnekte bir chr_file (karakter cihazı).

Kullanıcı ve Kernel Yığınlarını Dökme

Bazı durumlarda, olay günlüğünde bulunan bilgiler, reddinin kaynağını gösterir. Çekirdek ve teslimat dahil olmak üzere çağrı zincirinin bir araya getirilmesi Reddedilme işleminin neden gerçekleştiğini daha iyi anlamak için kullanıcı alanına

Son çekirdekler, avc:selinux_audited adlı bir izleme noktası tanımlar. Android kullan Bu izleme noktasını etkinleştirmek ve çağrı zincirini yakalamak için simpleperf.

Desteklenen yapılandırma

  • Linux çekirdeği >= 5.10, özellikle Android Common Kernel dalları mainline ve android12-5.10 desteklenir. android12-5.4 şube de destekleniyor. İzleme noktasınınsimpleperf cihazınızda tanımlı: adb root && adb shell simpleperf list | grep avc:selinux_audited. Diğer çekirdek sürümlerinde dd81662 ve 30969bc.
  • Hata ayıklamakta olduğunuz etkinliği yeniden oluşturabilirsiniz. Başlatma süresi etkinlikleri Simpleperf kullanılarak desteklenir. ancak yine de tetiklemek için hizmeti yeniden başlatabilirsiniz. etkinliği tıklayın.

Çağrı zincirini yakalama

İlk adım, etkinliği simpleperf record kullanarak kaydetmektir:

adb shell -t "cd /data/local/tmp && su root simpleperf record -a -g -e avc:selinux_audited"

Ardından, ret işlemine neden olan etkinlik tetiklenir. Bundan sonra kayıt durdurulabilir. Bu örnekte, Ctrl-c kullanılarak örnek yakalanmış olmalıdır:

^Csimpleperf I cmd_record.cpp:751] Samples recorded: 1. Samples lost: 0.

Son olarak, simpleperf report, yakalanan yığın izlemeyi incelemek için kullanılabilir. Örneğin:

adb shell -t "cd /data/local/tmp && su root simpleperf report -g --full-callgraph"
[...]
Children  Self     Command  Pid   Tid   Shared Object                                   Symbol
100.00%   0.00%    dmesg    3318  3318  /apex/com.android.runtime/lib64/bionic/libc.so  __libc_init
       |
       -- __libc_init
          |
           -- main
              toybox_main
              toy_exec_which
              dmesg_main
              klogctl
              entry_SYSCALL_64_after_hwframe
              do_syscall_64
              __x64_sys_syslog
              do_syslog
              selinux_syslog
              slow_avc_audit
              common_lsm_audit
              avc_audit_post_callback
              avc_audit_post_callback

Yukarıdaki çağrı zinciri, birleştirilmiş çekirdek ve kullanıcı alanı çağrı zinciridir. Bu sayede daha iyi önce kullanıcı alanından çekirdeğe kadar başlayarak kod akışının bir görünümünü sunar. kullanıcı ret işlemi gerçekleşir. simpleperf hakkında daha fazla bilgi için bkz. Simpleperf Yürütülebilir komut referansı

Daha az kısıtlayıcı moda geçiliyor

SELinux'u zorunlu kılma, userdebug veya eng derlemelerinde ADB aracılığıyla devre dışı bırakılabilir. Bunun için, ilk önce adb root çalıştırarak ADB'yi köke değiştirin. Ardından, SELinux'u devre dışı bırakmak için yaptırım, çalıştırma:

adb shell setenforce 0

Alternatif olarak, çekirdek komut satırında (cihazın erken başlatılması sırasında):

androidboot.selinux=permissive
androidboot.selinux=enforcing

Alternatif olarak Android 12'de bootconfig üzerinden:

androidboot.selinux=permissive
androidboot.selinux=enforcing

control2allow özelliğini kullanma

audit2allow aracı dmesg ret alır ve bunları ilgili SELinux politika ifadelerine dönüştürür. Dolayısıyla, hızlandırdı.

Bu özelliği kullanmak için şu komutu çalıştırın:

adb pull /sys/fs/selinux/policy
adb logcat -b events -d | audit2allow -p policy

Bununla birlikte, reklamlarınızın başarısına katkısı olabilecek her bir bu bilgilerden yararlanabilirsiniz. Örneğin, audit2allow adlı kullanıcıya Daha önce gösterilen rmt_storage reddi şu sonucu verir: önerilen SELinux politika ifadesi:

#============= shell ==============
allow shell kernel:security setenforce;
#============= rmt ==============
allow rmt kmem_device:chr_file { read write };

Bu işlem, rmt ürününün çekirdek belleğine veya göze çarpıyor. audit2allow ifadeleri genellikle yalnızca bir bir başlangıç noktası olabilir. Bu ifadeleri kullandıktan sonra dönüşüm hunisinin üst kısmındaki ve hedefin etiketini yapılandırmanın yanı sıra, alan adını makrolarının kullanılmasıdır. Bazen incelenmekte olan ret kararı hiçbir politika değişikliğine neden olmadı. bunun yerine rahatsız edici uygulamayı değiştirilmelidir.