UNIX sistemos saugumas
Turinys
1. Problema
* Praktinė problema
* Įsilaužimai
* Interneto servisai
* Sprendimai
* Įsilaužimų prevencija
2. Pasirinktas tyrimo objektas
3. Literatūros apžvalga
* TCP/IP
* TCP/IP protokolo schema
* Kompiuterinių tinklų saugumas
4. Saugumo spragų, 1996 metais rastų Linux operacinėje sistemoje, analizė
* Klasikinė klasifikacija
* Klasifikacija pagal klaidos vietą TCP/IP sluoksniuose
* Klasifikacija pagal servisus
5. Apsaugos schema
* Veikimo principas
* Privalumai ir trūkumai
6. Linux konfigūravimas pagal sudarytą apsaugos schemą
* Linux branduolio konfigūravimas
* Paketų filtrų konfigūravimas
* TCP apvalkalo konfigūravimas
* Paketų filtrai ir TCP apvalkalas kitose operacinėse sistemose
7. Saugumo spragos, rastos 1997 metais
8. Pasiekti rezultatai
9. Neišspręstos problemos. Kryptys tolimesniam tyrimui
* Pusiau automatizuotas potencialaus buferio perpildymo tikrinimas
* Laisvai prieinamų servisų konfigūravimas
10. Apibrėžimai
11. 1996 metais surastų įsilaužimų sąrašas
12. Literatūros sąrašas
1. Problema
Praktinė problema
Jeigu mes prisijungiame prie Interneto, reiškia mes norime iš jo pasisemti kažkokios informacijos, arba pateikti Interneto vartotojams savo informaciją. Tačiau toks prisijungimas sukelia ir ne vieną problemą:
Mūsų interneto serveris paprastai turi priėjimą tiek prie Interneto, tiek prie vidinio tinklo resursų. Įsibrovę į mūsų Interneto serverį įsilaužėliai gali prieiti prie mokslo įstaigos arba kompanijos vidinės informacijos.
Sutrukdžius interneto serverio darbą gali pablogėti kompanijos prestižas.
O informacija šiais laikais yra viena iš brangiausių prekių. Ir įsilaužimai pasinaudojant Internetu jau realybė. Informacijos apie kelis atvejus galima rasti [GS97].
Įsilaužimai
Gali būti daug įvairiausių įsilaužimų būdų bei pasekmių. Tačiau paprastai pakanka išskirti dvi įsilaužimų klases:
Nelegalus priėjimas prie duomenų.
Įvykdęs tokį įsilaužimą, įsibrovėlis gauna priėjimą prie duomenų, prie kurių jis legaliai prieiti negali. Priėjimas gali būti įvairus – duomenys perskaitomi, modifikuojami, ištrinami. Kartais saugumo spraga yra netgi tai, kad įsibrovėlis žino, kokie failai yra sistemoje.
Serviso sutrukdymas.
Vienu ar kitu būdu įsibrovėlis sutrukdo normalų Interneto serviso darbą. Iš vienos pusės įsibrovėlis savo veiksmais gali priversti servisą nekorektiškai dirbti, pavyzdžiui sunaudojant visus procesoriaus resursus. Iš kitos – gali padaryti patį servisą nebeprieinamu.
Viena saugumo spraga dažniausiai sudaro sąlygas įvykdyti tik vieną iš šių įsilaužimų. Serviso sutrukdymas paprastai laikomas mažesne problema nei nelegalus priėjimas prie duomenų. Tačiau spragų, leidžiančių sutrukdyti serviso darbą, randama daugiau.
Įsilaužimas sukelia ne tik tiesioginius nuostolius įsibrovėliui nelegaliai priėjus prie duomenų. Daug gali kainuoti duomenų auditas – ar nepakeisti, nesugadinti, neištrinti duomenys. Taip pat – ar įsilaužėliai nepaliko sau “atsarginio įėjimo” ateičiai.
Įsilaužimai galimi dėl dviejų priežasčių:
Serverio konfigūravimo ir priežiūros klaidos.
Klaidos serverio programose. Darbe būtent ir nagrinėjami įsilaužimai šituo aspektu.
Pirmosios problemos sprendimas priklauso praktiškai tik nuo sistemos administratoriaus. Antroji – nuo visos grupės programų, bibliotekų bei operacinės sistemos branduolio. Interneto serviso vartotojas bendrauja su taikomaja programa, kuri savo ruožtu kviečia funkcijas iš įvairių bibliotekų bei kreipiasi į branduolį.
Interneto servisai
Interneto servisas – tai interneto serveryje dirbanti programa kuri pagal nustatytą protokolą, bendraudama TCP/IP protokolu (naudodama jį duomenų su klientu apsikeitimui), pateikia ir gauna iš kliento duomenis. Kaip Interneto servisų pavyzdžius galima pateikti:
WWW serveris
Naudojamas tam, kad pateikti vartotojui įvairialypę informaciją: tekstą, iliustracijas, audio/video medžiagą.
FTP serveris.
Naudojamas failų perdavimui ir priėmimui.
Pašto (SMTP) serveris.
Elektroninio pašto transportas. Jis priima, persiunčia toliau ir įvairiai apdoroja vartotojų elektroninį paštą.
Naujienų serveris. Naudodamas NNTP protokolą leidžia skaityti ir rašyti į daugybę pasaulyje egzistuojančių naujienų grupių.
Interneto serveris savo ruožtu tai kompiuteris, kuris yra prijungtas prie Interneto. Jame dirbančiais Interneto servisais gali pasinaudoti vartotojai iš Interneto.
Sprendimai
Kai įsilaužimai gali įvykti dėl klaidų programose, sprendimai kaip išvengti klaidos pasekmių (galimo įsilaužimo) gali būti dvejopi:
Ištaisyti klaidą.
Bandyti taikyti prevencines priemones, kurie apribotų galimybes potencialiam įsilaužėliui iš Interneto pasinaudoti šia klaida.
Pirmas variantas aišku yra tiesioginis problemos sprendimas. Tai yra saugumo spraga užtaisoma ten, kur ji ir atsirado. Tačiau interneto serverio bendro saugumo požiūriu šis būdas turi keletą trūkumų:
Klaida pataisoma tik po jos suradimo.
Dažnai laisvai prieinamuose informacijos šaltiniuose pirmiausia paskelbiama apie surastą klaidą, o jos ištaisymas pateikiamas vėliau.
Reikia atidžiai sekti daug informacijos šaltinių.
Bet kuriuo atveju tarp klaidos pataisymo paskelbimo ir to momento, kada ji ištaisoma mūsų serveryje praeina laiko tarpas, kuriuo gali pasinaudoti įsilaužėliai.
Linux bei kitų operacinių sistemų su laisvai platinamais išeities tekstais (FreeBSD, NetBSD) atveju šios klaidos yra ištaisomos pakankamai greitai. Paprastai tai netrunka ilgiau kaip 24 valandas, o dažnai bent jau laikinas klaidos sprendimas pateikiamas kartu su problema.
Įsilaužimų prevencija
Nors visų lygių TCP/IP protokolų šeimos protokolai standartizuoti, tačiau standartuose apibrėžta pakankamai plati veiksmų aibė. Vidutinio serverio normaliam darbui pakanka gerokai mažiau. Konkrečiam serveriui su ribotų servisų skaičiumi – dar mažiau. Taip pat UNIX serveryje galima rasti nemažai servisų, kurie dažniausiai nėra būtini eiliniam vartotojui iš Interneto:
telnet – reikalingas praktiškai tik sistemos administratoriui, sistemos priežiūrai ir konfigūravimui.
ftp – jeigu tai ne laisvai prieinamas ftp serveris, tai servisas reikalingas gal tik vidinio tinklo vartotojams, WWW puslapių persiuntimui.
tftp – galima panaudoti maršrutizatorių konfigūravimui, darbo stočių be kietų diskų paleidimui. Tik pats protokolas yra pakankamai nesaugus ir ji konfigūruoti reikia ypač atsargiai.
Daug protokolų buvo sukurta, kai Internetas buvo žymiai mažesnis ir daugiau akademinis. Dėl to kai kurios tais laikais, saugesniame, mažesniame ir ne plačiai prieinamame, tinkle, standartizuotos galimybės šiais laikais jau laikomos saugumo spragomis.
Žinodami serverio struktūra mes galime žymiai sumažinti potencialių įsilaužėlių veiksmų laisvę, nepažeisdami serverio funkcionalumo. Apriboti veiksmų laisvę galima visuose trijuose viršutiniuose (interneto, transportinis, programų) sluoksniuose. Apsaugos priemonių viename sluoksnyje nepakanka, nes tuomet dažnai tokią apsaugą galima apeiti pasinaudojant kitų sluoksnių teikiamais servisais.
Interneto sluoksnis
Informacijos vienetas šiame sluoksnyje – IP paketas. Paketus filtruoti galima pagal šaltinio bei tikslo adresus. Taip pat reikia išmesti IP paketus, kuriuose įjungta vėliavėlė “source routing”. Pastarasis atvejis yra puikus pavyzdys to, kaip standartizuota naudinga galimybė nesaugioje aplinkoje (šiuolaikinis Internetas) tampa saugumo spraga.
Neribojant serverio funkcionalumo galima taikyti tokius apribojimus:
Nepriimti IP paketų iš Interneto su tam tikrais šaltinio adresais.
Tai šaltinio adresai, kurie normaliomis sąlygomis negali ateiti iš Interneto. Tokia adresai yra: adresai iš mūsų vidinio tinklo, adresai iš adresų erdvės skirtos vidiniams tinklams (10.0.0.0, 192.168.0.0).
Tokius paketus gali atsiųsti įsilaužėliai, bandydami įsilaužti, pasinaudodami interneto servisais, prieinamais tik vidinio tinklo vartotojams arba bandydami nuslėpti tikrają savo buvimo vietą.
Neišleisti paketų į Internetą su vidinio tinklo tikslo adresais.
Atsargumo priemonė prieš tai, kad kokia nors vidinė informacija netyčia nenuteketų už vidinio tinklo ribų.
Neišleisti paketų į Internetą su šaltinio adresais ne iš savo tinklo.
Čia daugiau vidinės drausmės užtikrinimui. Taip sistemos administratorius gali užtikrinti, kad vidinio tinklo vartotojai nebandys laužyti svetimų sistemų IP paketais su padirbtais šaltinio adresais.
Transportinis sluoksnis
Šiame sluoksnyje apribojimai vykdomi pagal TCP bei UDP paketų šaltinio arba dažniausiai pagal tikslo portus. Jeigu neužsiimti kruopščiu tikslo portų atrinkinėjimu, tai galima bent uždrausti kreipinius į portus, naudojamus kreipiniams į potencialiai pavojingus servisus. Tai būtų servisai, per kuriuos įsilaužus būtų galima padaryti daug žalos (telnet 23/TCP portas, login 513/TCP portas) ir servisai su silpnu saugumo mechanizmu (tftp 69/UDP portas).
Programų sluoksnis
Jeigu interneto sluoksnyje praktiškai naudojamas tik vienas protokolas (IP), transportiniame sluoksnyje – du (TCP, UDP), tai programų sluoksnyje protokolų yra daug. Ir paprasto bei universalaus metodo kaip apriboti veiksmų laisvę universaliai, o ne atskirai konfigūruojant kiekvieną servisą, literatūroje surasti arba sugalvoti nepavyko. Tačiau ir čia galima apriboti prisijungimus pagal servisą ir pagal šaltinio adresą:
ftp – leisti prisijungti tik vidinio tinklo vartotojams.
tftp – leisti prisijungti tik maršrutizatoriams bei darbo stotims be kieto disko.
telnet – Leisti prisijungti tik iš sistemos administratoriaus kompiuterio.
2. Pasirinktas tyrimo objektas
Peržiūrėjus rastus įsilaužimus pasirodė, kad praktiškai neįmanoma pasiūlyti visiškai universalaus sprendimo, kuris tiktų visoms operacinėms sistemoms. Skirtingose UNIX realizacijose skiriasi ypač paketų filtrų realizacija. Todėl pasirinkta operacinė sistema Linux, kadangi:
Atitinka UNIX keliamus reikalavimus.
Laisvai prieinami išeities tekstai.
Pakankamai stabili ir daug galimybių turinti sistema.
Pakankamai plačiai paplitusi ir naudojama sistema.
Linux – laisvai platinama operacinė sistema.
Tačiau bendri sprendime išdėstyti principai tinka ir kitoms operacinėms sistemoms. UNIX šeimos operacinėms sistemoms – beveik be principinių pakeitimų.
3. Literatūros apžvalga
TCP/IP
TCP/IP protokolų šeima vis plačiau naudojama šiuolaikiniuose tinkluose. TCP/IP jau praktiškai pakeitė NetBIOS/NetBEUI protokolus Microsoft operacinėse sistemose. Taip pat ir Novell būsimojoje 5’oje NetWare versijoje, kaip pagrindinį protokolą žada naudoti TCP/IP.
TCP/IP populiarėjimą galima paaiškinti tuo, kad tai pakankamai valdoma ir universali protokolų šeima. Šiuos protokolus galima naudoti tiek lokaliuose, tiek globaliuose tinkluose. Priešingai negu TCP/IP, IPX protokolas yra beveik nemaršrutizuojamas, o NetBIOS/NetBEUI – visai nemaršrutizuojami. Vienintelis jų pranašumas – greitis. Tačiau šis privalumas dingsta kai kompanijos kompiuterinis tinklas išsiplečia, o ypač jei pasidalina į kelis, geografiškai nutolusius, potinklius.
Dar vienas TCP/IP populiarumo šaltinis – Internetas. Internetas tai pasaulinis tinklų junginys, metatinklas, naudojantis IP protokolą tam, kad sujungti įvairius fizinius tinklus į vieną loginį tinklą ([Hu92; 3psl]). Iš vienos pusės, tai pigus transportas, galintis sujungti nutolusius tinklus. Iš kitos – Internetu gali pasinaudoti (ir naudojasi) įvairūs įsilaužėliai, kurie gali pavogti jūsų duomenis arba sutrukdyti kompiuterių darbą.
Viena iš geresnių knygų apie TCP/IP, Interneto servisus ir struktūrą yra Craig HuntTCP/IP Network Administration, 2nd edition. Ypač vertinga ši knyga yra UNIX serverių administratoriams. Darbe buvo naudotasi pirmuoju leidimu ([Hu92]). Ten pat ir galima rasti nepernelyg ilgą, tačiau pakankamai išsamų TCP/IP protokolų šeimos aprašymą.
TCP/IP protokolo schema
Protokolų architektūros sluoksniai
TCP/IP tai plačiai naudojama protokolų šeima, pavadinta pagal du šiai šeimai priklausančius protokolus. TCP/IP yra keturių sluoksnių protokolų šeima. Kiekvienas loginis sluoksnis atspindi tam tikrą duomenų perdavimo funkciją. Sluoksnis neapibrėžia konkretaus protokolo. Jis tik nusako to sluoksnio protokolų atliekamą funkciją. TCP/IP sudaro šie sluoksniai:
Tinklo sluoksnis (Network Access Layer)
Tai žemiausias sluoksnis TCP/IP hierarchijoje. Šio sluoksnio protokolai pateikia galimybes perduoti duomenis tiesiogiai sujungtuose tinkluose. Vartotojai šį sluoksnį dažniausiai ignoruoja. Atsiradus naujai tinklo įrangai dažnai reikia naujo tinklo protokolo tvarkyklės, kad galima būtų jį panaudoti.
Interneto sluoksnis (Internet Layer)
Interneto sluoksnyje dažniausiai naudojamas protokolas – IP (Internet Protocol). Visi aukštesnio lygio protokolai naudoja IP, kaip transportą. Darbe iš visų techninių IP paketo laukų bus naudojami du: šaltinio adresas ir tikslo adresas. Internete dabar naudojamame 4’os versijos IP protokole šiems laukams skirta po 32 bitus. Planuojamame įvesti 6’os versijos IP protokole šių laukų dydis išplėstas iki 128 bitų kiekvienam.
IP adresas unikaliai identifikuoja tinklo mazgą. 32 bitai paprastai skirstomi į keturis oktetus ir užrašomi kaip dešimtainiai skaičiai, atskirti taškais (193.219.43.28).
IP paketų maršrutizavimui skirta potinklio kaukė. Tai tokio paties, kaip ir IP adresas ilgio bitų eilutė. Prieš išsiųsdamas IP paketą, tinklo mazgas tikslo IP adresui ir potinklio kaukei padaro bitinę IR operaciją ir pagal gautą rezultatą, naudodamas turimas lenteles, sužino kuriam mazgui toliau reikia perduoti šį IP paketą.
Transportinis sluoksnis (Transport Layer)
Virš interneto sluoksnio yra transportinis sluoksnis. Du svarbiausi šio sluoksnio protokolai yra TCP (Transmission Control Protocol) ir UDP (User Datagram Protocol). TCP užtikrina, kad duomenys adresatui bus pristatyti ir pristatyti korektiška tvarka. Duomenys TCP protokolu perduodami sesijomis, kurios sudarytos iš daug TCP paketų su ta pačia šaltinio-tikslo portų pora. Sesiją kliento ir serverio programos pradeda ir užbaigia TCP paketais su tam tikromis vėliavėlemis. UDP – mažo pertekliškumo, duomenų blokų pristatymo protokolas. UDP atveju protokolas negarantuoja, kad duomenys bus pristatyti adresatui. Pagal poreikius programos duomenims pristatyti gali naudoti bet kurį iš šių dviejų protokolų.
Abiejuose protokoluose darbe naudojami laukai: šaltinio portas ir tikslo portas. Abiems laukams abiejuose protokoluose skirta po 16 bitų.
Pagal šaltinio ir tikslo portų porą TCP/IP funkcijos gali atskirti kuriai programai skirtas konkretus TCP/UDP paketas. Taip tarp dviejų kompiuterių gali vienu metu bendrauti kelios programos. Vienu metu galima skaityti paštą, naršyti po WWW ir siųstis kelis failus iš FTP ir t.t.
Interneto ir transportinis sluoksniai dažniausiai realizuojami kaip operacinės sistemos branduolio moduliai. Linux šie du sluoksniai yra pačiame operacinės sistemos branduolyje.
Programų sluoksnis (Application Layer)
Šiame sluoksnyje randame visus servisus, kurie naudoja transportinį sluoksnį pristatyti duomenims. Tai TCP naudojantys: telnet, FTP, HTTP, SMTP ir t.t. bei UDP naudojantys: DNS, NFS ir kiti. Būtent šiame sluoksnyje ir dirba Interneto servisai.
Ir TCP/IP protokolų šeimos sluoksniai su schema, kuris protokolas naudojasi kuriuo kaip transportu. Skirtingų protokolų kiekviename iš sluoksnių yra ir daugiau.
Tinklo duomenų paketai
Duomenys tinkle perduodami tam tikro dydžio ir struktūros paketais. Kiekvieno sluoksnio duomenų paketas yra “įdėtas” į žemesnio sluoksnio paketo duomenų lauką.
Jeigu kalbama apie pavyzdžiui IP paketą, tai reiškia, kad mūsų nedomina į kokį pirmo sluoksnio paketą jis buvo “įvilktas”. Nesvarbu ar tai buvo Ethernet, PPP ar Frame Relay. Taip pat nedomina duomenų lauko struktūra. Nesvarbu ar ten yra TCP ar UDP paketas.
IP paketas
Iš techninių laukų darbe naudojami šaltinio ir tikslo adresai.
TCP paketas
Arba praktiškai analogiškai – UDP paketas. Naudojami šaltinio ir tikslo portai.
Kompiuterinių tinklų saugumas
Kompiuterinių tinklų saugumas darosi aktuali problema vis platesniam žmonių ratui. Kuo labiau plinta Internetas, kuo daugiau žmonių ir ištisų kompanijų prisijungia prie jo, tuo aktualesnė darosi vietinio kompiuterių tinklo apsauga, jei jis prijungtas prie Interneto.
Nemažai apie prisijungimo prie Interneto potencialias problemas rašoma Simson Garfinkel, Gene Spafford knygoje Web Security & Commerce [GS97]. Tai pakankamai nauja knyga, išleista 1997 metų birželio mėnesį. Todėl čia galima rasti pakankamai šviežios informacijos. Aprašyti ir keli konkretūs atvejai, kurie turi mus įtikinti, kad įsilaužimo grėsmė yra reali.
Pavyzdžiui 1996 metų rugpjūčio mėnesį buvo įsilaužta į Jungtinių Amerikos Valstijų Teisingumo Departamento WWW serverį, http://www.usdoj.gov. Įsilaužėliai įveikė serverio apsaugą ir modifikavo pirmuosius puslapius. Pakeistas puslapis Internete prabuvo kelias valandas, kol FTB nesureagavo į ataką ir neatjungė serverio. Likusį savaitgalį (įsilaužta buvo šeštadienio rytą) Teisingumo Departamento WWW serveris buvo nepasiekiamas.
1996 metų rugsėjo mėnesį grupė įsilaužėlių iš Švedijos įsibrovė į CŽV WWW serverį (http://www.odci.gov/cia). Įsilaužėliai panašiai kaip ir pirmuoju atveju – modifikavo pirmuosius puslapius. Sprendimas buvo irgi panašus, pradžioje WWW serveris buvo atjungtas nuo Interneto.
Aukščiau paminėtais atvejais kompanijos nepatyrė tiesioginių finansinių nuostolių. Tik pakankamai nukentėjo jų prestižas, nes žiniasklaida pakankamai pagarsino šiuos įsilaužimus. Tačiau kitu atveju kompanijai pasisekė mažiau. 1996 metais įsibrovus į vienos iš su iD Software bendradarbiaujančių firmų serverius iš ten buvo pavogti Quake žaidimo išeities tekstai. Nuostolius iD Software vertino dešimtimis tūkstančių dolerių.
Dar blogiau galėjo baigtis įsilaužimas į Bhadha atominių tyrimų centrą (http://www.barc.ernet.in) 1998 metų birželio mėnesį. Grupė įsilaužėlių sugebėjo įveikti apsaugą ir pakeitė WWW titulinį puslapį bei parsisiuntė penkis megabaitus elektroninio pašto ir duomenų. Indijos tuo metu vykdytų branduolinių sprogdinimų duomenų tarp jų atrodo nebuvo.
Norint maksimaliai apsaugoti tinklo kompiuterius nuo įsilaužėlių iš Interneto, reikia kaip galima labiau atskirti vidinį tinklą nuo Interneto. Vienas iš veiksmingesnių metodų – ugnies siena. Tačiau vien ugnies siena visiškai neapsisaugosime. Kaip ir bet kuria kita viena priemone. Reikia kompleksinio sprendimo ([CZw95]). Darbe, šalia paketų filtrų, kurie yra ugnies sienos dalis, panaudotas TCP apvalkalas.
Apie ungnies sienos konfigūravima Linux operacinėje sistemoje galima pasiskaityti Mark Grennan sudarytame Firewalling and Proxy Server HOWTO ([FwPri]). Čia duodami pakankamai konkretūs patarimas, kaip ką reikėtų konfigūruoti. Tačiau tai nėra ilgalaikė informacija, nes jau naujoje 2.2 Linux branduolio versijoje ugnies siena bus realizuota kitaip. Bendresnių sprendimų kaip konstruoti ugnies sienas, kaip saugiai konfigūruoti priėjimą prie atskirų Interneto servisų geriau ieškoti D.Brent Chapman, Elizabeth D.Zwicky knygoje Building Internet Firewalls
Ten pat galima rasti ir ugnies sienos schemą. Kaip matyti, tinklo duomenų paketai iš Interneto atskirti nuo vidinio tinklo dviem maršrutizatoriais, kuriuose sukonfigūruoti paketų filtrai.
Išorinis maršrutizatorius sulaiko nepageidautinus tinklo duomenų paketus iš Interneto bei neišleidžia vidinio tinklo vartotojų tiesiogiai į Internetą. Prie perimetro tinklo prijungti kompiuteriai paprastai prieinami tiek iš vidaus, tiek iš išorės. Taip pat jie gali dirbti taprininkais vidinio tinklo vartotojams į Internetą. Ir vidinis maršrutizatorius nepraleidžia paketų iš Interneto į vidinį tinklą bei nereikalingu paketų iš vidinio tinklo į Interneta.
Jeigu pasirenkame schema su išskirtais maršrutizatoriais, ypač jei tai Cisco produktai, tai idėjų, kaip padaryti tokią sistemą saugesne galima rasti pačiame Cisco paruoštame dokumente Increasing Security On IP Networks. Be bendro pobūdžio minčių apie tinklų saugumą čia galima rasti ir konkrečių Cisco maršrutizatoriaus konfigūravimo pavyzdžių.
Tačiau klasikinėse UNIX realizacijose iškyla problema: neįmanoma izoliuoti proceso nuo visų jo darbui nebūtinų resursų ([GS96]). Ši problema sprendžiama įvairiai. Albert Kahalan sudarytame The Linux Kernel Wish List ([AKi]) galima rasti minčių, kaip tai galėtų būti išspresta Linux branduolyje arba artimuose branduoliui moduliuose.
Kitas klaidų šaltinis – buferio perpildymas programose dalinai sprendžiamas panaudojant Solar Designer Linux branduolio pataisymą ([SDi]). Buferis perpildomas panašiose į žemiau pavaizduotają situacijose.
void internetas (char *str)
{
char eil[120];
strcpy (eil, str);
Mes kopijuojame funkcijai perduotą eilutę į fiksuoto dydžio buferį. Tačiau gali įvykti taip, kad šaltinio eilutė yra ilgesnė negu išskirtas buferio ilgis. Tuomet tolimesnis scenarijus būna toks: kadangi daugelyje C realizacijų vieta lokaliems kintamiesiems išskiriame steke, o čia pat yra ir grįžimo iš funkcijos adresas, tai tas adresas yra sugadinamas išeities eilutės duomenimis. Geriausiu atveju tuomet programos vykdymas nutrūks. Blogiausiu atveju galima apskaičiuoti šaltinio eilutę ir sugrįžimo adresą sugadinti taip, kad valdymas būtų perduotas į išeities eilutės kūną.
Solar Designer pataisymas padaro steko segmentą nevykdomu. Taigi eliminuojama pavojingo kodo įvykdymo galimybė. Tiesa šis pataisymas nėra universalus, jis egzistuoja tik Linux operacinei sistemai ir jį, gana sudėtingai, bet galima apeiti.
Potencialiai pavojingų funkcijų sarašą bei nurodymus kaip jų reikėtų vengti savo programose galime rasti [GS96] 707psl. Tai pirmiausia būtų gets(), strcpy() ir strcat(). Vietoj jų siūloma naudoti atitinkamai fgets(), strncpy() ir strncat(). O toliau sekančias funkcijas iš sisteminių bibliotekų reikėtų naudoti labai atsargiai. Tai sprintf(), fscanf(), scanf(), sscanf(), vsprintf(), realpath(), getopt(), getpass(), streadd(), strecpy(), strtrns().
Kai kuriose, ypač reikalaujančiose padidinto saugumo, sistemose gets() funkcijos net nėra sisteminėse bibliotekose, nes tai vienareikšmiška buferio perpildymo galimybė.
Gana išsamų vaizdą apie vienos ar kitos operacinės sistemos buvusias saugumo spragas galima susidaryti pavarčius pašto sąrašų archyvus. Tokius kaip Bugtraq [BQi], Best of Security ir panašius. Jų privalumas prieš oficialius šaltinius – čia niekas neslepiama. Taip pat išsakoma nemažai įdomių minčių apie kompiuterinių tinklų bei operacinių sistemų saugumą.
4. Saugumo spragų, 1996 metais rastų Linux operacinėje sistemoje, analizė
Saugumo spragos buvo paimtos iš Bugtraq [BQi], linux-alert [LiAi] ir kitų UNIX šeimos operacinių sistemų saugumo klausimams skirtų pašto sąrašų archyvų ([IVDi], [RTi]). Tai toli gražu nėra pilnas sąrašas, tačiau bendra tendenciją jis atspindi. Visiškai tikslų sąraša sudaryti turbūt sunkiai įmanoma, nes pavyzdžiui vien Bugtraq pašto sąraše 1996 metais buvo apie 1400 laiškų.
Iš daugybės kitų laiškų išskirtos buvo 25 saugumo spragos ir jas galima analizuoti keliais skirtingais pjūviais.
Klasikinė klasifikacija
Klasifikacija pagal klaidos, dėl kurios atsirado saugumo spraga, tipą. Dažniausiai tokiuose pašto sąrašuose kaip Bugtraq klaidos apibūdinamos irgi pagal panašią klasifikaciją.
Buferio perpildymas – 16 (64%)
Lokalių programų paleidimas – 2 (8%)
Kitos klaidos – 7 (28%)
Kitos klaidos tai – panaudotas nesaugus duomenų apie vartotoją suradimo būdas, neatsargus programų paleidimas ir panašios. Tikslesnius duomenis galima rasti darbo gale.
Matome, kad viena spragų grupė ryškiai didesnė už kitas. Tai buferio perpildymo problemos. Jos kyla dėl to, kad programoje vartotojo pateikti duomenys kopijuojami į fiksuoto ilgio buferius prieš tai nepatikrinus ar pateiktos eilutės ilgis neviršija duomenų buferio ilgio. Dėl to gali iškilti dvi problemos:
Dalis vartotojo eilutės gali patekti į steką ir paskui būti įvykdyta kaip komandų seka.
Programos veikimas gali nutrukti dėl tokios klaidos. Jei tai suid tipo programa – vartotojas įgys papildomų teisių sistemoje.
Trečiosios grupės klaidos leido nutolusiam vartotojui paleisti lokalias programas Interneto serveryje. Viena iš tokių klaidų buvo sendmail pašto transporto programoje, kuri dirba root teisėmis. Taigi vartotojo galimybės serveryje gali tapti praktiškai neribotomis.
Klasifikacija pagal klaidos vietą TCP/IP sluoksniuose
Klasifikacija pagal klaidos, dėl kurios atsirado saugumo spraga, vietą, TCP/IP sluoksnių atžvilgiu.
Klaidos interneto servisuose – 23 (92%)
Klaidos transportiniame sluoksnyje – 1 (4%)
Klaidos interneto sluoksnyje – 1 (4%)
Problemos TCP/IP steke
Problemos branduolio dalyje kuri realizuoja TCP/IP protokolų steką iškyla branduoliui dirbant su tinklo duomenų paketais interneto bei transportiniame sluoksniuose. Būtent iš dviejų klaidų viena buvo rasta interneto sluoksnyje, kita – transportiniame.
Interneto sluoksnyje buvo rasta problema ICMP paketus apdorojančiame kode. Ping tinklo paketu su daug duomenų (65508-65527 baitai) galima perkrauti kompiuterį su Linux operacine sistema. Tiesa ši klaida pasireiškė ir daugelyje kitų operacinių sistemų. Problema kyla todėl, kad perpildomas buferis.
Kita problema – “SYN flood” ataka, kuri vykdoma transportiniame sluoksnyje. Čia pasinaudojama TCP sesijos užmezgimo ypatybėmis. Užmezgant TCP sesiją įvyksta trijų dalių “rankos paspaudimas”. Pirmiausia klientas serveriui siunčia taip vadinamą SYN paketą, serveris atsako SYN|ACK paketu ir pabaigoje klientas patvirtina sesijos užmezgimą ACK paketu.
Tokios atakos metu įsilaužėlis siunčia daug SYN paketų, tačiau nepatvirtina sesijos ACK paketais. Tuomet pakankamai greitai ušsipildo branduolio eilės, skirtos SYN buferizavimui ir branduolys nebegali priimti naujų prašymų TCP sesijų atidarymui.
Dar problema yra ta, kad iš anksto nuo tokių klaidų apsisaugoti nesudėtingai neišeina. Nuo ping atakos, jeigu iš vis neuždrausti ICMP paketų, galima apsisaugoti tik sutvarkius buferio perpildymą. “SYN flood” atveju irgi situacija panaši. Tinklo duomenų paketai yra visiškai korektiški ir panašus srautas SYN paketų gali nesunkiai susidaryti pavyzdžiui kiek labiau užkrautame WWW serveryje. “SYN flood” problema sprendžiama pridedant branduolyje funkcijas, kurios dirba atveju, kai atsiranda daug pusiau atidarytų TCP sesijų. Tuomet ilginama pauzė tarp atsakymų į SYN paketus, bei uždaromos tokios seniai pusiau atidarytos TCP sesijos.
Klaidos Interneto servisuose
Tai visos klaidos, kurios buvo rastos programose, bendraujančiose su vartotoju. Šių klaidų yra žymiai daugiau negu klaidų Linux branduolio dalyje, užsiimančioje darbu su TCP/IP, nes ir pačių programų yra žymiai daugiau.
Interneto servisai gali naudoti ir gerokai daugiau galimybių negu pats branduolys. Tai branduolio funkcijas, bibliotekų funkcijas, įvairius modulius.
Klasifikacija pagal servisus
Darbui reikia sudaryti kiek kitokią klasifikaciją, kuria galėtume įvertinti apsaugos efektyvumą. Tai servisų paskirstymas pagal jų reikalingumą vartotojams iš Interneto. Nes interneto serveris dažniausiai jiems pateikia tik kelias funkcijas. Tačiau jame yra dar daug interneto servisų, kurie naudojami siauresnio rato žmonių tam tikriems tikslams. Pavyzdžiui, servero administravimui ir konfigūravimui.
Klaidos riboto priėjimo Interneto servisuose 16 (64%)
Klaidos laisvo priėjimo Interneto servisuose 7 (28%)
Klaidos operacinės sistemos branduolio dalyje, kuri užsiima darbu su TCP/IP 2 (8%)
Taigi vien atkirtus servisus, nebūtinus visiems vartotojams iš Interneto, mes (statistiškai) serverį apsaugosime nuo apie 64% galimų įsilaužimų. Taip pat sumažinus apdorojamų tinklo duomenų paketų aibę mes potencialiai serverį apsaugosime nuo dalies galimų atakų interneto ir transportiniame sluoksniuose.
Tai turės nemažą efektą ir todėl, kad laisvai prieinamų interneto servisų paprastai yra gana nedaug ir jie gana atidžiai peržiūrimi dėl potencialių saugumo spragų.
5. Apsaugos schema
Apsaugos schema sudaryta iš dviejų pagrindinių dalių:
Paketų filtrai. Tai Linux branduolio dalis, kuri pagal sukonfigūruotus parametrus nepraleidžia tinklo duomenų paketų iš Interneto. Paketų filtrai atlieka dvi funkcijas:
Apsaugo daugelį branduolio funkcijų nuo “blogų” IP paketų.
Apsaugo TCP apvalkalą nuo padirbtų IP adresų.
TCP apvalkalas. Tarpininkas tarp kliento ir proceso serveryje. Leidžia apriboti priėjimą prie potencialiai pavojingų servisų.
Veikimo principas
Apsaugos schemą galima pavaizduota žemiau. Matome, kad tinklo duomenų paketai, atėję iš Interneto pirmiausia turi praeiti TCP/IP paketų filtrus prieš patekdami su jais dirbančiam Interneto servisui. Taip pat, prieš pradedant darbą su servisu, kliento duomenys patikrinami TCP apvalkale.
Ta pati schema, tik TCP/IP protokolo sluoksnių atžvilgiu. TCP/IP steke, prieš patekdamas iki Interneto serviso, tinklo duomenų paketas praeina filtrus interneto ir transportiniame sluoksniuose.
O tiksliau schema veikia taip:
Iš Interneto ateina tinklo duomenų paketas ir pradžioje patenka į paketų filtrą.
1. Patikriname ar duomenų paketo šaltinio ir tikslo IP adresai tenkina nustatytą konfigūraciją.
3. Jeigu konfigūracija nepatenkinama – į duomenų paketą neatsakome, jį tiesiog atmetame.
2. Patikriname ar duomenų paketo šaltinio ir tikslo TCP arba UDP portai tenkina nustatytą konfigūraciją.
3. Jeigu konfigūracija nepatenkinama – į duomenų paketą neatsakome, jį tiesiog atmetame.
4. Ar norimu duomenų paketu klientas nori pradėti naują TCP sesiją.
9. Jei ne – klientui leidžiama toliau dirbti su norimu servisu.
Jei taip – valdymas perduodamas TCP apvalkalui.
5. Remiantis tikslo TCP portu ir konfigūraciniais failais nustatome kokio serviso nori klientas.
6. Ar kliento duomenys tenkina TCP apvalkalo konfigūraciją?
7. Jei ne – atsisakome paleisti servisą.
8. Priešingu atveju paleidžiame norimą servisą ir perduodame bendravimą su klientu jam.
9. Klientas pradeda darbą su norimu servisu.
Privalumai ir trūkumai
Šio apsaugos modelio privalumai yra tokie:
Minimali priklausomybė nuo operacinės sistemos.
Apsauga sukonstruota iš dviejų pakankamai paprastų komponentų. Tas leidžia juos pakankamai detaliai išanalizuoti ieškant saugumo spragų. Pavyzdžiui TCP apvalkalo paleidžiamasis failas tcpd užima vos 18kilobaitų. Ir darbe nagrinėjamu periodu nei TCP apvalkale, nei Linux paketų filtruose nebuvo rasta saugumo spragų.
Gali papildyti kitus apsaugos būdus, o ne būti naudojama vietoj jų.
Paketų filtrai sudaro klasikinę ugnies sieną, todėl norint dar padidinti sistemos patikimumą galima juos iškelti į kitą kompiuterį arba pavyzdžiui maršrutizatorių. Taip pat galima nusipirkti komercinę ugnies sienos realizaciją.
Trūkumai:
Apsaugo nuo ne visų saugumo spragų operacinės sistemos branduolyje bei Interneto servisuose.
“Įveikus” apsaugą įsilaužėlis gali prieiti prie visų apsaugos komponentų ir kitų kompiuterio resursų. Tačiau tokį trūkumą turi visos apsaugos realizacijos, kuriose visi komponentai dirba viename kompiuteryje.
6. Linux konfigūravimas pagal sudarytą apsaugos schemą
Nuorodos kaip reikėtų konfigūruoti ir galimų parametrų reikšmės paimtos iš [FwPri] Firewalling and Proxy Server HOWTO, [TCPWi] TCP Wrapper README ir [MAN] ipfwadm(8), hosts_access(5), inetd(8) man puslapių.
Konfigūracija susideda iš trijų dalių:
Linux branduolio konfigūravimas.
Paketų filtrų konfigūravimas.
TCP apvalkalo konfigūravimas.
Taip pat toliau laikoma, kad serverio IP adresas yra 193.219.43.28 ir serveris priklauso tinklui 193.219.43.0, kurio potinklio kaukė yra 255.255.255.0. Taip pat tinkle yra kompiuterių iš tinklo 192.168.0.0 potinklių. 192.168.x.x adresai yra specialiai išskirti naudojimui vidiniuose tinkluose kompiuteriams, kurie su Internetu bendrauja netiesiogiai ([Hu92]).
Linux branduolio konfigūravimas
Linux branduolio konfigūravimo režime, kuris iškviečiamas paleidus ‘make menuconfig’, Networking options meniu branduolio parametrus konfigūruojame taip:
[*] Network firewalls
[ ] Network aliasing
[*] TCP/IP networking
[ ] IP: forwarding/gatewaying
[ ] IP: multicasting
[ ] IP: syn cookies
[ ] IP: rst cookies
[*] IP: firewalling
[*] IP: firewall packet logging
[ ] IP: masquerading
[ ] IP: transparent proxy support (EXPERIMENTAL)
[ ] IP: always defragment
[*] IP: accounting
Nepažymėtus parametrus galima konfigūruoti savo nuožiūra, išskyrus IP: forwarding/gatewaying, kurį reikia išjungti. Taip konfigūruojant į Linux branduolį ijungiami paketų filtrų funkcijas atliekantys moduliai.
Kitose operacinėse sistemose, ypač komercinėse UNIX versijose, paketų filtrų bei kitų ugnies sienos funkcijų palaikymas dažnai būna realizuotas kaip papildomi programiniai moduliai.
Paketų filtrų konfigūravimas
Konfigūruojama pagal schemą – viską uždraudžiame ir leidžiame tik tai ko minimaliai reikia. Tokia schema paprastai yra saugesnė negu kita – uždraudžiame ko nereikia, o visa kita leidžiame.
Konfigūracija pateikta kaip UNIX aplinkos interpretatoriaus komandinis failas. Programa ipfwadm valdo branduolio paketų filtrus. Jos pirmas parametras nurodo kuriuos filtrus konfigūruosime:
-F paketų filtravimui tarp tinklo interfeisų.
-O išeinančių paketų filtravimui
-I įeinančių paketų filtravimui
Šios programos pavadinimas ir parametrų reikšmės paprastai skiriasi skirtingoms paketų filtrų realizacijoms. Linux 2.0 versijos branduolyje turime ipfwadm, Linux 2.1 versijos branduolyje programa jau kita. O pavyzdžiui Cisco firmos maršrutizatoriuose paketų filtrai konfigūruojami vėl visiškai kitaip.
#!/bin/sh
###
# uždraudžiame paketų perdavimą tarp tinklo interfeisų
###
ipfwadm -F -p deny
###
# išvalome paketų filtrus
###
ipfwadm -F -f
ipfwadm -I -f
ipfwadm -O -f
###
# filtrai įeinantiems paketams
###
ipfwadm -I -a deny -S 193.219.43.0/24
ipfwadm -I -a deny -S 192.168.0.0/16
ipfwadm -I -a deny -D 192.168.0.0/16
ipfwadm -I -a accept -S 0.0.0.0/0
###
# filtrai išeinantiems paketams
###
ipfwadm -O -a accept -S 193.219.43.0/24
ipfwadm -O -a deny -S 0.0.0.0/24
TCP apvalkalo konfigūravimas
Pirmiausia riboto priėjimo TCP servisai turi būti sukonfigūruoti faile /etc/inetd.conf taip, kad jie būtų paleidžiami ne tiesiogiai, o per TCP apvalkalą. Žemiau pateiktas šio failo fragmentas su taip sukonfigūruotais telnet, ftp ir dar pora kitų servisų.
/etc/inetd.conf yra taip vadinamo Interneto superdemono inetd konfigūracinis failas. Pagal šiuos parametrus inetd laukia vartotojų bandymų prisijungti prie tam tikro serviso ir vartotojui bandant jungtis, šiuos servisus paleidžia.
Papildomas demonas naudojamas tam, kad sutaupytume atminties ir pagerintume sistemos saugumą.
###
# failo /etc/inetd.conf fragmentas
###
ftp stream tcp nowait root /usr/sbin/tcpd wu.ftpd -l -i -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
###
# keletas kitų protokolų, prie kurių galima suteikti ribotą priėjimą
###
login stream tcp nowait root /usr/sbin/tcpd in.rlogind
tftp dgram udp wait tftp /usr/sbin/tcpd in.tftpd /home/tftp/
Toliau konfigūruojamas pats TCP apvalkalas. Jo konfigūracijos failai yra /etc/hosts.allow ir /etc/hosts.deny. Tikrinimas, ar klientas gali pasinaudoti norimu servisu vyksta tokia tvarka:
Priėjimas bus leistas, jei pora klientas-servisas atitinka įrašą faile /etc/hosts.allow.
Jei ne, priėjimas bus uždraustas, jei pora klientas-servisas atitinka įrašą faile /etc/hosts.deny.
Priešingu atveju priėjimas bus leistas.
TCP apvalkalo konfigūracija daugelyje UNIX šeimos operacinių sistemų yra panaši. Tik pavyzdžiui firmos Hewlett Packard operacinėje sistemoje HP-UX TCP apvalkalo funkcijas atlieka jau Interneto superdemonas inetd.
###
# failas /etc/hosts.allow
###
###
# Pasiimti paštą leidžiame iš bet kur
###
in.pop3d : ALL
###
# telnet ir ftp servisais leidžiame naudotis tik mūsų tinklo vartotojams
###
in.telnetd: 193.219.43., 192.168.
wu.ftpd: 193.219.43., 192.168.
###
# lokaliai galima naudotis visais servisais
###
ALL: 127.
Kadangi nesuradus poros klientas-servisas faile /etc/hosts.deny priėjimas būtų leistas, tai į šį failą irašoma viena eilutė, uždraudžianti visus servisus.
###
# failas /etc/hosts.deny
###
###
# jeigu specialiai neleista – servisu naudotis uždraudžiame
###
ALL: ALL
Paketų filtrai ir TCP apvalkalas kitose operacinėse sistemose
Paketų filtrai bei TCP apvalkalas egzistuoja ir daugelyje kitų operacinių sistemų. Tiesa komercinėse UNIX versijose paketų filtrai dažniausiai būna kaip atskiri moduliai kartu su kitais ugnies sienos komponentais.
Paketų filtrai Cisco maršrutizatoriuose
Jeigu mūsų vidinis tinklas prie Interneto prijungtas per maršrutizatorių, galima pasinaudoti daugelyje maršrutizatorių realizuotais paketų filtrais. Taip pasiekiami geresni rezultatai, negu tuomet, kai viskas realizuota viename kompiuteryje
Žemiau pateikta paketų filtrų konfigūracija Cisco firmos maršrutizatoriui. Paketų filtras 101 skirtas įeinantiems duomenų paketams, 102 – išeinantiems.
access-list 101 deny ip 192.168.0.0 0.0.255.255 any
access-list 101 deny ip any 192.168.0.0 0.0.255.255
access-list 101 deny ip 193.219.43.0 0.0.0.255 any
access-list 101 permit ip any any
access-list 102 permit ip 193.219.43.0 0.0.0.255 any
access-list 102 deny ip any any
Ir priskiriame paketų filtrus interfeisui, per kurį maršrutizatorius bendrauja su Internetu.
ip access-group 101 in
ip access-group 102 out
TCP apvalkalas HP-UX
TCP apvalkalo funkcijas HP-UX operacinėje sistemoje atlieka Interneto superdemonas inetd. Apribojimo taisyklės konfigūruojamos faile /etc/inetd.sec. Tik jos nėra tiek lanksčios kaip Linux atskirame TCP apvalkale. Labai kliudo vienas trūkumas: negalima naudoti šablono vietoj serviso pavadinimo. Todėl neišeina uždrausti visų neišvardintų servisų. Failo sintaksė aprašyta inetd.sec(4) man puslapyje.
###
# failas /etc/inetd.sec
###
telnet allow 193.219.43.* 192.168.*
ftp allow 193.219.43.* 192.168.*
pop3 allow
telnet deny
ftp deny
7. Saugumo spragos, rastos 1997 metais
Šių metų duomenimis galima patikrinti auksčiau išdėstytos apsaugos schemos statistinį patikimumą.
1997 metais darbe išskirta 31 saugumo spraga. Jų skaičiaus padidėjimą galima paaiškinti keliais veiksniais:
Linux, kaip operacinės sistemos išpopuliarėjimu. Dėl to daugiau žmonių peržiūrėjo Linux branduolio ir jo kitų komponenčių išeities tekstus.
Didėjančiu dėmesiu kompiuteriniam saugumui. Nes vis daugiau ir daugiau kompiuterių prisijungia prie Interneto tinklo. Dėl ko didėja potencialių įsilaužėlių skaičius.
Klaidos pagal jų vietą TCP/IP sluoksniuose.
Klaidos interneto servisuose 28 (90%)
Klaidos interneto sluoksnyje 3 (10%)
Išdėstymas pagal spragos priežasčių tipą.
Buferio perpildymas 22 (71%)
Lokalių programų paleidimas 2 (6%)
Kitos klaidos 7 (23%)
Juntamai padidėjo buferio perpildymo klaidų dalis. To priežastis greičiausiai yra tai, kad tokio tipo klaidos randamos paprasčiausiai. Netgi nelabai kvalifikuotas programuotojas gali atsekti potencialų buferio perpildymą. Pakanka surasti ir išanalizuoti kreipinius į funkcijas strcpy(), sprintf() ir dar kelias. Funkcija gets() dabar jau praktiškai nebenaudojama.
Ir klaidos pagal jų radimo vietą.
Klaidos riboto priėjimo Interneto servisuose 19 (61%)
Klaidos laisvo priėjimo Interneto servisuose 9 (29%)
Klaidos operacinės sistemos branduolio dalyje, kuri užsiima darbu su TCP/IP 3 (10%)
Ir pagal radimo vietą klaidų pasiskirstymas liko beveik toks pat kaip ir 1996 metais.
8. Pasiekti rezultatai
Pritaikę darbe išdėstytą apsaugos schemą mes serverį apsaugome nuo klaidų riboto priėjimo servisuose. 1996 metais tokių klaidų buvo maždaug 64%, 1997 metais – 61%. Taip pat paketų filtrai apsaugojo nuo vienos iš trijų saugumo spragų Linux branduolyje 1997 metais.
Taip pat klaidų analizė rodo, kad vienos krypties pastangų neužtenka. Be paketų filtro ir TCP apvalkalo dar reikėtų:
Paketų filtrus iškelti į kitą kompiuterį arba maršrutizatorių. Taip žymiai patikimiau apsaugosime Linux branduolį nuo “blogų” IP paketų.
Maksimaliai saugiai sukonfigūruoti laisvo priėjimo servisus.
Imtis kitų priemonių tam, kad buferio perpildymas nesukeltų grėsmės sistemos saugumui.
9. Neišspręstos problemos. Kryptys tolimesniam tyrimui
Apsisaugojus nuo problemų riboto prieinamumo servisuose liko saugumo spragos laisvo priėjimo servisuose. Dažniausiai pasitaikanti spraga – buferio perpildymas. Ją gana įdomiai ir beveik pilnai išsprendžia Solar Designer parašytas Linux branduolio papildymas ([SDi]).
Darbas iškėlė keletą minčių tolimesniam UNIX šeimos operacinių sistemų saugumo tyrimui.
Pusiau automatizuotas potencialaus buferio perpildymo tikrinimas
Buferio perpildymą beveik visada sukelia tos pačios funkcijos:
gets. Jos iš viso neturėtų būti C kalba parašytose programose. Reikėtų keisti į fgets.
strcpy. Iš vartotojo pateiktos simbolių eilutės į kopijuojant į fiksuoto ilgio buferį, jį galima perpildyti. Problemą galima spręsti arba keičiant funkciją į strncpy, arba prieš iškviečiant strcpy patikrinti vartotojo pateiktos simbolių eilutės ilgį.
sprintf. Problemos tos pačios kaip ir su strcpy. Sprendimo metodai irgi tokie patys. Keisti galima į snprintf.
Analizuotinos situacijos yra tik su strcpy ir sprintf. Ir gali būti, kad galima parašyti programą, kuri, kiek padedama vartotojo, galėtų atsekti šių funkcijų parametrų kilmę ir parodytų potencialiai pavojingas vietas.
Laisvai prieinamų servisų konfigūravimas
Plačiausiai naudojami laisvai prieinami servisai dažniausiai dirba be TCP apvalkalo pagalbos, kad gautų maksimalų darbo greitį. Taip dirba labiausiai apkrauti iš visų servisų: naujienų (NNTP), pašto transporto (SMTP) ir WWW serveriai.
Problema būtų – kaip juos sukonfigūruoti, kad potencialios saugumo spragos keltų minimalią grėsmę visos sistemos saugumui.
10. Apibrėžimai
Adresų transliavimas
Adresų transliavimas (Network Address Translation – NAT) tai nematomas tarpininkas tinklo duomenų paketų kelyje. Einant per tokį tarpininką pakeičiamas IP paketo šaltinio adresas ir jis perduodamas toliau. Grįžus atsakymui, IP paketo tikslo adresas pakeičiamas atgal pagal išsaugotas lenteles. [NATi]
Duomenų paketas su padirbtu IP adresu
Tai duomenų paketas, kurio šaltinio arba tikslo adresas yra netikri. Taip daro įsilaužėliai norėdami nuslėpti tikrają savo vietą Internete. Taip pat tam tikros šaltinio bei tikslo adresų kombinacijos IP pakete gali sukelti problemų serverio darbui. [GS96]
Linux
Laisvai, su išeities tekstais platinamas UNIX šeimos operacinės sistemos branduolys. Pradėtas rašyti studento iš Suomijos Linus Torvalds, kuris ir dabar koordinuoja branduolio vystymą. [LOi]
Paketų filtras
Taisyklių rinkinys, pagal kurį tinklo duomenų paketas praleidžiamas arba nepraleidžiamas pro tinklo interfeisą.
Tinklo interfeisas šiuo atveju gali būti tiek tinklo adapteris, tiek modemas naudojamas prisiskambinti Interneto paslaugų tiekėjui, tiek bet koks kitas įrenginys naudojamas prisijungimui prie lokalaus arba globalaus tinklo. [CZw95]
suid tipo programa
Programa, kuriai suteiktas suid tipas. Tai reiškia, kad pradėjus vykdyti, programa paleidžiama su kito vartotojo (dažniausia root) teisėmis. Tai vienas iš metodų, kaip vartotojui leisti trumpam prieiti prie paprastai jam nematomų duomenų. Kitas būdas – bendravimas su root teisėmis dirbančiu demonu. [Fr95]
Tarpininkas (proxy)
Programa, kuri peradresuoja užklausas ir atgal perduoda atsakymus. Labiausiai paplitę yra WWW tarpininkai. Tai vienas iš metodų, kaip vidinio tinklo vartotojai gali prieiti prie Interneto resursų. [CZw95]
TCP apvalkalas
Programa, kuri pradeda TCP sesiją ir jeigu kliento adresas tenkina nurodytas sąlygas – paleidžia norimą Interneto servisą. [TCPWi]
Ugnies siena
Programinių-aparatinių priemonių kompleksas, naudojamas tam, kad kontroliuojamai atskirti kompiuterinius tinklus.
Atskirti galima tiek lokalų tinklą nuo Interneto tiek kelis lokalius tinklus vieną nuo kito. Atskiriama filtruojant tinklo duomenų paketus. [CZw95]
11. 1996 metais surastų įsilaužimų sąrašas
Programa Grėsmės
priežastis Trumpas klaidos apibūdinimas
dip suid Buferio perpildymas
dump dirba root teisėmis Netikrina failų teisių
bind() sisteminė funkcija Leidžia “vogti” sesijas
resizeicons suid Leidžia programą nepateikdama pilno kelio iki jos
fingerd Leidžia atlikti grandininį finger
sendmail servisas root teisėmis Klaidos komandų realizacijoje. Potencialus buferio perpildymas
login servisas root teisėmis Buferio perpildymas
getpwnam() sisteminė biblioteka Blogai apdoroja parametrus
kerneld servisas root teisėmis Neatsargiai kviečiama request_route.sh programa
suidperl suid Nepakankamai apsaugotas nuo nekorektiškų veiksmų
rdist suid Buferio perpildymas
sliplogin servisas root teisėmis Neatsargiai paleidžia programas root teisėmis
rwhod servisas root teisėmis Buferio perpildymas
mount suid Buferio perpildymas
rlogin servisas root teisėmis Buferio perpildymas
sendmail servisas root teisėmis Buferio perpildymas
SYN flood TCP/IP stekas Naudojamasi TCP sesijos užmezgimo
ftpd servisas root teisėmis Laiko atmintyje vartotojų slaptažodžius
sendmail servisas root teisėmis Nutolęs vartotojas gali paleisti programas
ping TCP/IP stekas Ilgas ping tinklo paketas nutraukia serverio darbą
ncpmount suid Buferio perpildymas
lpr suid Buferio perpildymas
umount suid Buferio perpildymas
crontab servisas root teisėmis Buferio perpildymas
login servisas root teisėmis Buferio perpildymas
12. Literatūros sąrašas
[CZw95] D.Brent Chapman, Elizabeth D.Zwicky Building Internet Firewalls. O’Reilly & Associates 544pp 1995.
[GS96] Simson Garfinkel, Gene Spafford Practical Unix and Internet Security, 2nd ed. O’Reilly & Associates 1004pp 1996.
[GS97] Simson Garfinkel, Gene Spafford Web Security & Commerce. O’Reilly & Associates 506pp 1997.
[Hu92] Craig Hunt TCP/IP Network Administration. O’Reilly & Associates 502pp 1992.
[Fr95] AElen Frisch Essential System Administration, 2nd ed. O’Reilly & Associates 788pp 1995.
[SIP97i] Increasing Security on IP Networks.
[BQi] Bugtraq mailing list archives.
[LiAi] Linux-alert mailing list archives.
[LOi] Linux Online – Help Center.
[FwPri] Mark Grennan Firewalling and Proxy Server HOWTO.
[NATi] Michael Hasenstein Linux IP Network Address Translation.
[AKi] Albert Kahalan The Linux Kernel Wish List http://www.cs.uml.edu/~acahalan/linux/22wishlist.html
[SDi] Solar Designer Secure Linux — kernel patch
[IVDi] Infilsec Vulnerabilities Database. http://www.infilsec.com/vulnerabilities/
[RTi] rootshell.com
[TCPWi] TCP Wrapper README, 1996
***
Vilniaus Universitetas
Matematikos fakultetas
Informatikos katedra
UNIX sistemos saugumas
magistro darbas
Mindaugas Riauba