2011-04-18 9 views
6

Pracuję nad aplikacją, która musi używać dd (robię to za pomocą skryptu powłoki w pakiecie aplikacji, który zbiera parametry z samej aplikacji, wykonuje pewne kontrole, a następnie uruchamia dd).NSTask, narzędzia linii poleceń i root

Aby wykonać tę operację, muszę wywołać dd z rootem, a ja już sprawdziłem kilka rozwiązań na StackOverflow. Najprostszy w implementacji wydawał mi się ten jeden problem: mój NSTask wykonuje pewne złożone operacje odczytu/zapisu (nieobecne w STPrivilegedTask) i nie musi być wszystkie uprzywilejowane.

Więc napisałem małe narzędzie pomocnicze wc, które wywołuje mój skrypt z poprawnymi parametrami z mojej aplikacji. Rozwiązaniem, o którym myślałem, jest użycie STPrivilegedTask do SUID po uruchomieniu mojego małego pomocnika, więc mogę uruchomić go (a więc mój skrypt i dd) z rootem, a wkrótce po udanym uruchomieniu ustawię narzędzie pomocnicze na non SUID (i robię to samo, jeśli jakikolwiek błąd na wyjściu z aplikacji, uruchomieniu aplikacji itp., aby był bezpieczniejszy).

Zaimplementowałem go i działa całkiem nieźle, może nie jest idealny, ale myślę, że bycie w tym pakiecie i praca z narzędziem pomocnika w SUID-ie tylko na potrzeby wystrzału są wystarczająco bezpieczne.

Jakieś myśli?

Dzięki!

Odpowiedz

1

Można użyć piaskownicę dla uruchamiając nowy proces w NSTask

sandbox-exec -f <profile> <command> 
sandbox-exec -f my_profile.sb "/bin/dd -if=/dev/disks01 of=/dev/target" 

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/sandbox-exec.1.html

Masz kilka przykładów profil tu

/usr/share/sandbox/ 

Trzeba dać wystarczająco dostępu do pracy, nie próbowałem ani nie sprawdzałem, czego wymaga dd, zacznę od czegoś takiego:

(version 1) 
(deny default) 
(debug deny) 
(import "system.sb") 
(allow file-read-data file-write-data file-ioctl     (regex #"^/dev/.*$")) 
(allow process-exec (literal "/usr/sbin/helper")) 

Aktualizacja: Warto wspomnieć, można użyć sandbox-exec command -p

+1

Hi JSMP starałem system sandbox jak kiedyś w przeszłości, ale to nie to co muszę, wystarczy aby wykonać zadanie jako root (także dla innych poleceń, których potrzebuję, takich jak mount i umount itp.). Ktoś z jakąś sugestią dotyczącą mojego tymczasowego rozwiązania SUID helperTool? Możliwe dziury i alternatywy? – opoloko

+0

Dodałem do tego, że zaimplementowałem w helperTool również kod, który zmienia się z suited na niestosowny na końcu własnego procesu. W ten sposób uzyskuje się SUID z aplikacji, uruchamia skrypt z poprawnymi parametrami i sprawia, że ​​nie jest SUID tuż po automatycznym. Wydaje się, że został dodany krok bezpieczeństwa. – opoloko

+0

Cześć opoloko, widzę, że chcesz tylko zachować bezpieczny plik. Z mojego punktu widzenia nadal jest tak, że użytkownik może zabić aplikację pozostawiając ją z SUID, zanim ją wyłączy. – jsmp