Mam task_struct *
, które otrzymałem pod numerem find_task_by_vpid(get_pid())
. Chciałbym dowiedzieć się, jaki użytkownik jest właścicielem tego procesu, aby móc wykonać pewne sprawdzanie uprawnień w wywołanym wywołaniu systemowym, ale przeglądając kod źródłowy task_struct
niewiele pomógł. Jedyne, co wyglądało na pomocne, to loginuid
, ale z jakiegoś powodu jądro się nie skompiluje, jeśli spróbuję uzyskać do niego dostęp w następujący sposób: my_task_struct->loginuid
. Czy istnieje inny sposób na uzyskanie użytkownika, który wywołał proces z poziomu task_struct
?Czy istnieje sposób, aby dowiedzieć się, który użytkownik jest właścicielem procesu z procesu task_struct procesu?
Odpowiedz
Niestety, identyfikatory użytkowników i grup nie są już przechowywane w strukturze zadania, lecz w osobnej strukturze uprawnień, która jest dynamicznie przydzielana i dzielona między wszystkie zadania, które mają te same identyfikatory. To z kolei stwarza sytuację, w której setuid
może powiedzie się z powodu wyczerpania zasobów i niepowodzenie setuid
do prop przywilejów jest niesławny źródłem luk ...
W każdym razie, to w tych członków task_struct
:
const struct cred __rcu *real_cred; /* objective and real subjective task
* credentials (COW) */
const struct cred __rcu *cred; /* effective (overridable) subjective task
* credentials (COW) */
To naprawdę pomaga. czy wiesz, jak zainicjować, gdzie zainicjowano ten user_struct? – saman
@saman: Nie tak, ale znajdź kod dla 'setuid()' itd. I powinieneś zobaczyć kilka przykładów jak to zrobić. –
@R .. Mogę tylko znaleźć deklarację wywołania systemowego setuid w unistd.h, ale nie mogę znaleźć implementacji tego połączenia systemowego [tutaj] (http://stackoverflow.com/questions/27594865/add-inother -field-to-user-struct) to moje pytanie, czy możesz na nie odpowiedzieć? – saman
Aby uzyskać dostęp do identyfikatora użytkownika (UID) w przestrzeni jądra można zrobić coś wzdłuż następujących linii (jak Linux 4.9.13):
struct task_struct *task;
for_each_process(task) {
uid_t uid = __kuid_val(task_uid(task));
}
task_uid
zwraca strukturę o nazwie kuid_t
i aby uzyskać dostęp do rzeczywistej wartości, musisz zadzwonić pod numer __kuid_val
lub uzyskać do niej bezpośredni dostęp (task_uid(task).val
).
Alternatywnie możesz użyć from_kuid(&init_user_ns, task_uid(task))
.
- 1. Pełna nazwa procesu z task_struct
- 2. Pobranie procesu z danym uchwytem procesu
- 3. Ładowanie procesu jako inny użytkownik?
- 4. Określanie, który szablon procesu TFS jest używany
- 5. Pid procesu, który uruchomił jakiś sygnał
- 6. Jak sprawdzić, który port używa procesu?
- 7. Pobierz "Wiersz poleceń" procesu i argumenty z obiektu procesu?
- 8. "Z wdziękiem" zabijanie procesu
- 9. stos jądra dla procesu linuxowego
- 10. Jak ustalić, czy identyfikator procesu istnieje
- 11. W jaki sposób uzyskać identyfikator procesu według nazwy procesu?
- 12. Czy mogę uzyskać identyfikator procesu procesu roboczego w aplikacji internetowej?
- 13. Czy istnieje sposób zmusić WorkSet procesu do 1GB w C++?
- 14. Jak uzyskać identyfikator PID procesu, który jest podłączony do innego procesu w Bash?
- 15. Określanie pid zakończonego procesu
- 16. wykonywanie procesu z argc = 0
- 17. monitor procesów potomnych procesu
- 18. C#: proces zamykania procesu "zabijanie procesu" (z zadaniem)
- 19. Czy istnieje sposób automatycznego procesu doxygenowania nieudokumentowanego kodu C?
- 20. Sprawdź status procesu
- 21. Jak wyliczyć uchwyt procesu?
- 22. Model procesu minFreeThreads wyjaśnienie
- 23. Kończenie chronionego procesu antywirusowego
- 24. Przyspieszenie procesu kompilacji z distutils
- 25. pid aktualnie wykonywanego procesu
- 26. Poprawa procesu budowania
- 27. Jak mogę uzyskać stdin procesu przez identyfikator procesu?
- 28. Ustal, czy proces istnieje z jego identyfikatora procesu
- 29. Get wartości zwracanej z procesu
- 30. Najlepszy sposób rejestrowania czasu rozpoczęcia procesu?
Spójrz na implementację 'geteuid'. Jednak w przypadku kontroli uprawnień prawie na pewno chcesz użyć istniejącej ogólnej struktury tego typu, zamiast tworzyć własną logikę niezgodną z resztą systemu. – zwol
Używam 'geteuid()', aby uzyskać 'euid' użytkownika, który wywołał wywołanie systemowe, ale nie jestem pewien, jak go użyć, aby uzyskać' uid' (lub 'euid')' task_struct' dla 'pid' przeszedł do samego wywołania systemowego. – Mason