KOMPIUTERIŲ IR OPERACINIŲ SISTEMŲ SAUGA

Download Report

Transcript KOMPIUTERIŲ IR OPERACINIŲ SISTEMŲ SAUGA

Europos socialinis fondas
KOMPIUTERIŲ IR OPERACINIŲ
SISTEMŲ SAUGA
4. Programų saugumas
4.3. C++ ir .NET sistemos saugos priemonės
Mokomoji medžiaga parengta vykdant ES struktūrinių fondų remtą projektą
INFORMACIJOS SAUGOS STUDIJŲ MODULIŲ RENGIMAS IR
DĖSTYTOJŲ KVALIFIKACIJOS TOBULINIMAS
Sutarties Nr. ESF/2004/2.5.0-03-421/BPD-190 (SFMIS Nr. BPD2004-ESF-2.5.0-03-05/0082)
Kauno technologijos universitetas, 2007
Europos socialinis fondas
Autoriai
doc. Algimantas Venčkauskas
[email protected]
(skirsniai: 0, 1.1, 1.2, 1.4, 2.1, 2.2, 2.3, 2.4, 2.5, 3.2, 3.3)
doc. Eugenijus Toldinas
[email protected]
(skirsniai: 1.3, 3.1, 4.1, 4.2, 4.3)
Kompiuterių katedra
http://www.ifko.ktu.lt/~algvenck/KirOSsauga/
k2007os k2007ossp
2
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Modulio turinys (1)
1. Kompiuterių ir OS saugumo pagrindai
1.1. Kas yra kompiuterių saugumas?
1.2. Kompiuterių saugumo standartai ir įvertinimo kriterijai
1.3. Formalūs kompiuterių saugos modeliai
1.4. Kriptografija ir kriptografijos protokolai
2. Operacinių sistemų saugumas
2.1. OS apsaugos mechanizmai
2.2. Prieigos saugumas
2.3. Biometriniai prieigos saugumo metodai
2.4. Failų sistemų saugumas
2.4. OS saugumo auditas ir stebėsena











3
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Modulio turinys (2)
3. Kompiuterių saugumas
3.1. Duomenų sauga kompiuterinėse laikmenose
3.2. Kompiuterių tinklų saugumas
3.3. Rizikos mažinimas
4. Programų saugumas
4.1. Programų saugos problemos: kenkėjiškos programos,
piratavimas
4.2. Programų saugos metodai, buferio perpildymo
problema
4.3. C++ ir .NET sistemos saugos priemonės








4
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Paskaitos tikslai
Šioje temoje nagrinėjami klausimai:
 Programų saugos metodai .NET aplinkoje.
 Programų sauga: sąvokos, problemos.
 Saugos pažeidžiamumas.
 Tipų saugumo kontrolė.
 Kodo pasirašymas.
 Šifravimo tarnybos.
 Kodo prieigos sauga.
5
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Programų saugos metodai .NET aplinkoje
Tipų saugumo kontrolė (verifiable type safety) – užtikrina teisingai
suformuotą programų kodo struktūrą ir tiksliai nustato atminties
prieigą.
Kodo pasirašymas (code signing) – apibrėžia unikalų komponavimo
identiškumą ir užtikrina vartotojus, kad nuo programos sukūrimo
momento kodas nebuvo paliestas ir modifikuotas.
Šifravimo tarnybos (cryptographic services) – suteikia šifravimo
mechanizmus srautinio duomenų siuntimo apsaugai.
Kodo prieigos sauga (code access security) – apsaugo išteklius
(failų sistemą, registrą arba tinklą) apribojant prieigą prie jų saugos
politikos.
Buferio perpildymo kontrolė (buffer overflow) – apsaugo, kai
perduodama daugiau duomenų, negu leidžia dalykinės programos
naudojamas atminties kiekis.





6
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Programų sauga: sąvokos, problemos
Programų sauga .NET aplinkoje yra papildomas apsaugos
būdas.
Naudojantis jį vartotojas negali aplenkti arba pakeisti OS
ir tinklo apsaugą, jis gali tik sustiprinti ir išplėsti saugos
galimybes.
Vartotojų autentifikavimas ir orientuotas į objektą prieigos
valdymas sudaro saugos modelį, kuris naudojamas
operacinėse sistemose MS Windows ir Linux.
Prieš prieigos prie apsaugotų objektų (tokių kaip failas,
registro raktas arba įrenginys) teisių suteikimą nustatomas
vartotojo tapatumas ir suformuojamas jo atvaizdas.




7
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Programų sauga: sąvokos, problemos
Autentifikavimas MS Windows operacinėje sistemoje numato tris
skirtingus mechanizmus: Kerberos, NTLM, viešojo rakto sertifikatas.
Tokia sistema pagrįsta, bet šiek tiek primityvi smulkmenų atžvilgiu –
kai vartotojo tapatumas vieną kartą nustatytas, daugelio programų
kodas gali būti įvykdytas ir gauta prieiga prie išteklių, prie kurių šis
vartotojas turi prieigos teisę.
Aplinkos .NET saugos modelis leidžia tikrinti kodą jo vykdymo
metu, nustatyti ne tik vartotojo tapatumą, bet ir pačios vykdomos
programos kodo tapatumą. Prieiga prie išteklių suteikiama
konkrečiam komponentui taip, kaip tai apibrėžta saugumo politikoje,
ir ši politika sukurta ir palaikoma kaip administracinė užduotis. Tai
labai apsunkina programų kodo rašymą, kuris gali aplenkti .NET
saugą.



8
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Saugos pažeidžiamumas
Galima suskirstyti saugos pažeidimus į nepiktavališkus (innocent) ir
piktavališkus (malicious).
 Nepiktavališkas saugos pažeidimas apima situacijas, kuriose
autorizuotieji, bet neatidūs vartotojai netyčia apgadina sisteminius
objektus dėl savo neatsargumo arba panaudoję programos kodą su
saugos spragomis. Nepiktavališki vartotojai gali gauti prieigos teisę
prie slaptos informacijos, prie kurios jie neturėjo turėti prieigos,
tiesiog dėl operacinės sistemos saugos lankstumo stokos ir galimybių
tinkamai valdyti jiems leistinas prieigas.
 Piktavališkas saugos pažeidimas yra nepiktavališkų užpuolimų
antaibis (innocent superset) dėl to, kad vienas iš standartinių
piktavališkų atakų prieigų yra apsimetimas autorizuotuoju vartotoju.
Kita piktavališkų atakų prieiga - esamo programų kodo
modifikavimas, kad jis nefunkcionuotų taip, kaip tai buvo numatyta.
Buferio perpildymas programų kodui modifikuoti yra klasikinis
piktavališko pažeidimo pavyzdys.

9
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Saugos pažeidžiamumas

Geros saugos modelis turi įvertinti pažeidimų riziką šiais atvejais:
1. Slaptumo pažeidimas (breach of privacy) – neautorizuotieji
vartotojai (unauthorized user) arba programų kodas gauna prieigą
prie įslaptintos informacijos, kuria galima pasinaudoti komercinėje
konkurencijoje (personalo sąrašai, mokėjimo algalapiai, pirkėjų
duomenys). Terminu „neautorizuotasis vartotojas“ vadinami tiek
nepiktavališki vartotojai, kuriems klaidingai buvo suteiktos prieigos
teisės, viršijančios autorizacijos įgaliojimus, tiek ir piktavališki
vartotojai.
2. Audito klastojimas (falsification of auditing) – saugos ir kitos
administracinės sistemos turi galimybės siekti registruoti operacijas
su apsaugotais objektais ir bandymus nulaužti saugumą.
Piktavališkas įsilaužėlis gali bandyti suklastoti šiuos registracijos
įrašus kiek po atakų, tiek ir prieš jas – įregistruoti klaidingus
įvykius, kad galima slėpti paskesnes atakas.
10
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Saugos pažeidžiamumas

Geros saugos modelis turi įvertinti pažeidimų riziką šiais atvejais:
3. Tapatumo pamėgdžiojimas (spoofing identity) – tai vienas iš
seniausiai įsilaužėlių naudojamų metodų, kai stengiamasi prisiimti
įgaliotojo vartotojo tapatumą. Šis pamėgdžiojimas sujungia tradicinį
„vartotojo vardas / slaptažodis“ tapatumo pamėgdžiojimą ir IP
adresų tapatumo pamėgdžiojimą, kai siunčiami suklastoti paketai,
kuriose rodoma, kad jie išsiųsti iš patikimų adresų. Standartinės
apsaugos primygtinai verčia vartotojus vartoti stipriuosius
slaptažodžius, kuriems reikia ne mažiau kaip šešių simbolių ir bent
trijų iš keturių simbolių rinkinių: didžiųjų raidžių, mažųjų raidžių,
skaičių ir ne raidinių-skaitmeninių simbolių, tokių kaip skyrybos
ženklai. Taip vartotojas verčiamas dažnai keisti slaptažodžius.
Įsilaužėlis bando atspėti vartotojo slaptažodį naudodamas žodžius iš
failo, saugančio įvairius galimus slaptažodžius, arba rinkdamas
įvairias simbolių kombinacijas tol, kol slaptažodis nebus atspėtas.
11
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Saugos pažeidžiamumas
Geros saugos modelis turi įvertinti pažeidimų riziką šiais
atvejais:

4.
5.
12
Privilegijos lygio paaukštinimas (elevation of privilege) –
kai pirmas saugumo lygis (autentifikavimas) pasiektas, dažnai
tampa lengva siekti kito lygio ir kaip jau autorizuotam
vartotojui įgyti papildomų privilegijų (pvz.,
administratoriaus).
Tarnybos išjungimas (denial of service) –bandoma uždrausti
arba visai išjungti svarbias sistemos tarnybas. Pvz., įsilaužėlis
užverčia Web serverį klaidingais reikalavimais, siekdamas
trukdyti jam valdyti tikrus reikalavimus, arba sutrikdo
kompiuterio veiklą ištrindamas sisteminius failus.
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Saugos pažeidžiamumas
Geros saugos modelis turi įvertinti pažeidimų riziką šiais
atvejais:

6.
13
Mobilusis kodas (mobile code) – populiarėjantis saugumo
pažeidimas, kai kodas gali būti prikabintas prie elektroninio
pašto laiškų, parsisiunčiamų iš interneto failų, įskaitant ir
Active X valdiklius. Daugelis elektroninio pašto serverių
leidžia administratoriams konfigūruoti serverį taip, kad būtų
uždrausta prikabinti tam tikros rūšies, pvz., dvejetainius,
failus, arba taip, kad reikėtų apriboti prikabinto failo dydį.
Nors interneto naršyklės ir atpažįsta HTML kodą su
scenarijumi (HTML containing script), jos gali atmesti jį arba
priimti besąlygiškai, nepaliekant galimybės atrankai. Active X
valdiklis gali turėti skaitmeninį parašą, garantuojantį
klientams, kad jis iš patikimo šaltinio, bet tai neapsaugo nuo
valdiklio sugadinimo jau po to, kai jis buvo pasirašytas.
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Aplinkos .NET saugos modelis
Aplinkos .NET saugos modelis leidžia apsisaugoti nuo
minėtųjų pažeidžiamumų.
Nors kai kurie .NET saugos aspektai yra automatiniai,
kiti gali būti gerai valdomi programiškai, o konfigūracija
atlikta administracinėmis priemonėmis.


14
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė

Programavimo kalbos C ir C++ skiriasi tuo, kad C++ yra
saugesnio tipo kalba. C++ kompiliatoriai užtikrina griežtus
reikalavimus suteikti korektiškus duomenų tipus parametrams,
perduodamiems į funkcijas.
C++ palaiko statinius ir dinaminius tipus jų saugumo lygiui
padidinti, konvertuojant duomenis iš vieno tipo į kitą. C# kalbos
operatoriai išsivystę iš statinių ir dinaminių C++ kalbos duomenų
tipų.
Pažymėtina, kad C ir C++ (įskaitant ir C++ su valdomojo kodo
išplėtimais vykdyti .NET aplinkoje) vis dar leidžia vartoti
neapdorotas rodykles (raw pointer).
Galima keisti bet kokio tipo rodyklę į kito tipo rodyklę kada tik
norima. Toks keitimas atliekamas todėl, kad visos rodyklės iš
tikrųjų yra vienodo tipo – 32 bitų kintamieji.



15
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė




16
C ir C++ kalbos leidžia bet kokį 32 bitų kintamąjį traktuoti kaip
rodyklę, ir tiek. Viena iš tokios galimybės priežasčių – įgyti
lankstumą.
Tradicinė C kalba neturi „polimorfizmo“ (polymorphism) ir
„delegato“ (delegates) sąvokų, todėl tas pats veiksmas galimas tik
panaudojus funkcijos priešpriešinę iškviestą (callback).
Priešpriešinė iškviesta reiškia, kad funkcijos atviros ir gali priimti
tuščius parametrus arba 32 bitų sveikojo tipo (integer) rodykles kaip
parametrus. Šioje situacijoje galima pakeisti rodyklę į bet ką. Tokia
sistema labai sunkiai valdoma ir negali būti inspektuojama
programų kodo vykdymo metu.
Todėl C# kalba leidžia vartoti neapdorotas rodykles tik nesaugiame
kontekste.
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė
Išnagrinėkime programos kodą, kuris akivaizdžiai
nesaugus. Tokio tipo užduotį tikrai gana sunku aprašyti
C# kalba, nes kompiliatorius labai reiklus transliuojamos
programos kodo saugumui. Todėl pirmajam bandymui
galima sukurti programos tekstą tiesiog Microsoft
tarpine kalba MSIL (Microsoft intermediate language) ir
sukompiliuoti jį su ILASM (intermediate language
assembler).

17
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė
.assembly Blogas{}
.class Nesaugus
{
.method public static void Main() cil managed
{
.entrypoint
pop // bandymas skaityti iš steko kintamojo reikšmę
ret
}
}
18
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė

MSIL kodas priimtinas .NET asembleriui: jis tiksliai
apibrėžia asemblerį, kuriame yra viena klasė,
inkapsuliuojanti standartinį pagrindinį (Main) klasės
metodą.
Programos kodas nesaugus dėl to, kad bando skaityti iš
steko kintamojo reikšmę, kai ji dar neįrašyta į steką.
Ši operacija klaidinga ir jos rezultatas klaidingas – steko
reikšmių praradimas, jeigu šios programos kodas bus
įvykdytas.


19
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė

Pirminis programos kodas (source code) formuojamas komanda
„ilasm nesaugus“.
Kompiliatorius ILASM perduos šį kodą į įvykdomą asemblerį
nepaisant akivaizdžios klaidos, nes rašant kodą šiuo lygmeniu gana
lengva rašyti nesąmoningus operatorius, kurie sėkmingai įveikia
kompiliatorių

20
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė
Toliau galima peržiūrėti sukompiliuotą rezultatą faile
„nesaugus.exe“
su
atvirkštinio
asemblerio
kompiliatoriumi ILDASM (intermediate language
disassembler)

21
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė
Įvykdžius šios programos kodą, gaunamas pranešimas
apie susidariusią išimtinę situaciją:


Įvyko tai, ko ir tikėtasi – vykdant programos kodą bendrosios kalbos
vykdomoji aplinka CLR (Common Language Runtime) atliko tipų saugos
kontrolės žingsnį kaip dalį kompiliavimo proceso JIT (just-in-time). Šiuo
atveju vykdomoji aplinka nustatė, kad programos kodas yra klaidingas ir
atsisakė jį vykdyti.
22
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Tipų saugumo kontrolė
Galima vykdyti tipų saugos kontrolę .NET Framework
SDK pagalbine programa „peverify.exe“, kuri praneša
apie programos kodo klaidas:

23
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Jūs norit, ir daugelis kodavimo standartų tai palaiko,
pasirašyti savo asemblerį griežtu vardu (strong name
signing). Šis pasirašymas turi keletą tikslų:




24
Parūpina unikalų tapatumą kiekvienam asembleriui, kurį
vėliau galima naudoti ne tik kaip įdiegimo strategiją, bet ir
kaip konfigūruojamą saugą.
Kodo pasirašymo mechanizmas grindžiamas viešojo rakto
kriptografija ir taip užtikrina asemblerio naudojimą vartotojo
pusėje. Griežtą vardą sunku sufalsifikuoti.
Bendrosios kalbos vykdomoji aplinka atlieka parašo
patikrinimą kaip programos kodo įkrovimo operacijos dalį ir
taip užtikrina programos kodo tikrumą.
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Pagrindinis .NET asemblerių įdiegimo veiksnys – jų pasirašymas
griežtais vardais.
Asemblerius, kurie bus naudojami tik vienos programos kode ir
gali būti įdiegti tame pačiame kataloge, kuriame yra ir programos
kodas, galima įdiegti ir be griežtų vardų parašų. Šis asemblerio
tipas gerai žinomas kaip privatusis asembleris dėl jo
priklausomybės vyraujančiai programai. Jis gali būti lengvai
įdiegtas ir pašalintas paprastai kopijuojant arba naikinant failus.
Bet jeigu reikia išdėstyti asemblerį nutolusiose sistemose, padaryti
jį prieinamą daugeliui programų bendram naudojimui arba
pasinaudoti saugumo tikrinimu vykdant programas, asembleris turi
būti pasirašytas griežtais vardais.



25
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Asemblerių pasirašymą griežtais vardais galima
papildyti autentifikuotuoju kodu.
Šio kodo signatūra garantuoja, kad patikimas leidėjas
pasirašė asemblerį iki tol, kol neatšauks sertifikatą,
susietą su signatūra.
Nors autentifikuotasis kodas ir .NET kodo parašai turi
skirtingus tikslus, jie papildo vienas kitą.
Atkreipkite dėmesį į tai, kad autentifikuotojo kodo
signatūra turi būti pritaikyta po griežto.NET vardo
parašo.




26
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Privatieji asembleriai
Išnagrinėkime privačiojo asemblerio savybes. Sukurkime klasių
bibliotekos programos kodą ir išsaugokime faile „Sveiki.cs“, parašykime
kliento programos kodą ir išsaugokime faile „Klientas.cs“

27
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Privatieji asembleriai
Perduokime programų kodus naudodamiesi C# kalbos
kompiliatoriumi su atitinkamais raktais.
Kompiliavimo komandos:


28
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Privatieji asembleriai
Dabar pasinaudosime ILDASM įrankiu ir atidarysime failą
„Klientas.exe“.
Šiame faile panagrinėkime manifestą:


29
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas




Manifeste galima pamatyti griežto vardo parašą, kuris pažymėtas sakiniu „
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )“ ir priklauso OS bibliotekai
„mscorlib.dll“. Mūsų kliento programa naudoja klasių biblioteką
„Sveiki.dll“, kuri neturi griežto vardo parašo.
Kai Jūs pridedate nuorodą į priklausantį asemblerį, numatytasis Visual
Studio įrankis padarys vietinę priklausančio asemblerio kopiją ir įkels ją į
kliento programos katalogą. Jeigu paleidžiame programą „Klientas“ su
Visual Studio, tai viskas veiks labai gerai. Bet kas atsitiks, jeigu pakeisime
klasių bibliotekos „Sveiki“ versijos numeri, sakykim, į 1.12.5.0.
Testuoti šį atvejį reikėtų leidžiant programą „Klientas“ iš komandinės
eilutės. Programa veiks, nepaisant to, kad „Klientas“ dabar naudoja kitą
klasių biblioteką, kurios versija 1.12.5.0. Vykdomoji aplinka paprasčiausiai
patikrino klasės bibliotekos metodo vardo atitikti ir netikrino versijos
numerio.
Pakeiskime klasės bibliotekos „Sveiki.dll“ metodo vardą SveikiMetodas į
NaujasMetodas. Ši klasės bibliotekos versija tapo nesuderinama su
„Kliento“ programa dėl to, kad jau nebepalaiko viešojo metodo vardo
SveikiMetodas. Dabar leidžiant „Kliento“ programą .NET vykdomoji
aplinka praneš apie išimtis
30
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Privatieji asembleriai
Darytinos išvados, kad .NET vykdomoji aplinka nesirūpina
versijomis, kai ji dirba su privačiaisiais asembleriais, kurie neturi
griežto vardo parašo. Galima pagalvoti, kad .NET vykdomosios
aplinkos elgesys skiriasi, kai ji dirba su griežtu vardu pasirašytais
asembleriais. Išnagrinėkime šį atvejį.

31
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Asembleriai su griežtais vardais
1.
Kaip reikia sukurti asemblerį su griežtais vardais? .NET aplinkoje
naudojama asimetrinė kriptografija viešuoju raktu. Jos algoritmas:
2.
Jūs generuojate ilgą seką dvejetainių duomenų, susidedančių iš dviejų
loginių dalių: viešasis raktas ir privatusis raktas. Kaip sudaroma ši seka,
priklauso nuo šifravimo algoritmo. Nesvarbu, koks šifravimo algoritmas
panaudotas, rezultatas turi būti unikalus. Yra standartinis .NET įrankis
„sn.exe“, skirtas tokių raktų porai generuoti.
3.
Toliau ši raktų pora naudojama asembleryje kuriant programų vykdomąjį
kodą C# kalbos kompiliatoriumi „csc.exe“ arba asemblerio redaktoriumi
„al.exe“. Kai naudojama šifravimo raktų pora, kompiliatorius (arba
asemblerio redaktorius) pagal maišos funkciją apskaičiuoja maišos
reikšmes (hashes) ir privačiuoju raktu iš naudojamos raktų poros
užšifruoja maišos reikšmę (hash). Užšifruotoji maišos reikšmė, kitaip
vadinama griežto vardo signatūra (strong-named signature), ir viešasis
raktas išsaugomi asembleryje.
32
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Asembleriai su griežtais vardais
4.
Vėliau .NET vykdomoji aplinka įkelia į operatyviąją atmintį
asemblerį, užšifruotą maišos reikšmę, nuskaito viešąjį raktą iš
manifesto ir juo iššifruoja maišos reikšmę. Kitu žingsniu .NET
vykdomoji aplinka pagal maišos funkciją apskaičiuoja maišos
reikšmę ir ją palygina su manifesto maišos reikšme. Jeigu
gautosios reikšmės sutampa, asemblerio programų kodas
leidžiamas vykdyti, priešingu atveju asembleris atmetamas ir
pranešama apie išimtis.
5.
Kai formuojamas kliento asembleris, naudojantis griežto vardo
signatūrą, viešasis raktas nuskaitomas iš jo manifesto ir
naudojamas maišos funkcijoje sukuriant viešojo rakto prieigą
(public key token), kuri saugoma dominuojančiame asembleryje
kaip asemblerio nuoroda AssemblyRef entry. Viešojo rakto prieiga
yra viešojo rakto maišos funkcijos reikšmė ir yra daug mažesnė už
viešąjį raktą.
33
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo pasirašymas
Asembleriai su griežtais vardais

Taigi asemblerio projektuotojas išsaugo privatųjį raktą, kuris niekada
neskelbiamas viešai.

Antra vertus, pasirašytas asembleris turi viešąjį raktą ir vyraujančių
klientų asembleriai visada turi viešojo rakto maišos reikšmę.

Privačiuoju raktu užšifruoti duomenys gali būti iššifruoti tik viešuoju. Ir
atvirkščiai, viešuoju raktu galima užšifruoti, privačiuoju – iššifruoti.

Šis procesas vadinamas asimetrine kriptografija (asymmetric
cryptography). Be to, tai, kad privačiaisiais raktais užšifruojamos
originalios asemblerio maišos funkcijos reikšmės, leidžia pasirašiusiam
asmeniui tvirtinti, kad tik Jis (arba Ji) turi prieigą prie autentiško
(nesuklastoto) privačiojo rakto.

Jeigu vykdant programos kodą maišos reikšmės nesutampa, tai gali
reikšti, kad pasirašęs asmuo nepanaudojo tikrojo privačiojo rakto (ir
asembleris gali būti pripažintas suklastotas) arba asemblerio turinys ar jo
užšifruota maišos reikšmė buvo suklastoti (ir vėl .NET vykdomoji aplinka
gali tai lengvai atpažinti).
34
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Šifravimo tarnybos
Programų kodo pasirašymas ir griežti vardai – vienas iš šifravimo
tarnybų naudojimo variantų.
Galima pasinaudoti ir .NET šifravimo klasių bibliotekos
galimybėmis (System.Security.Cryptography vardų erdve).
Šifravimas apsaugo duomenis nuo neautorizuotojo modifikavimo
arba peržiūros ir užtikrina ryšio kanalais perduodamos
informacijos saugumą. Pvz., galima užšifruoti duomenis ir perduoti
šifruotę (cipher text) bet kokiu apsaugotu arba neapsaugotu kanalu
numatomam gavėjui, kuris sugebės iššifruoti gautus duomenis.
Jeigu tretieji asmenys perims duomenis perdavimo metu, jiems bus
sunku juos iššifruoti. .NET klasių biblioteka aprūpina vartotojus
visapuse šifravimo tarnybų aibe, kurios elementus kombinuojant
galima suformuoti sudėtinga apsaugos sistema.




35
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo prieigos sauga
.NET vykdomoji aplinka įkeltam asemblerįui suteikia aibę leidimų
prieiti prie OS išteklių.
Leidimų grupė vadinama prieigos teise (permission set) ir ši teisė
pagrįsta saugumo politika.
Yra standartinės prieigos teisės ir administratorius gali sukurti
naujas prieigos teises. Be to, yra standartinės kodų grupės ir
administratorius gali sukurti naujas.
Būna ir kodų grupės atvaizdas į leidimų grupę. Šis atvaizdas
sudaromas kaupiant asemblerio požymius, tarp jų ir griežtų vardų
tapatumą.
Rezultatas – asembleriai su tam tikrais tapatumais atvaizduojami į
apibrėžtas ir jiems leidžiamas leidimų grupes.
Saugumo politika atvira ir ją galima konfigūruoti .NET
administracinėmis priemonėmis.
Programos kodas taip pat gali patikrinti ir pareikalauti prieigos
teisės.







36
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo prieigos sauga
.NET saugos politiką sudaro keturi lygiai: įmonės politikos lygis,
kompiuterio politikos lygis, vartotojo politikos lygis ir taikomosios srities
politikos lygis.
Kiekvienas lygis suformuotas iš hierarchinių kodo grupių ir kiekvienai
grupei priskirtos konkrečios prieigos teisės.
Įrankis „mscorcfg.msc“ skirtas saugos politikos parametrams
konfigūruoti:



37
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Kodo prieigos sauga
Programų kodo prieigos teisės skirtos ištekliaus
apsaugoti nuo neautorizuoto jų panaudojimo.
.NET klasių biblioteka turi klasių aibę kiekvienam
leidimui apibrėžti.
Visos šios klasės aibės išvestos iš
CodeAccessPermission klasės ir turi prieigos teisių
nustatymo metodus: Demand, Assert, Deny,
PermitOnly, IsSubsetOf, Intersect, Union.
Programų kodo prieigos teisės reiškia galimybę siekti
apsaugotų išteklių: failų, registro, nevaldomo kodo ir t. t.
Programos kodas gali patikrinti prieigos teises prieš
atliekant reikiamus veiksmus.





38
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Santrauka

Programų saugos metodai .NET aplinkoje:
 Tipų saugumo kontrolė (verifiable type safety) – užtikrina teisingai
suformuotą programų kodo struktūrą ir tiksliai nustato atminties
prieigą.
 Kodo pasirašymas (code signing) – apibrėžia unikalų komponavimo
identiškumą ir užtikrina vartotojus, kad nuo programos sukūrimo
momento kodas nebuvo paliestas ir modifikuotas.
 Šifravimo tarnybos (cryptographic services) – suteikia šifravimo
mechanizmus srautinio duomenų siuntimo apsaugai.
 Kodo prieigos sauga (code access security) – apsaugo išteklius (failų
sistemą, registrą arba tinklą) apribojant prieigą prie jų saugos
politikos.
 Buferio perpildymo kontrolė (buffer overflow) – apsaugo, kai
perduodama daugiau duomenų, negu leidžia dalykinės programos
naudojamas atminties kiekis.
39
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Santrauka (2)

Asemblerio pasirašymas griežtu vardu (strong name
signing) turi keletą tikslų:



40
Parūpina unikalų tapatumą kiekvienam asembleriui, kurį vėliau
galima naudoti ne tik kaip įdiegimo strategiją, bet ir kaip
konfigūruojamą saugą.
Kodo pasirašymo mechanizmas grindžiamas viešojo rakto
kriptografija ir taip užtikrina asemblerio naudojimą vartotojo
pusėje. Griežtą vardą sunku sufalsifikuoti.
Bendrosios kalbos vykdomoji aplinka atlieka parašo
patikrinimą kaip programos kodo įkrovimo operacijos dalį ir
taip užtikrina programos kodo tikrumą.
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Santrauka (3)



Programų kodo pasirašymas ir griežti vardai – vienas iš šifravimo
tarnybų naudojimo variantų. Galima pasinaudoti ir .NET šifravimo
klasių bibliotekos galimybėmis (System.Security.Cryptography
vardų erdve). Šifravimas apsaugo duomenis nuo neautorizuotojo
modifikavimo arba peržiūros ir užtikrina ryšio kanalais perduodamos
informacijos saugumą.
.NET vykdomoji aplinka įkeltam asemblerįui suteikia aibę leidimų
prieiti prie OS išteklių. Leidimų grupė vadinama prieigos teise
(permission set) ir ši teisė pagrįsta saugumo politika. Yra
standartinės prieigos teisės ir administratorius gali sukurti naujas
prieigos teises.
.NET saugos politiką sudaro keturi lygiai: įmonės politikos lygis,
kompiuterio politikos lygis, vartotojo politikos lygis ir taikomosios
srities politikos lygis. Kiekvienas lygis suformuotas iš hierarchinių
kodo grupių ir kiekvienai grupei priskirtos konkrečios prieigos teisės.
Įrankis „mscorcfg.msc“ skirtas saugos politikos parametrams
konfigūruoti.
41
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Mokymosi medžiaga

http://www.ifko.ktu.lt/~algvenck/KirOSsauga/:
 Teorinė medžiaga - Mokomoji knyga,
 Laboratorinių darbų medžiaga, ten yra ir referatų temos,
 Pateiktys.
42
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Literatūra






BISHOP, Matt. Computer Security: Art and Science. Addison Wesley
Professional, 2002.- 1136 p. ISBN-10: 0-201-44099-7; ISBN-13: 978-0-20144099-7
BARRETT, Daniel J; SILVERMAn, Richard E.; BYRNES, Robert G. Linux
Security Cookbook. Oreilly, 2003. - 334 p
BOSWORTH, Seymour (Editor); KABAY, M. E. (Editor). Computer Security
Handbook, 4th Edition. Wiley, 2002. – 1224 p. ISBN: 978-0-471-41258-8
DANSEGLIO, Mike; ALLEN, Robbie. Windows Server 2003 Security
Cookbook Security Solutions and Scripts for System Administrators. Oreilly,
2005. – 520p.
PRESTON, W. Curtis. Backup & Recovery. Oreilly, 2007. - 760 p.
SZOR, Peter. Art of Computer Virus Research and Defense. Addison Wesley
Professional, 2005. – 744 p. ISBN-10: 0-321-30454-3; ISBN-13: 978-0-32130454-4
43
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės
Europos socialinis fondas
Papildoma literatūra



PIPKIN, Donald L. Information security: protecting the global enterprise.
Prentice Hall, 2000. - 364 p. ISBN 0-13-017323-1
TANENBAUM, Andrew S. Modern Operating Systems, 2/E. Prentice Hall,
2001 - 976 p. ISBN-10: 0130313580; ISBN-13: 9780130313584
CARRIER, Brian. File System Forensic Analysis. Addison Wesley
Professional. 2005.- 6000 p. ISBN-10: 0-321-26817-2; ISBN-13: 978-0-32126817-4
44
© E. Toldinas, 2007 Kompiuterių ir operacinių sistemų sauga | C++ ir .NET sistemos saugos priemonės