» »

It's not a bug...

It's not a bug...

denial ::

...it's feature. Limited & obsolete, but nice anyway >:D


Debian Advisory
SELECT finger FROM hand WHERE id=3;
  • zavaroval slike: OmegaBlue ()

jype ::

Jah, suid :)

Starinski unix access controls so pač točno to - starinski.

MTm2H37rqt7B ::

memn tole na ubuntu ne dela:

:~$ oping -f /etc/shadow
oping: invalid option -- 'f'
Usage: oping [-46] [-c count] [-i interval] host [host [host ...]]

ocitno star paket na debianu?

tudi na debian 5.0 ne?

EDIT: se posipam...
This is clearly a security hole - however the good news is that the
version(s) of oping included in lenny and etch are unaffected.

Zgodovina sprememb…

denial ::

@pux
Saj lepo piše "limited & obsolete". Pomembna je verzija oping-a in ne OS.
SELECT finger FROM hand WHERE id=3;

MTm2H37rqt7B ::

Sej pravim, se posipam, prec sm paniko zagnal pa prepovrsno prebral :) Hiter sel sisteme cekirat...

jype ::

Problem ni v oping, problem je v tem da unixu ne moreš dopovedat, da opingu ni treba brat /etc/shadow, pod nobenimi pogoji.

BlueRunner ::

Lahko lahko, samo kaj ko tega skoraj nihče zares ne uporablja.

PolicyKit, SELinux, AppArmor so rešitve za GNU/Linux (mimogrede Linux ni UNIX). Solaris, ki je UNIX, ima ravno tako pozna RBAC, ki rešuje tovrsne težave iz 70-ih. In tako naprej...

Torej ni težava v funkcionalnosti modernih sistemov *IX, temveč predvsem klasičen PEBKAC. Že to, da ti, jype, ne poznaš danes obstoječih mehanizmov, je signal, da je bilo na izobraževanju in razsvetljevanju storjenega mnogo premalo.

Je pa že res, da običajno velja, da mora "storitev" najprej delovati, potem pa se jo bo še varovalo. Za tisti "potem" pa potem zmanjka časa/denarja/znanja/razumevanja/...

jype ::

Ja, jasno, imamo kup novih sistemov, ki pa niso več POSIXed in zato šibkeje zastopani.

BlueRunner> Že to, da ti, jype, ne poznaš danes obstoječih mehanizmov, je signal, da je bilo na izobraževanju in razsvetljevanju storjenega mnogo premalo.

Ah, seveda jih poznam, ampak oping je prenosljiv ravno zato, ker jih ne uporablja - če bi jih, bi bil pa (milo rečeno) nagravžen za prebrat. #ifdefs oh my!

BlueRunner> Za tisti "potem" pa potem zmanjka časa/denarja/znanja/razumevanja/...

Jah, pri unixu (kot konceptu) je predvsem zmanjkalo časa za standardizacijo. rwxrwxrwx znajo vsi enako, ko stopiš le korak više, pa pogosto naletiš na hude probleme, če bi rad, da je reč še vedno prenosljiva.

Zgodovina sprememb…

  • spremenilo: jype ()

BlueRunner ::

POSIX acl-ji so IMHO kar dobra flika. Ne popolna, ampak standardizirana do te mere, da ga praktično ni *IX sistema, ki jih ne bi podpiral tako ali drugače.

SELinux ravno tako pomaga pri omejevanju SUID/GUID programov, ki morajo imeti skrajno omejene pravice. Pri temu pa ponovno prevajanje ni potrebno - sistemska rešitev.

Ampak ja... veliko dela bi bilo potrebno tudi s strani razvijalcev, kjer pa zadeve velikokrat zastanejo zaradi vedno istega razloga - ko začne primarna funkcija delovati, je zabava zaključena. Od tam naprej pa delo več ni "zabavno".

Standardizacija bi tukaj morda nekoliko pomagala. Nekaterim. Ampak tiste skupine, ki jemljejo varnost resno, so že do sedaj pokazale, da jim več dela pri zagotavljanju podpore različnim platformam ni ovira. Standardizacija gor ali pa dol.

jype ::

ACLji so samo filesystem reč.

BlueRunner> SELinux ravno tako pomaga pri omejevanju SUID/GUID programov, ki morajo imeti skrajno omejene pravice. Pri temu pa ponovno prevajanje ni potrebno - sistemska rešitev.

Ja, ampak SELinux pomeni, da mora sistem vnaprej poznat _vse_ mogoče primere uporabe sistema, da ga lahko nastaviš. Če bi bil tak sistem povsod enak, bi še nekako šlo, a ima vsak OS svojega.

Še huje je to, da se je ta težava začela reševati pozno in na mnogo popolnoma nepovezanih načinov hkrati. Capabilites, SELinux, AppArmor so samo Linux based rešitve, nad katerimi se sicer nima smisla pritoževati, ker pred njimi ni bilo nobenega fine-grained nadzora, a samo dejstvo, da obstajajo tako različne rešitve, ki dejansko nekatere reči počnejo vsaka zase, nekatere pa vse hkrati, nam da vedeti, zakaj oping v tem primeru ne zna povedati sistemu, zakaj potrebuje root privilegije. Samo zaradi raw socketa in _ničesar_ drugega.

BlueRunner> Standardizacija bi tukaj morda nekoliko pomagala. Nekaterim. Ampak tiste skupine, ki jemljejo varnost resno, so že do sedaj pokazale, da jim več dela pri zagotavljanju podpore različnim platformam ni ovira. Standardizacija gor ali pa dol.

Problem je v tem da vsak tak design deficiency povečuje verjetnost za napako, ki se jo lahko zlorabi za nepooblaščen dvig privilegijev.

BlueRunner ::

Strinjam se pod 1 in strinjam se pod 2. Stvari so daleč od idealnih.

Niso pa čisto črne...

fiction ::

Problem ni v oping, problem je v tem da unixu ne moreš dopovedat, da opingu ni treba brat /etc/shadow, pod nobenimi pogoji.
Problem je oping. Pri branju datoteke, ki jo poda uporabnik, bi lahko zacasno spustil svoje privilegije s setuid() na tiste od uporabnika. Ce bi res samo tisto kar mora (odpiranje socketa) pocel priviligirano, bi bilo veliko manj moznosti za probleme (least-privilege approach).
To, da je prevec verbose pri izpisovanju napak je pa drug issue (ki ga drugace sploh ne bi bilo).

Seveda pa se da tudi procese, ki tecejo kot root z mandatory access control mehanizmi (kot je bilo ze omenjeno) omejiti. Ampak to je takorekoc za omilitev potencialne skode. Oping se takih stvari sploh ne bi zavedal. To je stvar tistega, ki doloci varnostno politiko.

fiction ::

Limited & obsolete se slisi, kot da je -f stara stvar, ki se ne uporablja vec. Ampak kolikor razumem to, je -f nov feature (ki ga drugje se ni). Zato stare verzije oping oz. liboping niso ranljive.

+static _Bool is_setuid (void)
+{
+       return (getuid () != geteuid ());
+}
+
 static int read_options (int argc, char **argv)
 {
        int optchar;
@@ -164,6 +170,13 @@ static int read_options (int argc, char
                                break;

                        case 'f':
+                               if (is_setuid () && (strcmp ("-", optarg) != 0))
+                               {
+                                       fprintf (stderr, "For security reasons the `-f' option "
+                                                       "is disabled if real and effective "
+                                                       "user IDs don't match. Sorry.\n");
+                               }
+                               else
Heh. Sej, ce bi res rekel, da je ta feature za ne root uporabnike neuporaben (oz. nevaren), ne recem. Tako so pa prakticno odstranili funkcionalnost programa.

Se enkrat ponavljam: prava pot je setuid(getuid()) takoj po tem ko ustvaris RAW socket (za kar moras biti root) oz. setreuid(getuid(), getuid()) ali kako drugace, da se ne da vec nazaj. Tako kot so zdaj naredili, je se vedno potencialno kaj drugega lahko narobe in uporabnik dobi z izkoriscanjem napake lahko dostop do root-a.
Proper UNIX way da preveris, ce user a lahko naredi xy, je to, da tega ne preverjas :) Namesto tega se naredis da si a in naredis xy. V drugih primerih si ponavadi, ce ne drugega, obsojen na race-conditione.

denial ::

Limited & obsolete se slisi, kot da je -f stara stvar, ki se ne uporablja vec. Ampak kolikor razumem to, je -f nov feature (ki ga drugje se ni). Zato stare verzije oping oz. liboping niso ranljive.

Prav imaš. /me oops...:P
SELECT finger FROM hand WHERE id=3;

fiction ::

Sem poslal tipu diff z mojimi idejami. V bistvu naredi setuid(), ampak sele malo kasneje. Jaz sem predlagal prej seteuid(), ki sicer ni POSIX, ampak najbrz bo vseeno kul. Tako pac oping lahko "pohekas" samo za branje datotek, ki bi jih ze sicer lahko bral. Ce te funkcije ni se vedno lahko onemogoci -f. Fora je v tem, da vmes se nekaj rabi root permissione in ne mores prej spustiti privilegijev iz rok za vedno. Kar pa bi bilo treba enkrat rewritati da bo bolj secure.

Kar se tice Linuxa je v bistvu drugace kot sem rekel, setuid() permanentno dropa root permissione (medtem ko ce ne-root user poklice to funkcijo ne).
Na BSD-ju mislim, da je vsak setuid() permanenten in kar se tega tice torej
bolj konsistenten. setreuid() torej niti ne rabis oz. je vse skupaj redundantno.

fiction ::

Baje je imel tip enake ideje kot jaz in je naredil ze:
http://git.verplant.org/?p=liboping.git...
Tole se mi zdi kar kul. Dela namrec tudi -f za nepriviligirane uporabnike v kolikor je _POSIX_SAVED_IDS definiran.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Glibc bug

Oddelek: Informacijska varnost
296548 (5919) Icematxyz
»

Linux pomanjkljivosti (strani: 1 2 )

Oddelek: Operacijski sistemi
5110760 (9279) poweroff
»

Poganjanje Windows brez administratorskih pravic varneje (strani: 1 2 )

Oddelek: Novice / Operacijski sistemi
5816247 (14111) noraguta
»

Nice summer reading

Oddelek: Informacijska varnost
172428 (1865) poweroff
»

Microsoft patentiral sudo (strani: 1 2 )

Oddelek: Novice / Industrijska lastnina
567631 (6541) Poldi112

Več podobnih tem