Brandväggar i publika nätverk
Brandväggar i publika nätverk
Brandväggar i publika nätverk
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Brandväggar</strong> i <strong>publika</strong> <strong>nätverk</strong><br />
"The ultimate security is your understanding of reality"<br />
H. Stanley Judd<br />
GUSTAV STENLUND, JONAS VIS<br />
Master’s Thesis at IMIT/TSLAB, KTH & Columbitech<br />
Supervisor: Mats Persson<br />
Examiner: Johan Montelius<br />
ECS/ICT-2006-136
Abstract<br />
Internet is an important part of many modern companies and opens for communication<br />
opportunities between co-workers and parties. Technologies like VPN (Virtual Private<br />
Network) makes it possible for employees to connect from home, public airports or internet<br />
coffee shops. Corporate networks are usually protected by firewalls guarding the physical<br />
borders of the network. These firewalls have difficulties keeping up with the security threats<br />
introduced by these technologies. With the rapid development in mobile internet technologies,<br />
new threats are introduced all the time forcing new counter actions. To be able to<br />
enforce a security policy for a corporate network, all connected nodes must be protected by<br />
a personal firewall.<br />
In this thesis we presents a general model for a personal firewall consisting of two<br />
cooperating filters. By using two filters; one session filter and one dynamic packet filter<br />
we construct an effective tool for maintaining a distributed security policy. The model is<br />
tested by an implementation for Windows XP consisting of a NDIS Intermediate filter and<br />
a TDI Hook filter. By testing the implementation we show that the model satisfies our<br />
requirements and is practically usable.<br />
iii
iv<br />
Sammanfattning<br />
Internet är en viktig del av varje företags verksamhet och öppnar upp möjligheter för<br />
företagen att kommunicera bättre med medarbetare och andra aktörer. Tekniker som VPN<br />
(virtuellt privat <strong>nätverk</strong>) gör det möjligt för anställda att ansluta sig till företaget hemifrån,<br />
från flygplatser eller internetkaféer. Företags<strong>nätverk</strong> skyddas i regel med brandväggar i<br />
utkanterna men dessa har svårt att skydda mot hot introducerade med de nya teknikerna.<br />
I samband med den mobila utvecklingen introduceras nya hot vilket gör det viktigt att<br />
överväga risker och vidta nödvändiga åtgärder för att skydda sig. För att upprätthålla en<br />
säkerhetspolicy för ett företags<strong>nätverk</strong> måste alla enheter som ansluter sig utrustas med en<br />
personlig brandvägg.<br />
I denna rapport presenterar vi en generell modell för en personlig brandvägg bestående<br />
av två samarbetande filter. Genom att kombinera två filter; ett sessionsfilter och ett dynamiskt<br />
paketfilter konstruerar vi en effektiv lösning för att underlätta att upprätthålla en<br />
distribuerad säkerhetspolicy. Modellen testas genom en implementation för Windows XP<br />
bestående av ett NDIS Intermediate-filter och ett TDI Hook-filter. Genom testning av implementationen<br />
visas att modellen uppfyller uppställda krav och är praktiskt genomförbar.
Innehåll<br />
Innehåll v<br />
Figurer vii<br />
1 Introduktion 1<br />
1.1 Syfte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />
2 Bakgrund 5<br />
2.1 OSI-modellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
2.1.1 Standardmodellen . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
2.1.2 TCP/IP-modellen . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
2.2 Brandväggstyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
2.2.1 Paketfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2.2 Anslutningsorienterat paketfilter . . . . . . . . . . . . . . . . 9<br />
2.2.3 Dynamiskt paketfilter . . . . . . . . . . . . . . . . . . . . . . 9<br />
2.2.4 Applikationsproxy . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.2.5 Deep Packet Inspection . . . . . . . . . . . . . . . . . . . . . 11<br />
2.2.6 Sessionsfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
2.3 Analys och testning av brandväggar . . . . . . . . . . . . . . . . . . 11<br />
2.3.1 Feltyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.3.2 Effekter av fel . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.3.3 Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.4 Sammanfattning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
3 Modell 15<br />
3.1 Krav för modellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2 Sessionsfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3.3 Dynamiskt paketfilter . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.4 Kontrollapplikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
4 Fallstudie - Microsoft Windows XP 21<br />
4.1 Operativsystemsmodell . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
4.1.1 Drivrutinsmodell . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.2 Nätverksmodell . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
v
vi INNEHÅLL<br />
4.2 Filtreringstekniker . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.2.1 Filtrering i applikationslagret . . . . . . . . . . . . . . . . . . 25<br />
4.2.2 Filtrering i kärnan . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
4.3 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.3.1 Mål och krav för implementationen . . . . . . . . . . . . . . . 27<br />
4.3.2 Begränsningar . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.3.3 Arkitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.3.4 Paketfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
4.3.5 Sessionsfilter - TDI filter . . . . . . . . . . . . . . . . . . . . . 30<br />
4.3.6 Kontrolltjänst . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
5 Tester 35<br />
5.1 Resultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1.1 Implementationstester . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1.2 Penetrationstester . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1.3 Regeltester . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.1.4 Sammanfattning . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
6 Slutsats 39<br />
Litteraturförteckning 41<br />
Appendix 42<br />
A TDI filter 43<br />
A.1 IO till TDI-lagret . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
A.2 Ny anslutning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
A.3 Öppna en anslutning med TDI . . . . . . . . . . . . . . . . . . . . . 44<br />
A.3.1 Öppna en Transportadress . . . . . . . . . . . . . . . . . . . . 44<br />
A.3.2 Öppna en anslutningsslutpunkt . . . . . . . . . . . . . . . . . 44<br />
A.3.3 Associera transportadressen med anslutningsslutpunkten . . 46<br />
A.3.4 Göra anslutningen . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
A.4 Skicka och ta emot data med TDI . . . . . . . . . . . . . . . . . . . 46<br />
A.5 Avsluta en anslutning med TDI . . . . . . . . . . . . . . . . . . . . . 47
Figurer<br />
2.1 OSI-modellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
2.2 OSI-modellen matchad mot TCP/IP-modellen . . . . . . . . . . . . . . 7<br />
2.3 Arkitektur för en paketfiltrerande brandvägg . . . . . . . . . . . . . . . 8<br />
2.4 Arkitektur för en anslutningsorienterad brandvägg . . . . . . . . . . . . 9<br />
3.1 Övergripande bild över flödet i modellen. . . . . . . . . . . . . . . . . . 15<br />
3.2 Flödesdiagram över sessionsfiltret. . . . . . . . . . . . . . . . . . . . . . 18<br />
3.3 Flödesschema över paketfiltret. . . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.4 Flödesschema över kontrollapplikationen. . . . . . . . . . . . . . . . . . 20<br />
4.1 Abstraktionslager i Windows XP . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.2 Drivrutinsmodellen i Windows XP . . . . . . . . . . . . . . . . . . . . . 23<br />
4.3 Nätverksmodellen i Windows XP . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.4 Arkitektur för implementationen . . . . . . . . . . . . . . . . . . . . . . 28<br />
4.5 Förenklat sekvensdiagram för implementationen . . . . . . . . . . . . . 29<br />
4.6 Komponenter i paketfilter . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
4.7 Komponenter i TDI-filtret . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
4.8 Tillståndsdiagram för en session i TDI-filtret . . . . . . . . . . . . . . . 32<br />
A.1 Create Address Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
A.2 Create Connection Context . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
A.3 Associate Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
A.4 Connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
A.5 Send Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
A.6 Receive Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
A.7 Register Event Receive Function to Receive Data . . . . . . . . . . . . . 49<br />
A.8 Receive Data in Event Receive Function . . . . . . . . . . . . . . . . . . 49<br />
A.9 Disconnect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
A.10 Disassociate the Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
A.11 Close the Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
vii
Kapitel 1<br />
Introduktion<br />
De flesta företag i dagens samhälle anser att Internet är en viktig del av deras<br />
verksamhet och för att kunna konkurrera med andra företag måste de vara anslutna<br />
till Internet. Men det finns stora risker att ansluta företagsnätet till Internet. När<br />
ett företag ansluter sitt <strong>nätverk</strong> till Internet möjliggör det inte bara för de anställda<br />
att komma åt material på Internet, utan gör det även möjligt för utomstående<br />
att komma åt företagets privata <strong>nätverk</strong>. Behovet av kontroll av tillgänglighet för<br />
datortrafik har därmed drivit fram utvecklingen av kontroll av datorkommunikation.<br />
Ett program speciellt avsett för denna typ av kontroll kallas brandvägg därför att<br />
den kan efterliknas en brandvägg i en bil.<br />
De allra flesta datoranvändare idag har någon gång kommit i kontakt med en<br />
brandvägg. Nästan alla som anslutit sig till Internet via bredband med till exempel<br />
ADSL (Asymmetric Digital Subscriber Line) har ett kombinerat bredbandsmodem<br />
och brandvägg. Alla som använder operativsystemet Windows XP eller Mac OS X<br />
får med en förinstallerad brandvägg. I idealfallet är en brandvägg något användaren<br />
ej behöver känna till, än mindre konfigurera, men det är inte alltid detta fungerar<br />
som tänkt.<br />
De första brandväggarna kom i slutet av 1980-talet som en reaktion på flera<br />
allvarliga säkerhetsincidenter. En av de mest kända säkerhetsincidenterna var den<br />
så kallade Morris-masken som slog till mot Internet i slutet av 1988 (Spafford, 1991).<br />
Programmet utnyttjade en säkerhetslucka i BSD-versioner av UNIX och spreds sig<br />
till tusentals datorer och slog ut större delen av Internet under flera dagar.<br />
Gemensamt för alla datorbrandväggar är att huvudfunktionen är att skydda<br />
ett betrott område, där ett ett område både kan vara ett företags <strong>nätverk</strong> eller en<br />
persondator. Grunden för denna funktion bygger på att man analyserar datortrafik<br />
och jämför denna med en lista av regler. En regel specificerar en viss typ av<br />
kommunikation mellan två eller flera ändpunkter. Ett exempel kan vara då X vill<br />
kommunicera med Y då dessa befinner sig på var sin sida om brandväggen F . I det<br />
enkla fallet kan följande scenario tänkas:<br />
• X försöker kontakta Y<br />
1
2 KAPITEL 1. INTRODUKTION<br />
• Anropet hamnar hos F<br />
• F kontrollerar om det finns en regel som tillåter X att kontakta Y<br />
• Om en sådan regel finns vidarebefordrar F anropet till Y<br />
• Om en sådan regel ej finns kastas anropet alternativt rapporteras till X att<br />
anropet ej genomförts<br />
De första brandväggarna var huvudsakligen anpassade för att filtrera datortrafik<br />
mellan två olika <strong>nätverk</strong>, till exempel ett lokalt <strong>nätverk</strong> på jobbet och det världsomspännande<br />
<strong>nätverk</strong>et Internet. En brandvägg som denna körs normalt på en separat<br />
dator som är ansluten till de båda <strong>nätverk</strong>en. Viktigt är att denna anslutning är den<br />
enda kopplingen mellan dessa <strong>nätverk</strong>. Detta eftersom brandväggen skall fungera<br />
som ett filter för all datortrafik mellan <strong>nätverk</strong>en.<br />
Denna typ av brandväggar installeras normalt i utkanten av det <strong>nätverk</strong> man<br />
vill skydda. Efter att datorer blivit mindre, lättare och mer portabla på senare tid<br />
har det blivit vanligare att företagens anställda tar med sig datorer och andra enheter<br />
utanför kontoret. Genom att göra det möjligt för anställda att ansluta sig till<br />
företagets <strong>nätverk</strong> via en VPN-tunnel (Virtuellt Privat Nätverk) var som helst ifrån<br />
har man i ett slag flyttat gränserna för det <strong>nätverk</strong> man vill skydda. Fördelen med<br />
en VPN-tunnel är att en dator som är ansluten får precis samma kommunikationsmöjligheter<br />
som om den skulle fysiskt befunnit sig innanför brandväggarna på det<br />
<strong>nätverk</strong> den är ansluten till. Denna egenskap gör att en hacker som lyckas ta över<br />
kontrollen av en sådan dator inte endas har kontroll över en anställds dator utan<br />
indirekt en dator inne i det <strong>nätverk</strong> man vill skydda. En bärbar dator som används<br />
av en resande anställd på en flygplats, ett café eller hemma måste därmed även den<br />
skyddas med en brandvägg.<br />
Risken har som sagt ökat de senaste åren i och med <strong>publika</strong> trådlösa <strong>nätverk</strong><br />
och möjligheten att alltid vara uppkopplad hemma, vilket gör det extra viktigt att<br />
ha ett fullgott skydd på de anställdas bärbara datorer och andra enheter för att<br />
skydda företagets <strong>nätverk</strong>. <strong>Brandväggar</strong> delas in i två huvudkategorier:<br />
• Nätverksbrandvägg. Installeras och körs på en dedikerad dator. Denna<br />
skyddar mot angrepp mellan olika <strong>nätverk</strong>.<br />
• Personlig brandvägg. Installeras och körs lokalt på den egna datorn. Denna<br />
skyddar mot lokala angrepp.<br />
Men det är inte bara hoten utifrån som man måste ta hänsyn till och skydda sig<br />
mot utan hoten kommer oftare och oftare på senare tid från insidan vilket gör att<br />
det inte räcker med en traditionell brandvägg. Ett exempel är mailkorrespondens<br />
som idag är vanligt förekommande både privat och affärsmässigt. Med mail kan man<br />
bifoga såväl dokument som exekverbara program eller skript. Trots att användaren<br />
har en brandvägg som skyddar mot angrepp utifrån finns inget som förhindrar att<br />
exekverbara program eller skript kan ta sig ut när de väl kommit in i datorn. Som
1.1. SYFTE 3<br />
en bifogad fil kan därför ett litet exekverbart program eskorteras in i datorn och<br />
därmed inifrån öppna en kommunikationskanal utåt. Ett sådant program kallas<br />
efter grekisk mytologi för en trojansk häst (Wikipedia, 2006e). När väl trojanen<br />
exekveras (t.ex. genom att användaren sätter igång den) kan trojanen installera sig<br />
själv, skicka sig själv vidare i nya mail till adresser i användares adressbok eller<br />
diskret börja kommunicera ut information från användarens dator helt utan att<br />
denne märker något.<br />
Dessa nya hot har drivit fram behov av filtrering av vilka program som får<br />
möjlighet att kommunicera. Man har introducerat ett nytt lager av filtrering för<br />
den personliga brandväggen, ett applikationsfilter. Det räcker inte med att endast<br />
filtrera trafikflöden baserat på avsändare och mottagare, man måste även filtrera<br />
trafik utefter vilken applikation som vill kommunicera.<br />
Mycket utveckling har skett inom detta område de senaste 20 åren. I dagsläget<br />
finns en uppsjö av brandväggsvarianter, såväl kommersiella som gratis. Nätverksbrandväggar<br />
följer till exempel med de flesta startpaketför bredbandsuppkopplingar.<br />
Desto svårare är det att hitta relevant information om hur brandväggar egentligen<br />
fungerar, hur en brandvägg designas utifrån standarder för kommunikation på internet<br />
samt hur en implementation egentligen skall göras.<br />
1.1 Syfte<br />
Mot denna bakgrund vill vi i denna rapport presentera en generell modell för en<br />
personlig brandvägg baserad på standarder inom datorkommunikation. Modellen<br />
skall rymma de grundfunktioner en personlig brandvägg bör implementera samt<br />
kunna ligga till grund för en implementation. För att testa att modellen är genomförbar<br />
presenterar vi en implementation för operativsystemet Windows XP. Genom<br />
att implementera modellen och testa implementationen kan vi verifiera att modellens<br />
design uppfyller de grundläggande krav (Ingham och Forrest, 2002) vi ställer<br />
upp för vår modell. Som utgångspunkt för denna rapport har vi därför ställt upp<br />
följande egenskaper som en personlig brandvägg bör ha:<br />
• Skydda mot säkerhetsproblem i operativsystem. Dagens operativsystem<br />
är otroligt komplexa och nya buggar upptäcks hela tiden. Genom att<br />
använda sig av en personlig brandvägg skyddar man operativsystem från attacker<br />
utifrån.<br />
• Förhindra åtkomst till information. En av de viktigaste funktionerna hos<br />
brandväggar är att förhindra åtkomst till information. Exempelvis begränsar<br />
många företag vilka webbsidor de anställda kan komma åt.<br />
• Förhindra informationsläckor. Eftersom all information som lämnar ett<br />
system passerar brandväggen kan den användas till att förhindra att känslig<br />
information kommer ut. Ett exempel på detta är hotet från trojaner som<br />
fångar upp exempelvis lösenord och skickar dem vidare.
4 KAPITEL 1. INTRODUKTION<br />
• Upprätthålla en säkerhetspolicy. <strong>Brandväggar</strong> är ett viktigt verktyg för<br />
att upprätthålla och implementera ett företags säkerhetspolicy.<br />
• Underlätta granskning. Om ett system har råkat ut för intrångsförsök är<br />
det sällan brandväggen i sig har tagit skada. Detta gör att logfilerna från<br />
brandväggen kan användas för att kartlägga och granska intrånget eller intrångsförsöket.<br />
Detta gäller framförallt <strong>nätverk</strong>sbrandväggar.<br />
Genom att utgå från tidigare forskning och standarder i <strong>nätverk</strong>skommunikation<br />
i kapitel 2 presenterar vi en modell i kapitel 3 som skall kunna ligga till grund<br />
för en implementation i ett godtyckligt system baserat på dessa standarder. En implementation<br />
som utgår från modellen erhåller indirekt de egenskaper vi i modellen<br />
presenterar. Som test av vår modell presenterar vi slutligen en implementation av<br />
modellen för operativsystemet Windows XP i kapitel 4.
Kapitel 2<br />
Bakgrund<br />
Trots att brandväggar är så vanligt förekommande har forskningen och teorin om<br />
dem varit knapphändig. En stor del av utvecklingen har gjorts på företag utan<br />
att någon tydlig modell eller teori presenterats offentligt. Dock finns det ett antal<br />
artiklar om brandväggar och de flesta teorierna utgår från den så kallade OSImodellen.<br />
Som introduktion presenteras OSI-modellen för att ligga som grund för<br />
en genomgång av brandväggstyper indelade efter vilken nivå av information från<br />
OSI-modellen de olika filtrerar på.<br />
2.1 OSI-modellen<br />
OSI står för Open Systems Interconnect och är en formell standardmodell som ofta<br />
används av forskare och utvecklare när man diskuterar <strong>nätverk</strong> och datasäkerhet.<br />
OSI-modellen är framtagen av ISO (International Standards Organization) för att<br />
definiera en standard för utveckling av <strong>nätverk</strong> och kringliggande system. Modellen<br />
beskriver sju lager som representerar viktiga funktioner som generellt behövs vid<br />
datakommunikation. Som många andra ISO-standarder går det inte att flytta den<br />
formella teorin till en implementation utanför den akademiska världen. Dock är OSImodellen<br />
en viktig verktyg för att kunna förklara och diskutera <strong>nätverk</strong>sdesign.<br />
2.1.1 Standardmodellen<br />
OSI-modellen består som sagt av sju lager där varje lager tillför en nivå av abstraktion.<br />
För att skicka data från en nod till en annan passerar data från lager sju ner<br />
till lager ett vidare till den andra noden där det motsatta sker, från lager ett upp<br />
till lager sju (se figur 2.1). På väg ner genom modellen styckas data normalt upp<br />
i fragment kallade paket, vardera bärande på information från de lager de passerat<br />
genom. Mottagarnoden sätter således ihop fragmenten igen till en dataström allt<br />
eftersom dessa anländer och kan sorteras upp i rätt ordning.<br />
De olika lagren nedifrån:<br />
5
6 KAPITEL 2. BAKGRUND<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
Utgående trafik<br />
Inkommande trafik<br />
Figur 2.1. OSI-modellen<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
1. Det fysiska lagret är ansvarigt för den fysiska kommunikation mellan ändpunkterna.<br />
Det hanterar själva fysiska kodningen och överföringen av data.<br />
2. Datalänklagret hanterar den logiska delen av överföringen mellan två direktanslutna<br />
enheter. Bland annat hanteras hur flera enheter som delar på ett<br />
överföringsmedium skall kommunicera och adressera varandra.<br />
3. Nätverkslagret hanterar adressering för <strong>nätverk</strong> som kan spänna över flera<br />
förbindelser och medium. Denna abstraktion används för att avgöra vilken väg<br />
ett paket behöver ta för att nå sin slutdestination över flera möjliga datalänkar<br />
och vägar över flera mellan liggande noder.<br />
4. Transportlagret introducerar konceptet dataströmmar. Detta lager är ansvarigt<br />
för hantering av sortering av paket, anpassning av överföringshastighet<br />
och säkerställande att informationen når sin ändpunkt.<br />
5. Sessionslagret kontrollerar sessionerna mellan olika datorer. Det sätter upp,<br />
hanterar och avslutar anslutningar mellan en lokala applikation och en fjärrapplikation.<br />
6. Presentationslagret tillhandahåller ett standardiserat gränssnitt mot applikationslagret<br />
för data.<br />
7. Applikationslagret gör det möjligt för användaren att komma åt information<br />
som finns på <strong>nätverk</strong>et. Användargränssnitt och funktioner som inte direkt är<br />
relaterade till <strong>nätverk</strong>soperationer finns i detta lager.<br />
2.1.2 TCP/IP-modellen<br />
OSI-modellen används som sagt mest som en akademisk modell när man vill diskutera<br />
<strong>nätverk</strong> och <strong>nätverk</strong>ssäkerhet men den används ej i någon konkret tillämpning.
2.2. BRANDVÄGGSTYPER 7<br />
Idag är det istället de protokoll som ingår i TCP/IP familjen som är helt dominerande.<br />
De undre lagren av TCP/IP-modellen liknar OSI-modellens, medan lager<br />
5, 6 och 7 i OSI-modellen normalt igår i applikationslagret i TCP/IP-modellen (se<br />
figur 2.2).<br />
OSI-modellen TCP/IP-modellen<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
5. Applikation<br />
4. TCP<br />
3. IP<br />
2. Datalänk<br />
1. Fysisk länk<br />
Inkommande trafik Utgående trafik<br />
Figur 2.2. OSI-modellen matchad mot TCP/IP-modellen<br />
Exempel på implementation av de 5 lagren i TCP/IP-modellen nedifrån:<br />
1. En populär implementation är till exempel standarden 802.11 (trådlöst <strong>nätverk</strong>)<br />
som definierar hur kodning av information till radiovågor skall gå till.<br />
2. En del av standarden 802.11 specificerar även att adressering skall ske med<br />
hjälp av MAC-adresser (Medium Access Control) som även den är en standard.<br />
Ett exempel på en MAC-adress är "00:12:a2:b7:4c:b1".<br />
3. En populär implementation av detta lager är IP-protokollet (Internet Protocol)<br />
som adresserar noder med hjälp av IP-adresser. Ett exempel på en<br />
IP-adress är "192.168.0.1".<br />
4. En populär implementation av detta lager är protokollet TCP (Transport Control<br />
Protocol). Denna implementation introducerar konceptet av en port som<br />
ett identifikationsnummer för ändpunkten för en dataström. En dataström<br />
går alltså mellan var sin port på käll- och destinationsnoden. Ett program<br />
kan ha flera parallella dataströmmar mellan två noder där respektive ström<br />
identifieras av ett portpar.<br />
5. Ett exempel på protokoll i applikationslagret är HTTP (Hypertext Transfer<br />
Protocol), FTP (File Transfer Protocol) och SMTP (Simple Mail Transfer<br />
Protocol).<br />
2.2 Brandväggstyper<br />
Innan vi går in på de olika brandväggstyper som finns ger vi en kort definition av<br />
vad en brandvägg är.
8 KAPITEL 2. BAKGRUND<br />
Brandväggsteknik är en mängd av mekanismer som kan upprätthålla<br />
en <strong>nätverk</strong>sdomäns säkerhetspolicy på inkommande och utgående<br />
kommunikation för <strong>nätverk</strong>sdomänen. Ett brandväggssystem, eller en<br />
brandvägg är en instans av brandväggsteknik (Schuba, 1997).<br />
<strong>Brandväggar</strong> brukar delas in i olika kategorier utifrån från vilka lager i OSImodellen<br />
de använder information från för att klassificera <strong>nätverk</strong>strafik samt hur de<br />
arbetar. Utvecklingen av brandväggar har gått från att endast använda information<br />
från lager tre i OSI modellen till att kombinera information från flera lager.<br />
2.2.1 Paketfilter<br />
Paketfilter kallas den teknik där man filtrerar datortrafik genom att analysera paket<br />
som skickas via <strong>nätverk</strong>et. Filtrering baseras på information man extraherar<br />
från paketet i sig, normalt information från lager tre och fyra från OSI-modellen<br />
(Woodall, 2004).<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
Inkommande trafik Utgående trafik<br />
Trafik filtreras utifrån käll- och<br />
destinationsadress, pakettyp och<br />
portnummer. Okänd trafik är bara<br />
tillåten upp till lager 3 i<br />
<strong>nätverk</strong>sstacken.<br />
Figur 2.3. Arkitektur för en paketfiltrerande brandvägg<br />
Till denna kategori hör exempelvis den första välkända kommersiella produkten<br />
Cisco IOS (Cisco, 2002) som lanserades 1985, vilken kom att kallas den första<br />
generationens brandvägg. Denna paktefiltrerande brandvägg använder sig av protokoll,<br />
käll- och destinationsadress samt port från TCP-protokollet (lager 3 och 4<br />
i OSI-modellen) för att filtrera trafik. Dock dröjde det till 1989 innan den första<br />
vetenskapliga artikeln publicerades av Mogul (1989).<br />
En egenskap hos paketfiltrerande brandväggar är att de har relativt liten påverkan<br />
på <strong>nätverk</strong>sprestandan. Dock saknar denna generation av brandvägg möjlighet<br />
att konfigureras efter vem som initierar trafik. Eftersom nästan all datortrafik baseras<br />
på att information skall skickas i båda riktningarna för att fungera blir de<br />
oerhört svåra, om inte omöjliga, att konfigurera på ett säkert sätt. För att konfigurera<br />
en sådan brandvägg att tillåta noder på ena sidan att få full tillgång till<br />
andra sidan måste man följaktligen tillåta alla trafik i båda riktningarna. En sådan<br />
brandväggskonfiguration fyller inte stor funktion. Ytterligare säkerhetsproblem
2.2. BRANDVÄGGSTYPER 9<br />
som finns med denna typ av paketfiltrerande brandvägg är att de inte håller i vilket<br />
tillstånd en anslutning är i. Utan denna kontroll kan buggar i operativsystemets<br />
implementation lätt utnyttjas för intrångsförsök.<br />
2.2.2 Anslutningsorienterat paketfilter<br />
En vidareutveckling av den första generationens paketfiltrerande brandvägg introducerade<br />
ett koncept av tillstånd för TCP-anslutningar. Detta för att kontrollera<br />
upp- och nerkopplingsfasen för TCP-protokollet och för att säkerställa att denna<br />
genomförts korrekt, att en anslutning är legitim samt att ingen tredje part försöker<br />
genskjuta kommunikationen. För varje anslutning genom brandväggen sparas<br />
information om anslutningens tillstånd i en tillståndstabell. Informationen i tillståndstabellen<br />
brukar oftast bestå av en unik identifierare, tillståndet på anslutningen<br />
(uppkopplad/stänger), sekvensinformation, IP adressen på avsändaren och<br />
mottagaren och de fysiska <strong>nätverk</strong>skortet som paketen inkommer eller går ut på.<br />
1. All paket jämförs mot för<br />
definierade regler utifrån ett eller<br />
flera lågnivå protokoll så som IP,<br />
TCP och ICMP. Filtret stoppar<br />
antigen paketen eller släpper i<br />
genom dem vidare till<br />
<strong>nätverk</strong>sstacken.<br />
Sorterad<br />
regellista<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
3. Om ett paket uppfyller alla<br />
villkor för den virtuella krets<br />
tabellen och regellistan skickas<br />
det vidare upp i <strong>nätverk</strong>sstacken.<br />
2. Transportlagret sparar<br />
information om en<br />
<strong>nätverk</strong>ssession i en<br />
virtuell kretstabell<br />
Figur 2.4. Arkitektur för en anslutningsorienterad brandvägg<br />
Fördelen mot paketfiltrerande brandväggar är att paket måste tillhöra en giltig<br />
anslutning. Varje paket undersöks först mot regellistan och sedan mot tillståndstabellen<br />
för att se om det skall accepteras eller ej. Denna brandväggstyp introducerades<br />
omkring 1989-1990 av Dave Presotto och Howard Trickey på AT&T Bell Labs<br />
och kom att kallas andra generationens brandvägg (Cisco, 2002). Med hjälp av den<br />
nya tekniken med tillståndstabell gjorde man det möjligt att stärka kontrollen av<br />
TCP-protokollet.<br />
2.2.3 Dynamiskt paketfilter<br />
Nästa tekniska framsteg utgjordes av en anpassning av de tidigare paketfiltrerande<br />
brandväggarna att möjliggöra för dynamisk uppdatering av regellistan under<br />
körning. Konceptet stödjer sig på att praktiskt taget all datorkommunikation är<br />
dubbelriktad. Förenklat kan man se det som att en förfrågan skickas i ena riktningen<br />
och ett svar i den andra. Förbättringen för denna typ av paketfilter ligger i att
10 KAPITEL 2. BAKGRUND<br />
det räcker med att ha en regel för en utgående förfrågan. Då förfrågan skickas iväg<br />
läggs en ny regel till för inkommande trafik från precis den som förfrågan skickats<br />
till i regellistan. När svaret inkommer finns då en regel som tillåter detta att passera.<br />
Hade förfrågan aldrig skett skulle detta svar ej heller tillåtas passera. Då denna teknik<br />
kombineras med tidigare teknik rörande tillstånd för TCP-uppkopplingar samt<br />
ett tillägg för liknande virtuella tillståndstabeller för andra protokoll som UDP och<br />
ICMP har man lagt grunden för dagens paketfiltrerande brandväggar. Denna typ av<br />
paketfiltrerande brandväggar kom att kallas fjärde generationens brandväggar, dynamisk<br />
paketfiltrering (itsecurity.com, 2006) eller SPI (Stateful Packet Inspection).<br />
Check Point Software släppte 1994 den första kommersiella produkten baserad på<br />
denna teknologi och kallade typen för Stateful Mulitlayer Inspection Firewalls. Säkerhetsmässigt<br />
kom denna teknik att innebära ett stort steg framåt. Med hjälp av<br />
brandväggar baserade på denna teknik kan man sätta upp ett skalskydd runt ett<br />
lokalt <strong>nätverk</strong> där man tillåter utgående trafik (initierad av användarna innanför<br />
brandväggen) men ej inkommande trafik (initierad av okända externa aktörer).<br />
2.2.4 Applikationsproxy<br />
En helt annan teknik baserad på filtrering av innehåll i informationsströmmar snarare<br />
än paket är att använda sig av en applikationsproxy. Detta filter opererar som<br />
en proxytjänst i form av en applikation som sköter kommunikationen ut på <strong>nätverk</strong>et.<br />
All trafik tänkt att passera ut på <strong>nätverk</strong>et passerar proxytjänsten. Denna typ<br />
av brandvägg skiljer sig mot de två tidigare på så sätt att man inte har något filter<br />
för TCP/IP stacken, utan låter paketen propagera uppåt i stacken för att sedan<br />
behandlas av en proxytjänst innan det skickas vidare till programmet som skall<br />
ha paketet. För att detta skall fungera krävs en proxytjänst för varje protokoll på<br />
applikationsnivå. Huvudsakligen var det AT&T Bell Labs som utvecklade de första<br />
brandväggarna av denna typ vilken kom att kallas Application Level Gateways eller<br />
Proxy Frewalls.<br />
Det finns många fördelar med en proxybrandvägg bland annat att de kan filtrera<br />
på applikationsprotokoll och att de inte tillåter direkt kommunikation med <strong>nätverk</strong>et<br />
utan allt måste passera genom proxybrandväggen. På denna nivå är det lätt att<br />
införa intelligenta filter som kan filtrera på innehåll i dataströmmen som till exempel<br />
skadliga skript. Tyvärr finns det flera nackdelar med denna typ av filter. I stort sett<br />
måste man skriva en proxytjänst för varje protokoll som man vill använda. Dock<br />
finns det vissa generella proxytjänster som hanterar UDP, RPC och andra vanliga<br />
protokoll. Proxybrandväggar är dessutom beroende av att operativsystemet de körs<br />
på är säkert nog. Paketfiltrerande brandväggar filtrerar trafik innan <strong>nätverk</strong>slagret<br />
och skyddar därmed <strong>nätverk</strong>sstacken från attacker medan proxybrandväggar inte<br />
har något skydd för denna typ av attacker (Cisco, 2002). En annan nackdel är att de<br />
ofta är relativt enkla att ta sig runt inifrån. Moderna operativsystem tillhandahåller<br />
enkla möjligheter att själv öppna anslutningar och man kan därigenom förbigå en<br />
applikationsproxy.
2.3. ANALYS OCH TESTNING AV BRANDVÄGGAR 11<br />
2.2.5 Deep Packet Inspection<br />
En vidareutveckling av paketfiltreringstekniken har introducerat ett begrepp kallat<br />
Deep Packet Inspection. Denna teknik bygger på att undersöka information från protokoll<br />
i applikationslagret i ett paket eller en ström av paket redan på <strong>nätverk</strong>slagret<br />
i OSI-modellen. Genom att analysera information från applikationslagret kan till<br />
exempel skadlig kod rensas bort tidigt, långt innan <strong>nätverk</strong>sstacken börjat behandla<br />
dataströmmen. Tekniker som används för deep packet inspection består oftast<br />
av kombination av statistisk och strängmatchning. Dessa typer av analys kräver<br />
mycket datakraft vilket gör det svårt att utan speciell hårdvara utföra deep packet<br />
inspection i en hastighet som matchar <strong>nätverk</strong>ets. En brandvägg som utför deep packet<br />
inspection måste inte bara hålla reda på tillstånden för <strong>nätverk</strong>sanslutningarna<br />
utan även tillstånden hos de applikationer som använder sig av <strong>nätverk</strong>et. Eftersom<br />
deep packet inspection kräver relativt mycket datorkraft är det inget alternativ än<br />
så länge för personliga brandväggar (Dubrawsky, 2003). Dock kan man tänka sig<br />
att i och med att antalet processorkärnor i dagens persondatorer ökar snabbt, skulle<br />
det kunna vara möjligt att använda sig av en av processorkärnorna till deep packet<br />
inspection utan att påverka prestanda på resten har systemet.<br />
2.2.6 Sessionsfilter<br />
Vid användande av VPN-lösningar då man flyttar ut företagets skalskydd till enskilda<br />
datorer uppkopplade via VPN kan det vara nödvändigt att endast tillåta vissa<br />
applikationer efter strikta regler att kommunicera ut på <strong>nätverk</strong>et. För att företaget<br />
skall kunna ha en säkerhetspolicy och vara säker på att denna efterlevs krävs<br />
ytterligare en typ av filter, nämligen sessionsfilter. Ett filter som detta opererar på<br />
information från sessions-, presentations- och applikationslagret för att begränsa<br />
access utåt. Detta filter är alltså inget filter för att huvudsakligen hindra inkommande<br />
trafik utan snarare ett filter för att hindra utgående trafik baserat på vilken<br />
applikation som vill kommunicera samt hur den vill få access till <strong>nätverk</strong>et.<br />
2.3 Analys och testning av brandväggar<br />
Precis som med forskning kring brandväggar är det först på senare tid som man<br />
gått mer vetenskapligt tillväga för att kontrollera att brandväggar implementerar<br />
en säkerhetspolicy korrekt. Problemet är att det är oerhört komplext att säkerhetställa<br />
en säkerhetspolicy eftersom den är beroende av så många faktorer. Detta är<br />
framförallt svårt när man hanterar stora <strong>nätverk</strong> med flera brandväggar eftersom<br />
man även måste kartlägga hur de olika brandväggarna tillsammans implementerar<br />
säkerhetspolicyn.<br />
Flera artiklar har tagit upp hur man kan gå till väga för att testa brandväggar,<br />
bland annat Schultz (1996), Schuba (1997), Haeni (1997), KhalidAl-Tawil och<br />
Al-Kaltham (1999) samt Kamara m.fl. (2003). Dock riktar alla in sig på <strong>nätverk</strong>sbrandväggar<br />
och hur man ska kontrollera hur de implementerar en säkerhetspolicy
12 KAPITEL 2. BAKGRUND<br />
för ett eller flera <strong>nätverk</strong>. Ingen av dessa behandlar personliga brandväggar. Dock<br />
finns en en websida (Kaddouch, 2006) som försöker skapa ett standardtest bestående<br />
av flera deltester för just personliga brandväggar. Testerna är begränsade till Windows<br />
XP och fokuserar att testa olika tekniker som trojaner och linkande program<br />
använder sig av för att skicka ut information från en dator. Genom att kombinera<br />
testerna från Kaddouch (2006) och bland annat Haeni (1997) får man tester som<br />
både täcker in de mer traditionella testerna för brandväggar med specifika tester<br />
för personliga brandväggar.<br />
2.3.1 Feltyper<br />
En sårbarhet hos en brandvägg definieras som ett fel, en svaghet eller ett felaktigt<br />
antagande som gjorts under design, implementation eller konfiguration, som kan<br />
utnyttjas för att attackera ett betrott <strong>nätverk</strong> som brandväggen antas skydda (Kamara<br />
m.fl., 2003). Kamara m.fl. (2003) delar upp sårbarheterna i kategorier utifrån<br />
orsak och effekt för att bättre kunna analysera sårbarheter hos brandväggar. De<br />
vanligaste sårbarheterna hos brandväggar är:<br />
• Valideringsfel (Validation error): Ett valideringsfel uppkommer när programmetet<br />
interagerar med sin omgivning utan att bekräfta korrektheten hos<br />
de data som programmet får från denna. Det finns tre typer av data från<br />
omgivningen som måste valideras: inmatning, ursprung och mål. Inmatningsvalidering<br />
ser till att indata är som förväntat. Ursprungsvalidering ser till att<br />
ursprunget hos data verkligen är den som det påstås vara. Målvalidering ser<br />
till att informationen går dit den är förutsatt att gå. Detta inkluderar även<br />
att skyddad information inte går till ett mål som inte är betrott.<br />
• Auktoriseringsfel (Authorization error): Ett autentiseringsfel tillåter en<br />
skyddad operation körs utan tillräcklig verifiering av rättigheter har skett.<br />
• Serialiseringsfel/Aliasfel (Serialization/Aliasing error): Ett serialiseringsfel<br />
tillåter att det asynkrona beteendet hos olika systemoperationer utnyttjas<br />
för att göra ett säkerhetsintrång. Ett aliasfel uppkommer då två namn<br />
för samma objekt kan göra att dess innehåll ändras snabbt och oförutsägbart,<br />
och medföra att redan gjorda säkerhetskontroller blir ogiltiga.<br />
• Avgränsningsfel (Boundary checking error): Ett avgränsningsfel uppkommer<br />
då man misslyckas med att kontrollera gränser mellan olika komponenter<br />
eller missar att kontrollera restriktioner. Att inte kontrollera om värden<br />
för tabellstorlekar, filallokeringar eller för andra resurser är orimliga leder till<br />
avgränsningsfel. Ett exempel på detta är buffer overlow som många gånger<br />
utnyttjats för intrångsförsök.<br />
• Domänfel (Domain error): Ett domänfel uppkommer när tänkte gränser<br />
mellan skyddade miljöer har hål som gör att information läcker ut.
2.3. ANALYS OCH TESTNING AV BRANDVÄGGAR 13<br />
• Svag/Inkorrekt design (Weak/Incorrect design error): Ett designfel<br />
som uppkommer kan spåras tillbaka till designfasen av utvecklingen. Till exempel<br />
faller en svag krypteringsalgoritm inom detta område.<br />
2.3.2 Effekter av fel<br />
En sårbarhet kan ge upphov till en eller flera effekter där en effekt är någon av<br />
följande:<br />
• Exekvering av kod (Execution of code): Detta uppkommer när en sårbarhet<br />
kan leda till att kod otillåtet körs. Det inkluderar, men är inte begränsat<br />
till, kod som är skriven av en hacker.<br />
• Förändring av målresurs (Change of target resource): Detta händer<br />
när en sårbarhet som tillåter att tillståndet hos en resurs otillåtet ändras av<br />
en hacker. En resurs kan vara en server, routing tabellen hos en brandvägg<br />
eller någon enhet som ska skyddas av brandväggen.<br />
• Åtkomst till målresurs (Access to target resource): Uppkommer då<br />
en sårbarhet tillåter att en hacker otillåtet får tillgång till en resurs, där en<br />
resurs är en enhet som skyddas av brandväggen. Exempel på denna effekt är<br />
att tillåta en hacker att läsa regellistan för brandväggen, eller att ta reda på<br />
vilka tjänster som finns tillgängliga på en skyddas server.<br />
• Denial of service (DoS): Uppkommer då en sårbarhet utnyttjas för att störa<br />
en tjänst som tillhandahålls till legitima användare. Här innebär en tjänst allt<br />
från att vidarebefordra paket eller adressöversättning till administration.<br />
2.3.3 Tester<br />
Brandväggstester delas in i tre huvudkategorier som är tänkt att testa olika aspekter<br />
Zaugg (2004). Målet är att testa designen, konfiguration och den säkerhetspolicy<br />
som man har satt upp för brandväggen.<br />
• Penetrationstester Målet med penetrationstester är att upptäcka säkerhetsproblem<br />
hos ett <strong>nätverk</strong> genom att utföra attacker mot det. Penetrationstester<br />
består av (1) informations insamling, (2) utforska <strong>nätverk</strong>et och (3) attackera<br />
<strong>nätverk</strong>et. Attackerna utförs genom att köra olika testverktyg som testar<br />
brandväggen för potentiella luckor i säkerheten som kan utnyttjas. Penetrationstester<br />
utförs vanligen av systemadministratörerna själva eller av en tredje<br />
part.<br />
• Implementationstester Implementationstester fokuserar på själva brandväggsmjukvaran<br />
där man försöker hitta buggar i programvaran. Man testar<br />
bland annat att en brandväggsregel motsvarar den funktion brandväggen utför.<br />
Exempelvis om en regel indikerar att man ska blocka ett paket men brandväggen<br />
skickar vidare paketet, står man inför ett implementationsfel.
14 KAPITEL 2. BAKGRUND<br />
• Regeltester Regeltester verifierar om säkerhetspolicyn är korrekt implementerad<br />
av en mängd regler.<br />
2.4 Sammanfattning<br />
De flesta personliga brandväggar fungerar på ett liknande sätt som ett sessionsfilter<br />
men ytterst lite är beskrivet i forskningen vad gäller denna typ av filter. I denna studie<br />
vill vi belysa hur ett sessionsfilter kan fungera. Vi vill även visa att man genom<br />
en kombination av ett paketfilter och ett sessionsfilter effektivt kan upprätthålla en<br />
strikt säkerhetspolicy samt eliminera de svagheter som finns i paketfilter respektive<br />
sessionsfilter. Genom en implementation av en sådan kombination i operativsystemet<br />
Windows XP vill vi visa att det även är praktiskt genomförbart.
Kapitel 3<br />
Modell<br />
Personliga brandväggar som filtrerar utifrån vilket program som försöker använda<br />
<strong>nätverk</strong>et har blivit vanligare. Dock riktar sig de flesta artiklar in sig på <strong>nätverk</strong>sbrandväggar.<br />
Vi vill i den här rapporten framför allt visa hur man kan konstruerar<br />
ett sessionsfilter men även hur man genom att kombinera det med ett dynamiskt<br />
paketfilter kan få ett effektivare filter. Genom att kombinera ett dynamiskt paketfilter<br />
med ett sessionsfilter kombinerar man styrkorna hos båda och undviker deras<br />
respektive nackdelar då de täcker upp varandras svaga sidor.<br />
Den modell för personlig brandvägg som den här rapporten föreslår bygger framför<br />
allt på ett sessionsfilter som placeras mellan transportlagret och sessionslagret i<br />
OSI-modellen. Sessionsfiltret fångar upp alla program som försöker använda <strong>nätverk</strong>et<br />
och kontrollerar att de är tillåtna. För program som tillåts skickas regler ner till<br />
paketfiltret för att öppna upp för den aktuella sessionen. För att samordna de två<br />
filtren är det nödvändigt med en kontrollapplikation. Kort sammanfattat fungerar<br />
brandväggen på följande vis (se figur 3.1):<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
Sessionsfilter<br />
4. Transport<br />
3. Nätverk<br />
Paketfilter<br />
2. Datalänk<br />
1. Fysisk länk<br />
1. Tillåt session?<br />
2. Ja/Nej<br />
3. Ny regel<br />
Kontrollapplikation<br />
Figur 3.1. Övergripande bild över flödet i modellen.<br />
1. Alla applikationer som vill använda <strong>nätverk</strong>et kommer att fångas upp och<br />
15
16 KAPITEL 3. MODELL<br />
stoppas i sessionsfiltret. Sessionsfiltret frågar kontrollapplikationen om programmet<br />
får använda <strong>nätverk</strong>et.<br />
2. Har programmet inte tillåtelse att komma ut på <strong>nätverk</strong>et kommer det inte<br />
längre än så här.<br />
3. Om programmet är tillåtet skickar kontrollapplikationen regler till paketfiltret<br />
som öppnar upp för just den här sessionen och sessionsfiltret får signal från<br />
kontrollapplikationen att det ska tillåta programmet.<br />
Idén med att använda sig av dynamiska regler är att endast tillåta reglerna under<br />
en kort tid när själva anslutningen görs istället för att ha regler som ligger aktiva hela<br />
tiden. Genom att överlåta till kontrollapplikationen att skapa regler till paketfiltret<br />
som är knutna till till en session och ett visst program får man regler som är lätta<br />
att verifiera att de gör det de ska och <strong>nätverk</strong>sadministratörer kan koncentrera<br />
sig på att sätta upp den övergripande säkerhetspolicyn. En kontrollapplikation kan<br />
dessutom enkelt samla information i logfiler att använda vid felsökning.<br />
3.1 Krav för modellen<br />
Målet för vår modell är att den ska klara av de fem huvudfunktioner för brandväggar<br />
som ställdes upp i kapitel 1. Modellen löser dessa fem huvudfunktioner på följande<br />
sätt:<br />
• Skydda mot säkerhetsproblem i operativsystemet. Genom att använda<br />
sig av två filter, ett på vardera sida om operativsystemets <strong>nätverk</strong>sstack,<br />
skyddar man sig mot utnyttjande av buggar i operativsystemet och dess implementation<br />
av <strong>nätverk</strong>sstacken. Oberoende av <strong>nätverk</strong>strafikens riktning måste<br />
den passera ett filter som verifierar dess legitimitet innan den tillåts behandlas<br />
av <strong>nätverk</strong>sstacken.<br />
• Förhindra åtkomst till information. Kontrollapplikationen är den enda<br />
som får öppna för trafik genom paketfiltret och därmed har den ensamrätt<br />
att bestämma över vilka informationsflöden som får passera. Endast i det fall<br />
då trafik initieras inifrån, passerar sessionsfiltret samt följer de regler som<br />
kontrollapplikationen har att gå efter öppnar denne för trafik genom paketfiltret.<br />
Detta gör att ingen information blir åtkomlig utifrån eftersom denna<br />
informationsström är initierad utifrån.<br />
• Förhindra informationsläckor. Precis som ovan gäller att endast i det fall<br />
då trafik initieras inifrån, passerar sessionsfiltret samt följer de regler som kontrollapplikationen<br />
har att gå efter öppnar denne för trafik genom paketfiltret.<br />
Detta gör att kontrollapplikationen kan sköta autentisering baserad på information<br />
från sessions-, presentations- och applikationslagret i OSI-modellen.<br />
Kontrollapplikationen kan alltså agera efter ett strikt regelverk som endast
3.2. SESSIONSFILTER 17<br />
tillåter begränsade informationsflöden för ett begränsat antal applikationer.<br />
På detta sätt kan trojaner och liknande program förhindras skicka ut information<br />
från en infekterad enhet.<br />
• Upprätthålla en säkerhetspolicy. Genom möjligheten att sätta regler för<br />
kontrollapplikationen baserad på information från toppskiktet av OSI-modellen<br />
kan denna modell hjälpa till att garantera att kommunikation endast tillåts<br />
efter strikta regler. På detta sätt kan en implementation av denna modell<br />
hjälpa till att upprätthålla en övergripande säkerhetspolicy för ett stort antal<br />
enheter.<br />
• Underlätta granskning. Eftersom alla program som vill använda <strong>nätverk</strong>et<br />
passerar genom sessionsfiltret och enkelt kan loggas av kontrollapplikationen<br />
kan man på ett lättare sätt spåra och undersöka vad som exempelvis hände<br />
vid ett intrång.<br />
3.2 Sessionsfilter<br />
Sessionsfiltret har två uppgifter, dels att stoppa ej tillåten <strong>nätverk</strong>strafik från att<br />
komma ut på ett tidigt stadium, dels att koppla samman <strong>nätverk</strong>strafik med det<br />
program som gav upphov till den. Att sammankoppla <strong>nätverk</strong>strafik med det som<br />
genererade trafiken är för de flesta operativsystem omöjligt att göra på den nivå som<br />
paketfilter opererar eftersom all <strong>nätverk</strong>strafik hanteras som enskilda paket. Detta<br />
är en av de svagheter som finns med paketfilter och för att komma åt den svagheten<br />
låter man sessionsfiltret utgöra kopplingen mellan program och <strong>nätverk</strong>strafik. Sessionsfiltret<br />
har ingen egen regelhantering utan förlitar sig på kontrollapplikationen<br />
för att avgöra om en <strong>nätverk</strong>sanslutning ska tillåtas eller inte vilket förenklar den<br />
övergripande designen.<br />
Flödesdiagrammet i figur 3.2 visar hur sessionsfiltret fungerar och hur det integrerar<br />
med kontrollapplikationen. Vid två tillfällen skickar sessionsfiltret information<br />
till kontrollapplikationen. När ett program försöker göra en ny anslutning<br />
skickas information om det upp till kontrollapplikationen som svarar om sessionsfiltret<br />
ska tillåta anslutningen eller inte. Även när en anslutning avslutas skickar<br />
sessionsfiltret upp information om detta så att kontrollapplikationen kan ta bort de<br />
regler som hör samman med den session som avslutats.<br />
De nackdelar som finns med ett sessionsfilter är att det inte kan skydda <strong>nätverk</strong>sstacken<br />
från attacker utifrån eftersom det ligger ovanför hela <strong>nätverk</strong>sstacken<br />
och kan inte heller analysera <strong>nätverk</strong>strafiken som den ser ut på <strong>nätverk</strong>et. Oftast<br />
består <strong>nätverk</strong>strafiken på den här nivån av strömmar av data eftersom det är först<br />
längre ner i stacken som data strömmarna blir till paket. Men med hjälp av ett<br />
paketfilter kan man analysera både de protokoll som används för transportlagret<br />
och <strong>nätverk</strong>slagret samt skydda datorn från attacker utifrån.
18 KAPITEL 3. MODELL<br />
Ny session<br />
Fråga<br />
kontrollapplikation<br />
3.3 Dynamiskt paketfilter<br />
Tillåt<br />
session?<br />
Nej<br />
Avsluta<br />
session<br />
Ja<br />
Vänta på data<br />
Avsluta<br />
session?<br />
Ja<br />
Informera tjänst<br />
Figur 3.2. Flödesdiagram över sessionsfiltret.<br />
Ett paketfilter är både enkelt att implementera, ger ett starkt skydd från intrång<br />
utifrån samt kräver lite resurser. Paketfiltret består av två komponenter, en regellista<br />
med regler som kontrollapplikationen har genererat och skickat ner samt en<br />
tillståndsmaskin med en tillståndstabell som där tillstånden för anslutningar genom<br />
paketfiltret sparas. Regellistan är sorterad i prioritetsordning och den första regel<br />
som hittas används. Nya regler läggs till överst i regellistan vilket kan ses som ett<br />
naivt sätt att hantera regler på och garanterar inte att vissa regler alltid gäller<br />
(Hazelhurst, 2001). För vår design är detta är dock inget problem eftersom tanken<br />
är att inte ska finnas några regler som alltid ska gälla, utan man ska börja med<br />
en tom regellista för att sedan lägga till och ta bort regler dynamiskt allt eftersom<br />
olika program använder <strong>nätverk</strong>et.<br />
Genom att använda sig av dynamiska regler som specificerar en viss anslutning<br />
tillsammans med en tillståndsmaskin för <strong>nätverk</strong>sanslutningar ökar man säkerheten<br />
avsevärt i jämförelse med ett traditionellt paketfilter eftersom tiden som ett<br />
regel gäller är relativt kort samt att den gäller bara för kommunikation mellan två<br />
noder. Om man skulle spoofa <strong>nätverk</strong>sadresser för att utnyttja en regel i paketfiltret<br />
kommer tillståndsmaskinen att märka att paketen inte matchar tillståndet<br />
som anslutningen är i och kasta bort dem. Figur 3.3 beskriver flödet för ett paket<br />
genom paketfiltret. Genom att använda en tillståndsmaskin behöver man bara söka<br />
i regellistan när en ny anslutning görs, resten av paketen som hör till anslutningen<br />
matchas mot tillståndet för anslutningen i tillståndstabellen.<br />
Nej
3.4. KONTROLLAPPLIKATION 19<br />
Sök<br />
tillståndstabell<br />
Finns<br />
tillstånd?<br />
ja<br />
Tillåtande<br />
tillstånd?<br />
ja<br />
Uppdatera<br />
tillståndstabellen<br />
3.4 Kontrollapplikation<br />
Nytt paket<br />
nej<br />
Blockera<br />
nej nej<br />
paket<br />
Släpp igenom<br />
paket<br />
Figur 3.3. Flödesschema över paketfiltret.<br />
Sök regellista<br />
Tillåtande<br />
regel?<br />
ja<br />
Lägg till i<br />
tillståndstabellen<br />
Är det program som samordnar de två filtren och hanterar regellistan över program<br />
som får använda <strong>nätverk</strong>et. Kontrollapplikationen verifierar vilket program som<br />
försöker använda <strong>nätverk</strong>et och använder sig av en regellista för att avgöra vilken typ<br />
av <strong>nätverk</strong>saccess programmet får göra. Om programmet är godkänt skickas en regel<br />
ner till paketfiltret för att öppnar upp för aktuella sessionen. När sessionen avslutats<br />
indikerar sessionsfiltret detta till kontrollapplikationen som då tar bort den aktuella<br />
regeln från paketfiltret. Själva flödet för kontrollapplikationen är enkelt och visas i<br />
figur 3.4, dock finns det svårigheter med hur man verifierar en applikationen eller<br />
om den utför kommandon åt någon annan applikation. Eftersom implementationen<br />
av där här funktionen skiljer sig mycket mellan olika operativsystem samt att det<br />
ligger utanför området brandväggar och snarare inom området för antivirus och<br />
antispyware programvara har vi valt att inte beskriva någon specifik teknik för<br />
att verifiera ett program. Generellt sätt kan man dock säga att man bör verifiera<br />
program med någon form av hash-funktion, kontrollera vilka bibliotek programmet<br />
har laddat samt undersöka processträdet för programmet för att kontrollera att<br />
även de program som har startat programmet är betrodda.
20 KAPITEL 3. MODELL<br />
Matcha PID mot<br />
program<br />
verifiera program<br />
Sök regellista regel finns<br />
Förfrågan om ny<br />
anslutning från<br />
sessionfiltret<br />
Nej<br />
Ja<br />
Meddela<br />
sessionsfiltret<br />
att stoppa<br />
anslutningen<br />
Nej<br />
tillåt<br />
anslutning<br />
Figur 3.4. Flödesschema över kontrollapplikationen.<br />
Ja<br />
Skapa regler för<br />
paketfiltret<br />
Skicka regler till<br />
paketfiltret<br />
Meddela<br />
sessionsfiltret att<br />
tillåta<br />
anslutningen
Kapitel 4<br />
Fallstudie - Microsoft Windows XP<br />
Den stora användningen av Windows XP som operativsystem i konsumentdatorer<br />
har drivit fram en stor efterfrågan på säkerhetsprogramvara som brandväggar och<br />
antivirusprogram. Det finns många produkter ute på marknaden att köpa, men lite<br />
finns skrivet om hur de egentligen fungerar. Viktigt är att belysa hur säkerhetsprogram<br />
som dessa fungerar för att kunna använda dem på rätt sätt. Säkerhetsmässigt<br />
brukar man säga att en ökad insyn och förståelse för funktionen bara kan höja den<br />
faktiska säkerheten av ett system. För att testa vår modell har vi implementerat<br />
en personlig brandvägg för Microsofts operativsystem Windows XP. Det finns flera<br />
anledningar att vi valt detta operativsystem bland annat följande:<br />
• Windows XP används som operativsystem i majoriteten av världens konsumentdatorer.<br />
• Windows XP är det operativsystem som i störst utsträckning utsätts för regelbundna<br />
attacker, främst baserade på svagheter i operativsystemet samt att<br />
konsumentanvändare är dåliga att skydda sig mot dessa.<br />
• Det finns få artiklar, om några alls, som presenterar design och implementation<br />
av ett sessionsfilter i Windows XP.<br />
• Det finns få artiklar skrivna om hur en implementation av en kombination av<br />
sessions- och paketfilter i Windows XP kan göras.<br />
4.1 Operativsystemsmodell<br />
Microsoft Windows XP har två abstraktionslager där programkod körs (Wikipedia,<br />
2006a). Den del av operativsystemet som tillhandahåller grundläggande funktionalitet<br />
för program kallas vanligtvis kärna eller kernel (se figur 4.1). Kärnan är<br />
ansvarig för att tillhandahålla ett enkelt gränssnitt för program att komma åt funktionalitet<br />
som till exempel att läsa och skriva till disk. Lagret ovanför kallas normalt<br />
applikationslager eller user space och det är i detta lager som vanliga program körs.<br />
21
22 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
Applikationslager<br />
OSkärna<br />
IOhanterare<br />
Figur 4.1. Abstraktionslager i Windows XP<br />
I själva verket är dessa två lager uppdelade i ytterligare lager, där varje nytt<br />
lager introducerar en ny nivå av abstraktion, men det finns en distinkt skillnad<br />
mellan kärnan och applikationslagret. All programkod som körs i kärnan har högre<br />
prioritet än den som körs i applikationslagret. Dessutom har programkod som körs<br />
i kärnan i stort sett obegränsad access till hela systemet. Dock finns det nackdelar<br />
med kärnan till skillnad från applikationslagret. Skulle någon del av programmet<br />
vara felaktigt eller sluta fungera som det skall är sannolikheten mycket stor att hela<br />
systemet havererar. Normalt är inte heller enkla standardfunktioner tillgängliga<br />
vilket gör det mycket svårare att skriva program.<br />
Programkod som körs i applikationslagret har däremot begränsad access till systemet.<br />
Alla grundfunktioner är normalt tillgängliga genom standardiserade gränssnitt.<br />
Genom denna nivå av abstraktion kan man enkelt skriva ett program som<br />
använder sig av standardgränssnitt för att till exempel läsa och skriva till disk. Programmet<br />
behöver således inte ändras för olika lagringsmedium som till exempel en<br />
hårddisk, en brännbar CD-skiva eller ett minneskort. Ytterligare en skillnad som<br />
har avgörande effekt är att program som körs i applikationslagret normalt delar på<br />
alla resurser. Program som körs i kärnan kan ibland ha ensamrätt till hela systemet<br />
vilket i vissa fall försvårar för utvecklaren. Ett sådant program kan till exempel inte<br />
vänta på att någon annan del av systemet skall bli klar eftersom det har exklusiv<br />
access till alla resurser.<br />
Normalt sköts all kommunikation till och från kärnan i Windows XP av en<br />
del av operativsystemet som kallas IO-hanterare eller Input Output manager. IOhanteraren<br />
är även ansvarig för kommunikationen mellan olika lager i kärnan. Denna<br />
kommunikation är i Windows XP paketbaserad. Den vanligaste typen av kommunikation<br />
sker med datafragment kallade IO-paket eller Input Output Request Packet<br />
(IRP).<br />
4.1.1 Drivrutinsmodell<br />
Drivrutin eller driver kallas en bit programkod som utökar kärnans funktionalitet.<br />
Vid installation av en drivrutin installeras programmet in i kärnan och körs igång.<br />
En tillverkare av till exempel ett <strong>nätverk</strong>skort är normalt sett ansvarig för att
4.1. OPERATIVSYSTEMSMODELL 23<br />
tillhandahålla en drivrutin som styr <strong>nätverk</strong>skortet och ett standardiserat gränssnitt<br />
mot resten av systemet. Kärnan i Windows XP består till stor del av lager ovanpå<br />
lager av drivrutiner som kommunicerar med IO-paket via IO-hanteraren (se fig 4.2).<br />
Applikationslager<br />
Kärna<br />
Hårdvara<br />
TCP/IP-drivrutin<br />
Ethernet-drivrutin<br />
Drivrutin <strong>nätverk</strong>skort<br />
Nätverkskort<br />
Hårdvaruabstraktionslager<br />
Applikation<br />
API<br />
Executive<br />
...<br />
Minneshant.<br />
IO-hanterare<br />
Processhant.<br />
...<br />
Fysisk enhet<br />
Figur 4.2. Drivrutinsmodellen i Windows XP<br />
För kommunikation mellan applikationer och komponenter i kärnan brukar denna<br />
kommunikation gå genom ett applikationsgränssnitt eller Application Programming<br />
Interface (API). Det finns flera sätt för ett sådant gränssnitt att implementera<br />
själva kommunikationen, men det vanligaste är att använda sig av IO-paket. Att<br />
från en komponent i kärnan initiera kommunikation till en applikation i applikationslagret<br />
är svårt varför normalt sett applikationen är den som initierar trafiken.<br />
En vanlig metod är att applikationen förbereder och skickar ner ”tomma” IO-paket<br />
som drivrutinen buffrar upp. När denne är redo att skicka upp information tar den<br />
ett ”tomt” IO-paket ur högen, fyller i information och returnerar till applikationen.<br />
Applikationen som har legat och väntat på att få tillbaka sina IO-paket kan nu läsa<br />
ut informationen, förbereda ett nytt ”tomt” IO-paket och skicka ner det.<br />
4.1.2 Nätverksmodell<br />
Nätverksmodellen i Windows XP består av flertalet lager inuti och utanför kärnan<br />
(se figur 4.3). Denna modell är en anpassning av TCP/IP-modellen (se figur 2.2)<br />
för att passa drivrutinsmodellen i Windows XP.<br />
Applikationer använder sig normalt av något av de gränssnitt (API) som finns<br />
för <strong>nätverk</strong>skommunikation såsom Winsock API för TCP/IP. Lagret där Winsock<br />
finns kallas för API-lagret och där finns olika gränssnitt för att kommunicera över<br />
<strong>nätverk</strong>.
24 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
OSI-modellen XP-modellen<br />
7. Applikation<br />
6. Presentation<br />
5. Session<br />
4. Transport<br />
3. Nätverk<br />
2. Datalänk<br />
1. Fysisk länk<br />
Applikationer och tjänster<br />
Winsock<br />
API<br />
NetBios<br />
API<br />
Servers<br />
TCP/IP IPX/SPX NetBEUI<br />
Drivrutin<br />
<strong>nätverk</strong>skort<br />
TDI<br />
NDIS<br />
HAL<br />
Drivrutin<br />
<strong>nätverk</strong>skort<br />
Nätverkskort Nätverkskort<br />
Figur 4.3. Nätverksmodellen i Windows XP<br />
Applikationslager<br />
Under API-lagret finns ett standardiserat gränssnitt mot alla <strong>nätverk</strong>sprotokoll<br />
implementerade i kärnan kallat TDI-lagret (Transport Driver Interface) (Microsoft,<br />
2006c). TDI är ett gemensamt gränssnitt alla protokoll måste implementera för att<br />
API-lagret ska kunna kommunicera med dem. I det här lagret finns bland annat<br />
TCP/IP-protokollet implementerat.<br />
Protokollen i TDI-lagret kommunicerar i sin tur med nästa lager via ett gränssnitt<br />
kallat NDIS-lagret (Network Driver Interface Specification). NDIS är ett gemensamt<br />
gränssnitt för drivrutiner för <strong>nätverk</strong>skort. Protokollagret får på detta<br />
sätt ett standardiserat gränssnitt att kommunicera mot. NDIS består i sig själv av<br />
flera olika lager. Drivrutiner i NDIS-lagret kommunicerar i sin tur med hårdvaran<br />
via HAL-lagret (Hardware Abstraction Layer). Se DDK-dokumentationen (Driver<br />
Development Kit) från Microsoft för mer information (Microsoft, 2006e).<br />
4.2 Filtreringstekniker<br />
Det finns flera sätt att implementera ett <strong>nätverk</strong>sfilter i Windows XP där alla varianter<br />
har sina fördelar och nackdelar. Huvudsakligen finns det två huvudkategorier<br />
av filter:<br />
• Filter som är implementerade i applikationslagret, det vill säga på samma<br />
nivå som vanliga program körs på.<br />
Kärna<br />
• Filter som är implementerade i kärnan, det vill säga som drivrutiner.<br />
Generellt är det enklare att implementera ett filter i applikationslagret eftersom<br />
det finns fler funktioner och bibliotek tillgängliga samt att fel bara påverkar den
4.2. FILTRERINGSTEKNIKER 25<br />
applikationen som felet uppstod i, inte hela systemet. Att implementera ett filter<br />
i kärnan ställer högre krav på koden. Många funktioner och bibliotek som finns i<br />
applikationslagret finns inte i kärnan. Dessutom orsakar ett fel i en drivrutin med<br />
största sannolikhet att hela systemet havererar. Dock finns det fördelar att implementera<br />
filter i kärnan, bland annat körs de med högre prioritet, de är svåra att<br />
ta bort, man får tillgång till paketen på ett tidigt stadium (vilket gör att de inte<br />
behöver passera hela <strong>nätverk</strong>sstacken) och det är svårt att gå runt ett filter i kärnan.<br />
Nedan följer en genomgång av filtreringstekniker som finns tillgängliga i Windows<br />
XP.<br />
4.2.1 Filtrering i applikationslagret<br />
• Winsock Layered Service Provider (LSP). LSP är en del av Winsock<br />
gränssnittet och gör det möjligt att på ett enkelt sätt filtrera eller implementera<br />
tjänster så som Quality of Service (QoS) för TCP/IP. Dock är det möjligt<br />
att anropa TDI-lagret direkt och på så sätt gå förbi en LSP. Vill man inspektera<br />
alla paket kan man inte förlita sig på Winsock LSP, utan måste använda<br />
andra tekniker.<br />
• Packet Filtering Interface. Detta gränssnitt är en del av det så skallade<br />
IP helper API i Windows XP och gör det möjligt för applikationer att ange<br />
ett antal regler som används av TCP/IP-komponenter för att filtrera paket.<br />
Detta filter är inbyggt i olika TCP/IP-komponenter i kärnan och själva filtret<br />
kallas IP Filter. Filtrering sker på IP-adresser och portnummer. Dock är det<br />
möjligt att gå förbi även denna mekanism genom att exempelvis installera ett<br />
eget protokoll parallellt med TCP/IP protokollet.<br />
• Winsock Replacement DLL (Dynamically Linked Library). Innan det<br />
var möjligt att bygga ut Winsockgränsnittet med en LSP var det ända sättet<br />
att byta ut vissa av DLL-erna mot nya. På detta sätt kunde man filtrera<br />
alla anrop till Winsock och anropa de ursprungliga funktionerna i Winsock<br />
när så behövdes. Det finns flera anledningar till att det här var och är en<br />
dålig idé. En av anledningarna är att gränssnittet mellan DLL-erna är privata<br />
och odokumenterade vilket gör att en uppdatering av operativsystemet kan<br />
medföra att en DLL slutar att fungera.<br />
4.2.2 Filtrering i kärnan<br />
• TDI-Hook (TDI-filter). Genom att lägga sig som ett lager ovanpå protokolldrivrutinen<br />
för TCP/IP kan man filtrera alla IO-paket som passerar. Det<br />
finns två sätt att filtrera IO-paket till TDI-lagret. Antigen kan man använda<br />
sig av IoAttachDeviceXYZ-anrop för att filtrera ovanför TDI eller så kan man<br />
ersätta utvalda funktioner i anropstabellen (Dispatch Table) för TDI så att<br />
alla IO-paket filtreras. Dessa är en relativt drastiska metoder som genskjuter
26 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
alla anrop till TDI-lagret. Båda teknikerna kräver en djup förståelse för TDI<br />
gränssnittet och Windows XP vilket gör dem relativt svåra att implementera.<br />
Implementationen försvåras ytterligare av att det finns lite, om alls någon,<br />
dokumentation om hur man skall gå tillväga. Med ett TDI-filter kan man inte<br />
skydda TCP/IP-stacken från attacker utifrån eftersom filtret installeras ovanför<br />
TCP/IP protokollet. Fördelen är att man kan filtrera på information från<br />
sessions- och applikationsnivån i OSI-modellen (se figur 2.2) samt att ett filter<br />
av denna typ är mycket svårt att avinstallera.<br />
• NDIS Intermediate (NDIS-filter). Denna typ av filter installeras som<br />
en komponent i NDIS-lagret. NDIS tillhandahåller ett inbyggt stöd för denna<br />
typ av filter vilket gör en implementation enkel. Microsoft rekommenderar<br />
att paketfilter implementeras som NDIS-filter och tillhandahåller i sin<br />
DDK-dokumentation ett exempel för att fånga paket kallat Passthru (Microsoft,<br />
2006e). En nackdel är att ett NDIS-filter endast filtrerar på paketnivå.<br />
Det finns alltså ingen information från applikations- eller sessionsnivån i OSImodellen<br />
att filtrera på (se figur 2.2). Det går således inte att filtrera dataströmmar<br />
efter vilken applikation som kommunicerar. Fördelen med NDISfilter<br />
är att man har tillgång till datapaketen så som de ser ut på <strong>nätverk</strong>et<br />
och att filtreringen sker under TCP/IP-stacken.<br />
• NDIS-Hook. På samma sätt som för ett TDI-filter kan man ersätta utvalda<br />
funktioner i anropstabellen för NDIS och på detta sätt filtrera alla anrop till<br />
NDIS. Även denna typ av filter är relativt drastisk och saknar dokumentation<br />
och tydliga exempel. Fördelen med detta filter jämfört med ett NDIS<br />
Intermediate-filter är att de generellt är mycket svåra att avinstallera eller<br />
kringgå. Nackdelen är istället att dokumentationen är knapphändig, de är<br />
svåra att implementera och att NDIS kan sluta fungera vid en eventuell uppgradering.<br />
• Firewall-Hook. Microsoft tillhandahåller ett gränssnitt som kom i och med<br />
Windows 2000 för ett generellt brandväggsfilter inbyggt i <strong>nätverk</strong>sstacken.<br />
Dock avråder Microsoft från att använda det idag eftersom det finns kända<br />
problem med implementationen av detta filter. Filtreringen sker på för hög<br />
nivå i stacken för att fungera som en effektiv brandvägg.<br />
• Filter-Hook. Genom att registrera en filterfunktion i det inbyggda IP Filter<br />
som används av bl.a. IP helper-API kan man utöka IP Filter-funktionaliteten.<br />
TCP/IP-stacken anropar denna funktion på många olika ställen och man kan<br />
på detta sätt implementera ett filter som inte lägger till något nytt lager<br />
till stacken. Fördelar är bland annat att man kan filtrera på datapaketen<br />
direkt från <strong>nätverk</strong>et samt skydda transportlagret av TCP/IP (Jackson, 2005).<br />
En nackdel med denna teknik är att endast ett filter kan vara installerat åt<br />
gången.
4.3. DESIGN 27<br />
4.3 Design<br />
Utgångspunkten för designen är att visa att vår teori fungerar i en implementation.<br />
För att kunna göra detta inom ramen för det här arbetet har vissa praktiska detaljer<br />
utelämnats. Bland annat har inget grafiskt användargränssnitt utvecklas och<br />
program som vill använda <strong>nätverk</strong>et identifieras endast utifrån namnet på deras exekverbara<br />
fil. En praktisk implementation borde göra en utförligare identifikation av<br />
program, vilka bibliotek varje program har laddat, vem som startade programmet<br />
i fråga och så vidare. Med denna implementation vill vi visa ett koncept.<br />
4.3.1 Mål och krav för implementationen<br />
Prototypen skall implementera de grundfunktioner som presenterats i teoridelen<br />
(kapitel 3). Målet med implementationen är att visa att konceptet med två filter<br />
och dynamiska regler fungerar och kan utgöra grunden för en säker personlig brandvägg.<br />
Utöver de grundläggande kraven för funktionalitet har vi ställt upp följande<br />
implementationsspecifika krav:<br />
• Det skall vara svårt för obehöriga att förändra filtrens beteende.<br />
• Det skall vara svårt att kringgå filtren.<br />
• Implementationen måste vara effektiv i bemärkelsen att normal användning<br />
ej skall medföra någon försämring i prestanda för slutanvändaren.<br />
4.3.2 Begränsningar<br />
Eftersom implementationen görs för att visa ett koncept och ej en färdig produkt<br />
har följande begränsningar satts upp:<br />
• Förenklad tillståndshantering En enkelt version av tillståndhantering i<br />
paketfiltret som inte verifierar sekvensnummer och fönsterstorlek i TCP/IPprotokollet.<br />
• Förenklad identifikation av program Program som vill använda <strong>nätverk</strong>et<br />
identifieras endast utifrån namnet på deras exekverbara fil.<br />
• Förenklad kontrolltjänst Inget grafiskt gränssnitt för kontrolltjänsten. Som<br />
följd av begränsningen i identifikation av program har heller inget avancerat<br />
regelverk för access baserat på applikation satts upp.<br />
4.3.3 Arkitektur<br />
Implementationen är precis som modellen uppdelad i två filter och en kontrollapplikation.<br />
Utifrån kraven och informationen om filtreringstekniker i Windows XP<br />
anser vi att båda filtren måste implementeras i kärnan. Genom att installera filtren
28 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
Brandväggstjänst<br />
Applikationer och tjänster<br />
Winsock<br />
API<br />
NetBios<br />
API<br />
Servers<br />
TCP/IP IPX/SPX NetBEUI<br />
Drivrutin<br />
<strong>nätverk</strong>skort<br />
TDI-filter<br />
TDI<br />
NDIS<br />
NDIS-filter<br />
HAL<br />
Drivrutin<br />
<strong>nätverk</strong>skort<br />
Nätverkskort Nätverkskort<br />
Applikationslager<br />
Kärna<br />
Figur 4.4. Arkitektur för implementationen<br />
som drivrutiner i kärnan blir de svåra att kringgå och man får bland annat tillgång<br />
till paketen innan de når TCP/IP stacken (se figur 4.4).<br />
Som paketfilter har vi valt att använda oss av ett NDIS-filter. Filtreringen sker<br />
på en låg nivå mellan <strong>nätverk</strong>skortet och TCP/IP-stacken. Ytterligare en fördel är<br />
att det finns mycket information att tillgå om denna typ av drivrutiner, bland annat<br />
i form av ett exempel i Microsoft DDK (Microsoft, 2006e).<br />
Vårt sessionsfilter har vi valt att lägga mellan transportlagret och applikationslagret<br />
i TCP/IP-modellen. Detta filter har vi valt att implementera som ett TDIfilter.<br />
Genom att ändra anropstabellen för det ursprungliga TDI-lagret att hänvisa<br />
till våra egna funktioner genskjuter vi alla anrop till TDI-lagret. Godkända anrop<br />
vidarebefordras till det ursprungliga TDI-lagret. Det finns dock vissa risker med ett<br />
TDI-filter, bland annat att det är komplicerat att implementera då det inte finns<br />
någon, eller mycket lite dokumentation om hur man gör.<br />
Själva kontrollapplikationen har vi valt att implementera som en tjänst vilket<br />
bland annat innebär att den kan starta utan att en användare behöver start ett<br />
program. All konfiguration och alla regler ligger i registret, som är en databas med<br />
inställningar som finns tillgängligt i Windows, eftersom det inte finns något filsystem<br />
tillgängligt när drivrutinerna laddas under uppstart av operativsystemet.<br />
För att kommunicera med drivrutinerna använder sig kontrolltjänsten av IOCTLmeddelanden<br />
(Input Output Control Codes) som skickas som IO-paket ner till drivrutinerna.<br />
En applikation försöker öppna en anslutning fångas detta anrop i TDI-filtret.<br />
Filtret skickar en förfrågan till brandväggstjänsten som får avgöra huruvida anslut-
4.3. DESIGN 29<br />
ningen är tillåten eller inte. Brandväggstjänsten verifierar i sin tur att det finns<br />
en regel som tillåter applikationen att öppna anslutningen. Ifall anslutningen är<br />
legitim skickar brandväggstjänsten ner en ny regel till NDIS-filtret som öppnar för<br />
kommunikation (se figur 4.5).<br />
Applikation TDI filter Tjänst<br />
TDI_CONNECT<br />
4.3.4 Paketfilter<br />
svc_io_query_service<br />
ALLOW<br />
ValidateProcess()<br />
IOCTL_NDIS_<br />
ADD_RULES<br />
TDI_CONNECT<br />
NDIS filter<br />
Figur 4.5. Förenklat sekvensdiagram för implementationen<br />
Paketfiltret installeras som en NDIS intermediate driver och lägger sig som en integrerad<br />
del av NDIS i <strong>nätverk</strong>smodellen för Windows XP (se figur 4.4). En intermediate<br />
driver är en speciell komponent i NDIS som lägger sig ovanpå varje drivrutin för<br />
<strong>nätverk</strong>skort installerade i NDIS-lagret. Tillgängligt för filtrering finns här hela <strong>nätverk</strong>spaket<br />
precis som de skickas ut på det medium man anslutit sig till. Denna plats<br />
är således utmärkt för filtrering av in- och utgående paketströmmar. Paketfiltret är<br />
konstruerat utifrån grundexemplet Passthru i DDK-dokumentationen (Microsoft,<br />
2006e). Utöver grundkomponenterna läggs några komponenter till enligt figur 4.6.<br />
En enkel och effektiv tillståndshantering för anslutningar har implementerats<br />
efter flödesdiagrammet i figur 3.3. För att utnyttja teknikerna för dynamiska paketfilter<br />
(se 2.2.3) har även UDP-protokollet hanteras som ett anslutningsorienterat<br />
protokoll. En timer har implementerats för att hålla koll på livslängden för tillstånden<br />
i tillståndstabellen. Tillståndshanteringen för TCP kontrollerar uppkopplingsoch<br />
nerkopplingsfaserna för TCP (Wikipedia, 2006d) medan tillståndshanteringen<br />
för UDP är förenklad till att det antingen finns en uppkoppling eller inte. Genom<br />
denna implementation skyddar NDIS-filtret operativsystemets TCP/IP-stack från<br />
hot utifrån. Dessutom agerar paketfiltret som ett extra filter för trafik inifrån. Skulle<br />
en applikation installera en parallell protokollstack för att försöka gå runt TDI-filtret<br />
kommer man inte längre än hit. Alla paket stoppas som ej tillhör en tillåten paketström<br />
som kontrollapplikationen öppnat för genom att skicka ner nya regler. All<br />
trafik som filtret ej känner igen eller ej har någon regel som explicit tillåter den<br />
TDI
30 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
Utgående trafik<br />
Paketfilter<br />
Inkommande trafik<br />
Överliggande protokoll<br />
Regellista<br />
Protocol<br />
Tillståndstabell<br />
Miniport<br />
Timer<br />
Underliggande NDIS-drivrutin<br />
Regelhantering<br />
Figur 4.6. Komponenter i paketfilter<br />
IOCTL<br />
konfiguration<br />
stoppas. För enkelhets skull har detta filter endast implementerats för att hantera<br />
IP-protokoll version 4, men en enkel anpassning skulle göra det kompatibelt med<br />
IP-protokoll version 6.<br />
4.3.5 Sessionsfilter - TDI filter<br />
Sessionsfiltret installeras ovanpå TCP/IP-protokollet som en TDI-Hook. På detta<br />
sätt genskjuter man alla anrop till TDI-lagret och därmed alla normala uppkopplingsförsök<br />
gjorda från applikationslagret. Eftersom detta filter installeras ovanför<br />
TCP/IP-stacken kan vi avbryta anslutningen så tidigt som möjligt och få minimal<br />
inverkan på TCP/IP-stacken. Sessionsfiltrets uppgift är att identifiera och sammankoppla<br />
sessions- och applikationsinformation. Alla normala kommunikationskanaler<br />
öppnas genom att använda ett API som kommunicerar med TDI. Vid denna kommunikation<br />
sker ett IOCTL-anrop till TDI-lagret och detta anrop körs i programmets<br />
egna process. Detta gör att man under ett anrop kan ta reda på vilken process<br />
eller PID (Process Identification Number) man är och därigenom vilket program<br />
som gjort anropet. Ett anslutningsförsök i TDI är alltså förknippat med följande<br />
information:<br />
• Adressinformation gällande anslutningen, t.ex. käll- och destinationsadresser,<br />
portar och protokoll.<br />
• PID för den process som gjort anropet.<br />
Det finns inget väldokumenterat sätt att ta reda på vilken exekverbar fil som en viss<br />
PID tillhör i en drivrutin varvid själva mappningen till vilket program som motsvarar<br />
en PID måste göras i applikationslagret. TDI-filtret måste därför ta hjälp av<br />
kontrolltjänsten för att verifiera att programmet som gör anropet har rättigheter att
4.3. DESIGN 31<br />
öppna en anslutning. Eftersom kontrollapplikationen körs i applikationslagret och<br />
därmed har lägre prioritet än en drivrutin måste denna förfrågan göras asynkront.<br />
För att hantera detta har vi implementerat ett kösystem där en tråd som gör en<br />
förfrågan lägger en semafor i en väntekö för att sedan ligga och vänta på att svar<br />
skall inkomma. För att det inte skall uppstå någon lägre låsning har vi även en<br />
timer som avbryter väntan efter en tid. Dessa system har gjort att TDI-filtret har<br />
relativt många komponenter (se figur 4.7).<br />
IOCTL-anrop till TDI<br />
TDI-filter<br />
Adressobjekt<br />
IRP-kö<br />
Anrop till återkopplingsfunktion<br />
(Callback)<br />
TDI-klient<br />
IO-hanterare<br />
Associerade<br />
objekt<br />
Förfrågningar<br />
som väntar på<br />
svar<br />
TDI-lager<br />
Anslutningar<br />
Timer<br />
Figur 4.7. Komponenter i TDI-filtret<br />
IOCTL<br />
förfrågningar/<br />
svar<br />
Konceptuellt fungerar sessionsfiltret relativt enkelt och är baserat på flödesdiagrammet<br />
i figur 3.2. Vad gäller tillståndshantering för en uppkoppling i TDI-lagret<br />
är denna inte lika lättöverskådlig (se figur 4.8). Konceptuellt fungerar denna som<br />
följande:<br />
1. Öppna två ändpunkter för kommunikation (adresser).<br />
2. Associera dessa.<br />
3. Anslut.<br />
Det finns knapphändig dokumentation om hur anslutningar hanteras i TDI men<br />
för en utförligare beskrivning se appendix A.<br />
4.3.6 Kontrolltjänst<br />
Kontrolltjänsten är ansvarig för att knyta samman sessions- och paketfiltret. Denna<br />
komponent är även ansvarig för den övergripande regelhanteringen. Komplexiteten
32 KAPITEL 4. FALLSTUDIE - MICROSOFT WINDOWS XP<br />
start<br />
ZwCreateFile<br />
En öppen<br />
adress<br />
ZwClose<br />
slut<br />
ZwCreateFile<br />
ZwClose<br />
ZwClose<br />
TDI_SEND<br />
TDI_RECEIVE<br />
Två öppna<br />
adresser<br />
ZwClose<br />
Uppkopplad<br />
TDI_ASSOCIATE_ADDRESS<br />
TDI_DISASSOCIATE_ADDRESS<br />
TDI_DISCONNECT<br />
TDI_CONNECT<br />
TDI_SET_EVENT_HANDLER<br />
Uppkopplad<br />
med<br />
callback<br />
TDI_SEND<br />
TDI_RECEIVE<br />
TDI_EVENT_RECEIVE<br />
Associerade<br />
adresser<br />
Callback<br />
registread<br />
TDI_DISCONNECT<br />
~TDI_SET_EVENT_HANDLER<br />
TDI_CONNECT<br />
ZwClose<br />
~TDI_SET_EVENT_HANDLER<br />
TDI_SET_EVENT_HANDLER<br />
ZwClose<br />
Figur 4.8. Tillståndsdiagram för en session i TDI-filtret<br />
för reglerna för ett sessionsfilter gör att implementationen av regelhantering underlättas<br />
avsevärt då den flyttas till kontrolltjänsten.<br />
För de förfrågningar kontrolltjänsten får från TDI-lagret kan kontrolltjänsten<br />
avgöra huruvida en applikation får upprätta en anslutning eller ej. TDI-lagret skickar<br />
en förfrågan med följande information:<br />
• PID för den process som försöker öppna en anslutning.<br />
• Adressinformation om vilket protokoll och vart processen vill ansluta.<br />
Man kan även ta reda på vilka bibliotek som denna process har laddat och vem<br />
som startat den. Från denna information samt vilken adress den försöker ansluta till<br />
kan man sedan bestämma huruvida en applikation (exekverbara filer och bibliotek)<br />
får genomföra anslutningen eller ej. Möjligt i detta läge är även att fråga användaren<br />
om anslutningen är legitim eller ej. Det är många kommersiella program som<br />
använder sig av denna typ av kontroll, vanligtvis presenteras ett fönster med en<br />
fråga om ett visst program får ansluta eller ej. Den grundläggande funktionaliteten<br />
för tjänsten baseras på flödesdiagrammet i figur 3.4.<br />
I det fall tjänsten beslutat att anslutningsförsöket är legitimt skickar denne ner<br />
en ny regel till NDIS-filtret för att öppna för trafik till denna anslutning. Tjänsten<br />
kommunicerar med de två drivrutinerna med hjälp av IOCTL-meddelanden. För
4.3. DESIGN 33<br />
NDIS filtret används dessa för att lägga till, ta bort och rensa regler från paketfiltret.<br />
NDIS filtret skickar aldrig själv meddelanden till tjänsten utan hanterar en<br />
egen regellista som tjänsten är ansvarig för att uppdatera. IOCTL-meddelanden<br />
till och från TDI-filtret är av två typer. Antigen informerar TDI-filtret tjänsten till<br />
exempel om att en anslutning har avslutats, eller skickar TDI-filtret en förfrågan<br />
om en anslutning får göras. Tjänsten har en egen regellista som består av regler per<br />
program.
Kapitel 5<br />
Tester<br />
För att testa och utvärdera om implementationen och därav modellen uppfyller<br />
de mål och krav som ställts upp för den här rapporten utfördes ett antal tester.<br />
Implementationstester för att utvärdera att implementationen fungerade som det<br />
var tänkt, penetrationstester för att verifiera att implementationen klarar av externa<br />
och interna attacker samt regeltester för att säkerhetsställa att en säkerhetspolicy<br />
implementeras på ett korrekt sätt. Utifrån dessa tester kan man sedan dra slutsatser<br />
om implementationen uppfyller de fem mål som ställdes upp i avsnitt 1.1 och därav<br />
visa om implementationen innehar de egenskaper som beskrivs för modellen.<br />
Implementationstesterna utfördes i två delar. För att upptäcka valideringsfel<br />
och avgränsningsfel i implementationen användes kodanalysverktyg. Koden i NDIS<br />
och TDI drivrutinerna analyserades regelbundet vid kompilering med hjälp av PRE-<br />
Fast for Drivers (Microsoft, 2006b) som är ett verktyg för statisk kodanalys och som<br />
kan upptäcka problem som inte brukar upptäckas av vanliga kompilatorer. Tjänsten<br />
analyserades med hjälp av kodanalysverkyget i Visual Studio 2005 (Microsoft,<br />
2006d). Den andra delen av implementationstester gjordes genom för att testa om<br />
brandväggen verkligen blockerade paket och utförde det som reglerna beskrev. Dessa<br />
tester gjordes med hjälp av enkla program som ping och telnet.<br />
Penetrationstesterna bestod av externa och interna attacker. För de externa penetrationstesterna<br />
användes paketgenererings- och <strong>nätverk</strong>sscanningsverktyg. För<br />
interna penetrationstester (program som försöker ta sig ut) användes program från<br />
en websida med testprogram (Kaddouch, 2006). Dock utfördes inte alla deras tester<br />
utan bara sådana som motsvarade målen för implementationen. Framförallt utlämnades<br />
tester som använder sig av tekniker för att ladda in sig själva i andra program<br />
och liknande. Eftersom endast en enkelt version för att verifiera program har implementerats<br />
kan inte vår implementation upptäcka och stoppa denna typ av interna<br />
attacker. Följande program och tester valdes ut då de motsvarar de mål som vi<br />
ställt upp för implementationen.<br />
• Leak Test v1.2: Programmet försöker kontakta websidan grc.com genom att<br />
döpa om sig till ett program som antagligen är godkänt, Internet Explorer.<br />
35
36 KAPITEL 5. TESTER<br />
• TooLeaky: Tooleaky öppnar standardwebläsaren med följande kommandorad:<br />
iexplore.exe http://grc.com/lt/leaktest.htm?PersonalInfoGoesHere<br />
Fönstret som öppnas är gömt. Om webläsaren är tillåten att anropa servrar<br />
på port 80 kommer den att lyckas skicka information till destinationsadressen<br />
som i det här fallet är GRC.com.<br />
• YALTA: Provar att skicka UDP paket på portar som ofta är tillåtna så som<br />
53 (DNS) och 21(FTP).<br />
• hping: Paketgenerator för TCP/IP-protokollet (Wikipedia, 2006b).<br />
• Nmap: Nätverksscanner för TCP/IP-protokollet (Wikipedia, 2006c).<br />
Regeltesterna gjordes genom att en säkerhetspolicy sattes för brandväggen och<br />
sedan testades om brandväggen implementerade denna genom att testa med ping,<br />
hping, telnet och nmap.<br />
Alla tester utfördes i en virtuell maskin (Microsoft, 2006a) med operativsystemet<br />
Microsoft Windows XP SP2 med alla säkerhetsuppdateringar som fanns tillgängliga<br />
november 2006. Noden som användes för de externa penetrationstesterna använde<br />
sig av operativsystemet Mac OS X 10.4.8.<br />
5.1 Resultat<br />
5.1.1 Implementationstester<br />
Genom att utgå från modellen vid design implementerade vi en brandvägg bestående<br />
av två filter och en kontrollapplikation. Dessa filter har var för sig olika<br />
funktionalitet, olika starka och svaga egenskaper men tillsammans kompletterar de<br />
varandra. För enklare program som ping och telnet kunde deras uppkopplingsförsök<br />
följas redan i TDI-lagret. Då vi skrivit in en tillåtande regel för ett av dessa program<br />
kunde det utan problem kommunicera eftersom tjänsten vid ett uppkopplingsförsök<br />
skickat ner en ny regel till NDIS. Även mer komplicerade program som installerar<br />
en egen <strong>nätverk</strong>sstack parallellt med den inbyggda får problem att kommunicera ut<br />
trafik eftersom NDIS-filtret blockerar trafiken.<br />
5.1.2 Penetrationstester<br />
Vi genomförde en testsvit med olika typer av penetrationstester för utgående trafik<br />
(se tabell 5.1).<br />
För penetrationstester utifrån har vi genomfört tester med bland annat hping<br />
med lyckat resultat. Vid penetrationstesterna innifrån lyckades TooLeaky ta sig ut<br />
vilket beror på att den startar Internet Explorer. Eftersom implementationen inte<br />
undersöker processträdet för varje process fångar vi inte upp denna typ av program.<br />
Dock klarar implementationen de två andra som väntat.
5.1. RESULTAT 37<br />
Test Riktning Resultat Kommentar<br />
Leak Test Ut Stoppad<br />
TooLeaky Ut Passerar Använder sig av Internet Explorer<br />
YALTA Ut Stoppad<br />
hping In Stoppad Specialkonstruerade paket<br />
Nmap In Stoppad Portscanning<br />
5.1.3 Regeltester<br />
Tabell 5.1. Resultat av penetrationstester.<br />
För regeltesterna definierades en säkerhetspolicy som innebar att Internet Explorer<br />
fick kommunicera med servrar med TCP port på 80, samt att systemets DNS<br />
klient får kommunicera med servrar med UDP på port 53. Denna säkerhetspolicy<br />
lades in som två regler för kontrolltjänsten, en för Internet Explorer och en för<br />
DNS klienten. Genom att starta Internet Explorer och gå mot en websida samtidigt<br />
som de olika komponenterna (TDI filtret, NDIS filtret och kontrolltjänsten)<br />
i brandväggen övervakades. Utifrån detta kunde vi se att brandväggen implementerade<br />
säkerhetspolicyn som det var tänkt. Tester gjordes även med nmap för att<br />
verifiera att inga andra portar var öppna.<br />
5.1.4 Sammanfattning<br />
Resultaten från de olika testerna visar att implementationen fungerar som tänkt<br />
samt att den innehar de egenskaper som beskrivs av modellen. Nedan följer en<br />
beskrivning av hur testerna visar att implementationen klarar av dem fem målen<br />
från avsnitt 1.1.<br />
• Säkerhetsproblem i operativsystem. Genom penetrationstesterna har man<br />
visat att implementationen skyddar mot externa och interna attacker vilket<br />
betyder att implementationen skyddar operativsystemet från attacker.<br />
• Förhindra åtkomst till information. Eftersom implementationen klarar<br />
av implementationstesterna samt regeltesterna har vi visat att den klarar av<br />
att förhindra åtkomst till information.<br />
• Förhindra informationsläckor. De interna penetrationstesterna har visat<br />
att implementationen klarar av att förhindra informationsläcker.<br />
• Upprätthålla en säkerhetspolicy. Regeltesterna har visat att implementationen<br />
implementerar en säkerhetspolicy på ett korrekt sätt.<br />
• Granskning. Genom att implementationen spårar alla applikationer och all<br />
<strong>nätverk</strong>strafik är det lätt att följa ett förlopp för till exempel ett intrångsförsök.
Kapitel 6<br />
Slutsats<br />
I denna rapport har vi börjat med att presentera OSI-modellen för att relatera den<br />
till TCP/IP-modellen som är den standard som används på Internet idag. Utifrån<br />
dessa modeller har vi i kapitel 2 presenterat olika brandväggstekniker samt olika<br />
metoder för att testa och analysera dessa. I kapitel 3 har vi sedan utgått från tekniker<br />
presenterade i kapitel 2 för att ta fram en generell modell för en personlig<br />
brandvägg kapabel att filtrera på information från flera lager i OSI-modellen. Fokus<br />
har legat på design av ett sessionsfilter samt kombinationen av detta filter ihop med<br />
ett dynamiskt paketfilter. Genom denna kombination av brandväggstekniker har vi<br />
visat att man kunnat eliminera betydande svagheter hos respektive teknik. På detta<br />
sätt har vi designat en personlig brandvägg som ger ett bättre skydd, från attacker<br />
både inifrån och utifrån. För att testa den teoretiska modellen och visa att den är<br />
praktiskt genomförbar har vi i kapitel 4 konstruerat en prototyp för Microsoft Windows<br />
XP. Nätverksmodellen, drivrutinsmodellen samt olika filtreringstekniker för<br />
Windows XP har presenterats i detta kapitel. Utifrån de tekniker som presenterats<br />
har vi implementerat modellen presenterad i kapitel 3 med hjälp av ett TDI-filter,<br />
ett NDIS-filter och en kontrolltjänst. I kapitel 5 har vi testat prototypen utifrån<br />
tre olika testkategorier: (1) implementationstester, (2) penetrationstester och (3)<br />
regeltester för att verifiera att prototypen stämmer överens med den teoretiska modellen.<br />
Genom tester genomförda i kapitel 5 har vi visat att implementationen och<br />
modellen uppfyller de fem egenskaper vi ställt upp i kapitel 1. I och med detta<br />
har vi uppnått de mål som ställts upp för den här rapporten; att presentera en<br />
generell modell för en personlig brandvägg med följande fem egenskaper: (1) skydda<br />
mot säkerhetsproblem i operativsystem, (2) förhindra åtkomst till information, (3)<br />
förhindra informationsläckor, (4) upprätthålla en säkerhetspolicy och (5) underlätta<br />
granskning.<br />
39
Litteraturförteckning<br />
Cisco. Evolution of the firewall industry, September 2002. URL http://www.cisco.<br />
com/univercd/cc/td/doc/product/iaabu/centri4/user/scf4ch3.htm.<br />
Dubrawsky, Ido. Firewall evolution - deep packet inspection, Juli 2003. URL http:<br />
//www.securityfocus.com/print/infocus/1716.<br />
Haeni, Reto E. Firewall penetration testing. Teknisk rapport, Cyberspace Policy<br />
Institute, 1997.<br />
Hazelhurst, Scott. A proposal for dynamic access lists for tcp/ip packet filering.<br />
Teknisk rapport, School of Computer Science, University of the Witwatersrand,<br />
April 2001.<br />
Ingham, Kenneth och Forrest, Stephanie. A history and survey of network firewalls.<br />
Teknisk rapport, The University of New Mexico Computer Science Department<br />
Technical Report 2002-37, 2002. URL http://www.cs.unm.edu/~treport/tr/<br />
02-12/firewall.pdf.<br />
itsecurity.com. History of the firewall, Augusti 2006. URL http://www.<br />
itsecurity.com/security.htm?s=410.<br />
Jackson, Debbie. Windows xp firewall. Examensarbete, University of Sheffield, May<br />
2005.<br />
Kaddouch, Guillaume. Firewall leak tester, 2006. URL http://www.<br />
firewallleaktester.com/.<br />
Kamara, Seny, Fahmy, Sonia, Schultz, Eugene, Kerschbaum, Florian, och Frantzen,<br />
Michael. Analysis of vulnerabilities in internet firewalls. Journal of Computers<br />
and Security, 22(3):214–232, April 2003.<br />
KhalidAl-Tawil och Al-Kaltham, Ibrahim A. Evaluationandtestingofinternetfirewalls.<br />
INTERNATIONAL JOURNAL OF NETWORK MANAGEMENT, ss 135–<br />
149, 1999.<br />
Microsoft. Microsoft virtual pc 2004, 2006a. URL http://www.microsoft.com/<br />
windows/virtualpc/default.mspx.<br />
41
42 LITTERATURFÖRTECKNING<br />
Microsoft. Prefast for drivers, 2006b. URL http://www.microsoft.com/whdc/<br />
devtools/tools/PREfast.mspx.<br />
Microsoft. Tdi drivers, 2006c. URL http://msdn.microsoft.com/library/<br />
default.asp?url=/library/en-us/NetXP_d/hh/NetXp_d/nettdidriv_<br />
27c4b7c0-7e21-441d-bb08-335d48204a06.xml.asp.<br />
Microsoft. Visual studio team system, 2006d. URL http://msdn2.microsoft.<br />
com/en-us/library/fda2bad5(VS.80).aspx.<br />
Microsoft. Windows Driver Development Kit: Network Devices and Protocols: NDIS<br />
Drivers. Microsoft Corporation, 2006e.<br />
Mogul, Jeffrey C. Simple and flexible datagram access controls for unix-based<br />
gateways, 1989. URL http://www.hpl.hp.com/techreports/Compaq-DEC/<br />
WRL-89-4.html.<br />
Schuba, Christoph L. On the modeling, design, and implementation of firewall<br />
technology. Teknisk rapport, Center for Education and Research in Information<br />
Assurance and Security, 1997.<br />
Schultz, E. Eugene. How to perform effective firewall testing. Computer Security<br />
Journal, 12(1):47–54, 1996.<br />
Spafford, Eugene H. The internet worm incident. Teknisk rapport, Department of<br />
Computer Sciences Purdue University, 1991. URL http://www.funet.fi/pub/<br />
crypt/old/spaf/IWorm2.PS.Z.<br />
Wikipedia. Architecture of windows nt, 11 2006a. URL http://en.wikipedia.<br />
org/wiki/Windows_kernel.<br />
Wikipedia. hping free packet generator, 2006b. URL http://en.wikipedia.org/<br />
wiki/Hping.<br />
Wikipedia. Nmap free security scanner, 2006c. URL http://en.wikipedia.org/<br />
wiki/Nmap.<br />
Wikipedia. Transmission control protocol, 2006d. URL http://en.wikipedia.<br />
org/wiki/Transmission_Control_Protocol.<br />
Wikipedia. Trojan horse, 10 2006e. URL http://en.wikipedia.org/wiki/<br />
Trojan_horse_%28computing%29.<br />
Woodall, Stephen. Firewall design principles. Course project, April<br />
2004. URL http://www4.ncsu.edu/~kksivara/sfwr4c03/projects/<br />
SteWoodall-Project.pdf.<br />
Zaugg, Gerhard. Firewall testing. Examensarbete, Swiss Federal Institute of Technology<br />
Zurich, 2004.
Bilaga A<br />
TDI filter<br />
Detta appendix beskriver mer i detalj hur TDI filtret fungerar och hur TDI fungerar<br />
allmänt genom att visa hur en anslutning kan göras med TDI. För att bättre förklara<br />
hur TDI filtret fungerar och vilka funktioner som finns kommer vi att gå i genom<br />
processen att göra en anslutning, skickar data och slutligen stänger anslutning med<br />
hjälp av TDI. Innan vi går in på detaljer ger vi först en kort överblick.<br />
A.1 IO till TDI-lagret<br />
Varje protokoll som implementerar ett TDI-interface sätter upp en eller flera enheter<br />
som API lagret kommunicerar med (se figur 4.3). TCP/IP-protokollet sätter upp<br />
följande enheter:<br />
• \Device\Tcp<br />
• \Device\Udp<br />
• \Device\RawIp<br />
• \Device\IP<br />
De första två används för TCP respektive UDP trafik, medan RawIp kan användas<br />
för att skicka råa IP paket. Dock kan man bara använda denna device om man<br />
är administratör på datorn. Denna begränsning har gjort att man varit tvungen<br />
att implementera den fjärde enheten som användas bland annat för att skicka t.ex.<br />
ICMP-meddelanden med programmet Ping utan att man behöver vara administratör.<br />
Dock används den troligtvis till fler funktioner men det saknas helt dokumentation<br />
för denna enhet från Microsoft, troligtvis för att den endast är tänkt att<br />
användas internt av Microsoft.<br />
A.2 Ny anslutning<br />
Beroende på om en applikation vill öppna en ny anslutning eller skicka data hanteras<br />
det på olika sätt. När en applikation vill öppna en ny anslutning sker förenklat det<br />
43
44 BILAGA A. TDI FILTER<br />
förlopp som visas i figur 4.5. En applikation använder sig i vanliga fall av Winsock<br />
som fungerar som en TDI klient och gör alla TDI anrop som behövs för att göra en<br />
anslutning. Det som visas i figuren är endast det avslutande anropet för att göra<br />
själva anslutningen till fjärrnoden. För en mer detaljerad beskrivning av hur man<br />
gör en anslutning TDI och hur TDI filtret hanterar det, se appendix A.<br />
I första steget får TDI filtret TDI_CONNECT anropet från applikation och skickar<br />
den en förfrågan till tjänsten genom att anropa svc_io_query_service med information<br />
om vilket process id, protokoll, destinations adress och destinations port.<br />
Tjänsten mappar process id till namnet på den exekverbara filen och söker sedan<br />
i sin regellista efter matchande regler. Om det inte finns någon regel som matchar<br />
namnet på processen eller det finns en regel som matchar namnet, men den anslutningen<br />
som applikationen vill göra inte tillåts, svara tjänsten med BLOCK. TDI<br />
filtret svarat då till applikationen med STATUS_REMOTE_NOT_LISTENING vilket innebär<br />
att anslutningen avbryts. Om anslutningen tillåts som i figuren skickar tjänsten<br />
en regel till NDIS filtret som matchar den aktuella anslutningen och svarar sedan<br />
till TDI filtret med ALLOW. TDI filtret skickar då vidare TDI_CONNECT anropet till<br />
det ursprungliga anropet och returnerar senare svaret till applikationen.<br />
A.3 Öppna en anslutning med TDI<br />
För att göra en anslutning med TDI måste följande steg utföras:<br />
• Öppna en transport adress<br />
• Öppna en anslutningsslutpunkt<br />
• Associera transport adressen med anslutningsslutpunkten<br />
• Göra anslutningen<br />
A.3.1 Öppna en Transportadress<br />
Första steget är att skapa ett objekt som representerar en transportadress. Transportadressen<br />
är den IP adress och port som kommer att användes på den lokala<br />
noden. Det är möjligt att specificera en lokal adress och port och används bland<br />
annat när en process vill vänta på anslutningar på en viss port. Figur A.1.<br />
A.3.2 Öppna en anslutningsslutpunkt<br />
Nästa steg är att skapa en anslutningsslutpunkt som definierar en klients sida av<br />
en <strong>nätverk</strong>s anslutning. Denna anslutningsslutpunkt sätts upp är den inte aktiv och<br />
ingen I/O kan utföras på denna innan man har associerat en transportadress med<br />
den. Figur A.2.
A.3. ÖPPNA EN ANSLUTNING MED TDI 45<br />
TDI Client<br />
ExtendedAttributes->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH<br />
Possibly specify local address to use<br />
irp1<br />
Dispatch Create<br />
Handler<br />
Create Address<br />
Object<br />
Set completion<br />
routine:<br />
Complete_Address_<br />
Object<br />
IoCallDriver(... irp1)<br />
ZwCreateFile(... ExtendedAttributes ...)<br />
Transport Data Interface<br />
Complete<br />
Address Object<br />
Create irp2 & set<br />
completion<br />
function:<br />
Complete_Query_<br />
Local_Address<br />
irp1<br />
irp1<br />
IoCallDriver(... irp2)<br />
Original TDI Driver<br />
Object List<br />
Address Object<br />
Complete Query<br />
Local Address<br />
Save Address Object<br />
in Object List<br />
irp2<br />
Figur A.1. Create Address Object<br />
TDI Client<br />
ExtendedAttributes->EaNameLength = TDI_CONNECTION_CONTEXT_LENGTH<br />
Dispatch Create<br />
Handler<br />
irp<br />
ZwCreateFile(... ExtendedAttributes ...)<br />
Transport Data Interface<br />
Create Connection<br />
Context<br />
Save Connection Object<br />
in Object List<br />
IoCallDriver(... irp)<br />
Original TDI Driver<br />
Object List<br />
Address Object<br />
Connection Object<br />
Figur A.2. Create Connection Context<br />
User Space<br />
Kernel Space<br />
User Space<br />
Kernel Space
46 BILAGA A. TDI FILTER<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_ASSOCIATE_ADDRESS ...)<br />
TdiBuildAssociateAddress(irp ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Associate Address<br />
1. Verify Address and<br />
Connection objects<br />
2. Save associated Address<br />
Object in Object List<br />
3. Associate objects<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
2x<br />
Object List<br />
Address Object<br />
Connection Object -> Address Object<br />
Original TDI Driver<br />
Verify Objects<br />
Associate Objects<br />
Associate List<br />
Address Object -> Connection Object<br />
Figur A.3. Associate Address<br />
User Space<br />
Kernel Space<br />
A.3.3 Associera transportadressen med anslutningsslutpunkten<br />
Som sagts tidigare behöver vi först associera en transportadress med en anslutningsslutpunkt<br />
innan vi kan skicka data över anslutningen. Associationen görs genom ett<br />
TDI_ASSOCIATE_ADDRESS IOCTL anrop. En anslutningsslutpunkt kan endast vara<br />
associerat med en transportadress, medan en transportadress kan ha associationer<br />
till många olika anslutningsslutpunkter. Ett exempel är när flera klienter är ansluta<br />
till en server socket.<br />
A.3.4 Göra anslutningen<br />
För att göra själva anslutningen skickas ett TDI_CONNECT IOCTL anrop som gör att<br />
själva anslutningen. I det här steget skickas även själva adressen till den fjärrnod<br />
som man vill ansluta till<br />
A.4 Skicka och ta emot data med TDI<br />
Ä client can disable an already registered event handler by making a subsequent<br />
TDI_SET_EVENT_HANDLER request in which the EventType member specifies the type<br />
of handler but the EventHandler and EventContext members are NULL."<br />
Åhen a kernel-mode client makes a TDI_SEND request, it asks the underlying TDI<br />
transport driver to transmit a normal or expedited TSDU on a specified connection
A.5. AVSLUTA EN ANSLUTNING MED TDI 47<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_CONNECT ...)<br />
Specify remote address to connect to<br />
TdiBuildConnect(irp ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Connect<br />
1. Find related Connection<br />
Object and Address Object<br />
2. Query Service<br />
3. Save connection in<br />
Connection List<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Object List<br />
Address Object<br />
Connection Object -> Address Object<br />
Find Object<br />
Original TDI Driver<br />
Save Connection<br />
Query Service<br />
Connection List<br />
Pid, Protocol, IP:Port -> IP:Port<br />
Figur A.4. Connect<br />
Service<br />
Investigate<br />
Permissions<br />
User Space<br />
Kernel Space<br />
endpoint to its remote-node peer."<br />
Åhen a kernel-mode client makes a TDI_SET_EVENT_HANDLER request, it asks<br />
the underlying TDI transport driver to call the specified ClientEventXxx routine<br />
whenever the corresponding network event occurs."<br />
A.5 Avsluta en anslutning med TDI<br />
Disconnect<br />
Åhen a kernel-mode client makes a TDI_DISCONNECT request, it asks the underlying<br />
TDI transport driver to make a disconnect indication to the remote node,<br />
to acknowledge a disconnect indication from the remote node for an established<br />
endpoint-to-endpoint connection, or to reject an offered connection by a remotenode<br />
peer."<br />
Disassociate the Handles<br />
Åhen a kernel-mode client makes a TDI_DISASSOCIATE_ADDRESS request, it asks<br />
the underlying TDI transport driver to break an established association between a<br />
particular local-node address and a connection endpoint."<br />
Close the Handles<br />
"TdiDispatchClose runs when the I/O manager is releasing its last reference<br />
to the handle of the file object representing an address, connection endpoint, or<br />
control channel. Such a file object is deallocated when this last reference to the file<br />
handle has been released."
48 BILAGA A. TDI FILTER<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_SEND ...)<br />
TdiBuildSend(irp ... dataBuffer ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Send<br />
Verify a valid connection<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Original TDI Driver<br />
Connection List<br />
Pid, Protocol, IP:Port -> IP:Port<br />
Verify Connection<br />
Figur A.5. Send Data<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_RECEIVE ...)<br />
TdiBuildReceive(irp ... dataBuffer ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Receive<br />
Verify a valid connection<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Original TDI Driver<br />
Connection List<br />
Pid, Protocol, IP:Port -> IP:Port<br />
Verify Connection<br />
Figur A.6. Receive Data<br />
User Space<br />
Kernel Space<br />
User Space<br />
Kernel Space<br />
Åhen the I/O manager is closing the last handle to an open file object that represents<br />
an address, connection endpoint, or control channel, it calls TdiDispatchCleanup.<br />
In other words, the I/O manager always submits an IRP_MJ_CLEANUP request to a<br />
transport before it submits an IRP_MJ_CLOSE request for a particular file object."
A.5. AVSLUTA EN ANSLUTNING MED TDI 49<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_SET_EVENT_HANDLER ...)<br />
TdiBuildSetEventHandler(irp ... TDI_EVENT_RECEIVE ... clientEventHandler, clientContext)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
Verify Address Object<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Object List<br />
1 - Address Object<br />
2 - Connection Object, -> Address Object<br />
Original TDI Driver<br />
TDI Set Event Handler<br />
1. Verify a valid Address Object<br />
2. Save clientEventHandler and<br />
clientContext in new context of<br />
a modified irp<br />
3. Replace event handler in irp<br />
with: TDI_Event_Receive<br />
IoCallDriver(... modified irp)<br />
Figur A.7. Register Event Receive Function to Receive Data<br />
TDI Client<br />
NTSTATUS clientEventHandler(clientContext ... irp){<br />
handle irp...<br />
}<br />
clientEventHandler(clientContext ... irp)<br />
TDI Event Receive<br />
1. Verify a valid connection<br />
2. Call clientEventHandler with<br />
clientContext earlier saved in<br />
context of modified irp<br />
context + irp<br />
clientContext + irp<br />
Transport Data Interface<br />
Original TDI Driver<br />
Associate List<br />
Address Object -> Connection Object<br />
Verify Connection<br />
Connection List<br />
Pid, Protocol, IP:Port -> IP:Port<br />
Figur A.8. Receive Data in Event Receive Function<br />
User Space<br />
Kernel Space<br />
User Space<br />
Kernel Space
50 BILAGA A. TDI FILTER<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_DISCONNECT ...)<br />
TdiBuildDisconnect(irp ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Disconnect<br />
1. Find & remove connection<br />
from Connection List<br />
2. Inform Service<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Original TDI Driver<br />
Connection List<br />
Pid, Protocol, IP:Port -> IP:Port<br />
Find & Remove<br />
Connection<br />
Inform Service<br />
Figur A.9. Disconnect<br />
TDI Client<br />
irp = TdiBuildInternalDeviceControlIrp(TDI_DISASSOCIATE_ADDRESS ...)<br />
TdiBuildDisassociateAddress(irp ...)<br />
irp<br />
Dispatch Internal<br />
Device Control Handler<br />
TDI Disassociate Address<br />
1. Find & remove related<br />
Address Object<br />
3. Disassociate objects<br />
IoCallDriver(... irp)<br />
IoCallDriver(... irp)<br />
Transport Data Interface<br />
Object List<br />
Address Object<br />
Connection Object -> Address Object<br />
Original TDI Driver<br />
Find Object<br />
Disassociate<br />
Objects<br />
Associate List<br />
Address Object -> Connection Object<br />
Figur A.10. Disassociate the Handles<br />
Service<br />
Update<br />
connection<br />
states<br />
User Space<br />
Kernel Space<br />
User Space<br />
Kernel Space
A.5. AVSLUTA EN ANSLUTNING MED TDI 51<br />
TDI Client<br />
Closes handle to Address Object and Connection Context separately.<br />
irp<br />
Dispatch Close Handler<br />
Remove object from Object List<br />
IoCallDriver(... irp)<br />
ZwClose(handle)<br />
Transport Data Interface<br />
Original TDI Driver<br />
Find & Remove<br />
Object<br />
Object List<br />
Address Object<br />
Connection Object<br />
Figur A.11. Close the Handles<br />
User Space<br />
Kernel Space