[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