Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
��� �������� �������� �� ��������� ������: English  Castellano  Deutsch  Francais  Nederlands  Indonesian  Russian  

[image of the authors]
����� Frédéric Raynal, Christophe Blaess, Christophe Grenier

�� ������:

Christophe Blaess - ����������� ������� �� �����������. �� ���������� Linux � ������ ������� ����� ����� ������ �� ���� �������. �������� ������������ ��������� man �������, ����������� Linux Documentation Project.

Christophe Grenier - ������� 5 ����� � ESIEA, ��� �� ����� �������� ����������. �������� ���������� ������������ �������������.

Frédéric Raynal ���������� Linux �� ����������������� �������� ���������(����������� � ��.). ����� ����, �� ������ ���������� Dancer in the Dark : ������ Bjork ������� �����������, ���� ����� �� ����� �������� ��� ����������� (� �� ���� ������� ������ �� ������� �����, ������������ ������������ � �������������).


����������:

 

��� �������� ��� � ������������ ��� ���������� ���������� - ����� 1

[article illustartion]

������:

������ ������ - ������ �� ����� ������ � �������� ����� ��� � ������������ � �����������. �� ������� �������, ��� �������� �� ������� ������� ���� �������� ������������.



 

��������

�� �������� � ���� ������ ��� � ������ ����������, ������� �������� ������ ����������� ������������� Linux, ������� ���� � ������������, �����������, ��������, ���������� ������������ ����� root. �������� �� �������� �������� ����������� �� ���� ����������, ���������� ������������ ��������� ���� �������: ��� �� ������ ��������� ������� ����� ��������� ������������ ���������� ���������. ����������� ��������� ���� ���������� - ���� �������, ������ ��������� ��������������, ������ �������� ������� ��������� ���������� ����� ����. ����� ����, ����������� �������� �������� ���������� ��������� ������� � ����, �������� ��, �� ������ ����� ������ ���������.

��� ��������� ������������ ������ ������� � ������ �������, ����������� ��������� ������������, � ����������� ���������� �������, ���������� � ���� �������. ������������ ����� ���� �������� �������� �������� ������� ������������, ��� ��� ��������� ��� � ������������ � ������ - ������ ������ ����������� ��. �� ���������� ���������� ��������� "������������" ������� ��������� �������� � ����� ������, ��� ��������� ����. �� �� ����� �������� � ��������� ������� ������������, ��� ��� ��� ����� ��������� ��-�� ������ � ������������ (������������ ������� cgi-bin, ...) ��� ��-�� ������ � �������, ����������� ��������� ����� DOS-����(Denial Of Service - ����� � ������������), ����� ������ ��������� ������� �� ����� ��������. ��� �������� - ������ ���������� � ������������� ����. ������ � ����������� ���������� ������ �������� ���, ��� ������ ��������� �������� ������ � ������� ������ ������������. ��������� ������ pine, acroread, netscape, access,... ����� ����������� ������ � ���������� ��� ���������� ������ ���������� ��� ��������� ��������. �� ��������, ������������ ���������������� - ������ �������.

������ ���� ������ ���������� ������, ������� ����� ���� ������������ ��� ����������� Unix �������. �� ����� �� ������ ��������� � ��� ��� ������� ���� ����, ������ �� ������������ ������ �����������, ����� ���� ����� �������� ����. ����� �������, ��� ������� ��������� ��� ��� ���������� �����, �� ������� ������ ��� ��������� ��� ������. ��� ������������ ������ ����, �� ����� �������������� ������ �������. ����� �������� � ��������� ������� �� ������. �����, �� ������� ��� �������� ��. ��� ������� ������� �� ����� ������������ ���� � ������������ �� ��� ��� �������������� � ������ ���������������� ���������� �����������.

� ������ - ������ - ������ �������������� �� �������, ������ ��� �������� ��� � ������������: ���������� � ������������ � ������ Set-UID � Set-GID. ����� �� ����������� ���� ���������� �� ������� system(), ��� ��� ��� ������ ��� ���������.

�� ����� ����� ������������ ��������� ��������� �� ��, ����� �������� ��, � ��� �� �������. ������ �������, �������� � ������ �������, ��������� � � ������ ������ ����������������: perl, java, ������� shell... ��������� ���� � ������������ ������� �� �����, ������ ��� �� ������ ���, ��� �� � ������ ��� ������������ system().

 

����������

� Unix ������� ������������ �� �������� �������������, �� �� ����� � ��� ����������. ������ � ����� �������� ������� - � �������������� ������� ����������� ������ - ������� �� �������� �������� �� ������������. ��������� ������������� ��������� ����������� ������ �������������� �������� ��� ����������� ������� � ���������� ���������. �����, ��������� UID (User Identifier - ������������� ������������) ��������� ����������� �������������. ����� ��������� �������, ��� ������������ ������������� ����� �����. ��� ����� ����������� � ����� /etc/passwd.

UID ������ 0 � ������ �� ��������� root, ����� ������ ������ � �������. �� ����� ���������, ��������, ������� ����� ��������� ����, �� ����� ����� �������� ���������� ������������ ������, ����������� �������, �������������� ������� ���������� � ������ �� ������������ (IP �����) ��� ������ ��������� ������ ����� ��� mlock() ��� ���������� ���������� ������� ��� sched_setscheduler() ��� ��������� ��������� �����������. � ����� �� ��������� ������ �� ������ � ������������ Posix.1e, ������� ��������� ������������ ���������� ����������, ������������ ��� root, �� ������ ����� ������������, ��� ����������������� ������������ ����� ������ ��� ��� ������ �� ������.

�����, � ������� �� ����� ��������, ���� ����� ����������, �� ���� ������������������ ������������ �� ������ �������� �������� ����������, ������� � ���� ���. � ������ �������, ������� ����� - ���� ����� �������, �� ���������� ���� ���������� ������������ � ������, ������ � ������� ��� ��� ��������.

����� ������������ ������������ ������� ������������, �� ���� ����������� ����� � ������� ��� ���, ����� ��� ������� ����� ����������� ����������������� � �����������, ���������� � UID ������. ����� ���������� - ������� - �������� ��� Linux, ��� ����� ������ ������������ ����������������. ��-������ ��������� ����� �������, ���������� RUID (Real UID - �������� UID), ������� ������������� ID ������������, ������������ ���. ���� ��������� ��������� ���� � ������ �� �� ����� ���� �������. ������ ������� ��������� ����������: ���� EUID (Effective UID - ����������� UID) - ��� ��������� �� �������� ���� ��� ���������� ������� ������� (�������� ������, ����������������� ��������� ������).

�������� ���������� ������� ������������ - ������ ����������� ��� �������� ��� ��� UID, � �� ��� ��������� UID. �����������, �������� �������� �������� ID root-�, ������ ������ ������ ������� ������ ����� ������������ �������, ��� ������ ��� ��� ���� ������ � ��������� ���������� (news, mail, lp...) ��� ������ ��� ��������� ������ ������ ���������� (�����, ������ ����� � �.�.) ��� �� ��� ����� ������������� ��� ������� ����������� ������������, ��������, ���� �� ������ �����.

����� ��������� ���������� � ������������, ��� ����������� UID ������� �� ��������� (UID ������������, ������� �������� ���), ����������� ���� ������ ����� ������������� ����������� ���, ���������� Set-UID. ���� ��� ���������� � �������� ���� ������� ����� (����� ��� � ���� ����������, ������, ������ ��� ������������, ������ ������ � ��������� �������������) � ����� ������������ �������� 4000. ��� Set-UID ����������� ������ s ��� ����������� ���� � ������� ������� ls:

>> ls -l /bin/su
-rwsr-xr-x  1 root  root  14124 Aug 18  1999 /bin/su
>>

������� "find / -type f -perm +4000" ���������� ������ ��������� ����������, ��� Set-UID � ������� ���������� � 1. ����� ���� ��������� ��������� � ������������ ����� Set-UID, ��� ���������� UID ��������� ��������� � �������� EUID ��������. � ������ �������, RUID �� ���������� � ������������� ������������, ������������ ���������. ��������, ����� ������������ ����� ����� ������ � ��������� /bin/su, �� ��� ����������� � ������� ��������� (root) � ������� ������������ � �������. ������� ��������, ��� ���� ���� ���������� ��� ��������� ��������� � ���� ���������.

������ ������� ����� ����� ����������� ID ������, EGID, � �������� ������������� RGID. ��� Set-GID (������������ 2000) � ������ ������� ������������ �����, ������� ����, ��� ���� ������������ ������ ��������� ����� ��� EGID, � �� GID ������������, ������������ ���������. ���������� ���������� ��������� ������ ��� Set-GID ������������� � 1, �� ��� ���� ���������� ��� ������. ���������� ��� ����������, �� ������� ������ ������ � ������������, ������������ � �����������, ������ �����������, ��� ���� ����� ���� ������������ �������� fcntl(fd, F_SETLK, lock). ������ ���������� �� ���������� ��� Set-GID, ������ ��������� � �����. ��������, ��������� ���� ���������� ��� ��� ���������� ������ ����������� � ��������� �������.

 

���� ���� � ��������� ������

���� ��������� ���� ���� �� �������. ������� �� ������ ��������� ������� ������� ������ �� ����������. ������ ��� ��������� ��������� ��������� ��� ������� ��������� ����������. ������ ��� ���� ������� �� ������������ ������, ��� ���� ���������� ����������� ���������� ����� ���������� ����. ���������, ������ �������� ��� ����� ������� �� �������� ��������� (race condition) - ���������� ������� ����� ����� ������������, � ������� �������� ���������� ��������� ��������� (������ ����) � �� ����� ��� ���������� �������, ��� �� ������� ��� ��.

������ ��� ���� ���� ������ �������� ��������� ��������� ��������� � ������������ ��������� ����������, � �� ����� ��� ������ ��� ������� �� ��������� ���� ������ �� ���������� ��������� �����. ������ �� ������ ������ �������� ����������� ������ ������ ������� (������ �����, ������, ���� ������� /etc/shadow, ���������������������� ����� ���� � /proc).

����� ���� � �������� �������� ��������� � ������������ ����� Set-UID (��� Set-GID). ������ ����� ����� ����� ����������� �� ����� ���������� ��������� ��� ID �������� �� ID ������������. ������� ����� ����� �������� ������������ ��������� ������. ����� - ����������, ������ ����������� ��� ��������, ������������� � ���� ��� ������������ ���������, ������� ������ ����������������� ������ ��� ������ ������������. �������� ����� lpd ��������� ������ ������������ �������� �������� �� �������, sendmail - ��������� � �������������� ����������� �����, ��� apmd - ����������� � Bios ������ ������� ������������ ����������. ��������� ������ ��������� ������ � �������� �������������� �� ���� (Ftp, Http, Telnet... �������). ������, ���������� inetd, ��������� ������������ ������ �� ���� ��������.

�� ����� ������� �����, ��� ��������� ����� ���� ���������, ��� ������ ��� ��������������� - ���� ����� ����� - � ������������� �������� �� ������������ ���. ��� ���������� ���������� ������ ����, �� ������ ���� ��������� � ������� � �����, ������� ���������� ��� ������������� ������� � ������� �� ����� ����� ��������.

 

��������� ������ ����������

����� ���������� ����������� � EUID �������� �� ��� RUID, ��� ������������� ������������ ����������, ������� ��� �����, �� ������� � ���� ��� (������ � �����, ����������������� ��������� �����...). ������ ������ ���������� ����� ������ �� ����� �������� �����, �������� ��� �������� �����, � ��������� ����� ���������� ����� ����������� � ������������ ������ ������������. �������� ��������� ��������� EUID ���������� ��� ������ ���������� ������:

  int seteuid (uid_t uid);
������� ������ ����� �������� �������� ������ EUID � ��������� ��� �������� RUID. � ���� ������ ������ UID �������� � ��������� �����, ���������� SUID (Saved UID - ����������� UID), �� ������ � SID (Session ID - ID ������), ������� ������������ ��� �������������� � ����������� ����������. ������ �������� ������� ����� SUID � �������� EUID. �����������, ��������� � ������� EUID (root) ����� ������ �� ������� ��� ���� EUID ��� � RUID (����� ������� �������� /bin/su).

����� ��������� ���� ����, ���������� ������ EUID � ������������ ������ ���� RUID ������������. ����� ����� ���� ��������� ���������� ��������� �����, �������� ��������� ����������� UID � EUID. ��� ������:

  uid_t e_uid_initial;
  uid_t r_uid;

  int
  main (int argc, char * argv [])
  {
    /* ��������� ��������� UID-� */
    e_uid_initial = geteuid ();
    r_uid = getuid ();

    /* ������������ ����� ������� �� ���� ������������,
     * ������������ ��������� */
    seteuid (r_uid);
    ...
    privileged_function ();
    ...
  }

  void
  privileged_function (void)
  {
    /* ���������� ����� ��������� ���������� */
    seteuid (e_uid_initial);
    ...
    /* ����� ����, ������� ����� ���������� */
    ...
    /* ����� � ������ ������������, ������������ ��������� */
    seteuid (r_uid);
  }

������ ����� ������� ���������� ��� � ��������� ������������, ��������� � ������������� ���������� EUID, � ����� � ���������� ���������� ���������� ����� "�����������" ����������. ������, ������ ���������� ���������� ���������� ��� ������ �� ������������ ������. ��� �� ������ � ��������� ������, ��� ����� �������� ��������� ���������� ��������� ���� ����������, ������� ����� ��������� ��������� ������, ������ ��� ��������� ������ ����������. � ���-���� ������ ������ �������� �� ������ ������� ������ � ����������� �������� ���������.

 

���������� ������� ������

���������� ����� ����� ������� �����-���� ������� ��������� ������. ������ ��������� ������ ��������� � ������� mail, ��������������� ��� ���������� ����������� ������ (����� � ����������, ��������� ������, ���������� � �.�.) ��� ���������� ����� ������� ������ � �������� ��������. ���������� ������� - ������������ ������������ ������� :

  int system (const char * command)
 

��������� ������������� ������� system()

������ ������� ����� ������: ��� �������� �������� ��� ���������� �������, ���������� �� ��� ��������. ��������� �������� ������� �� ������� ������������. �������� ������ ��������� ��� ������������ ���������� ��������� PATH. ��������� �� ���������� ���������� ������� mail. ��������, ��������� ��������� �������� ���� �������� ��� ������������, ������� �� ��������:

/* system1.c */

#include <stdio.h>
#include <stdlib.h>

int
main (void)
{
  if (system ("mail $USER < system1.c") != 0)
    perror ("system");
  return (0);
}
�����������, ��� ��������� Set-UID root :
>> cc system1.c -o system1
>> su
Password:
[root] chown root.root system1
[root] chmod +s system1
[root] exit
>> ls -l system1
-rwsrwsr-x  1 root  root  11831  Oct 16  17:25 system1
>>

����� ��������� ��� ���������, ������� ��������� �������� (/bin/sh) � ������ -c, ����� �������� �� ���������� ��� �������. �����, �������� �������� ����� �������� ��������� � ������������ � ���������� ��������� PATH, ����� ����� ����������� ����, ������� ���������� mail. ����� ����������������� ���������, ������������ ���������� �������� �������� ���� ���������� ����� �������� ����������. ��������:
  >> export PATH=.
  >> ./system1

���� ������� mail ������ � ������� ��������. ���������� ������� ����������� ���� (�������� ������, ����������� ��������� ���������) � ������� ��� mail, � ��������� ����� ����� �������� � EUID-�� ��������� ��������� ����������! ����� ��� ������ ��������� /bin/sh. ������, ��� ��� �� ���������� � ���������������� ����������� ������ (��� ��������� ������� mail), �� ������ ������� ��� �� ��������. ������� ������:
#! /bin/sh
# "mail" script running a shell
# getting its standard input back.
/bin/sh < /dev/tty

��� ���������:
>> export PATH="."
>> ./system1
bash# /usr/bin/whoami
  root
bash#

�������, ������ ������� ������� � �������� ������� ���� � ���������, �������� /bin/mail. ����� ��������� ����� ��������: �������������� ���������� ������� �� ��������� �������. ���� /bin/mail ������ ���� �� ����� �������, �� �������� ��� ��������� GhostScript? (����� �� � /usr/bin, /usr/share/bin, /usr/local/bin?). � ������ �������, ��� ���� ��� ����� �������� ��� ������������� ��������� ������ ��������: ������������� ���������� ��������� IFS. �������� ���������� �� ��� ������� ���� � ��������� ������. ��� ���������� �������� �����������. �� ��������� ��� ������, ��������� � ������� �������. ���� ������������ ������� ���� ���� /, ������� "/bin/mail" ����� ������ ��������� ��� "bin mail". ����������� ����, ������� ���������� bin, � ������� �������� ����� ���� �������� ����� ���� ���������� ���������� PATH, ��� �� ������ �����, ��� �������� ��������� ��� ��������� � EUID ����������.

��� Linux ���������� ��������� IFS - ��� �� ��������, � ��� ��� ��� bash � pdksh ������� �� ��������� ������� �� ��������� ��� �������. �� ����� � ������������� ����������, �� ������ �����, ��� ��������� ������� ����� ���� ����� ����������� ������������ ���� ����������.

��������� ������ ���������� ��������� ����� ������� ���������� ��������. ��������, ���������� mail ��������� ������������ ��������� ������� ��� ��������� ��������� ��������� ����������� ������������������ "~!". ���� ������������ ����� "~!command" � ������ ������, ������� �����������. ��������� /usr/bin/suidperl, ������������ ��� ������� �������� perl � ����� Set-UID, �������� /bin/mail, ����� ��������� ��������� root-� ��� ����������� ��������. ��� ��� /usr/bin/suidperl Set-UID root, ����� /bin/mail ���������� � ������������ root � �������� ��� �����, ������� ������ ������. ����� ������������ ����� ������� ����, ��� �������� �������� ������� ������� � ����������� ~!command � ��� ����� ���������. ���� perl ������ ���������� suidperl �������� ��������� ������ ��-�� �������������� ��������, ����������� � ����� �����, ���������� ��������� �� root, ������� �������� ����������� ������������������ ���������� mail, � ������� �� ����� ����� ����������� � ������� root.

���� �������� �� ����������, ��� ��� ��������� mail �� ��������� ������ ����������� ������������������� ��� �������������� ���������� (�� � ���������). � ���������, ������������������� ����������� ������� ���������� (�������� ���������� �� �������) ��������� ����������� ������������������, ���� ����������� ���������� ��������� interactive. ���������? ����� � ������������ ����� ����� ��������������� (� ������ ������������) � ����������, ������� ������ �������� ������������ �������. ��������������� �� ��� ���������. ������, /bin/mail �������� ������������������� ����� �������� �������, �.�. ��� ��������� ���������� ����, �������� ������ ���������� ������, ��� ������ ���� ������� �������������� ��� �������� �������. ������, ���� ���� ������������ /usr/bin/suidperl �� ����� � ���������� interactive, ��� �� ������ ���� ��� ������ ������� ������� ��������� ��������� ���������� ����� ��, ����� ��� � ����, �������� ����� ��� ��������� Set-UID root.

���������� Linux ���������� ���� Set-UID � Set-GID ��� ���������� �������� (��. /usr/src/linux/fs/binfmt_script.c � /usr/src/linux/fs/exec.c). �� ������� ���������� ����� ������ ��� �������, ��� ������ Perl �� ������ ��������� ��������� /usr/bin/suidperl, ����� ������� � �������� ��� ����.

 

�������

�� ������ ����� ����� ������ ������� system(). ������ ������� - ������������ ��������� ������ ����� ��� execl() ��� execle(). ������ ��� ����� ������ �� ��, ��� ��� ������� ��������� ����� ���������� �� ��� ������������, � ����� �������� ������� �������. ��� �������� ������� ����� ������� ��� ������ fork � ���������������� ��������� ��������� ������. ����� ������� ���������:

  if (system ("/bin/lpr -Plisting stats.txt") != 0) {
    perror ("Printing");
    return (-1);
  }

������������:
pid_t pid;
int   status;

if ((pid = fork()) < 0) {
  perror("fork");
  return (-1);
}
if (pid == 0) {
  /* �������� ������� */
  execl ("/bin/lpr", "lpr", "-Plisting", "stats.txt", NULL);
  perror ("execl");
  exit (-1);
}
/* ������������ ������� */
waitpid (pid, & status, 0);
if ((! WIFEXITED (status)) || (WEXITSTATUS (status) != 0)) {
  perror ("Printing");
  return (-1);
}

��������, ��� ���� �������! � ��������� ��������� �� ����������� �������� �������, ��������, ����� ��� ���� ������������� ����������� ���� ����������, ��� ��������:
system ("mail root < stat.txt");

�� ���� ��������������� ������������ < �������� ���������. �� ������ ������ �� �� ��������� ������� ������������������ ����� ��� fork(), open(), dup2(), execl() � �.�. � ����� ������, ���������� �������� ����� ������������� ������� system(), �� � ��������������� ������������� ����� ���������.

��� Linux ���������� ��������� �������� � ����� ��������� �� ������� ��������: char ** environ. ��� ������� ������������� NULL. ������ �������� � ����� "���=��������".

�� �������� �������� ��������� ��� ������ Gnu ����������:

    int clearenv (void);

��� ���������� ���������
    extern char ** environ;

�������� NULL. ����� ���������������� ������ ���������� ���������, ��������� �������������� ��������, ��� ������ �������:
    int setenv (const char * name, const char * value, int remove)
    int putenv(const char *string)

����� ������� ������� system(). ��������:
    clearenv ();
    setenv ("PATH", "/bin:/usr/bin:/usr/local/bin", 1);
    setenv ("IFS", " \t\n", 1);
    system ("mail root < /tmp/msg.txt");

���� ����������, �� ������ ��������� ���������� ��������� �������� ���������� ����� ��������� ��������� (HOME, LANG, TERM, TZ � �.�.). ����������, ����� �������������, ������ ���� ���������� ������ ���� ������ ���������. ��� �����, ��� �� �������� ��� ��������� ����� ���������������� ������ ����������. ���� � suidperl �� ��������� ��, ���� ������� ������� ���� �� ������� ���������.

�� ��������, ������ ������ � ����, ��-������, ������������ ������ ������� �����������. �����, �������� ������������ ����������� ��� �������� �������. ��� �� �������, ��� ���������������� Set-UID ���������� ��������� ������ ���� �������, � ����� ��������� ������� �����������.

�������� ������� ��������� ���������� ��� ������ ��������� ���������� �������� � ������������ ���������. ���� ��������� �������, �������� �����������. ����� �� �����������. ���� �� ���������� ����, ��������� ������ ������������ �������� �������, ���������� ���� �������� ������������� ��������, ��� ����� �������� � ����� �������.

�� ������ ��������, �� ������� � ���������� PATH, ��� ��������� ������������� system() ����������� ��� ������������� ��������� ����������� ������� ����� ��� popen() ��� ��������� �������, ��������, execlp() ��� execvp().

 

��������� ���������� ������

��� ��������� ������������ ��������, ������ �������� ������������ ����������� ��������������� ��������� ������������ �����������, ��������, ��������� �������. ��� ���������� ����������� � ������ ���������, ��� ��� ��� ������ ��������, ������������� ������ ������� wordexp(). �� ������ ���� ����������� ��������� ��, ��� ��� �������� ������ ���� $(command) �������� ��������� ��������� ������� �������. �������� ������ "$(/bin/sh)" ������� Set-UID ��������. ����� �������� �����, wordexp() ����� ������� WRDE_NOCMD, ������� ��������� ������������� ������������������ $( ).

��� ������� ������� ������, ��� ���� ���� ���������� � �� �������� �������, ������� ������������� �������� ������ � �������� (��� ������������������ :!command � vi). ������ ����������� �� ���, ��������� ���������� �������� � ���� ������(��������� ���������, ����-���������...), ������ ������� ���������� (��� �� ������ � /bin/mail) ��� ����� ������� ������ �������.

 

����������

��� ������ �������� ��������� �������:

� ��������� ������ �� ��������� � ������, �� ����������� � ������� ������� ����� ���, ��� ��������� �� ������������ ������. ����� �� ������, ��� �������� �������.

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ���������.
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Frédéric Raynal, Christophe Blaess, Christophe Grenier, FDL
LinuxFocus.org

Click here to report a fault or send a comment to LinuxFocus
Translation information:
fr -> -- Frédéric Raynal, Christophe Blaess, Christophe Grenier
fr -> en Georges Tarbouriech
en -> ru Kolobynin Alexey

2001-08-20, generated by lfparser version 2.17