2012-10-27 12 views
7

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?

+1

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

+0

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

Odpowiedz

7

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) */ 
+0

To naprawdę pomaga. czy wiesz, jak zainicjować, gdzie zainicjowano ten user_struct? – saman

+0

@saman: Nie tak, ale znajdź kod dla 'setuid()' itd. I powinieneś zobaczyć kilka przykładów jak to zrobić. –

+0

@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

0

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)).

Powiązane problemy