[FreeBSD] OFFTOPIC: megint a biztonsagrol...

Gabor Zahemszky ZGabor at CoDe.hu
2001. Május. 11., P, 08:19:41 CEST


Szia!

On Thu, May 10, 2001 at 11:08:47AM +0200, Zelenak.Gabor at ans.lri.hu wrote:
> $ whoami
> system
> $ ls -l suid.ksh	-rwsr-x---	root	users	etc...
> $
> $ cat suid.ksh
> # ! /bin/ksh
> whoami
> $ ./suid.ksh
> system
> $
> 
> ...miert adja vissza a "system" UID-t a 0 helyett, nos
> a valaszom egyszeru. a "whoami" altalam ismert
> peldanyai - nemigen hasznaljak az "int setuid(uid_t)" (2)
> rendszerhivast, ezert aztan a hivo shell UID-je
> lesz szamara a mervado - marpedig, ha az a

Na ja, de akkor hol jatszik szerepet a SUID bit?

> "system"-e, akkor kutyakotelessege annak az UID-jevel
> visszaterni (az igazi owner kiletetol teljesen fuggetlenul!!!).

Hm.  Hat akkor.  VSZ itt a szezon es fazon kategoriarol van szo.  Ugyanis
ha a font emlitett scriptet ugy hivom meg, hogy irok egy wrapper _binarist_,
ami suid root-os, es egyszeruen exec-cel meghivja a _nem_ suid-os scriptet,
akkor meglepo modon _nem_ system, hanem root lesz a kimenet.  Ugyanis a SUID
bit hasznalatahos _abszolut semmi szukseg_ a setuid hivasra, ugyanis a neki
megfelelo dolgot elintezi a kernel.  Csak eppen, ha scriptet hiv, akkor
altalaban nem csinalja meg, mig ha binarist, akkor igen.

> lasd: man 2 setuid

Kosz, ezen a szinten mar kb egy tucat eve tul vagyok. :-)  Szoval nem kene
osszekeverni a setuid(2) System Call-t a Set_User_ID jogosultsagi bittel.

> arra a kerdesre, hogy miert hasznalnak egyesek SUID-s scripteket
> a valaszom ujfent egyszeru:
> 1. nem ismerik a perl nyelvet

Erdekes, en eddig ugy tudtam, hogy a Perl szinten script nyelv, nem
veletlen, hogy a SUID-os perl-scripthez #!../sperl kell.  4.3-ban nincs is!

> 2. nem tudnak C-ben programozni

Ugy van, es meg soha senki nem tette ki a vilag leglatogatottabb weblapjara a
wrapper-binaris 3 soros forrasat.  De usse ko, tan a jovo heten raerek.
(Az persze igaz, hogy attol meg a scriptet lehet szarul megirni.)

> 3. meg nem tiltottak ki sajat geperol mint "root"....

???  Az utobbi idoben _nem_ a SUID-es scriptek, hanem a root-kent futo
binarisok hackelese valt elterjedte, ugyhogy ezt itt - ellentetben a 2.
ponttal, nem ertem.

> 4. a dolgat konnyitendo - ha szeretne, hogy csak az altala
> biztositott  - ellenorzott !!!! - kornyezetbol inditanak egyesek
> olyan programokat, amelyek a superuser fennhatosaga ala
> tartoznak.

????

> es vegul a megjegyzesre - miszerint, felesleges aggodni mert
> bizonyos OS-ek nem engedik meg, hogy SUID-s scriptekkel
> szabadon garazdalkodhassanak egyesek.
> 
> azok a bizonyos OS-ek, csupan egyedul vannak jelenleg: Linux.

Mint emlitettem, pl. a FreeBSD is ilyen, sot szinte merget vehetsz ra, hogy
a tobbi modern *BSD is ilyen, sot minden kicsit is normalis UNIX a SUID bit
hasznalatat kisse maskepp kezeli, scriptek eseten.

> egy listat csinalni azokrol a rendszerekrol (shell-ekrol), ahol ez a 

Bocs, ez normalis korulmenyek kozott _nem_ shell-fuggo, hanem KERNEL!

> azt a kijelentest, hogy a 4.3-ason nincs erre lehetoseg, talan a csh
> shellben irott SUID-s scriptekkel kellene legeloszor letesztelni...

Mivel fonntartom, hogy az altalam irt script tokeletesen alkalmas a
tesztelesre
#! shell
who am i
whoami

ezert nemileg riadtan kiprobaltam shell == /bin/csh - val is.  Az eredmeny
tok ugyanaz.  Es utolso pontkent.  Ha ugy inditom, hogy:
su root -c zzz, akkor erdekes modon minden shell eseten rootnak mondja magat
a masodik sorban, akkor is, ha a script nem SUID-os.  Viszont a SUID bit
tulajdonkepp ekvivalens a fenti hivassal, ugyhogy a magyarazatod egyszeruen
ROSSZ.

> ----------------------------------------------------------
> --                 Zelenak Gabor			
> --             system programmer			
> ----------------------------------------------------------

ZGabor at CoDe dot HU

aki nem system programmer, csak egyszeru, kozonseges UNIX Trainer.

-- 
#!/bin/ksh
Z='21N16I25C25E30, 40M30E33E25T15U!' ;IFS=' ABCDEFGHIJKLMNOPQRSTUVWXYZ ';set $Z ;for i { [[ $i = ? ]]&&print $i&&break;[[ $i = ??? ]]&&j=$i&&i=${i%?};typeset -i40 i=8#$i;print -n ${i#???};[[ "$j" = ??? ]]&&print -n "${j#??} "&&j=;typeset +i i;};IFS=' 0123456789 ';set $Z;X=;for i { [[ $i = , ]]&&i=2;[[ $i = ?? ]]||typeset -l i;X="$X $i";typeset +l i;};print "$X"



További információk a(z) BSD levelezőlistáról