[<<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