Функция door_cred и информация о клиенте
Функция door_cred и информация о клиенте
На этот раз мы изменим нашу функцию servproc из листинга 15.3, добавив в нее вызов door_cred для получения информации о пользователе. В листинге 15.5 приведен текст новой процедуры сервера; функции main клиента и сервера не претерпевают изменений по сравнению с листингами 15.2 и 15.3.
Листинг 15.5. Процедура сервера, получающая информацию о клиенте
//doors/server4.c
1 #include "unpipc.h"
2 void
3 servproc(void *cookie, char *dataptr, size_t datasize,
4 door_desc_t *descptr, size_t ndesc)
5 {
6 long arg, result;
7 door_cred_t info;
8 /* получение и вывод информации о клиенте */
9 Door_cred(&info);
10 printf("euid = %ld, ruid = %ld, pid = %ld ",
11 (long) info.dc_euid, (long) info.dc_ruid, (long) info.dc_pid);
12 arg = *((long *) dataptr);
13 result = arg * arg;
14 Door_return((char *) &result, sizeof(result), NULL, 0);
15 }
Сначала мы запустим программу-клиент и увидим, что действующий и реальный идентификаторы клиента совпадают, как мы и предполагали. Затем мы сменим владельца исполняемого файла на привилегированного пользователя, установим бит SUID и запустим программу снова:
solaris % client4 /tmp/server4 77 первый запуск клиента
result: 5929
solaris % su вход под именем привилегированного пользователя
Password:
Sun Microsystems Inc. Sun OS 5.6 Generic August 1997
solaris # cd каталог, в котором находится исполняемый файл
solaris # ls –l client4
-rwxrwxr-x 1 rstevens other1 139328 Apr 13 06:02 client4
solaris # chown root client4 смена владельца на привилегированного пользователя
solaris # chmod u+s client4 включение бита SUID
solaris # ls -l client4 проверка разрешений и владельца файла
-rwsrwxr-x 1 root other1 139328 Apr 13 06:02 client4
solaris # exit
solaris % ls -l client4
-rwsrwxr-x 1 root other1 139328 Apr 13 06:02 client4
solaris % client4 /tmp/server477 и еще раз запускаем программу-клиент
result: 5929
Если мы посмотрим, что в это время выводил сервер, то увидим следующую картину:
solaris % server4 /tmp/server4
euid = 224, ruid = 224, pid = 3168
euid = 0, ruid = 224, pid = 3176
Действующий идентификатор пользователя при втором запуске изменился. Значение 0 означает привилегированного пользователя.
Данный текст является ознакомительным фрагментом.