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. Sondatclass
(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
veyasetenforce
. - İşlemi yapan kullanıcı:
scontext
(kaynak bağlam) girişi şunu temsil eder: oyuncu, bu örnektermt_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 birchr_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ın
simpleperf
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.