2015-11-18 29 views
7

Wcześniej napisałem autonomicznego demona, aby uzyskać dostęp do niestandardowego urządzenia (/ dev/mydev0). Patrząc na źródło AOSP, pomyślałem potrzebne polityki konfiguracji w następujących plików, aby to działało:Definicja polityki SELinux dla usługi systemu Android: jak skonfigurować?

nowy plik device.te zawierające:

type mydev_device, dev_type; 

nowy plik mydevsrvc.te zawierający

# service flash_recovery in init.rc 
type mydevsrvc_type, domain; 
type mydevsrvc_type_exec, exec_type, file_type; 

init_daemon_domain(mydevsrvc_type) 

allow mydevsrvc_type mydev_device:chr_file rw_file_perms; 

edytowany file_contexts dodać:

/dev/mydev[0-9]* u:object_r:mydev_device:s0 

edytowany service_contexts dodać:

mydevsrvc     u:object_r:mydevsrvc_type:s0 

i zaczął demona edytując init.flo.rc włączyć te linie:

service mydevsrvc /system/bin/mydevsrvc 
    class main 
    user system 
    group system 
    seclabel u:r:mydevsrvc_type:s0 
    oneshot 

Teraz muszę dostęp do urządzenia w aplikacjach na Androida, więc muszę zmienić demona w produkt usługa systemu Android.

mogę uruchomieniem usługi (gwint) przy użyciu BOOT_COMPLETED intencję, jak wyjaśniono w a previous question

nie jestem w stanie dowiedzieć się, jak skonfigurować polityki SELinux tak, że ta usługa Java jest również w stanie uzyskać dostępu do pliku Dev.

[Aktualizacja] W tym celu kontynuowałem używanie uprzywilejowanego demona. Moja usługa java łączy się z demonem poprzez gniazda. Nie mam lepszego rozwiązania.

+0

W trakcie opracowywania zasad dla tego demona zdałem sobie sprawę, że komponent uruchamiający proces musi skonfigurować domenę procesu. Teraz odkryłem, że init * .rc to miejsce, w którym mogę skonfigurować domenę dla demona. Nie mogłem znaleźć miejsca do skonfigurowania domeny dla usługi Android opartej na języku Java. – GPS

+0

Jeśli ktoś na to patrzy, postanowiłem zachować rodzimego demona z init.rc i komunikować się z nim z mojej nieuprzywilejowanej usługi java poprzez gniazda linuksowe Androida. – GPS

+0

Tutaj masz składnię polecenia "dervice" init.rc https://stackoverflow.com/questions/8905593/whats-language-of-init-rc-in-android –

Odpowiedz

3

I w końcu zorientowali się odpowiedź. Zamieszczam to tutaj, ponieważ na pewno będą SEPolicy podobni do mnie szukający podobnych odpowiedzi.

Do tej pracy potrzebowałem mieć dostęp do pliku urządzenia z mojej aplikacji java, która implementuje moją usługę.

Musiałem dodać następujące reguły w moim katalogu sepolicy, w nowym pliku:

allow system_app mydev_device:chr_file rw_file_perms;

także potrzebne, aby mój serwis app Uruchom w system_app domenie. W tym celu muszę:

  1. Zainstalować w priv_app podczas kompilacji systemu Android.
  2. Podpisać przy użyciu klucza platformy
  3. Zadeklarować wspólny identyfikator użytkownika w manifeście: android.uid.system. Zauważyłem, że bez tego aplikacja działa w domenie platform-app i nie może uzyskać dostępu do mojego pliku urządzenia nawet z odpowiednią zmianą reguły SEPolicy. Nie wiem dlaczego, nie zawracałem sobie głowy debugowaniem.

Może być również możliwe uruchomienie mojej aplikacji Service w domenie mydevsrvc_type. Nie dowiedziałem się, jak to zrobić, i czy to zadziała.

2

Oto krótkie podsumowanie etapów niezbędnych do realizacji SELinux na urządzeniu z Androidem:

Dodaj wsparcie SELinux w jądrze i konfiguracji. Przydziel każdą usługę (proces lub demona) z init własnej domeny. Identyfikacja tych usług za pomocą: Przeglądanie pliku init..rc i znajdowanie wszystkich usług. Badanie ostrzeżeń w formularzu init: Ostrzeżenie! Nazwa usługi wymaga zdefiniowania domeny SELinux; Proszę napraw! w wyjściu dmesg. Sprawdzanie ps -Z | grep init output, aby zobaczyć, które usługi działają w domenie init. Oznacz wszystkie nowe procesy, sterowniki, gniazda itp. Wszystkie obiekty muszą być odpowiednio oznaczone, aby zapewnić ich prawidłową interakcję z obowiązującymi zasadami. Zobacz etykiety używane w AOSP, aby zobaczyć przykłady, jak tworzyć nazwy etykiet. Polityka bezpieczeństwa instytutu, która w pełni obejmuje wszystkie etykiety i ogranicza uprawnienia do absolutnego minimum. Idealnie, OEMs zaczynają od zasad w AOSP, a następnie budują na nich dla własnych dostosowań.

dłużej https://source.android.com/security/selinux/implement.html

+3

Widziałem ten tekst sir. Nie mogłem dowiedzieć się, jak uruchomić usługę Android od init * .rc? Dokładnie jakie linie mogę dodać do init.rc, aby uruchomić moją usługę. Alternatywnie, jeśli uruchamiam usługę przy użyciu BOOT_COMPLETED, w jaki sposób oznaczyć domenę w tej usłudze? – GPS

+0

@ Suzan Mak A Chciałbym również wiedzieć więcej =) – HenriqueMS

0

Ewentualnie dodać linię w pliku ueventd.rc lub konkretnego projektu dać pozwoleniem