• No results found

The Hidden Resources Detector for GNU/Linux

N/A
N/A
Protected

Academic year: 2021

Share "The Hidden Resources Detector for GNU/Linux"

Copied!
57
0
0

Loading.... (view fulltext now)

Full text

(1)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INTELIGENTN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INTELLIGENT SYSTEMS

DETEKTOR UTAJOVAN ´

YCH PROST ˇ

REDK ˚

U

PRO GNU/LINUX

BAKAL ´

A ˇ

RSK ´

A PR ´

ACE

BACHELOR’S THESIS

AUTOR PR ´

ACE

RADEK NE ˇ

CAS

AUTHOR

(2)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INTELIGENTN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INTELLIGENT SYSTEMS

DETEKTOR UTAJOVAN ´

YCH PROST ˇ

REDK ˚

U

PRO GNU/LINUX

THE HIDDEN RESOURCES DETECTOR FOR GNU/LINUX

BAKAL ´

A ˇ

RSK ´

A PR ´

ACE

BACHELOR’S THESIS

AUTOR PR ´

ACE

RADEK NE ˇ

CAS

AUTHOR

VEDOUC´I PR ´

ACE

Ing. BORIS PROCH ´

AZKA

SUPERVISOR

(3)

Abstrakt

Tato pr´ace se zab´yv´a detekov´an´ım skryt´ych prostˇredk˚u v prostˇred´ı operaˇcn´ıch syst´em˚u GNU/Linux. Souˇcasnˇe analyzuje n´astroje, kter´e toto skr´yv´an´ı prov´adˇej´ı (tzv. rootkity). Pr´ace je rozdˇelena na teoretickou a praktickou ˇc´ast. Teoretick´a ˇc´ast se zamˇeˇruje pˇredevˇs´ım na zp˚usob spr´avy a reprezentace prostˇredk˚u v operaˇcn´ım syst´emu, reˇzimy bˇehu a syst´emov´a vol´an´ı. Praktik´a ˇc´ast se zab´yv´a n´avrhem a implementac´ı obecn´eho detektoru, kter´emu jsou jednotliv´e metody detekce pˇred´any formou z´asuvn´ych modul˚u. Nˇekter´e z tˇechto metod jsou realizov´any jako moduly j´adra operaˇcn´ıho syst´emu. ´Uˇcinnost detektoru je porovn´ana oproti re´aln´ym rootkit˚um.

Abstract

The main goal of this thesis was to detect hide resources in GNU/Linux operating systems and analyse tools so called rootkits, which are used to hide system resources. This thesis is devided into two parts, theoretical and practical one. Theoretic part focusses on resource managment, representation, privilege levels and system calls. Practical part covers design and implementation of an abstract detector. Each new detection method is implemented as a plugin. Some of those methods are realized as linux kernel modules. The usability of the detector is compared against real rootkits.

Kl´ıˇ

cov´

a slova

poˇc´ıtaˇcov´a bezpeˇcnost, operaˇcn´ı syst´em, Linux, syst´emov´a vol´an´ı, virtu´aln´ı souborov´y syst´em, proces, soubor, s´ıt’ov´a spojen´ı, rootkit, detektor

Keywords

computer security, operating system, Linux, system call, virtual filesystem, process, file, network connection, rootkit, detector

Citace

Radek Neˇcas: Detektor utajovan´ych prostˇredk˚u

(4)

Detektor utajovan´

ych prostˇ

redk˚

u

pro GNU/Linux

Prohl´

sen´ı

Prohlaˇsuji, ˇze jsem tuto bakal´aˇrskou pr´aci vypracoval samostatnˇe pod veden´ım pana Ing. Borise Proch´azky. Uvedl jsem vˇsechny liter´arn´ı prameny a publikace, ze kter´ych jsem ˇ

cerpal.

. . . . Radek Neˇcas 14. kvˇetna 2013

Podˇ

ekov´

an´ı

T´ımto bych r´ad podˇekova panu Ing. Borisi Proch´azkovi za jeho veden´ı, z´ajem, ochotu a ˇcas, kter´y mi vˇenoval a v neposledn´ı ˇradˇe za schopnost mˇe vˇzdy nav´est spr´avn´ym smˇerem.

c

Radek Neˇcas, 2013.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe in-formaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´avnˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.

(5)

Obsah

´

Uvod 3

1 Operaˇcn´ı syst´em 5

1.1 Operaˇcn´ı syst´em a jeho role . . . 5

1.2 J´adro operaˇcn´ıho syst´emu . . . 6

1.2.1 Typy jader . . . 6

1.2.2 J´adro Linux . . . 7

1.3 Urovnˇ´ e opr´avnˇen´ı . . . 7

1.3.1 Pˇrechod mezi reˇzimy opr´avnˇen´ı . . . 8

1.4 Implementace syst´emov´ych vol´an´ı . . . 10

2 Reprezentace a spr´ava prostˇredk˚u 11 2.1 Reprezentace a spr´ava proces˚u . . . 11

2.1.1 Z´akladn´ı pojmy . . . 11

2.1.2 Reprezentace proces˚u . . . 12

2.1.3 ˇZivotn´ı cyklus procesu . . . 13

2.1.4 Pl´anov´an´ı proces˚u . . . 15

2.2 Reprezentace a spr´ava soubor˚u . . . 17

2.2.1 Z´akladn´ı pojmy . . . 17

2.2.2 Virtu´aln´ı souborov´y syst´em . . . 17

2.2.3 Reprezentace VFS . . . 18

2.3 Reprezentace a spr´ava s´ıt’ov´ych spojen´ı . . . 21

2.3.1 Z´akladn´ı pojmy . . . 21

2.3.2 Reprezentace s´ıt’ov´ych spojen´ı . . . 22

3 Rootkity a metody ´utok˚u 23 3.1 Z´akladn´ı pojmy . . . 23

3.2 Typy rootkit˚u . . . 23

3.2.1 Rootkity bˇeˇz´ıc´ı v uˇzivatelsk´em reˇzimu . . . 23

3.2.2 Rootkity bˇeˇz´ıc´ı v reˇzimu j´adra . . . 24

3.3 Metody ´utok˚u v reˇzimu j´adra . . . 25

3.3.1 Napaden´ı obsluhy pˇreruˇsen´ı . . . 26

3.3.2 Napaden´ı v´ybˇeru syst´emov´e funkce . . . 26

3.3.3 Napaden´ı syst´emov´e funkce . . . 27

3.4 Testovan´e rootkity . . . 29

3.4.1 Kbeast-v4 . . . 29

3.4.2 Adore-ng . . . 29

(6)

3.4.4 Jynx2 . . . 29

3.4.5 DR . . . 29

3.4.6 Override . . . 30

4 Programov´an´ı modul˚u pro j´adro 31 4.1 Z´akladn´ı principy . . . 31

4.2 Datov´e typy v j´adˇre . . . 32

4.2.1 Implementace datov´ych typ˚u . . . 32

4.3 Komunikace modulu s uˇzivatelskou aplikac´ı . . . 33

4.4 Tvorba a spr´ava modul˚u . . . 33

5 Detekce skryt´ych prostˇredk˚u a implementace detektoru 34 5.1 Detekce skryt´ych proces˚u . . . 34

5.2 Detekce skryt´ych spojen´ı . . . 37

5.3 Detekce skryt´ych soubor˚u . . . 38

5.4 N´avrh a implementace detektoru . . . 40

6 Testov´an´ı 42 6.1 Postup testov´an´ı . . . 42

6.2 V´ysledky testov´an´ı . . . 42

Z´avˇer 44

Seznam pˇr´ıloh 47

A Uk´azkov´e v´ystupy programu 48

(7)

´

Uvod

ˇ

Zijeme v modern´ı dobˇe pln´e technologi´ı. Poˇc´ıtaˇce jsou dnes bˇeˇznou souˇc´ast´ı vˇsech dom´acnost´ı, stejnˇe jako televize, lednice ˇci praˇcka. V´yznam poˇc´ıtaˇc˚u s´ıl´ı s fenom´enem dneˇsn´ı doby – Internetem. Uˇz n´am neslouˇz´ı jen pro pr´aci ˇci z´abavu, ale st´avaj´ı se vstupn´ı branou do virtu´aln´ıho svˇeta, kter´y n´am v mnoh´em zjednoduˇsuje ˇzivot v tom skuteˇcn´em. M´ısto post´av´an´ı ve front´ach obchod˚u si m˚uˇzeme objednat zboˇz´ı z domu, n´avˇstˇevu banky na-hrad´ıme zad´an´ım pˇr´ıkazu z pohodl´ı vlastn´ıho gauˇce. Kaˇzd´a mince m´a ale i druhou stranu. V poˇc´ıtaˇc´ıch uchov´av´ame spoustu citliv´ych informac´ı, kter´e m˚uˇzou b´yt zneuˇzity. Internet je pot´e prostˇredn´ıkem, kter´y umoˇzˇnuje ´utoˇcn´ık˚um infiltrovat v´aˇs poˇc´ıtaˇc. Z tˇechto d˚uvod˚u se vyv´yjej´ı st´al´e nov´e a dokonalejˇs´ı bezpeˇcnostn´ı mechanismy. Stejnˇe s nimi se ale zdokonaluj´ı i metody ´utok˚u. ´Utoˇcn´ıci se v prvn´ı ˇradˇe snaˇz´ı skr´yt svoji ˇcinnost na napaden´e stanici. K t´eto ˇcinnosti jim pr´avˇe slouˇz´ı rootkity.

Pˇri tvorbˇe rootkit˚u je potˇreba detailnˇe zn´at strukturu napaden´eho syst´emu. My se v t´eto pr´aci sezn´am´ıme s rodinou operaˇcn´ıch syst´em˚u GNU/Linux. Tyto syst´emy jsou dnes pouˇz´ıvan´e pˇredevˇs´ım na servrech, d´ıky ˇcemuˇz jsou pro ´utoˇcn´ıky velmi zaj´ımav´e. Linuxov´e syst´emy zast´avaj´ı politiku otevˇren´eho k´odu. ´Utoˇcn´ıci tedy mohou nahl´ednout do jejich zdrojov´ych k´od˚u a hledat zraniteln´a m´ısta. Podobnou filozofii zast´avaj´ı i autoˇri veˇrejn´ych rootkit˚u. M˚uˇzeme tedy pouˇz´ıt stejn´y postup, analyzovat k´od operaˇcn´ıch syst´em˚u i rootkit˚u a jejich srovn´an´ım nal´ezt zp˚usob, jak odhalit ´utoˇcn´ıkovu nekalou ˇcinnost. O tento postup jsem se pokusil i j´a pˇri tvorbˇe t´eto pr´ace.

V prvn´ı kapitole jsem se pokusil srozumitelnˇe podat z´akladn´ı pojmy oblasti operaˇcn´ıch syst´em˚u, kter´e d´ale vyuˇz´ıv´am ve zbytku pr´ace. Tak´e jsem zde rozebral ´urovnˇe opr´avnˇen´ı a implementaci syst´emov´ych vol´an´ı, jejichˇz znalost je nezbytn´a pro pochopen´ı funkce root-kit˚u. V druh´e kapitole jsem se zamˇeˇril na reprezentaci a spr´avu prostˇredk˚u operaˇcn´ıch syst´em˚u pˇredevˇs´ım proces˚u, soubor˚u a s´ıt’ov´ych spojen´ı. Popsal jsem zp˚usoby, jak tyto prostˇredky vznikaj´ı, jak jsou reprezentov´any, a jak jsou ruˇseny. V tˇret´ı kapitole se pr˚ubˇeˇznˇe dost´av´ame k praktick´e ˇc´asti t´eto pr´ace. Pro jej´ı sestaven´ı jsem detailnˇe prozkoumal ˇsest veˇrejnˇe dostupn´ych rootkit˚u a provedl jsem anal´yzu syst´emov´ych vol´an´ı i virtu´aln´ıho sou-borov´eho syst´emu. Pro pˇrehlednost jsem rozdˇelil rootkity do z´akladn´ıch skupin. Krit´eriem tohoto dˇelen´ı byly metody, jak´ymi rootkity skr´yvaj´ı prostˇredky operaˇcn´ıho syst´emu, ˇci adre-sov´y prostor, ve kter´em se k´od rootkitu nach´az´ı. Nakonec jsem zde popsal veˇrejnˇe dostupn´e rootkity, kter´e byly pouˇzity v t´eto pr´aci.

Ve ˇctvrt´e kapitole jsem popsal p´ar z´akladn´ıch poznatk˚u ohlednˇe vytv´aˇren´ı, spr´avy a zav´adˇen´ı modul˚u pro j´adro. Popsal jsem i rozd´ıly oproti uˇzivatelsk´ym aplikac´ım, kter´e by mˇel m´ıt kaˇzd´y program´ator jadern´ych modul˚u na pamˇeti. Pot´e uˇz n´asledovala ˇcistˇe praktick´a kapitola vˇenuj´ıc´ı se detekci skryt´ych prostˇredk˚u. V t´eto kapitole jsem navrhl sadu metod jak´ymi mohou b´yt identifikov´any skryt´e prostˇredky. Zamˇeˇril jsem se pˇredevˇs´ım na detekci skryt´ych proces˚u, kter´a nab´ızela nejv´ıce prostoru pro r˚uzn´e zkoum´an´ı a expe-rimentov´an´ı. Implementoval jsem tˇri detektory skryt´ych proces˚u. Jeden bˇeˇz´ıc´ı kompletnˇe v uˇzivatelsk´em reˇzimu a dva vyuˇz´ıvaj´ıc´ı pro detekci modul˚u j´adra. Abych mohl zajistit

(8)

komunikaci detektoru s tˇemito moduly, musel jsem prozkoumat, jak´e kan´aly pro tento typ

komunikace Linux nab´ız´ı, a naimplementovat jednoduch´y protokol. D´ale jsem

implemen-toval detektor skryt´ych spojen´ı a popsal dva n´avrhy detekce skryt´ych soubor˚u. V ˇsest´e kapitole popisuje testov´an´ı detektoru a analyzuji v´ysledky tˇechto test˚u.

Vˇsechny kapitoly jsem se snaˇzil podat srozumitelnˇe i pro nepˇr´ıliˇs zasvˇecen´e ˇcten´aˇre, proto jsem je obohatil o sadu ilustraˇcn´ıch obr´azk˚u. V´ysledn´y detektor byl testov´an oproti analyzovan´ym rootkit˚um. Srovn´an´ı tˇechto rootkit˚u je dod´ano v pˇr´ıloze spoleˇcnˇe s uk´azkov´ymi v´ystupy detektoru. Detektor jsem navrhl s ohledem na moˇznosti budouc´ıho rozˇs´ıˇren´ı. V pr´aci lze pokraˇcovat zaˇrazov´an´ım nov´ych metod detekce. Lze implementovat nˇekter´e z uveden´ych metod ˇci pokraˇcovat v odhalov´an´ı nov´ych. Mohou b´yt zaˇrazeny detekce dalˇs´ıch prostˇredk˚u jako napˇr´ıklad skryt´ych modul˚u ˇci text˚u ukryt´ych uvnitˇr souboru. Nakonec by mohl b´yt program pˇretvoˇren do kompletn´ıho detektoru rootkit˚u, kter´y by mohl b´yt zaˇrazen do anti-virov´eho syst´emu.

(9)

Kapitola 1

Operaˇ

cn´ı syst´

em

Tato ´uvodn´ı kapitola se zamˇeˇruje na z´akladn´ımi pojmy teorie operaˇcn´ıch syst´em˚u. Bu-dou zde pops´any pojmy jako operaˇcn´ı syst´em, jeho j´adro a reˇzimy opr´avnˇen´ı. Na tˇechto informac´ıch je postaven v´yklad zbyl´ych kapitol. Take jsou zde obsaˇzeny informace o pr˚ubˇehu prov´adˇen´ı syst´emov´ych vol´an´ı, kter´e jsou z´akladn´ı pro pochopen´ı funkce rootkit˚u.

1.1

Operaˇ

cn´ı syst´

em a jeho role

Nejdˇr´ıve se sezn´am´ıme s v´ypoˇcetn´ım syst´emem.V´ypoˇcetn´ı syst´em se skl´ad´a z uˇzivatel˚u, aplikaˇcn´ıch program˚u, operaˇcn´ıho syst´emu1 a hardwarov´ych komponent (obr. 1.1)[1]. M˚uˇze zajiˇst’ovat ˇsirokou ˇsk´alu r˚uzn´ych operac´ı a funkc´ı od zobrazov´an´ı videi, komunikaci po inter-netu aˇz po sloˇzit´e simulace. Tyto moˇznosti se mohou znaˇcnˇe mˇenit ˇci rozˇsiˇrovat pˇrid´av´an´ım

nov´ych program˚u a hardwarov´ych komponent. Uˇzivatel´e komunikuj´ı se zbytkem syst´emu

skrze uˇzivatelsk´a rozhrann´ı aplikaˇcn´ıch program˚u. Veˇsker´a ˇcinnost je nakonec vykon´ana za pomoc´ı hardwaru (procesor, pamˇet’, vstupnˇe/v´ystupn´ı zaˇr´ızen´ı aj.). Operaˇcn´ı syst´em tento hardware ˇr´ıd´ı a umoˇzˇnuje jeho uˇzit´ı pro r˚uzn´e aplikace. Aplikace zase d´ıky funkci operaˇcn´ıho syst´emu nemusej´ı zn´at pˇresnou implementaci hardwaru ani detaily jeho komunikaˇcn´ıho roz-hrann´ı, a pˇresto jsou schopny vyuˇz´ıvat jeho sluˇzeb.

Operaˇcn´ı syst´em (zkr´acenˇe OS) je softwerovou ˇc´ast´ı v´ypoˇcetn´ıho syst´emu, jenˇz tvoˇr´ı mezivrstvu mezi hardwarem a uˇzivatelsk´ymi ˇci syst´emov´ymi programy. Zat´ımco program˚u m˚uˇze souˇcasnˇe bˇeˇzet cel´a ˇrada, operaˇcn´ı syst´em bˇeˇz´ı vˇzdy jen jeden. Dalo by se ˇr´ıci, ˇze je z´akladnou na kter´e stav´ı a kter´e vyuˇz´ıvaj´ı ostatn´ı aplikace2. Pln´ı dvˇe z´akladn´ı role [2]:

1. Rozˇs´ıˇren´ı stroje – Poskytuje mnoˇzinu operac´ı pomoc´ı kter´ych lze komunikovat s hardwarem na vyˇsˇs´ı ´urovni pomoc´ı pˇr´ıvˇetivˇejˇs´ıho komunikaˇcn´ıho rozhran´ı [2]. Apli-kace tedy mohou vyuˇz´ıvat r˚uzn´e typy hardwaru, anichˇz by znali jejich pˇresnou im-plementaci. Tv˚urci tˇechto aplikac´ı zase mohou vyuˇz´ıvat standardizovan´e komunikaˇcn´ı rozhran´ı, coˇz jim umoˇzˇnuje ps´at jednoduˇsˇs´ı, ˇcitelnˇejˇs´ı a pˇrenositelnˇejˇs´ı programy. 2. Spr´avce zdroj˚u – V t´eto roli OS pˇridˇeluje v´ypoˇcetn´ı prostˇredky (procesor, pamˇet’,

vstupnˇe/v´ystupn´ı zaˇr´ızen´ı) a umoˇzˇnuje jejich sd´ılen´ı co nejefektivnˇejˇs´ım zp˚usobem. Z´aroveˇn zajiˇst’uje zabezpeˇcen´ı pˇr´ıstupu a pr´ace s tˇemito komponentami.

1

Rozsah pojmu operaˇcn´ı syst´em nen´ı striktnˇe definov´an a v r˚uzn´ych literatur´ach se liˇs´ı. V nˇekter´ych je

ch´ap´an v uˇzˇs´ım smyslu pouze jako j´adro. V jin´ych je tento pojem rozˇs´ıˇren´y i na vˇsechny syst´emov´e programy.

V t´eto pr´aci bude pouˇzita druh´a definice.

(10)

Uživatel 1 Uživatel 2 Uživatel 3 Uživatel n

Aplikace

Operační systém

Hardware

Obr´azek 1.1: V´ypoˇcetn´ı syst´em

Mezi nejpouˇz´ıvanˇejˇs´ı souˇcasn´e operaˇcn´ı syst´emy patˇr´ı Microsoft Windows, Mac OS X a syst´emy GNU/Linux [3]. GNU/Linux je sp´ıˇse rodinou operaˇcn´ıch syst´em˚u sd´ılej´ıc´ı stejn´e

j´adro (Linux). K dispozici je ve formˇe distribuc´ı jako napˇr.: Debian, Cent OS, Ubuntu,

Arch Linux a mnoho jin´ych. Distribuce se snaˇz´ı b´yt komplexn´ım a snadno pouˇziteln´ym

poˇc´ıtaˇcov´ym syst´emem. Obsahuj´ı tedy kromˇe samotn´eho OS i uˇzivateli bˇeˇznˇe vyuˇz´ıvan´y dodateˇcn´y software jako internetov´y prohl´ıˇzeˇc, textov´y editor aj. Disponuj´ı rozs´ahl´ymi datab´azemi tohoto softwaru tzv. zdroji, jenˇz umoˇzˇnuj´ı jeho snadn´e z´ısk´av´an´ı napˇr´ıklad prostˇrednictv´ım Internetu.

1.2

adro operaˇ

cn´ıho syst´

emu

Operaˇcn´ı syst´em je sloˇzit´ym a komplexn´ım programem. Skl´ad´a se z mnoha komponent zajiˇst’uj´ıc´ıch r˚uzn´e ˇc´asti jeho funkcionality. Z´akladn´ı a zˇrejmˇe nejpodstatnˇejˇs´ı komponentou jej´adro. J´adro bˇeˇz´ı od zaveden´ı operaˇcn´ıho syst´emu aˇz po jeho ukonˇcen´ı. V jeho pamˇet’ov´em prostoru jsou uloˇzena veˇsker´a data, pomoc´ı kter´ych zajiˇst’uje j´adro z´akladn´ı funkce nutn´e pro plnˇen´ı v´yˇse uveden´ych rol´ı OS. Typick´ymi ˇcinnostmi kter´ymi se j´adro zab´yv´a jsou napˇr´ıklad spr´ava pˇreruˇsen´ı, proces˚u ˇci pamˇeti. Nad j´adrem jsou pot´e vystavˇeny dalˇs´ı kom-ponenty jako je okenn´ı manaˇzer, jenˇz poskytuje uˇzivatel˚um z´akladn´ı uˇzivatelsk´e rozhran´ı vykreslov´an´ım a rozm´ıstˇen´ım oken, spr´avce sezen´ıaj.

1.2.1 Typy jader

Dle pˇr´ıstupu k implementaci m˚uˇzeme j´adra rozdˇelit do tˇechto z´akladn´ıch skupin [4]:

• Mikroj´adro – Pouze z´akladn´ı funkcionalita je implementov´ana pˇr´ımo v j´adˇre tzv.

mikroj´adˇre. Ostatn´ı funkcionalita je delegov´ana do samostatn´ych proces˚u zvan´ych

servery, kter´e komunikuj´ı s j´adrem skrze striktnˇe definovan´e komunikaˇcn´ı rozhrann´ı (napˇr.: souborov´y syst´em, spr´avce pamˇeti, aj.). V´yhodou tohoto pˇr´ıstupu je snadn´a rozˇsiˇritelnost j´adra a moˇznost mˇenit, spouˇstˇet ˇci zastavovat jeho d˚uleˇzit´e komponenty za bˇehu syst´emu. Nev´yhodou tohoto pˇr´ıstupu je velmi ˇcast´a a n´aroˇcn´a komunikace

(11)

jednotliv´ych server˚u mezi sebou ˇci s j´adrem, pˇri kter´e mus´ı doch´azet k pˇrep´ın´an´ı kontextu.

• Monolytick´a j´adra – Veˇsker´a funcionalita vˇcetnˇe podsyst´em˚u je implementov´ana jako souˇc´ast j´adra. Kaˇzd´y podsyst´em m´a k dispozici pˇr´ıstup ke vˇsem ostatn´ım ˇc´astem j´adra. D´ıky tomu, ˇze cel´y k´od bˇeˇz´ı ve stejn´em adresov´em prostoru (v syst´emov´em reˇzimu), je ˇcinnost j´adra velmi efektivn´ı a pˇrep´ın´an´ı kontextu minim´aln´ı. Probl´emem tohoto pˇr´ıstupu m˚uˇze b´yt jeho niˇzˇs´ı bezpeˇcnost. Pˇri napaden´ı syst´emu staˇc´ı ´utoˇcn´ıkovi nabourat jeho libovolnou ˇc´ast a m˚uˇze t´ım z´ıskat pˇr´ıstup k cel´emu j´adru.

P˚uvodnˇe byl cel´y k´od j´adra obsaˇzen v jednom bal´ıˇcku. J´adro nemˇelo ˇz´adnou vnitˇrn´ı strukturu a veˇsker´a ˇcinnost prob´ıhala v jednom reˇzimu. Dokonce i uˇzivatelsk´e procesy byly spouˇstˇeny jako podprogramy j´adra. V literatuˇre je tento pˇr´ıstup uv´adˇen jako mo-nolytick´a j´adra typu monitor. V dneˇsn´ı dobˇe je vˇetˇsina monolytick´ych jader vytv´aˇrena smodul´arn´ı strukturou. Funkˇcnost j´adra je rozdˇelena do jednotliv´ych podsyst´em˚u tzv.

j´adrov´ych modul˚u, kter´e spolu ´uzce spolupracuj´ı. Tyto moduly bˇeˇz´ı v syst´emov´em reˇzimu, zat´ımco uˇzivatelsk´e procesy v reˇzimu uˇzivatelsk´em. Pro pˇrechod mezi reˇzimi je zavedeno striktn´ı rozhran´ı. Tento pˇr´ıstup pˇrin´aˇs´ı vyˇsˇs´ı bezpeˇcnost syst´emu a umoˇzˇnuje modifikaci j´adra za bˇehu zav´adˇen´ım jednotliv´ych modul˚u. Pˇr´ıkladem tohoto typu j´adra je Linux.

• Ostatn´ı – Existuj´ı i jin´e typy jader OS. Pˇr´ıkladem mohou b´yt napˇr´ıklad Hybridn´ı j´adra, jenˇz se snaˇz´ı zkombinovat dobr´e vlastnosti pˇredchoz´ıch variant,Exoj´adra jenˇz vˇetˇsinu funkcionality pˇresouvaj´ı do uˇzivatelsk´eho reˇzimu a poskytuj´ı jen velmi jedno-duch´e rozhrann´ı pro komunikaci s j´adrem aj. Hybridn´ıch jader vyuˇz´ıvaj´ı syst´emy jako

Mac OS X ˇci Windows NT [5].

1.2.2 J´adro Linux

Linux je j´adrem operaˇcn´ıho syst´emu GNU/Linux. Jde omonolytick´e j´adro s modul´arn´ı strukturou. Pˇri manu´aln´ı instalaci j´adra lze pˇri konfigurov´an´ı instalace nastavit jak´e moduly chceme nainstalovat, pˇr´ıpadnˇe jakou funkcionalitu chceme zav´est pˇr´ımo do j´adra a jakou

poskytnout skrze moduly (Loadable Kernel Module - LKM)[6]. Linux se vyvyj´ı pod GPL

licenc´ı3. Na jeho v´yvoji se pod´ıl´ı v´yvoj´aˇrsk´a komunita vˇcetnˇe Linuse Torvaldse jeho za-kladatele. Tato dalo by se ˇr´ıc´ı ˇcist´a j´adra se naz´yvaj´ıvanilla j´adra a jsou volnˇe k dispo-zici prostˇrednictn´ım Internetu. D´ale je pˇreb´ıraj´ı tv˚urci jednotliv´ych distribuc´ı, testuj´ı je, pˇr´ıpadnˇe upravuj´ı a zaˇrazuj´ı pot´e do sv´ych syst´em˚u.

R˚uzn´e distribuce vyuˇz´ıvaj´ı r˚uzn´e verze Linuxu. Aby byla zachov´ana pˇrehlednost jed-notliv´ych verz´ı, byl zaveden syst´em ˇc´ıslov´an´ı verz´ı j´adra (obr. 1.2). Majoritn´ı spolu s mino-ritn´ım ˇc´ıslem verze ud´avaj´ı s´erii j´adra. Ta se mˇen´ı vˇzdy aˇz pˇri razantn´ıch zmˇen´ach syst´emu. Ostatn´ı se mˇen´ı s vyd´av´an´ım r˚uzn´ych aktualizac´ı a z´aplat [6]. Nˇekter´e distribuce se snaˇz´ı vyuˇz´ıvat nov´ych trend˚u a instaluj´ı nov´e verze j´adra. Jin´e jsou sp´ıˇse ortodoxn´ı a drˇz´ı se starˇs´ıch stabiln´ıch a ovˇeˇren´ych verz´ı.

1.3

Urovnˇ

´

e opr´

avnˇ

en´ı

Linux disponuje dvˇemy ´urovnˇemi opr´avnˇen´ı [1, 5]:

3

V dobˇe psan´ı pr´ace byla vyv´ıjena pod GPLv2 licenc´ı. V´ıce na http://vanillaforums.org/docs/

(12)

2.6.32.1

Majoritní verze

Minoritní verze Revize

Stabilní verze

Obr´azek 1.2: ˇC´ıslov´an´ı verze j´adra Linuxu

• Uˇzivatelsk´y reˇzim(neprivilegovan´y reˇzim) – Je reˇzim v nˇemˇz bˇeˇz´ı uˇzivatelsk´e procesy. V tomto reˇzimu m´a proces k dispozici pouze uˇzivatelsk´y pamˇet’ov´y prostor

a disponuje pouze omezenou sadou instrukc´ı.

• Reˇzim j´adra(privilegovan´y ˇci syst´emov´y reˇzim)– V tomto reˇzimu je k dispozici cel´y pamˇet’ov´y prostor vˇcetnˇepamˇet’ov´eho prostoru j´adra a kompletn´ı instrukˇcn´ı sada. Bˇeˇz´ı v nˇem j´adro a jeho moduly.

Pokud se uˇzivatelsk´y proces pokus´ı pˇristoupit mimo sv˚uj pamˇet’ov´y prostor ˇci bude cht´ıt pouˇz´ıt instrukci nepovolenou v jeho reˇzimu, bude tento stav zachycen operaˇcn´ım syst´emem a ˇcinnost bude zak´azana. Uˇzivatelsk´e procesy ale velmi ˇcasto potˇrebuj´ı pr´avˇe takov´e operace prov´adˇet. Z tohoto d˚uvodu je umoˇznˇen pˇrechod mezi jednotliv´ymi reˇzimy. Tento pˇrechod je pˇr´ısnˇe monitorov´an a je prov´adˇen skrze striktn´ı komunikaˇcn´ı rozhran´ı. Tento pˇr´ıstup je z´akladn´ım bezpeˇcnostn´ım principem kter´y nejen stˇeˇzuje pr´aci potencion´aln´ım ´utoˇcn´ık˚um, ale tak´e chr´an´ı syst´em pˇred moˇzn´ymi dopady chybnˇe napsan´ych uˇzivatelsk´ych aplikac´ı.

Provádění uživatelského procesu Vyvolání systémového volání Návrat ze systémového volání Uživatelský prostor

Provedení systémového volání Prostor jádra U ži va te ls ký r ež im R ež im já dr a

Obr´azek 1.3: Pˇrechod mezi reˇzimy opr´avnˇen´ı

1.3.1 Pˇrechod mezi reˇzimy opr´avnˇen´ı

Pˇrechod mezi reˇzimy opr´avnˇen´ı je umoˇznˇen dvˇema zp˚usoby. Prvn´ı moˇznost´ı je vyuˇzit´ı rozhran´ı syst´emov´ych vol´an´ı. Kaˇzd´e syst´emov´e vol´an´ı m´a sv´e identifikaˇcn´ıˇc´ıslo a n´avratovou

(13)

hodnotu. Aplikace poˇzaduj´ıc´ı operaci k n´ıˇz bˇeˇznˇe nem´a opravnˇen´ı spust´ı syst´emov´e vol´an´ı. Dojde k pˇrechodu z uˇzivatelsk´eho reˇzimu do reˇzimu j´adra. V nˇem se provedou funkce j´adra jenˇz obslouˇz´ı dan´e vol´an´ı. Po dokonˇcen´ı tˇechto funkc´ı se vr´at´ı ˇr´ızen´ı uˇzivatelsk´e aplikaci do m´ısta spuˇstˇen´ı syst´emov´eho vol´an´ı a je navr´acena hodnota (obr. 1.3).

Aplikace vˇetˇsinou nespouˇst´ı syst´emov´a vol´an´ı pˇr´ımo, ale vyuˇz´ıvaj´ı k tomu knihovny. Pro vykon´an´ı dan´e operace vyuˇzij´ı knihovn´ı funkci. Ta v r´amci sv´eho bˇehu m˚uˇze vyvolat jedno ˇ

ci v´ıce syst´emov´ych vol´an´ı. Pˇrebere jejich hodnoty, kter´e m˚uˇze d´ale spracovat a v´ysledek navrac´ı uˇzivatelsk´e aplikaci. Tento princip usnadˇnuje psan´ı uˇzivatelsk´ych program˚u [6].

Posledn´ı moˇznost´ı jak vyvolat pˇrechod mezi reˇzimi je vyuˇzit´ı pˇreruˇsen´ı.Pˇreruˇsen´ıslouˇz´ı pˇredevˇs´ım pro komunikaci j´adra s hardwarem. Hardwarov´e zaˇr´ızen´ı vyvol´a elektrick´y sign´al. Ten pˇreruˇs´ı bˇeh procesoru a spust´ı obsluˇznou rutinu pro dan´e pˇreruˇsen´ı. Pˇri tomto pˇreruˇsen´ı doch´az´ı k z´aloze stavu syst´emu (registr˚u, z´asobn´ıku, atd.). Po dokonˇcen´ı pˇreruˇsen´ı je stav syst´emu obnoven a jeho bˇeh m˚uˇze pokraˇcovat d´ale.

Pˇreruˇsen´ı se mohou vyskytovat synchronnˇe ˇci asynchronnˇe.Softwarov´a pˇreruˇsen´ı(nˇekdy naz´yvan´evyj´ımky) vznikaj´ı synchronnˇe v procesoru jako n´asledek vykon´avan´e funkce (napˇr. dˇelen´ı nulou). Hardwarov´a pˇreruˇsen´ı(pˇreruˇsen´ı) vznikaj´ı asynchronnˇe a slouˇz´ı pˇredevˇs´ım pro komunikaci s periferiemi(disk, s´ıt’, atd.). Nˇekter´a pˇreruˇsen´ı lze po urˇcitou dobu za-maskovat a ignorovat jejich pˇr´ıjem. Jin´a jsou nemaskovateln´a a tato operace pro nˇe nen´ı povolena [7, 5].

Jednotliv´a komunikaˇcn´ı rozhrann´ı jsou zobrazena na obr. 1.4.

G N U /L in ux U živ ate ls ký p ro sto r P ro sto r já dr a Uživatelské aplikace

GNU C knihovna (glibc)

Rozhraní systémových volání

Jádro

Rozhraní pro obsluhu výjimek a přerušení

Hardware

Obr´azek 1.4: J´adro Linux jeho rozhran´ı a reˇzimy

Za bˇehu Linuxu se tedy kaˇzd´y procesor nach´az´ı v jednom z tˇechto tˇr´ı stav˚u [6]:

• V uˇzivatelsk´em reˇzimu vykon´av´a k´od uˇzivatelsk´eho procesu.

• V reˇzimu j´adra vykon´av´a k´od j´adra ve prosbˇech bˇeˇz´ıc´ıho procesu. Po spuˇstˇen´ı syst´ emo-v´eho vol´an´ı a pˇrechodu do reˇzimu j´adra.

(14)

• V reˇzimu j´adra pˇri obsluze pˇreruˇsen´ı. Zde nen´ı spˇraˇzen s ˇz´adn´ym uˇzivatelsk´ym pro-cesem.

1.4

Implementace syst´

emov´

ych vol´

an´ı

V Linuxu jsou syst´emov´a vol´an´ı realizovan´a jako softwarov´e pˇreruˇsen´ı s identifikaˇcn´ım ˇ

c´ıslem 126 (0x80 hexa). Pˇri prov´adˇen´ı syst´emov´ych vol´an´ı se d˚uleˇzit´a data pˇred´avaj´ı po-moc´ı registr˚u. D˚uvodem je rychlost a tak´e jednoduchost pˇr´ıstupu. Cel´y proces vykon´an´ı syst´emov´eho vol´an´ı je spuˇstˇen, kdyˇz aplikace ˇci knihovna uloˇz´ı do registrueaxidentifik´ator syst´emov´eho vol´an´ı a vyvol´a pˇreruˇsen´ı pˇr´ıkazem int $0x80. V tabulce pˇreruˇsen´ı se na-lezne obsuha pˇreruˇsen´ısystem call (nalezne se odkaz na ni) a zaˇcne se prov´adˇet jej´ı k´od. Nejdˇr´ıve se uloˇz´ı hodnota vˇsech registr˚u, ˇc´ımˇz se uchov´a stav syst´emu v dobˇe pˇreruˇsen´ı aplikace (tzv. kontext). Z registru eaxse pˇreˇcte ˇc´ıslo syst´emov´eho vol´an´ı, otestuje se jeho platnost a vtabulce syst´emov´ych vol´an´ıse zjist´ı odkaz na syst´emovou funkci. Dojde k jej´ımu vyvol´an´ı, pˇri nˇemˇz jsou parametry pˇred´av´any v registrechebx, ecx, edx, esi, edi. Po skonˇcen´ı uloˇz´ı syst´emov´a funkce n´avratovou hodnotu do registrueaxa vr´at´ı ˇr´ızen´ı obsluˇzn´e rutinˇe. Ta obnov´ı kontext syst´emu a vr´at´ı ˇr´ızen´ı aplikaci. Celou ˇcinnost zn´azorˇnuje obr. 1.5.

Aplikace nebo knihovna

Obsluha přerušení pro system_call

(id volání v reg. eax)

0x80 system_call … 0x01 debug 0x00 divide_error Tabulka přerušení ... 2 sys_fork 1 sys_exit 0 sys_restart_syscall Tabulka systémových volání

int 0x80

Systémová funkce

Parametry v reg.: ebx, ecx, edx, esi, edi

Vrací hodnotu v reg.: eax

idtr sys_call_table

(symbol)

Registr

(15)

Kapitola 2

Reprezentace a spr´

ava prostˇ

redk˚

u

C´ılem t´eto kapitoly je obezn´amit ˇct´en´aˇre se z´akladn´ımi principy reprezentace a spr´avy prostˇredk˚u v prostˇred´ı operaˇcn´ıch syst´em˚u GNU/Linux. Budou zde vysvˇetleny z´akladn´ı principy, na kter´ych stav´ı ostatn´ı kapitoly t´eto pr´ace. Tyto informace jsou nezbytn´e pˇri tvorbˇe rootkit˚u a jejich detektor˚u.

2.1

Reprezentace a spr´

ava proces˚

u

Tato kapitola pop´ıˇse zp˚usob jak´ym jsou reprezentov´any a spravov´any procesy uvnitˇr j´adra operaˇcn´ıho syst´emu. Budou zde pops´any i z´akladn´ı pojmy z t´eto oblasti.

2.1.1 Z´akladn´ı pojmy

Nejdˇr´ıve se sezn´am´ıme se z´akladn´ımi pojmy souvisej´ıc´ımi se spr´avou proces˚u. S po-jmemprogram jsme se jiˇz setkali v pˇredchoz´ı kapitole 1.1. Program je posloupnost instrukc´ı uloˇzen´a v takov´e formˇe, kter´e je schopen rozumˇet poˇc´ıtaˇc. Aby mohl takov´y program bˇeˇzet, mus´ı b´yt jeho k´od um´ıstˇen v operaˇcn´ı pamˇeti poˇc´ıtaˇce.

Proces je v podstatˇe bˇeˇz´ıc´ı program a s n´ım souvisej´ıc´ı dynamick´e datov´e struktury uloˇzen´e v pamˇet’ov´em prostoru j´adra. Neplat´ı, ˇze by se k jednomu programu musel v´azat vˇzdy jeden proces. Ve skuteˇcnosti m˚uˇze bˇeˇzet v´ıce proces˚u vykon´avaj´ıc´ıch jeden a ten stejn´y program (napˇr. v´ıcekr´at spust´ıme stejn´y textov´y editor). Program tak´e m˚uˇze pˇri sv´em bˇehu vyuˇz´ıvat v´ıce proces˚u, ˇcehoˇz se ˇcasto vyuˇz´ıv´a, pokud program potˇrebuje vykonat v´ıce ˇ

cinnost´ı souˇcastnˇe1.

Bˇeˇzn´e procesy vyuˇz´ıvaj´ı za sv´eho bˇehu jedno vl´akno ˇr´ızen´ı. Jde o tzv. jednovl´aknov´e procesy. S kaˇzd´ym procesem souvis´ı zdroje jako napˇr. k´od uloˇzen´y v pamˇeti, glob´aln´ı data, otevˇren´e soubory, z´asobn´ık a registry. Pokud chce program souˇcasnˇe prov´edˇet v´ıce ˇ

c´ınnost´ı, mus´ı vytvoˇrit v´ıce jednovl´aknov´ych proces˚u. Modern´ı operaˇcn´ı syst´emy dispo-nuj´ı prostˇredky pro poskytov´an´ı tzv. v´ıcevl´aknov´ych proces˚u. Takov´e procesy obsahuj´ı v´ıce vl´aken pro ˇr´ızen´ı sv´eho chodu. Kaˇzd´e vl´akno bˇeˇz´ı samostatnˇe2, obsahuje sv˚uj vlastn´ı z´asobn´ık ˇ

ci sadu registr˚u. Sd´ıl´y ale stejn´y k´od a nˇekter´e zdroje (napˇr. glob´aln´ı data ˇci otevˇren´e sou-bory), coˇz jim umoˇzˇnuje mezi sebou velmi rychle komunikovat. D´ıky sd´ılen´ı prostˇredk˚u se

1r´ıkladem m˚ze b´yt server. Jeden proces naslouch´a na urˇcit´em portu a pro obsluhu kaˇzd´eho pˇripojen´ı

vytvoˇr´ı nov´y proces. M˚uˇze tedy souˇcasnˇe obsluhovat v´ıce poˇzadavk˚u i ˇcekat na nov´a pˇripojen´ı.

(16)

Vlákno Zásobník Registry Data Kód Soubory Proces s jedním vláknem Vlákno Registry Data Kód Soubory Zásobník Zásobník Zásobník Registry Registry Proces s více vlákny

Obr´azek 2.1: Deskriptor procesu a seznam task list

s vl´akny efektivnˇe manipuluje a ˇsetˇr´ı se pamˇet’ poˇc´ıtaˇce. Proto jsou nˇekdy naz´yv´ana od-lehˇcen´e procesy. Linux je implementuje a zach´az´ı s nimi stejnˇe jako s procesy. Rozd´ıl mezi procesy s jedn´ım a v´ıce vl´akny je zobrazen na obr. 2.1 [1].

2.1.2 Reprezentace proces˚u

Z´akladn´ı datovou strukturou kaˇzdˇeho procesu jestruct task struct, kter´a uchov´av´a vˇsechny potˇrebn´e informace o dan´em procesu. Tato struktura je naz´yv´ana deskriptor pro-cesu. Popisovaˇce vˇsech proces˚u j´adro sdruˇzuje v obousmˇernˇe v´azan´em seznamu zvan´em

task list. Tyto z´akladn´ı struktury a jejich vztah lze vidˇet na obr. 2.2. Popisovaˇc procesu je pomˇernˇe rozs´ahlou strukturou obsahuj´ıc´ı velk´e mnoˇzstv´ı informac´ı jako napˇr´ıklad [4]:

• Z´akladn´ı informace nutn´e pro bˇeh procesu.PID, sign´aly ˇcekaj´ıc´ı na obsluhu, odkazy na rodiˇce, priority procesu, jeho stav apod.

• Informace o alokovan´e virtu´aln´ı pamˇeti a uˇz´ıvan´e soubory (soubor s bin´arn´ım k´odem, informace souborov´eho syst´emu uˇz´ıvan´ych soubor˚u).

• Data potˇrebn´a pro pl´anov´an´ı. Tˇr´ıdu pl´anovaˇce a sched entity(viz kapitola 2.1.4), r˚uzn´e statistiky atd.

• Opr´avnˇen´ı souboru, identifikaˇcn´ı ˇc´ısla uˇzivatele a skupiny.

• Informace o vl´aknech uˇz´ıvan´ych procesem, data potˇrebn´a pro spolupr´aci s dalˇs´ımi procesy aj.

Mnoho z tˇechto poloˇzek nen´ı pˇr´ımo souˇc´ast´ıtask struct, ale jsou uchov´any v dalˇs´ıch struktur´ach prov´azan´ych pomoc´ı odkaz˚u.

V dˇr´ıvˇejˇs´ıch verz´ıch Linuxu (pro architektury x86) byla strukturatask structuloˇzena vˇzdy na koncij´adrov´eho z´asobn´ıku kaˇzd´eho procesu. V dneˇsn´ı dobˇe se na tomto m´ıstˇe m´ısto n´ı ukl´ad´a struktura struct thread info, jenˇz pot´e natask structodkazuje. Pˇri progra-mov´an´ı modul˚u j´adra m´ame k dispozici vˇzdy pˇr´ıstup k poloˇzce thread info aktu´aln´ıho

(17)

task_struct 1 task_struct 2 task_struct 3 task_struct n

task_struct

unsigned long state; int prio;

unsigned long policy; struct task_struct *parent; pid_t pid;

...

task list

Obsahuje

Deskriptor procesu

Obr´azek 2.2: Deskriptor procesu a seznam task list

procesu skrze funkci current thread info(). Pokud chceme z´ıskat deskriptor aktu´aln´ıho

procesu, je to moˇzn´e skrze pˇr´ıkaz current threat info()->task. Protoˇze je tato operace ˇ

casto vyuˇz´ıv´ana, existuje pro ni makro current. Uk´azka popisovan´ych poloˇzek a z´ısk´an´ı pˇr´ıstupu k nim je zn´azornˇena na obr. 2.3 [6].

2.1.3 Zivotn´ı cyklus procesuˇ

Tvorba nov´ych proces˚u v Linuxu prob´ıh´a ve dvou kroc´ıch [6, 4]:

init

cron

terminal firefox

csh bash

Obr´azek 2.4: Hiearchie proces˚u.

1. Vytvoˇren´ı identick´e kopie aktu´aln´ıho procesu – Je prov´adˇeno pomoc´ı vol´an´ı funkce

fork(). Tato funkce alokuje potˇrebn´e da-tov´e struktury jako j´adrov´y z´asobn´ık procesu,

task struct a threat info. Jejich hodnoty

nastav´ı identicky k aktu´aln´ımu procesu.

Na-stav´ı se ´udaje, jenˇz mus´ı b´yt jedineˇcn´e pro kaˇzd´y proces jako pid. Duplikuj´ı ˇci sd´ıl´y se

zdroje (jako napˇr. adresov´y prostor procesu,

sd´ılen´e otevˇren´e soubory, informace soubo-rov´eho syst´emu apod.). Vl´akna tyto zdroje ty-picky sd´ıl´y, jinak jsou vˇetˇsinou poˇr´ızeny kopie (viz copy-on-write d´ale v kapitole). Nakonec je proces spuˇstˇen.

2. Nahr´an´ı nov´eho k´odu a jeho spuˇstˇen´ı – Nov´y proces vol´a funkci exec(), ˇc´ımˇz do sv´eho pamˇet’ov´eho prostoru nahraje nov´y k´od a spust´ı jeho prov´adˇen´ı.

(18)

Nejvyšší adresa Ukazatel zásobníku (stack pointer) Začátek zásobníku thread_struct S m ěr stu z ás ob ník u Nejnižší adresa

Jádrový zásobník každého procesu

thread_info

struct task_struct *task; __u32 flags; __u32 status; ... Obsahuje Odkazuje task_struct ... current_thread_info(); Získáme current_thread_infor()->task; Získáme current; Získáme

Obr´azek 2.3: Z´akladn´ı struktury proces˚u a z´ısk´an´ı pˇr´ıstupu k nim.

Jak jde vidˇet, nov´y proces vznik´a vˇzdy z jin´eho, jiˇz bˇeˇz´ıc´ıho procesu. T´ım vznik´a stro-mov´a hiearchie rodiˇc–potomek, jenˇz je zobrazena na obr. 2.4. Proces, kter´y vytvoˇril nov´y proces, je naz´yv´anrodiˇc. Novˇe vznikl´y procespotomek. Procesy vznikl´e ze stejn´eho procesu jsou zv´any sourozenci. Na vrcholu hiearchie stoj´ı proces init, jenˇz je spuˇstˇen jiˇz bˇehem zav´adˇen´ı operaˇcn´ıho syst´emu [4].

Tradiˇcnˇe jsou po vol´an´ı fork() vˇsechny zdroje rodiˇce duplikov´any a jejich kopie je pˇred´ana potomkovi. ˇCasto je po t´eto operaci okamˇzitˇe vol´an exec(). V takov´em pˇr´ıpadˇe doch´az´ı ke zbyteˇcn´e kopii dat rodiˇce, kter´e jsou ihned pˇreps´any. Tento probl´em se ˇreˇs´ı

pomoc´ı pˇr´ıstup copy-on-write. Data nejsou potomkovi kop´ırov´ana, ale pouze nazd´ılena v

reˇzimu pro ˇcten´ı. Ke kopii doch´az´ı aˇz tehdy, kdyˇz potomek zaˇsle pˇr´ıkaz pro z´apis do je-jich oblasti. Pokud je tedy okamˇzitˇe po fork() vol´an exec(), nedoch´az´ı ke zbyteˇcn´emu kop´ırov´an´ı dat, ale jsou ihned nahr´ana nov´a. T´eto technologii nepodl´eh´a tabulka str´anek a deskriptor procesu, kter´y je duplikov´an vˇzdy [6].

Za sv´eho ˇzivota proces proch´az´ı r˚uzn´ymi stavy zn´azornˇen´ymi na obr. 2.5 [6]:

• RUNNING – Proces je spuˇstˇen a bˇeˇz´ı, nebo ˇcek´a ve frontˇe, neˇz mu bude pˇridˇelen procesor.

• INTERRUPTIBLE– Proces je usp´an a ˇcek´a na v´yskyt urˇcit´e ud´alosti ˇci na pˇr´ıjem sign´alu.

• UNINTERRUPTIBLE– Proces je usp´an a probud´ı se pouze pˇri v´yskytu specifick´e ud´alosti (sign´al jej neprobud´ı).

Proces je ukonˇcen zavol´an´ım syst´emov´eho vol´an´ıexit(), pˇrijet´ım sign´alu ˇci vyj´ımky, jenˇz nelze obslouˇzit ˇci ignorovat. Nastav´ı se do zvl´aˇstn´ıho stavu ZOMBIE, v nˇemˇz ˇcek´a,

(19)

RUNNING (připravený ale ještě neběží) RUNNING (běžící) INTERRUPTABLE nebo UNINTERRUPTIBLE (čekající) Vytvoření

nového procesu Proces je zrušen

fork() schedule() nebo context_switch() schedule() (přepnut kvůli procesu s vyšší prioritou) do_exit()

Proces je uspán a čeká na specifickou událost Nastala událost

a proces je probuzen

Obr´azek 2.5: Stavy procesu.

neˇz rodiˇc pˇrijme jeho n´avratov´y k´od. Pokud je rodiˇc ukonˇcen dˇr´ıv neˇz potomek, je nov´ym rodiˇcem automaticky procesinit. Potom jsou odstranˇeny vˇsechny nesd´ılen´e datov´e poloˇzky a uvolnˇeno pid procesu [6].

2.1.4 Pl´anov´an´ı proces˚u

Aby mohl proces vykon´avat sv˚uj k´od, mus´ı mu b´yt pˇridˇelen procesor. V dneˇsn´ıch syst´emech je ˇcast´e, ˇze bˇeˇz´ı v´ıce proces˚u souˇcasnˇe. Tomuto principu se ˇr´ık´a multitasking. Procesy ˇci vl´akna se mus´ı o procesor dˇelit neboli mus´ı sd´ılet ˇcas procesoru. Odebr´an´ı pro-cesoru jednomu procesu a pˇridˇelen´ı druh´emu se naz´yv´a pˇrepnut´ı kontextu. Tuto ˇcinnost ˇr´ıd´ıpl´anovaˇc na z´akladˇe sv´ehopl´anovac´ıho algoritmu. Pl´anovaˇc zach´az´ı s procesy a vl´akny stejn´ym zp˚usobem. Proto se nˇekdy souhrnˇe naz´yvaj´ı term´ınem´uloha 3.

Z hlediska zp˚usobu, jak´ym je soubˇeˇzn´eho prov´adˇen´ı ´uloh dosaˇzeno, dˇel´ıme multitasking do dvou skupin [6]:

• Kooperativn´ı multitasking– Procesu nen´ı odebr´an procesor dokud se k tomu s´am nerozhodne. ˇCinnosti, kdy se proces s´am vzd´a procesoru se ˇr´ık´a yielding. V dneˇsn´ı dobˇe se t´emˇeˇr nepouˇz´ıv´a. Vyuˇz´ıvali jej dˇr´ıvˇejˇs´ı verze Windows ˇci Mac OS.

• Preemptivn´ı multitasking – Pl´anovaˇc rozhoduje, kdy bude procesu odebr´an pro-cesor. Aktu nedobrovoln´eho odebr´an´ı procesoru a pˇriˇrazen´ı jej nov´emu procesu se ˇr´ık´a preempce. Doba po kter´e dojde k preempci se naz´yv´a timeslice. Tohoto pˇr´ıstupu vyuˇz´ıv´a Linux i vˇetˇsina modern´ıch operaˇcn´ıch syst´em˚u.

Pro kaˇzd´y proces je v´yhodn´y jin´y zp˚usob pˇridˇelov´an´ı procesoru. Proto se procesy ˇcasto rozdˇeluj´ı do n´asleduj´ıc´ıch kategori´ı [7].

3

Pro popis pl´anov´an´ı budu v t´eto kapitole vyuˇz´ıvat sp´ıˇse pojmu proces, kter´y bude ve skuteˇcnosti

(20)

• I/O-bound – Tr´av´ı spoustu ˇcasu ˇcek´an´ım na dokonˇcen´ı vstupnˇe/v´ystupn´ı operace (napˇr. stisk kl´avesy uˇzivatelem). Pokud by jim byl pˇridˇelov´an procesor pˇr´ıliˇs ˇcasto, tr´avil by spoustu sv´eho ˇcasu ˇcek´an´ım. Na druhou stranu je u tˇechto proces˚u potˇreba okamˇzit´e interakce. Pˇr´ıkladem m˚uˇze b´yt textov´y editor.

• CPU-bound (processor-bound) – Prov´ad´ı sloˇzit´e algoritmy a v´ypoˇcty na kter´e potˇrebuj´ı spoustu ˇcasu procesoru (napˇr. dekod´er videa).

Nejedn´a se vˇsak o pˇr´ıliˇs striktn´ı zp˚usob dˇelen´ı. Mnoh´e procesy projevuj´ı chov´an´ı z obou dvou skupin souˇcasnˇe nebo v urˇcit´ych ˇc´astech sv´eho bˇehu se chovaj´ı jako I/O-bound a v jin´ych jako CPU-bound. Tento zp˚usob dˇelen´ı poukazuje sp´ıˇse na kriteria, kter´e mus´ı b´yt v pl´anovac´ım algoritmu zohlednˇena.

Nejjednoduˇzˇs´ı principy pl´anovac´ıch algoritm˚u jsou zaloˇzeny na udˇelov´an´ı priorit pro-ces˚um. Proces s vyˇsˇs´ı prioritou dost´av´a pˇrednost pˇred procesy s niˇzˇs´ı prioritou. Procesy mohou b´yt vyb´ır´any na z´akladˇe dvou pl´anovac´ıch algoritm˚u:

• FCFS(First Come, First Serve)– Procesy se ˇrad´ı veFIFO front´ach4. Pˇri spuˇstˇen´ı se procesy ˇrad´ı na konec fronty. Pˇri pˇrep´ın´an´ı kontextu je spuˇstˇen proces ze zaˇc´atku fronty. Tento proces bˇeˇz´ı dokud se s´am nevzd´a procesoru nebo dokud nezaˇcnˇe ˇcekat na ud´alost.

• Round-robin – Princip je podobn´y FCFS, akor´at je jeˇstˇe vyuˇz´ıv´an timeslace. Po jeho uplynut´ı tedy dojde k preempci.

Pˇri realizov´an´ı priorit dost´avaj´ı procesy s vyˇsˇs´ı prioritou ve front´ach pˇrednost pˇred procesy s niˇzˇs´ı prioritou. Druhou a ˇcastˇejˇs´ı moˇznost´ı je vyuˇz´ıv´an´ı pol´ı front. Kaˇzd´a fronta m´a jinou prioritu, kter´a odpov´ıd´a priorit´am proces˚u, kter´e se do n´ı chtˇej´ı zaˇradit. Pl´anovaˇc proch´az´ı fronty dle jejich priorit a zastav´ı se u prvn´ı zaplnˇen´e fronty.

Linux vyuˇz´ıv´a dvou typ˚u priorit.Bˇeˇzn´e procesyvyuˇz´ıvaj´ı hodnotynice, kter´a je z rosahu od -20 do 19. ˇC´ım niˇzˇs´ı hodnota nice t´ım vyˇsˇs´ı je priorita procesu. Druh´ym typem je

real-time priorita, jenˇz vyuˇz´ıv´a rozsahu od 0 do 99 kde vyˇsˇs´ı hodnotˇe odpov´ıd´a vyˇsˇs´ı priorita procesu. Procesy jenˇz tento typ priorit vyuˇz´ıvaj´ı se naz´yvaj´ıreal-time procesy5 a vˇsechny maj´ı automaticky vyˇsˇs´ı prioritu neˇz bˇeˇzn´e procesy [6].

Od verze Linuxu 2.6.32 byl do j´adra zaˇrazen pl´anovaˇcCFS (Completely Fair Scheduler). Ten odstranil pole front a m´ısto nich ukl´ad´a procesy do strukturyred-black tree(rbtree). Jde o vyv´aˇzen´y bin´arn´ı strom, kter´y ukl´ad´a sv´e uzly na z´akladˇe hodnoty kl´ıˇce. Kl´ıˇcem je hod-nota vruntime(Virtual Runtime). Ta se poˇc´ıt´a na z´akladˇe doby bˇehu dan´eho procesu vyv´aˇzenou poˇctem bˇeˇz´ıc´ıch proces˚u. Jakmile m´a doj´ıt k pˇrepnut´ı kontextu, pˇriˇrad´ı se pro-cesor procesu s nejniˇzˇs´ı hodnotou vruntime, coˇz je nejlevˇejˇs´ı uzel stromu. Jak lze vidˇet,

CFS nevyuˇz´ıv´a pˇr´ımo priorit. Priority ovlivˇnuj´ı n´ar˚ust hodnotyvruntime. Procesy s v´yˇsˇs´ı prioritou zvyˇsuj´ıvruntime pomaleji, s niˇzˇs´ı prioritou ˇcastˇeji [6].

Pl´anovaˇc v Linuxu jemodul´arn´ıˇcehoˇz je dosahov´ano na z´akladˇetˇr´ıd pl´anovaˇc˚u. Kaˇzd´a tˇr´ıda pl´anovaˇce vyuˇz´ıv´a jin´eho algoritmu pl´anov´an´ı a m´a jinou prioritu. Hlavn´ı pl´anovaˇc

4

FIFO(First In First Out) – Procesy jsou ˇrazeny ve frontˇe v poˇrad´ı, v jak´em do n´ı vstupuj´ı. Z jednoho

konce do fronty vstupuj´ı, z druh´eho konce jsou vyb´ır´any

5

Real-time procesy nejsou bˇeˇznˇe pˇr´ıliˇs vyuˇz´ıv´any. Vyuˇz´ıv´a se jich sp´ıˇse ve vestavˇen´ych syst´emech, robotice

(21)

iteruje nad vˇsemi tˇr´ıdami pl´anovaˇc˚u v poˇrad´ı dle jejich priorit. Prvn´ı tˇr´ıda, jenˇz m´a proces pˇripraven´y k bˇehu je spuˇstˇena. CFS napˇr´ıklad obsluhuje bˇeˇzn´e procesy. Real-time procesy jsou obvykle obsluhov´any tˇr´ıdami pl´anovaˇc˚u pracuj´ıc´ıch na principu algoritm˚u FCFS ˇci

round-robin, jenˇz maj´ı vyˇsˇs´ı prioritu [6].

2.2

Reprezentace a spr´

ava soubor˚

u

V t´eto ˇc´asti pr´ace budou vysvˇetleny pojmy z oblasti reprezentace a spr´avy soubor˚u. Zvl´aˇstn´ı pozornost bude vˇenov´ana virtu´aln´ımu souborov´emu syst´emu.

2.2.1 Z´akladn´ı pojmy

Za bˇehu m˚uˇze aplikace uchov´avat data ve sv´em pamˇet’ov´em prostoru. Velikost tohoto prostoru je vˇsak znaˇcnˇe omezen´a. Nav´ıc po ukonˇcen´ı aplikace jsou data ztracena. Tyto probl´emy jsou ˇreˇseny pomoc´ı souborov´eho syst´emu.Soubor´y syst´emumoˇzˇnuje permanentn´ı uchov´an´ı dat na disku ˇci jin´em m´ediu. Soubor je nejmenˇs´ı jednotkou, jenˇz m˚uˇze b´yt na tˇechto nosiˇc´ıch uloˇzena. V dneˇsn´ı dobˇe je na disk bˇeˇznˇe ukl´ad´ano velk´e mnoˇzstv´ı soubor˚u. Aby se mezi nimi zachoval pˇrehled, byl zaveden syst´em adres´aˇr˚u.Adres´aˇr (sloˇzka) je entita, kter´a umoˇzˇnuje uchov´avat jednotliv´e soubory nebo jin´e adres´aˇre. T´ım vznik´a hiearchie adres´aˇr˚u a soubor˚u zn´azornˇena na obr. 2.6 [2].Souborov´y syst´emseskupuje vˇsechny soubory a adres´aˇre. Umoˇzˇnuje jejich vytv´aˇren´ı, maz´an´ı, modifikaci a jin´e operace.

/ bin home dev pepa radek soubor.txt Kořenový adresář Cesta k souboru: /home/radek/soubor.txt

Obr´azek 2.6: Hiearchie soubor˚u a cesta k souboru.

V Linuxu je adres´aˇr implementov´an jako speci´aln´ı typ souboru. Koˇrenem stromov´e hiearchie je speci´aln´ı adres´aˇr

”/“. Kaˇzd´y adres´aˇr lze identifikovat na z´akladˇe cesty. Ta odpov´ıd´a cestˇe od koˇrenov´eho adres´aˇre k c´ılov´emu adres´aˇri ˇci souboru. Jednotliv´e uzly jsou

oddˇeleny znakem

”/“ (viz obr. 2.6).

2.2.2 Virtu´aln´ı souborov´y syst´em

Virtu´aln´ı souborov´y syst´em (Virtual Filesystem – VFS) je podsyst´emem j´adra, kter´y tvoˇr´ı mezivrstvu mezi uˇzivatelsk´ymi procesy a implementac´ı souborov´eho syst´emu (obr. 2.7). Poskytuje jednotn´e rozhran´ı syst´emov´ych vol´an´ı, pomoc´ı kter´ych mohou tyto procesy ko-munikovat s r˚uzn´ymi typy souborov´ych syst´em˚u uloˇzen´ych na r˚uzn´ych medi´ıch [4].

(22)

Aplikace Aplikace Aplikace

Standardní knihovna (libc)

Virtuální souborový systém (VFS)

Uživatelský prostor Prostor jádra Rozhranní systémových volání

Ext3 Reiserfs Ext2

Obr´azek 2.7: Pozice virtu´aln´ıho souborov´eho syst´emu.

Souborov´e syst´emy m˚uˇzeme rozdˇelit do dvou z´akladn´ıch skupin [4]:

• Diskov´e – Klasick´e souborov´e syst´emy uloˇzen´e na pevn´ych disc´ıch poˇc´ıtaˇce ˇci na r˚uzn´ych pˇrenosn´ych medi´ıch (CD, DVD, flash disk, aj.). Pˇr´ıkladem jsou souborov´e

syst´emyNTFS, ext4, FAT32, ISO 9660 aj.

• S´ıt’ov´e– Umoˇzˇnuj´ı pˇr´ıstup k dat˚um uloˇzen´ych na jin´em zaˇr´ızen´ı skrze poˇc´ıtaˇcovou s´ıt’. Patˇr´ı mezi nˇe NFS, SMB a dalˇs´ı.

• Speci´aln´ı – Virtu´aln´ı syst´emy, vytvoˇren´e v j´adˇre, kter´e poskytuj´ı jednoduch´e ko-munikaˇcn´ı rozhran´ı aplikac´ım ˇci uˇzivatel˚um. Do t´eto skupiny patˇr´ı napˇr. sysfs ˇci

procfs.

2.2.3 Reprezentace VFS

VFS je implementov´an pomoc´ı objektovˇe orientovan´eho pˇr´ıstupu. Jednotliv´e objekty jsou reprezentov´any pomoc´ı dvou z´akladn´ıch struktur. Prvn´ı uchov´av´a ˇclensk´a data ob-jektu. Jeho metody jsou uloˇzen´e ve zvl´aˇstn´ı struktuˇre, na kterou datov´a struktura odka-zuje. Struktura s metodami je naz´yv´anatabulka operac´ıa obsahuje ukazatele na jednotliv´e funkce (viz obr. 2.8).

file

struct file_operations *f_op;

...

file_operations

int(*open) (struct inode *, struct file *); ssize_t (*read) (...);

size_t (*write) (...);

...

int open (struct inode *i, struct file *f) {

... }

(23)

VFS tvoˇr´ı n´asleduj´ıc´ı z´akladn´ı sada objekt˚u [6]:

• Superblock– Reprezentuje konkr´etn´ı souborov´y syst´em. Odpov´ıd´a superbloku sou-borov´eho syst´emu (kontroln´ımu bloku), kter´y b´yv´a uchov´an na speci´aln´ım sektoru disku. Pro jin´e neˇz diskov´e souborov´e syst´emy (napˇr. speci´aln´ı souborov´e syst´emy -procfs) je superblok generov´an a uloˇzen v pamˇeti. Realizuje jej strukturasuper block. Uchov´av´a informace jako napˇr. typ souborov´eho syst´emu, pˇr´ıpojn´y bod, maxim´aln´ı

velikost souboru, bezpeˇcnostn´ı informace aj. Jeho tabulka operac´ısuper operations

poskytuje funkce pro pˇripojen´ı ˇci odpojen´ı souborov´eho syst´emu, jeho zmrazen´ı ˇci jin´e. Objekt vznik´a pˇri pˇripojen´ı souborov´eho syst´emu a zanik´a pˇri jeho odpojen´ı.

• Inode– Obsahuje veˇsker´e metainformace, kter´e j´adro potˇrebuje k manipulaci se sou-borem. Unixov´e souborov´e syst´emy oddˇeluj´ı soubory a jejich metainformace, kter´e ukl´ad´a jakoinody (iuzly) na disku. Jin´e souborov´e syst´emy uchov´avaj´ı tyto informace jako souˇc´ast souboru ˇci ve speci´aln´ı datab´azi na disku. Objekt reprezentuje struk-tura inode. Obsahuje informace jako jsou id vlastn´ıka souboru a skupiny, velikost souboru, ˇcasov´e ´udaje (doba pˇr´ıstupu, posledn´ı zmˇeny) aj. Skrze tabulku operac´ı

inode operations poskytuje funkce k vytv´aˇren´ı a ruˇsen´ı pevn´ych ˇci symbolick´ych odkaz˚u, umoˇzˇnuje pracovat s adres´aˇri nebo mˇenit opr´avnˇen´ı pˇr´ısluˇsn´eho souboru a mnoho dalˇs´ıch. Ke kaˇzd´emu souboru, s n´ımˇz se pracuje, je v´az´an pr´avˇe jeden objekt inode.

• File– Reprezentuje soubor otevˇren´y procesem. Jeden fyzick´y soubor m˚uˇze b´yt otevˇren v´ıce procesy. V takov´em pˇr´ıpadˇe vznik´a s kaˇzd´ym otevˇren´ım nov´y objekt file. Po

uzavˇren´ı souboru objekt zanik´a. Objekt reprezentuje struktura file. Obsahuje

in-formace o aktu´aln´ı pozici v souboru, reˇzimu otevˇren´ı, opr´avnˇen´ı aj. Tabulka operac´ı

file operations obsahuje vˇetˇsinu zn´am´ych funkc´ı jako otevˇren´ı a zavˇren´ı souboru, ˇcten´ı, z´apis, nastaven´ı pozice v souboru aj.

• Dentry – N´azev je zkratkou pojmu Directory Entry Cache (mezipamˇet’ poloˇzek ad-res´aˇre). Objekt kontroluje, zda je cesta validn´ı a proch´az´ı jej´ı jednotliv´e poloˇzky. Umoˇzˇnuje na z´akladˇe t´eto cesty vyhledat pˇr´ısluˇsn´y objekt inode. Tato vyhled´av´an´ı si uchov´av´a v mezipamˇeti pro pozdˇejˇs´ı vyuˇzit´ı. Objekt je reprezentov´an skrze strukturu

dentrya tabulku operac´ıdentry operations. Vznik´a jakmile je potˇreba vyhodnotit cestu, kter´a prozat´ım nen´ı v mezipamˇeti uloˇzena.

Objekt dentry jako jedin´y nesouvis´ı s konkr´etn´ımi daty uloˇzen´ymi na disku. Superblok, iuzly ˇci soubory jsou vˇzdy uloˇzeny permanentnˇe na disku, ale jim odpov´ıdaj´ıc´ı objekty se vytv´aˇr´ı v pamˇeti poˇc´ıtaˇce aˇz za uveden´ych situac´ı. Pro kaˇzd´y soubor, s n´ımˇz pracuje r˚uzn´y poˇcet proces˚u, je vytvoˇren vˇzdy jen jeden objekt inode. Narozd´ıl od objektu file, kter´y se vytvoˇr´ı s kaˇzd´ym otevˇren´ım souboru nov´y.

V´yˇse popsan´e objekty nejsou jedin´e, kter´e j´adro potˇrebuje pˇri pr´aci s VFS. Pro uloˇzen´ı informac´ı o moˇznostech a schopnostech konkr´etn´ıho souborov´eho syst´emu (napˇr. ext4 nebo UDE) vyuˇz´ıv´a strukturu file system type. Pro kaˇzd´y typ souborov´eho syst´emu existuje pr´avˇe jedna instance dan´e struktury bez ohledu na to, kolikr´at je uloˇziˇstˇe s dan´ym sou-borov´ym syst´emem pˇripojeno. S kaˇzd´ym pˇripojen´ım ale vznik´a struktura vfsmount, kter´a poskytuje informace o dan´em pˇr´ıpojn´em bodu.

S procesy jsou v´az´any tˇri datov´e struktury vztahuj´ıc´ı se k VFS. Prvn´ı jefiles struct, kter´a uchov´av´a deskriptory otevˇren´ych soubor˚u a pomoc´ı nich pˇristupuje k objekt˚um

(24)

file. Tak´e zajiˇst’uje aby si proces neotevˇrel v´ıce soubor˚u neˇz je povolen´y limit. Druhou je

fs struct, kter´a sdruˇzuje informace o souborov´em syst´emu, kter´a jsou pro proces potˇrebn´a (napˇr. koˇrenov´y nebo pracovn´ı adres´aˇr). Posledn´ı jemnt namespace. Ta m˚uˇze poskytovat kaˇzd´emu procesu unik´atn´ı pohled na celou hiearchii pˇripojen´eho souborov´eho syst´emu. Kla-sick´e procesy si vytv´aˇr´ı vlastn´ı strukturyfile structafs struct. Vl´akna tyto struktury typicky sd´ıl´y. Naopak strukturamnt namespace je typicky vˇsemi procesy a vl´akny sd´ılena. Nov´a se vytv´aˇr´ı pouze pokud si o ni proces pˇri vytv´aˇren´ı zaˇz´ad´a.

Nejd˚uleˇzitˇejˇs´ı datov´e struktury a jejich prov´az´an´ı je zn´azornˇeno na obr. 2.9.

super_block …

unsigned char s_dirt; struct file_system_type s_type; struct super_operations *s_op; struct list_head s_inodes; struct list_head s_files; ...

Seznam superbloků

inode …

struct list_head i_sb_list; struct list head i_dentry; unsigned long i_ino; struct inode_operations *i_op; struct file_operations *i_fop; ... Seznam inodů inode_operations dentry_operations super_operations file_operations file …

struct file_operations *f_op; struct path f_path; ...

Seznam souborů

dentry …

struct inode *d_inode; struct qstr d_name; struct dentry_operations *d_op; ...

Seznam položek dentry

task_struct …

struct files_struct *files; struct fs_struct *fs; ...

files_struct …

struct files *fd_array[]; ...

fd_array[NR_OPEN_DEFAULT] (pole otevřených souborů

daného procesu)

fs_struct ... f_path.dentry

(25)

2.3

Reprezentace a spr´

ava s´ıt’ov´

ych spojen´ı

C´ılem t´eto kapitoly je sezn´amit ˇcten´aˇre se z´akladn´ımi pojmy s´ıt’ov´ych spojen´ı. Jelikoˇz je tento obor velmi rozs´ahl´y, budou zde vysvˇetleny pouze pojmy nutn´e pro pochopen´ı zbyl´e ˇ

c´asti pr´ace.

2.3.1 Z´akladn´ı pojmy

Pro realizaci s´ıt’ov´e komunikaci je zapotˇreb´ı velmi rozs´ahle infrastruktury, skl´adaj´ıc´ı se z mnoha zaˇr´ızen´ı, protokol˚u a aplikac´ı. Pro zjednoduˇsen´ı jej´ıho popisu se zav´adˇej´ıvrstvov´e modely zn´azornˇen´e na obr. 2.10:

Fyzická Linková Síťová Transportní Relační Aplikační Prezentační OSI model Vrstva síťového rozhraní Internetová Transportní Aplikační Ethernet, Token Ring, ... IPv4, IPv6 TCP, UDP, ... HTTP, FTP, XMPP, RIP, ... TCP/IP model Rozhraní soketů Uživatelský proces Jádro Síťová karta a její ovladač

Obr´azek 2.10: Vrstvov´e modely

OSI model je sp´ıˇse referenˇcn´ım modelem, kdeˇzto na TCP/IP modelu je v podstatˇe vystavˇen cel´y Internet. Na obr´azku 2.10 jsou zn´azornˇeny jednotliv´e vrstvy tˇechto model˚u a nˇekter´e protokoly, kter´e na nich mohou pracovat. Z pohledu t´eto pr´ace je zaj´ımav´e, ˇze v j´adˇre operaˇcn´ıho syst´emu je implementov´ana funkcionalita vrstvy transportn´ı a interne-tov´e. Do detail˚u t´eto implementace zab´ıhat nebudeme, sp´ıˇse se zamˇeˇr´ıme na uˇzivatelsk´y pohled na s´ıt’ov´e komunikace, kter´y je d˚uleˇzit´y pro tvorbu rootkit˚u a jejich detektor˚u.

Pˇri vytv´aˇren´ı s´ıt’ov´e aplikace v GNU/Linux se vyuˇz´ıv´a rozhran´ıBSD Sockets (d´ale so-kety), zn´azornˇen´e na obr. 2.10. Kaˇzd´a strana, kter´a chce po s´ıti komunikovat mus´ı vytvoˇrit jeden takov´y soket. Skrze nˇe je pot´e komunikace zprostˇredkov´ana. Kaˇzd´y soket je jedno-znaˇcnˇe identifikov´an pomoc´ıIP adresy a ˇc´ısla portu. IP adresa jednoznaˇcnˇe identifikuje poˇc´ıtaˇc v s´ıti6. V dneˇsn´ı dobˇe se vyuˇz´ıvaj´ıIPv4 ˇci IPv6 adresy. ˇC´ıslo portu identifikuje konkr´etn´ı aplikaci ˇci sluˇzbu bˇeˇz´ıc´ı na dan´em poˇc´ıtaˇci. Rozsah ˇc´ısel port˚u je pevnˇe d´an od 0 do 65535. Porty od 0 do 1023 jsou tzv.well known ports, kter´e jsou rezervovan´e pro zn´am´e sluˇzby. Port od 1024 do 49151 jsou registrovan´e, zbyl´e se naz´yvaj´ı dynamick´e. O spr´avu

6Respektive identifikuje rozhran´ı poˇc´ıtaˇce. Poˇc´ıtaˇc m˚ze m´ıt napˇr. v´ıce s´ıt’ov´ych karet. Kaˇzd´e pot´e bude

(26)

ˇ

c´ısel port˚u se star´a organizaceICANN. Nen´ı moˇzn´e, aby na jedn´e stanici bˇeˇzelo v´ıce sluˇzeb na stejn´em portu. Kaˇzd´e spojen´ı je identifikovan´e m´ıstn´ı adresou a portem (lok´aln´ı soket), vzd´alenou adresou a portem (vzd´alen´y soket) a vˇetˇsinou i typem protokolu transportn´ı vrstvy (nejˇcastˇeji TCP ˇci UDP). Sokety se daj´ı vyuˇz´ıt i pˇri lok´aln´ı komunikaci mezi pro-cesy ˇci s j´adrem. T´ımto typem se ale zde nebudeme zab´yvat. Zn´azornˇen´ı komunikace pomoc´ı soket˚u s uk´azkou adres m˚uˇzete videt na obr. 2.11. Obr´azek zn´azorˇnuje odchoz´ı komunikaci z poˇc´ıtaˇce PC1 do PC2 a jejich adresy.

PC1 (lokální) (vzdálený)PC2 Lokální adresa: IP adresa: 11.12.58.64 Port: 49160 Vzdálená adresa: IP adresa: 11.12.58.73 Port: 51513 S ok e t S ok e t

Obr´azek 2.11: Komunikace pomoc´ı soket˚u a jejich adresy

2.3.2 Reprezentace s´ıt’ov´ych spojen´ı

V t´eto kapitole se bl´ıˇze sezn´am´ıme se sokety a s t´ım, jak´ym zp˚usobem jsou informace o s´ıt’ov´ych spojen´ıch reprezentov´any uˇzivateli.

Pro realizaci soket˚u se plnˇe vyuˇz´ıv´a moˇznost´ı virtu´aln´ıho souborov´eho syst´emu a linu-xov´eho pˇr´ıstupu vˇse je soubor. Soket je speci´aln´ım typem souboru. Po jeho vytvoˇren´ı je identifikov´an pomoc´ı ˇc´ıseln´eho deskriptoru, stejnˇe jako bˇeˇzn´e otevˇren´e soubory. Stejnˇe jako s ostatn´ımi soubory se s n´ım i pracuje a stejnˇe je reprezentov´an v j´adˇre. Proces si deskrip-tor soketu uchov´av´a v seznamu deskriptor˚u, skrze kter´y se m˚uˇze dopracovat ke struktuˇre

file. Ta obsahuje odkaz na tabulku operac´ı soubor˚u, kter´a uˇz je samozdˇrejmˇe specifick´a pro potˇreby s´ıt’ov´e komunikace. Na soket se m˚uˇze volat syst´emov´e vol´an´ıread()ˇciwrite()

a tak data pˇrij´ımat ˇci zas´ılat po s´ıti. Plat´ı na nˇej tedy vˇsechny poznatky t´ykaj´ıc´ı se VFS. J´adro poskytuje uˇzivateli informace o s´ıt’ov´ych rozhran´ıch ˇci spojen´ıch skrze speci´aln´ı virtu´aln´ı souborov´y syst´em /proc/net. V tomto syst´emu jsou um´ıstˇeny textov´e soubory poskytuj´ıc´ı tyto informace a r˚uzn´e statistiky. Form´at tˇechto soubor˚u je vˇetˇsinou ˇciteln´y pro ˇclovˇeka, ale tak´e je upraven pro snadn´e poˇc´ıtaˇcov´e zpracov´an´ı. Pˇr´ıklady tˇechto soubor˚u jsou napˇr. souborytcpˇciudpposkytuj´ıc´ı informace o tcp ˇci udp spojen´ı,routeobsahuj´ıc´ı smˇerovac´ı tabulku poˇc´ıtaˇce, wirelessinformuj´ıc´ı o dostupn´ych wifi s´ıt´ıch aj.

Tohoto souborov´eho syst´emu vyuˇz´ıv´a ˇrada standardn´ıch linuxov´ych n´astroj˚u posky-tuj´ıc´ıch informace o s´ıt’ov´em spojen´ı. Jedn´ım z nejpouˇz´ıvanˇejˇs´ıch jenetstat. Jde o pomˇernˇe komplexn´ı n´astroj poskytuj´ıc´ı informace o s´ıt’ov´ych spojen´ı, routovac´ıch tabulk´ach, roz-hran´ıch a jejich statistik´ach, ˇclenstv´ı v multicastov´ych skupin´ach aj. Dalˇs´ım n´astrojem je napˇr. lsof, kter´y poskytuje informace o souborech otevˇren´ych procesy. Jelikoˇz je soket speci´aln´ım typem souboru, lze takto vypisovat i informace o s´ıt’ov´ych spojen´ı.

(27)

Kapitola 3

Rootkity a metody ´

utok˚

u

Nyn´ı se sezn´am´ıme s rootkity, jejichˇz anal´yza byla jedn´ım z stˇeˇzejn´ıch aspekt˚u t´eto pr´ace. Budou vysvˇetleny z´akladn´ı pojmy t´eto oblasti, rozdˇel´ıme si rootkity do nˇekolika kategorii a sezn´am´ıme se s r˚uzn´ymi metodami skr´yv´an´ı zdroj˚u. Veˇsker´e zkouman´e rootkity a teorie jsou zamˇeˇreny na architekturu i386 ˇci kompatibiln´ı na niˇz bˇeˇz´ı operaˇcn´ı syst´em

GNU/Linux. Vyuˇzit´ı metod konkr´etn´ımi rootkity a jejich srovn´an´ı naleznete v pˇr´ıloze B.

3.1

akladn´ı pojmy

Rootkit je sada program˚u, pomoc´ı kter´ych lze maskovat pˇr´ıtomnost ´utoˇcn´ıka na kom-promitovan´em poˇc´ıtaˇci. Umoˇzˇnuj´ı skr´yvat ´utoˇcn´ıkovy zdroje jako napˇr. procesy, soubory ˇ

ci s´ıt’ov´a spojen´ı. Mohou obsahovat tzv. zadn´ı vr´atka, kter´a zajiˇst’uj´ı snadn´y pˇr´ıstup k na-paden´e stanici. Rootkit samotn´y se nesnaˇz´ı poˇskodit c´ılov´y poˇc´ıtaˇc, ani vˇetˇsinou nezjiˇst’uje citliv´e informace o uˇzivatel´ych, jenˇz jej pouˇz´ıvaj´ı. Jeho c´ılem je skr´yt d˚ukazy o vyuˇzit´ı napaden´eho stroje ´utoˇcn´ıkem. ´Utoˇcn´ıci jej vyuˇz´ıvaj´ı v prvn´ı f´azi ´utoku, aby si pˇripravili prostˇred´ı pro zaveden´ı a spuˇstˇen´ı dalˇs´ıch pracovn´ıch n´astroj˚u [5].

3.2

Typy rootkit˚

u

V dneˇsn´ı dobˇe existuje cel´a ˇrada rootkit˚u bˇeˇz´ıc´ıch na r˚uzn´ych operaˇcn´ıch syst´emech a hardwarov´ych architektur´ach. V t´eto kapitole si je rozdˇel´ıme podle zp˚usobu, jak´ym ´utoˇc´ı na c´ılovou platformu, a m´ıry, jak hluboko zasahuj´ı do operaˇcn´ıho syst´emu. Obecnˇe se d´a ˇr´ıci, ˇze ˇc´ım je rootkit zanoˇren v´ıce do syst´emu, t´ım doch´az´ı k silnˇejˇs´ımu spˇraˇzen´ı s konkr´etn´ı architekturou a roste n´aroˇcnost jeho tvorby. Stejnˇe tak ale roste obt´ıˇznost odhalen´ı takov´eho rootkitu a zdroj˚u, kter´e skr´yv´a, a tak´e rozsah infikov´an´ı syst´emu [5].

3.2.1 Rootkity bˇeˇz´ıc´ı v uˇzivatelsk´em reˇzimu

Cel´y rootkit bˇeˇz´ı v uˇzivatelsk´em reˇzimu. ´Utok vˇetˇsinou spoˇc´ıv´a v nahrazen´ı syst´emov´ych funkc´ı nebo knihoven. Pokud se napˇr´ıklad rootkit snaˇz´ı skr´yt ´utoˇcn´ık˚uv proces, nahrad´ı se syst´emov´e funkce jakops, pstree, top, aj. za jejich upravenou verzi, kter´a skr´yvan´y pro-ces nevyp´ıˇse. Tento typ ´utoku je velmi jednoduch´y avˇsak m´alo efektivn´ı. K naruˇsen´ı ´utoku uˇzivateli postaˇc´ı nainstalovat sv´e vlastn´ı programy (vlastn´ı verzepsapod.), ˇci pˇreinstalovat ty st´avaj´ıc´ı.

Vˇetˇsina program˚u prov´ad´ı svoji ˇcinost skrze syst´emov´e knihovny. Nab´ız´ı se tedy moˇznost je infikovat pˇr´ımo a t´ım upravit funkˇcnost vˇsech program˚u, jenˇz je vyuˇz´ıvaj´ı. Pˇreinstalov´an´ı

(28)

je v tomto pˇr´ıpadˇe ne´uˇcinn´e ani instalace vlastn´ıch verz´ı syst´emov´ych program˚u ˇcasto ne-pom´ah´a. Z´aleˇz´ı zda tyto nov´e programy vyuˇz´ıvaj´ı infikovan´e knihovny. Pokud programy ke sv´e ˇcinnosti knihovny v˚ubec nepouˇz´ıvaj´ı nebo vyuˇz´ıvaj´ı sv´e vlastn´ı, je tento zp˚usob ne´uˇcinn´y. Uk´azka pr˚ubˇehu poˇzadavku na ˇcten´ı souboru a lokalizace ´utoku uveden´ych root-kit˚u je na obr. 3.1. Aplikace read() Knihovna read() wrapper Obsluha přerušení system_call Systémová funkce sys_read()

Uživatelský prostor Prostor jádra

Rootkit Rootkit Rozhraní Systémových volání Tabulka Systémových volání

Obr´azek 3.1: Rootkity v uˇzivatelsk´em reˇzimu

Nejvˇetˇs´ım probl´emem v´yˇse uveden´ych pˇr´ıstup˚u je z´ısk´an´ıadministr´atorsk´eho opr´avnˇen´ı, kter´e je pˇri nahrazov´an´ı syst´emov´ych program˚u a knihoven potˇreba. K jeho z´ısk´an´ı ˇcasto slouˇz´ı odposlechnut´ı hesla, chyba nˇekter´ych program˚u ˇci sluˇzeb s administr´atorsk´ymi opr´ av-nˇen´ımi nebo chyba pˇr´ımo v j´adˇre syst´emu [5].

3.2.2 Rootkity bˇeˇz´ıc´ı v reˇzimu j´adra

Veˇsker´e programy a knihovny, kter´e jsou pro rootkity zaj´ımav´e, vyuˇz´ıvaj´ı sluˇzeb j´adra. Logick´ym krokem je tedy infikovat pˇr´ımo j´adro a t´ım ovlivnit vˇsechny programy, kter´e s n´ım komunikuj´ı. Takov´e rootkity pracuj´ı na velmi n´ızk´e ´urovni, d´ıky ˇcemuˇz mohou ovl´adnout cel´y syst´em a tˇeˇzko se odhaluj´ı i odstraˇnuj´ı. D´ıky tomu ˇcasto setrv´avaj´ı d´ele v syst´emu a d´avaj´ı tak ´utoˇcn´ıkov´ı v´ıce ˇcasu k jeho zneuˇzit´ı. Pˇri vytv´aˇren´ı k´odu na takto n´ızk´e ´urovni se ale nevyhneme nutnosti vyuˇz´ıvat mechanism˚u specifick´ych pro danou platformu. Vytv´aˇr´ı se tedy rootkity, kter´e jsou c´ılen´e nejen na dan´y operaˇcn´ı syst´em (Windows, GNU/Linux, atd.), ale velmi ˇcasto i na urˇcitou verzi j´adra a hardwarovou architekturu (i386, amd64 aj.). Operaˇcn´ı syst´em mus´ı m´ıt nav´ıc k dispozici prostˇredky pro zav´adˇen´ı a spouˇstˇen´ı takov´eho k´odu, jako maj´ı napˇr´ıklad monolytick´a j´adra s modul´arn´ı strukturou (a tedy i Linux) ve formˇe j´adrov´ych modul˚u [6, 5].

Dle ´urovnˇe infiltrace rozliˇsujeme tyto tˇr´ıdy napaden´ı:

• Napaden´ı obsluhy pˇreruˇsen´ı – Rootkit zautoˇc´ı jiˇz bˇehem vyvol´an´ı pˇreruˇsen´ı. Za-jist´ı, aby byla pro obsluhu pˇreruˇsen´ı vybr´ana upraven´a funkce. Ta se postar´a o skryt´ı ´

utoˇcn´ıkov´ych zdroj˚u.

• Napaden´ı z´amˇenou syst´emov´e funkce – ´Utoˇc´ı se na mechanismus syst´emov´ych vol´an´ı takov´ym zp˚usobem, aby byla nakonec vˇzdy vyvol´ana ´utoˇcn´ıkova upraven´a syst´emov´a funkce, kter´a skryje utajovan´e zdroje.

(29)

• Napaden´ı syst´emov´e funkce – Pˇri tomto ´utoku se rootkit posune jeˇstˇe d´ale v ob-sluze syst´emov´eho vol´an´ı a za´utoˇc´ı aˇz bˇehem proveden´ı syst´emov´e funkce. Dojde tedy k v´ybˇeru spr´avn´e funkce, jej´ıˇz proveden´ı je ale ovlivnˇeno rootkitem, a vrac´ı upraven´e v´ysledky, kter´e opˇet skryj´ı poˇzadovan´e zdroje.

Uveden´e ´utoky zn´azorˇnuje obr. 3.2.

Uživatelský prostor Prostor jádra

Napadení obsluhy přerušení

Napadení záměnou systémové funkce

Napadení systémové funkce

Upravená systémové funkce

Aplikace Knihovna Obsluha přerušení

Původní systémové funkce Tabulka přerušení Přesměrování na upravenou systémovou funkcí Aplikační rozhraní knihovny Rootkit

Aplikace Knihovna Obsluha přerušení

Systémové funkce Tabulka přerušení systémových voláníTabulka

Aplikační rozhraní knihovny Rootkit Aplikace Knihovna Původní obsluha přerušení Systémové funkce Přesměrování na upravenou obsluhu přerušení Tabulka systémových volání Aplikační rozhraní knihovny Rootkit Upravená obsluha přerušení

Obr´azek 3.2: Typy napaden´ı v reˇzimu j´adra

3.3

Metody ´

utok˚

u v reˇ

zimu j´

adra

V t´eto kapitole se podrobnˇeji sezn´am´ıme s metodami skr´yv´an´ı zdroj˚u v operaˇcn´ım syst´emu. Zamˇeˇr´ıme se na metody vyuˇz´ıv´an´e rootkity, kter´e bˇeˇz´ı v reˇzimu j´adra. Pokud se

(30)

´

utoˇcn´ıkovi podaˇr´ı takov´y rootkit pro kompromitovan´y poˇc´ıtaˇc vytvoˇrit a nainstalovat, z´ısk´a t´ım mnohem rozs´ahlejˇs´ı a robustnˇejˇs´ı prostˇredky pro skryt´ı sv´e ˇcinnosti.

Aplikace nebo knihovna

Obsluha přerušení pro system_call

(id volání v reg. eax)

0x80 system_call … 0x01 debug 0x00 divide_error Tabulka přerušení ... 2 sys_fork 1 sys_exit 0 sys_restart_syscall Tabulka systémových volání

int 0x80

Systémová funkce

Parametry v reg.: ebx, ecx, edx, esi, edi

Vrací hodnotu v reg.: eax

idtr sys_call_table

(symbol)

Registr

Obr´azek 3.3: Sch´ema proveden´ı syst´emov´eho vol´an´ı

Uveden´e ´utoky budou m´ıt spoleˇcn´e nˇekter´e rysy. Vˇetˇsina ´utok˚u spoˇc´ıv´a v pˇreps´an´ı od-kazu na funkci (ˇci tabulku funkc´ı) tak, aby byla nakonec vyvol´ana´utoˇcnikova funkce (upra-ven´a funkce), kter´a skryje poˇzadovan´e zdroje. Velmi ˇcasto je na konci prov´adˇen´ı ´utoˇcn´ıkovy funkce vyvol´ana p˚uvodn´ı, origin´aln´ı funkce, aby bylo zaruˇceno origin´aln´ı chov´an´ı. Metody se hlavnˇe liˇs´ı t´ım, jak a v jak´e f´azy syst´emov´eho vol´an´ı jsou aplikov´any. Pr˚ubˇeh syst´emov´ych vol´an´ı byl pops´an v kap. 1.4. Pro pˇrehlednost znovu uvedeme sch´ema pr˚ubˇehu syst´emov´eho vol´an´ı (obr. 3.3).

3.3.1 Napaden´ı obsluhy pˇreruˇsen´ı

V tomto pˇr´ıpadˇe rootkit za´utoˇc´ı jiˇz bˇehem v´ybˇeru rutiny, kter´a obsluhuje pˇreruˇsen´ı. Existuje v´ıce zp˚usob˚u, jak takov´yto ´utok implementovat. Jedn´ım z nich je ´utok na tabulku pˇreruˇsen´ı. V t´eto tabulce se uprav´ı odkaz na obsluˇznou rutinu pˇreruˇsen´ısystem call tak, aby odkazoval na ´utoˇcn´ıkovu funkci [8].

Dalˇs´ı moˇznost´ı je napˇr´ıklad zamˇenˇen´ı tabulky pˇreruˇsen´ı. Ukazatel na tuto tabulku je uchov´an v registru idtr. Pokud se ´utoˇcn´ıkovi podaˇr´ı zmˇenit obsah tohoto registru m˚uˇze doc´ılit toho, ˇze pˇri pr˚ubˇehu syst´emov´eho vol´an´ı bude vyuˇz´ıv´ana jeho upraven´a tabulka pˇreruˇsen´ı, kter´a m˚uˇze odkazovat na jeho vlastn´ı obsluˇzn´e rutiny. Oba typy ´utoku se velmi podobaj´ı ´utok˚um vyuˇz´ıvan´ych pˇri napaden´ı v´ybˇeru syst´emov´e funkce, kter´e budou pops´any d´ale [5].

3.3.2 Napaden´ı v´ybˇeru syst´emov´e funkce

V t´eto kapitole si pop´ıˇseme dva z´akladn´ı zp˚usoby tohoto typu ´utoku:

1. Utok na tabulku syst´´ emov´ych vol´an´ı – Jde o jeden z nejstarˇs´ıch a v˚ubec nej-pouˇz´ıvanˇejˇs´ıch metod ´utok˚u. Uprav´ı se tabulka syst´emov´ych vol´an´ı tak, aby

odka-zovala na upravenou syst´emovou funkci. Ta pot´e skryje poˇzadovan´e zdroje a na

konci sv´eho bˇehu ˇcasto vyvol´a origin´aln´ı syst´emovou funkci, aby se zachovala p˚uvodn´ı funkˇcnost. Popisovan´y princip je zn´azornˇen na obr´azku 3.4. Dˇr´ıve byl tento typ ´utoku snaˇzˇs´ı, jelikoˇz byl program´ator˚um k dispozici symbolsys call table, pomoc´ı kter´eho

References

Related documents

─ is low (similar to concrete); HOWEVER a rock mass can have even less tensile strength..

or information about their expertise, which is repeated mainly with Negation feedback. Social: we mean context information related to a user’s role at work, and

In Section 2.3, we then cover topics related to our work on the field of data-driven software development: methods for collecting user related data, its analysis, and

This will entail conceiving language as an essential social and ideological instrument which enables learners to question methods and procedures and contributes to

In addition to the positive implications already mentioned, it should also be considered that standard language ideology and the imposition of native speaker models onto

To capture CNVs within CDH candidate regions, we developed and tested a targeted array comparative genomic hybridization platform to identify CNVs within 140 regions in 196 patients

There is a need to measure and evaluate the costs associated with the feed consumed by beef cows not  only  over  the  winter  feeding  period  but  also 

antioxidant enzyme assay indicated that there was marked increase in the level of lipid peroxidation and decrease in the level of antioxidant enzyme in hypothyroid and