Sandboxing i linux
Förord
Den grundläggande säkerheten i unix kan ibland vara för grundläggande. Ett exempel är när användaren vill exekvera en applikation som denna av en eller annan anledning inte litar på. Det kan till exempel vara programvara under utveckling eller ett program som misstänks ha ett skadligt beteende.Innehåll
För att lösa det här problemet så kan exekvering av programmet ske i en kontrollerad miljö, en sandbox. I den begränsas vilka resurser programmet har tillgång till. Det är till exempel tänkbart att begränsa ett program från att använda nätverket eller att blockera åtkomst till filer som programmet själv inte skapat.
Många utav funktionerna i en debugger liknar de i en sandbox. I båda fallen handlar det om att kontrollera en exekvering, granska den i detalj och även eventuellt modifiera innehåll i minne och register.
Ett sätt att implementera detta på är att använda en funktionalitet i linuxkärnan, ptrace (Process Trace). Med hjälp av ptrace kan en process kontrollera exekveringen av en annan process. Så fort processen gör ett systemanrop så stoppas exekveringen av processen och dess kontrollerande process får ta över exekveringen. Kontrollprocessen kan då granska systemanropet och ändra på det ifall det behövs. På detta sätt så kan exekveringen av programmet kontrolleras och skadligt beteende kan stoppas.
En annan, väldigt vanlig typ av sandboxing är chroot. Med chroot så kan en process och dess underliggande processers root-katalog förändras. I ett linux-system är root-katalogen den som betecknas med "/", den lägsta nivån i filsystemet. Genom att ändra root-katalog för en applikation så begränsas den till de filer och kataloger som ligger i den katalogen och kan inte få åtkomst till filer som ligger i kataloger utanför sin nya root. På detta sätt skapar man ett slags fängelse. Ett uppenbart problem med detta är att ifall programmet behöver resurser utanför sin egen root så måste de kopieras in i programmets root så att sökvägar bibehålls. Ifall programmet till exempel skulle behöva ett bibliotek /usr/lib/abc.so så måste filen abc.so kopieras in i den nya katalogen och läggas på rätt plats i katalogstrukturen. Ifall det är många filer som programmet behöver kan sandboxen i slutändan sluta med något som nästan är en kopia av filsystemet utanför den miljö skapad av chroot. I det fallet börjar man närma sig något som kallas virtualisering.
En annan nackdel är att root-användaren kan ta sig ut ur en chroot och det exekverande programmet kan därför inte ha fulla rättigheter i sitt fängelse.
Chroot används flitigt av servrar så som webbservrar och ftpservrar för att begränsa användare till kataloger. Ifall en webbsida ger åtkomst till filer i en katalog /home/kurt/public_html/ så skall inga filer utanför den katalogen kunna ges åtkomst till.
Tillsammans med filsystemet UnionFS så kan chroot användas för att skapa ett effektivt och återanvändbart fängelse för att låsa in farliga program. UnionFS är ett filsystem som kan användas för att montera ett filsystem över ett befintligt filsystem och fungera som om de båda var ett och samma. Under monteringen så prioriteras ett utav filsystemen så att ifall identiska filer existerar i båda filsystemen så prioriteras den ena. Detta kan utföras både på filsystem som bara är läsbara och på filsystem som är båda skrivbara och läsbara. På detta sättet kan man i botten montera ett filsystem som bara är läsbart och ovanpå montera ett som även är skrivbart. När någon fil skall ändras eller skapas så görs detta i det skrivbara filsystemet och det läsbara filsystemet i botten ligger kvar orört.
För att skapa ett återanvändbart fängelse så kan grundkonfigurationen finnas på ett filsystem som bara är läsbart. Ovanpå det så monteras ett skrivbart filsystem som tar emot alla ändringar. När processen har körts klart så kan det skrivbara filsystemet avmonteras och tömmas för att på nytt monteras och bilda ett nytt filsystem som är identiskt med grundkonfigurationen.
Nedan följer ett exempel;
Skapa ett temporärt filsystem, 50Mb stort med fulla rättigheter för användaren root. Detta filsystem existerar i minnet och monteras i mappen /mnt/tmp. Man kan alltså säga ett en liten del av minnet partitioneras och monteras som en hårddisk.
Först skapar vi en katalog som skall vara vår sandbox, /home/kurt/sandbox/. I denna lägger vi två filer, testfil med lite textinnehåll och en tom fil som heter testfil2.
Sedan monteras vårat temporära filsystem ovanpå /home/kurt/sandbox samtidigt som orginalkatalogen konfigureras så att den bara är läsbar. UnionFS är alltså inte ett filsystem på samma sätta som tex tmpfs eller ext3 utan det används bara för att förena redan existerande filsystem.
Nu simulerar vi en attack mot filsystemet. Texten i filen testfil skrivs över och filen testfil2 tas bort. Avmonterar vi nu /home/kurt/sandbox så plockas unionfs-monteringen bort och orginalfilsystemet finns kvar, oförändrat.
Tar man sig nu en titt i /mnt/tmp så kommer man att se alla förändringar som har gjort. Monterar man av det filsystemet så kommer alla förändringar att försvinna för alltid.
Monteras filsystemen igen så kommer man återigen ha ett filsystem om ser ut som grundkonfigurationen och inte kommer att förstöras på grund av ändringar. Används det här filsystemet tillsammans med chroot för att exekvera program så har vi vårt återanvändbara fängelse.
Många utav funktionerna i en debugger liknar de i en sandbox. I båda fallen handlar det om att kontrollera en exekvering, granska den i detalj och även eventuellt modifiera innehåll i minne och register.
Ett sätt att implementera detta på är att använda en funktionalitet i linuxkärnan, ptrace (Process Trace). Med hjälp av ptrace kan en process kontrollera exekveringen av en annan process. Så fort processen gör ett systemanrop så stoppas exekveringen av processen och dess kontrollerande process får ta över exekveringen. Kontrollprocessen kan då granska systemanropet och ändra på det ifall det behövs. På detta sätt så kan exekveringen av programmet kontrolleras och skadligt beteende kan stoppas.
En annan, väldigt vanlig typ av sandboxing är chroot. Med chroot så kan en process och dess underliggande processers root-katalog förändras. I ett linux-system är root-katalogen den som betecknas med "/", den lägsta nivån i filsystemet. Genom att ändra root-katalog för en applikation så begränsas den till de filer och kataloger som ligger i den katalogen och kan inte få åtkomst till filer som ligger i kataloger utanför sin nya root. På detta sätt skapar man ett slags fängelse. Ett uppenbart problem med detta är att ifall programmet behöver resurser utanför sin egen root så måste de kopieras in i programmets root så att sökvägar bibehålls. Ifall programmet till exempel skulle behöva ett bibliotek /usr/lib/abc.so så måste filen abc.so kopieras in i den nya katalogen och läggas på rätt plats i katalogstrukturen. Ifall det är många filer som programmet behöver kan sandboxen i slutändan sluta med något som nästan är en kopia av filsystemet utanför den miljö skapad av chroot. I det fallet börjar man närma sig något som kallas virtualisering.
En annan nackdel är att root-användaren kan ta sig ut ur en chroot och det exekverande programmet kan därför inte ha fulla rättigheter i sitt fängelse.
Chroot används flitigt av servrar så som webbservrar och ftpservrar för att begränsa användare till kataloger. Ifall en webbsida ger åtkomst till filer i en katalog /home/kurt/public_html/ så skall inga filer utanför den katalogen kunna ges åtkomst till.
Tillsammans med filsystemet UnionFS så kan chroot användas för att skapa ett effektivt och återanvändbart fängelse för att låsa in farliga program. UnionFS är ett filsystem som kan användas för att montera ett filsystem över ett befintligt filsystem och fungera som om de båda var ett och samma. Under monteringen så prioriteras ett utav filsystemen så att ifall identiska filer existerar i båda filsystemen så prioriteras den ena. Detta kan utföras både på filsystem som bara är läsbara och på filsystem som är båda skrivbara och läsbara. På detta sättet kan man i botten montera ett filsystem som bara är läsbart och ovanpå montera ett som även är skrivbart. När någon fil skall ändras eller skapas så görs detta i det skrivbara filsystemet och det läsbara filsystemet i botten ligger kvar orört.
För att skapa ett återanvändbart fängelse så kan grundkonfigurationen finnas på ett filsystem som bara är läsbart. Ovanpå det så monteras ett skrivbart filsystem som tar emot alla ändringar. När processen har körts klart så kan det skrivbara filsystemet avmonteras och tömmas för att på nytt monteras och bilda ett nytt filsystem som är identiskt med grundkonfigurationen.
Nedan följer ett exempel;
#mkdir /mnt/tmp
#mount -t tmpfs -o size=50M,mode=0700 tmpfs /mnt/tmp
Skapa ett temporärt filsystem, 50Mb stort med fulla rättigheter för användaren root. Detta filsystem existerar i minnet och monteras i mappen /mnt/tmp. Man kan alltså säga ett en liten del av minnet partitioneras och monteras som en hårddisk.
#mkdir /home/kurt/sandbox
#echo "testinnehåll" > /home/kurt/sandbox/testfil
#touch /home/kurt/sandbox/testfil2
#mount -t unionfs -o dirs=/mnt/tmp:/home/kurt/sandbox=ro unionfs /home/kurt/sandbox/
Först skapar vi en katalog som skall vara vår sandbox, /home/kurt/sandbox/. I denna lägger vi två filer, testfil med lite textinnehåll och en tom fil som heter testfil2.
Sedan monteras vårat temporära filsystem ovanpå /home/kurt/sandbox samtidigt som orginalkatalogen konfigureras så att den bara är läsbar. UnionFS är alltså inte ett filsystem på samma sätta som tex tmpfs eller ext3 utan det används bara för att förena redan existerande filsystem.
#echo "hackattack!" > /home/kurt/sandbox/testfil
#rm /home/kurt/sandbox/testfil2
#umount /home/kurt/sandbox
Nu simulerar vi en attack mot filsystemet. Texten i filen testfil skrivs över och filen testfil2 tas bort. Avmonterar vi nu /home/kurt/sandbox så plockas unionfs-monteringen bort och orginalfilsystemet finns kvar, oförändrat.
Tar man sig nu en titt i /mnt/tmp så kommer man att se alla förändringar som har gjort. Monterar man av det filsystemet så kommer alla förändringar att försvinna för alltid.
Monteras filsystemen igen så kommer man återigen ha ett filsystem om ser ut som grundkonfigurationen och inte kommer att förstöras på grund av ändringar. Används det här filsystemet tillsammans med chroot för att exekvera program så har vi vårt återanvändbara fängelse.
Kim Persson
Tack för en riktigt välskriven och intressant artikel.