SystemTap: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Jkaap (talk | contribs)
No edit summary
Jkaap (talk | contribs)
No edit summary
 
(23 intermediate revisions by the same user not shown)
Line 2: Line 2:
Sisuliselt on SystemTap-i näol tegemist skriptimiskeele ja tarkvaraga, millega saab luua laetavaid kerneli mooduleid (loadable kernel module) väga erinevatel eesmärkidel. Loodud kerneli moodulid suudavad ennast näiteks ühe väga kasuliku võimalusena, haakida erinevate süsteemi moodulites olevate funktsioonide külge ning seeläbi monitoorida ja muuta andmeid mida programmid süsteemilt küsivad ja/või tulemuseks saavad. See on kasutusel nii administraatorite kui arendajate poolt, tehes väga lihtsalt võimalikuks jälgida erinevate programmide tööd, nende tehtavate süsteemi kutsete (system calls) parameetreid ning tulemusi ja võib isegi aitada süsteemi jõudluse pudelikaelade leidmisel. Kõige lihtsam on SystemTapi võimaluste osas endale selgem pilt saada, kui külastada näidete lehekülge, kus on pikk nimekiri erinevatest algkoodidest koos funktsionaalsuse kirjeldusega: [https://sourceware.org/systemtap/examples/ SystemTap näited]
Sisuliselt on SystemTap-i näol tegemist skriptimiskeele ja tarkvaraga, millega saab luua laetavaid kerneli mooduleid (loadable kernel module) väga erinevatel eesmärkidel. Loodud kerneli moodulid suudavad ennast näiteks ühe väga kasuliku võimalusena, haakida erinevate süsteemi moodulites olevate funktsioonide külge ning seeläbi monitoorida ja muuta andmeid mida programmid süsteemilt küsivad ja/või tulemuseks saavad. See on kasutusel nii administraatorite kui arendajate poolt, tehes väga lihtsalt võimalikuks jälgida erinevate programmide tööd, nende tehtavate süsteemi kutsete (system calls) parameetreid ning tulemusi ja võib isegi aitada süsteemi jõudluse pudelikaelade leidmisel. Kõige lihtsam on SystemTapi võimaluste osas endale selgem pilt saada, kui külastada näidete lehekülge, kus on pikk nimekiri erinevatest algkoodidest koos funktsionaalsuse kirjeldusega: [https://sourceware.org/systemtap/examples/ SystemTap näited]


= Kuidas paigaldada süsteem (Xubuntu näitel) =
 
= Kuidas paigaldada (Xubuntu näitel) =
Valisin Xubuntu seepärast, et kasutan seda ise pidevalt ning seepärast, et Ubuntu ja selle erinevad arendused/analoogid on väga populaarsed.
Valisin Xubuntu seepärast, et kasutan seda ise pidevalt ning seepärast, et Ubuntu ja selle erinevad arendused/analoogid on väga populaarsed.


Line 14: Line 15:




Seejärel on vaja paigaldada ka kerneli debug informatsiooni paketid(lisab ka mõned uued repository-d ning võtab üldiselt veidi aega, sest alla laaditav maht on suht suur):
Seejärel on vaja paigaldada kerneli debug informatsiooni paketid (lisab ka mõned uued repository-d ning võtab üldiselt veidi rohkem aega, sest paketi maht on suhteliselt suur):




Line 41: Line 42:




= Esimene programm =
 
 
= Oluline info =
Linuxi kerneli kood muutub küll olulistes kohtades suht harva, kuid sellegi poolest on erinevused erinevate kerneli versioonide puhul olemas. Seetõttu ei pruugi kõik SystemTap-i lehel olevad näited üldse töötada. Eriti need, mille puhul antakse täpselt c faili täpsusega, et mis funktsiooni külge probe kinnitub. Et leida funktsioone ja nende asukohti, oli minu jaoks kõige mugavam kasutada lehekülge [http://lxr.free-electrons.com/ident http://lxr.free-electrons.com/ident] näiteks ''vfs_mkdir'' leidmiseks otsidagi seda ning lehekülg tagastab c faili kus see asub: [http://lxr.free-electrons.com/ident?i=vfs_mkdir http://lxr.free-electrons.com/ident?i=vfs_mkdir]
 
 
 
 
 
= Esimesed programmid =
Esimene programm on väga lihtne ja tüüpiline - Hello world
----
''probe begin { println("hello world") exit () }''
----
See tuleb salvestada kuhugi faili, ütleme näiteks ''tere.stp'' ja seejärel käivitada käsk ''"sudo stap tere.stp"''. Selle tulemusena peaks kuvatama vana ja tuttav teade.
 
 
Teine programm kasutab juba SystemTap-i kõige kasulikumat omadust ning seob ennast ühe syscall-ga. Antud näites on selleks ''mkdir'', mis kutsutakse välja, nagu nimigi juba ütleb, siis kui soovitakse luua uus kataloog
----
''probe begin
 
''{
 
''  println("ALGAB")
 
''}
 
 
''probe syscall.mkdir
 
''{
 
''  println("KATALOOG: ", pathname)
 
''}
----
Kui see käivitada täpselt samal viisil nagu eelmine skript, siis kompileerimise ning laadimise järel kuvatakse teade "ALGAB" ja peale seda hakatakse kuvama iga loodud kataloogi.
 
 
 
Kolmas programm on veidi teistsugune ja näitab, et SystemTap annab võimaluse ka sisendparameetreid muuta, kuigi seda tehes tuleb arvesse võtta, et tegemist on ikkagi C-s kirjutatud kerneliga, seega näiteks tekstiline sisend- ehk string parameeter on sisuliselt viide mälu aadressile (''pointer''), kus asub siis char tüüpi massiiv (char[]).
----
''probe begin
 
''{
 
''  println("ALGAB")
 
''}
 
 
''probe syscall.mkdir
 
''{
 
''  $pathname = $pathname + 1
 
''}
----
See programm tuleb käivitada ühe lisa flag-iga ''"-g"'', mis määrab, et SystemTap kävitub valitud skripti suhtes ''"guru"'' viisil ja seega lubab sisend- ja väljundparameetreid muuta. Ehk siis terve käsk oleks midagi sellist ''"sudo stap tere.stp"''.
 
Mida see programm aga teeb, on väga lihtne: Programm muudab sisendiks oleva ''pointer'' tüüpi parameetrit ühe võrra suuremaks, mille tulemusena luuakse soovitud kataloogi asemel hoopis kataloog, mille esimene täht on kadunud. Ehk kui kasutaja käivitab käsu ''mkdir abc'', siis tegelikult luuakse kataloog ''bc''. See juhtub seetõttu, et kui algselt viitab sisendiks olev mäluviit (''pointer'') soovitud katalooginime esimesele tähele, siis seda 1 võrra suurendades, viitab see hoopis teisele.
 
 
 
 
 
= Funktsioonide ja parameetrite tuvastamine =
Kui tekib probleeme sellega, et ei leia üles vajalikke funktsioone või ei tea funktsioonidega kaasas käivaid parameetrite nimesid, siis selle puhul aitavad järgnevad käsureakäsud
----
''stap -L syscall.mkdir''
----
tagastab mkdir system call-iga kasutatavad parameetrid
 
 
----
''stap -L 'kernel.function("may_*")' ''
----
tagastab kõik kerneli funktsioonid, mille nimi algab "may_" stringiga
 
 




= Failid =
= Failid =
[https://www.dropbox.com/s/aj17zugfi0jrzko/SystemTap_paigaldatud.ova Valmis image Xubuntu süsteemist, kus on SystemTap ja selle tööks vajalikud asjad paigaldatud (tapper:tapper)]




= Viited erinevatele materjalidele =
= Viited erinevatele materjalidele =
[https://sourceware.org/systemtap/ SystemTap]
[https://sourceware.org/systemtap/ SystemTap]
[https://sourceware.org/systemtap/examples/ SystemTap näited]
[https://sourceware.org/systemtap/examples/ SystemTap näited]
[http://stapbofh.krunch.be/systemtap-bofh-fosdem2011020501.pdf Esitlus mille teema oli SystemTapi kasutamine sisulise rootkitina]
[http://stapbofh.krunch.be/systemtap-bofh-fosdem2011020501.pdf Esitlus mille teema oli SystemTapi kasutamine sisulise rootkitina]

Latest revision as of 10:49, 22 January 2014

Millega on tegu

Sisuliselt on SystemTap-i näol tegemist skriptimiskeele ja tarkvaraga, millega saab luua laetavaid kerneli mooduleid (loadable kernel module) väga erinevatel eesmärkidel. Loodud kerneli moodulid suudavad ennast näiteks ühe väga kasuliku võimalusena, haakida erinevate süsteemi moodulites olevate funktsioonide külge ning seeläbi monitoorida ja muuta andmeid mida programmid süsteemilt küsivad ja/või tulemuseks saavad. See on kasutusel nii administraatorite kui arendajate poolt, tehes väga lihtsalt võimalikuks jälgida erinevate programmide tööd, nende tehtavate süsteemi kutsete (system calls) parameetreid ning tulemusi ja võib isegi aitada süsteemi jõudluse pudelikaelade leidmisel. Kõige lihtsam on SystemTapi võimaluste osas endale selgem pilt saada, kui külastada näidete lehekülge, kus on pikk nimekiri erinevatest algkoodidest koos funktsionaalsuse kirjeldusega: SystemTap näited


Kuidas paigaldada (Xubuntu näitel)

Valisin Xubuntu seepärast, et kasutan seda ise pidevalt ning seepärast, et Ubuntu ja selle erinevad arendused/analoogid on väga populaarsed.

SystemTap enda paigaldamine on Xubuntu puhul väga lihtne (paigaldatakse ka gcc):



sudo apt-get install -y systemtap gcc



Seejärel on vaja paigaldada kerneli debug informatsiooni paketid (lisab ka mõned uued repository-d ning võtab üldiselt veidi rohkem aega, sest paketi maht on suhteliselt suur):



codename=$(lsb_release -c | awk '{print $2}')

sudo tee /etc/apt/sources.list.d/ddebs.list << EOF

deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse

deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse

deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse

deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse

EOF


sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01

sudo apt-get update

sudo apt-get install linux-image-$(uname -r)-dbgsym




Oluline info

Linuxi kerneli kood muutub küll olulistes kohtades suht harva, kuid sellegi poolest on erinevused erinevate kerneli versioonide puhul olemas. Seetõttu ei pruugi kõik SystemTap-i lehel olevad näited üldse töötada. Eriti need, mille puhul antakse täpselt c faili täpsusega, et mis funktsiooni külge probe kinnitub. Et leida funktsioone ja nende asukohti, oli minu jaoks kõige mugavam kasutada lehekülge http://lxr.free-electrons.com/ident näiteks vfs_mkdir leidmiseks otsidagi seda ning lehekülg tagastab c faili kus see asub: http://lxr.free-electrons.com/ident?i=vfs_mkdir



Esimesed programmid

Esimene programm on väga lihtne ja tüüpiline - Hello world


probe begin { println("hello world") exit () }


See tuleb salvestada kuhugi faili, ütleme näiteks tere.stp ja seejärel käivitada käsk "sudo stap tere.stp". Selle tulemusena peaks kuvatama vana ja tuttav teade.


Teine programm kasutab juba SystemTap-i kõige kasulikumat omadust ning seob ennast ühe syscall-ga. Antud näites on selleks mkdir, mis kutsutakse välja, nagu nimigi juba ütleb, siis kui soovitakse luua uus kataloog


probe begin

{

println("ALGAB")

}


probe syscall.mkdir

{

println("KATALOOG: ", pathname)

}


Kui see käivitada täpselt samal viisil nagu eelmine skript, siis kompileerimise ning laadimise järel kuvatakse teade "ALGAB" ja peale seda hakatakse kuvama iga loodud kataloogi.


Kolmas programm on veidi teistsugune ja näitab, et SystemTap annab võimaluse ka sisendparameetreid muuta, kuigi seda tehes tuleb arvesse võtta, et tegemist on ikkagi C-s kirjutatud kerneliga, seega näiteks tekstiline sisend- ehk string parameeter on sisuliselt viide mälu aadressile (pointer), kus asub siis char tüüpi massiiv (char[]).


probe begin

{

println("ALGAB")

}


probe syscall.mkdir

{

$pathname = $pathname + 1

}


See programm tuleb käivitada ühe lisa flag-iga "-g", mis määrab, et SystemTap kävitub valitud skripti suhtes "guru" viisil ja seega lubab sisend- ja väljundparameetreid muuta. Ehk siis terve käsk oleks midagi sellist "sudo stap tere.stp".

Mida see programm aga teeb, on väga lihtne: Programm muudab sisendiks oleva pointer tüüpi parameetrit ühe võrra suuremaks, mille tulemusena luuakse soovitud kataloogi asemel hoopis kataloog, mille esimene täht on kadunud. Ehk kui kasutaja käivitab käsu mkdir abc, siis tegelikult luuakse kataloog bc. See juhtub seetõttu, et kui algselt viitab sisendiks olev mäluviit (pointer) soovitud katalooginime esimesele tähele, siis seda 1 võrra suurendades, viitab see hoopis teisele.



Funktsioonide ja parameetrite tuvastamine

Kui tekib probleeme sellega, et ei leia üles vajalikke funktsioone või ei tea funktsioonidega kaasas käivaid parameetrite nimesid, siis selle puhul aitavad järgnevad käsureakäsud


stap -L syscall.mkdir


tagastab mkdir system call-iga kasutatavad parameetrid



stap -L 'kernel.function("may_*")'


tagastab kõik kerneli funktsioonid, mille nimi algab "may_" stringiga



Failid

Valmis image Xubuntu süsteemist, kus on SystemTap ja selle tööks vajalikud asjad paigaldatud (tapper:tapper)



Viited erinevatele materjalidele

SystemTap

SystemTap näited

Esitlus mille teema oli SystemTapi kasutamine sisulise rootkitina