[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Программа, использующая механизм установки идентификатора пользователя

Это программа демонстрирует механизм установки идентификатора
пользователя. Она имеет бит установки идентификатора пользователя и ее
владельцем является владелец файла answer. Так как бит установки
идентификатора пользователя установлен, обучаемые получают право
писать в файл преподавателя.
Сопутствующий протокол вывода показывает, что у программы quiz
установлен бит установки идентификатора пользователя.
6    Открывается файл answer для дозаписи.
10-12     Задается вопрос обучаемым.
13-16     Принимается только ответ a или b.
17   Ответ записывается в файл answer.
Вывод программы, демонстрирующий механизм установки идентификатора
пользователя.
.    Директория, содержащая answer, доступна для записи только
пользователю instr. Никто больше не может создавать или уничтожить там
файлы.
.    Заметим, что владелец instr может читать/писать в файл answer.
Программа quiz имеет бит установки идентификатора пользователя и может
быть выполнена кем угодно. Бит установки идентификатора пользователя
может быть установлен командой chmod~u+s~quiz. Если преподаватель
просмотрит содержимое файла answer после того, как пользователь с
реальным идентификатором 507 закончит исполнение программы quiz, он
увидит, что ответ "пользователя 507" записан в файл answer, писать в
который разрешено только владельцу.
.    Преподаватель просматривает содержимое файла answer.
.    Обучаемый пытается просмотреть содержимое файла answer, а затем
выполняет программу quiz.
ПРОГРАММА, ИСПОЛЬЗУЮЩАЯ МЕХАНИЗМ УСТАНОВКИ ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ

 1 #include <unistd.h>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 main()
 5 {
 6     FILE *fp; static char response;
 7     if((fp = fopen("answer","a+")) == NULL){
 8     fprintf(stderr,"Cannot open answer\n");
 9     exit(1);
10     }
11     printf("When opening a file,\n");
12     printf("which id is checked?\n");
13     printf(" (a)real (b) effective\n");
14     while( response != 'a' && response != 'b'){
15     printf("Answer(a/b)? ");
16     scanf("%c%*c", &response);
17     }
18     fprintf(fp,"%5ld:%c\n", getuid(), response);
19     fclose(fp);
20 }

               Два сеанса работы за двумя терминалами:

$ id                                    $ id
uid=75(instr) gid=21(unixc)             uid=507(stu1) gid=1(other)
$ chmod u+s quiz

$ ls -ld . quiz answer | cut -c1-24,55-  # at both terminals
drwxr-xr-x   1 instr  .
-rw-------   1 instr  answer
-rwsr-xr-x   1 instr  quiz

$ cat answer                            $ cat answer
  511:b                                 cat: cannot open answer
  503:b                                 $ quiz
  505:a                                 When opening a file,
  508:b                                 which id is checked?
                                        (a)real (b) effective
                                        Answer(a/b)? b