3.3. SUID root programmer

SUID betyder, at et program kører "som sin ejer", og ikke "som" den bruger, der udfører det. Dvs. at det kører med ejerens rettigheder. Et program, som "tyge" ejer, og som er SUID, har f.eks. ret til at skrive i "tyge"s hjemmekatalog, selvom det er en anden bruger, der kører det. Et SGID program er det samme bare med gruppe rettigheder i stedet.

Hvorfor er det farligt? SUID er specielt farligt, når det er et SUID-program som root ejer. Så længe programmet opfører sig pænt, er det ikke noget problem. Men hvis der er fejl eller sikkerhedshuller i programmet, kan det være en trussel mod sikkerheden. Man kan forestille sig, at et program har et sikkerhedshul, som gør det muligt for en almindelig bruger at gå ind og overskrive noget af programmets hukommelse, imens det kører, og få det til at gøre noget andet, end det skal. Så har denne bruger faktisk root adgang til systemet. Man har set eksempler på dette med efterfølgende sikkerhedsopdateringer til følge.

Lad os nu se på hvilke programmer, der på en normal Linux-maskine er SUID programmer.

[tyge@hven ~]$ su - root
[root@hven /root]# find / -perm +4000
Sådan finder du alle SUID programmer. Men det er kun SUID root programmer, som vi vil være bange for i dag. Hvis andre brugere selv laver SUID programmer så lad os antage, at de ved, hvad de laver og selv tager eventuelle konsekvenser. Vi går nu efter de programmer, hvor root er ejeren og som er SUID. Så vi tager parametrene "-user root" med til find kommandoen:
[tyge@hven tyge]$ su - root
Password:
[root@hven tyge]#  find / -perm +4000 -user root
/bin/ping
/bin/mount
/bin/umount
/bin/su
/bin/login
/sbin/dump
/sbin/restore
/sbin/pwdb_chkpwd
/sbin/cardctl
/usr/bin/rcp
/usr/bin/rlogin
/usr/bin/rsh
/usr/bin/at
/usr/bin/dos
/usr/bin/chage
/usr/bin/lpq
/usr/bin/lpr
/usr/bin/lprm
/usr/bin/passwd
/usr/bin/suidperl                                                           
/usr/bin/procmail
/usr/bin/screen
/usr/bin/nwsfind
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/newgrp
/usr/bin/crontab
/usr/bin/zgv
/usr/bin/gpasswd
/usr/bin/sperl5.00405
/usr/X11R6/bin/xterm
/usr/X11R6/bin/XConsole
/usr/X11R6/bin/nxterm
/usr/X11R6/bin/xscreensaver
/usr/X11R6/bin/Xwrapper
/usr/lib/news/bin/startinnfeed
/usr/local/bin/ssh1
/usr/sbin/usernetctl
/usr/sbin/inndstart
/usr/sbin/sendmail
/usr/sbin/traceroute
/usr/libexec/pt_chown
find: /proc/1144/fd: Permission denied
find: /proc/1145/fd: Permission denied
find: /proc/6286/fd/4: No such file or directory
/opt/kde/bin/kvt
/opt/kde/bin/kppp

Outputtet er de SUID root programmer, der findes på systemet. Der er også et par fejl fra find nede fra /proc kataloget. Det skal du ikke tage dig af, /proc er et interface til den kørende kerne, og der ligger ikke almindelige filer (f.eks. SUID root programmer) der. Det er mange programmer at passe på, måske er der et sikkerhedshul i nogle af dem. Har du brug for alle disse programmer? Er der mon nogle af dem, der kan køre uden SUID root eller helt fjernes? Tjek programmernes man page, tjek om andre programmer er afhængige af SUID-programmet, som det f.eks. er tilfældet med /bin/su. Det kan ofte undersøges med systemets pakkemanager. Er der sikkerhedsopdateringer til nogle af programmerne, du burde installere? Kan du overskue at følge med i sikkerhedsopdateringer for alle disse programmer? Konklusionen er, at du aldrig skal installere flere programmer, end der skal bruges.

SGID - set group ID - er også farligt, hvis gruppen er root. Det er ikke så almindeligt at anvende SGID

[root@hven tyge]#  find / -perm +2000 -group root
/sbin/netreport
/usr/sbin/sendmail
find: /proc/1144/fd: Permission denied
find: /proc/1145/fd: Permission denied
find: /proc/6296/fd/4: No such file or directory

Der var ikke så mange, men dem skal man også være opmærksom på.

Lad os som et eksperiment prøve at lade /bin/ping være ejet af "tyge" i stedet for "root", og lad os se om den stadig virker:

[root@hven tyge]# ls -l /bin/ping
-rwsr-xr-x   1 root     root        14116 Jun 18  1998 /bin/ping
[root@hven tyge]# chown tyge /bin/ping
[root@hven tyge]# ls -l /bin/ping
-rwsr-xr-x   1 tyge      root        14116 Jun 18  1998 /bin/ping
[root@hven tyge]# ping 10.10.10.3
ping: ping must run as root

Ups, det kunne man ikke. Vi må hellere skifte tilbage:

[root@hven tyge]# chown root /bin/ping

Programmet ping er svært at undvære og er nødt til at køre som SUID root. Du kan i øvrigt se, at det er SUID ved det "s" som kommer frem, når du kører ls -al på filen. Programmet /usr/bin/passwd er svært at undvære, og det er nødt til at køre som root for at kunne ændre i /etc/passwd filen. Et program som kppp kunne derimod afinstalleres, hvis du ikke bruger det. Kppp er et KDE program, der bruges til at koble sig til internettet via modem. Tilsvarende kan du afinstallere /sbin/cardctl, hvis du ikke har PCMCIA kort i din maskine. Anvender du en RPM baseret Linuxdistribution såsom Mandrake, SuSE eller Red Hat, kan du have glæde af at finde ud af fra hvilken pakke, et givent SUID program kommer fra.

[root@hven root]# rpm -qf /sbin/cardctl
kernel-pcmcia-cs-2.2.5-15

Så kan du tjekke hvilke filer, pakken indeholder. Når du frem til, at pakken ikke bruges, så afinstaller den:

[root@hven root]# rpm -ql kernel-pcmcia-cs-2.2.5-15
...klip mange linjer
[root@hven root]# rpm -e kernel-pcmcia-cs-2.2.5-15

SUID root programmer er en alvorlig sikkerhedsrisiko, og man bør i hvert fald ikke lave SUID root programmer selv for at løse en given opgave. Der er ting man ikke har fundet smartere løsninger på endnu, men de fleste ting kan gøres uden. I Linux har man som en sikkerhedsforanstaltning overfor SUID root programmer indbygget, at et script (tekstfil med kommandoer) ikke kan køres som SUID root.