Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Relevanta dokument
Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Sockets. Processkommunikation Sammanfattning. Sockets. Domän, typ och protokoll

Säkerhet. De onda. Vilka är farorna?

Programmeringsteknik med C och Matlab

Övning från förra gången: readword

... Funktionsanrop. Vad händer när man kör ett program?

*Pekarvärden *Pekarvariabler & *

Pekare och arrayer. Indexering och avreferering

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Operativsystem ID1200/06 Tentamen :00-18:00

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Det finns många flaggor till g++,

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Repetition C-programmering

Tillfälle 10 (F): Sockets i C, grundläggande IP och Client/Server-applikationer

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Introduktion C-programmering

Att använda pekare i. C-kod

Möte 9: Relationer mellan körande processer - (PI)

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Raspberry Pi och Tellstick, ett program i C.

Föreläsning 3. Programmering, C och programmeringsmiljö

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Linuxadministration I 1DV417 - Laboration 7 SSH-magi och systemtrolleri. Marcus Wilhelmsson 6 mars 2013

1 Logga in 1. 2 Byta lösenord 1. 3 Hemkatalog 1. 4 Unixintroduktion Viktiga kommandon Läsa 3

2 Pekare och dynamiska variabler.

Tentamen *:58/ID100V Programmering i C Exempel 3

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Installera din WordPress med 9 enkla steg

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

F5: Högnivåprogrammering

Åtkomst och användarhandledning

F5: Högnivåprogrammering

Programmering B med Visual C

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Enkla datatyper minne

Föreläsning 13. In- och utmatning

#include <stdio.h> #include <string.h>

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Deklarera en struct som kan användas för att representera en rät linje

LEU240 Mikrodatorsystem

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Programmeringsteknik med C och Matlab

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

En kort text om programmering i C.

Planering Programmering grundkurs HI1024 HT TIDAA

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

printenv sort pager printenv grep args sort pager

Planering Programmering grundkurs HI1024 HT data

grundläggande C++, funktioner m.m.

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Strängar. Strängar (forts.)

Föreläsning 5: Introduktion av pekare

Tentamen Nätverksprogrammering Lösningsförslag

Programsystemkonstruktion med C++

Loopar och datatyper. Föreläsning 3

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

TDIU01 - Programmering i C++, grundkurs

Föreläsning 3. Programmering, C och programmeringsmiljö

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

1 PC intro. 2 Logga in. 3 Läsa websidor. 4 Skapa kataloger. 5 Putty

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

MESI i Intel Core 2 Duo

Föreläsning 10. Pekare (Pointers)

TDIU01 - Programmering i C++, grundkurs

Föreläsning 7 Strängar

Objektorienterad Programkonstruktion. Föreläsning 10 7 dec 2015

Säkerhet, eller nått. Tomas Forsman

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Strategier för att utnytja parallella system. Peter Kjellström NSC Upplysning

Avancerad SSL-programmering II

Ladda upp filer fra n PLC till PC

Datakommunika,on på Internet

Anvä ndärmänuäl PortWise fo r leveränto ren

GSM Axcess 2/3 Snabbstart

Programutveckling med Java Development Kit. (JDK 1.1.x) och Programmers File Editor (PFE 7.02)

Standardfilerna Input och Output

F4. programmeringsteknik och Matlab

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

SSH-protokollet. Niels Möller

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Programmeringsteknisk översiktskurs för yrkeshögskoleprogram

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

C++ Lektion Tecken och teckenfält

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok

Transkript:

Generell säkerhet Här finns det inga direkta rätt eller fel. Snarare saker man bör tänka på när man implementerar ett program. Kort sagt: Efter att du kommit på hur du tänkt göra, sov på saken och tänk en gång till... Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix loggar alla inloggningsförsök. Om en användare av misstag skriver in sitt lösenord istället för användarnamn kommer det att stå i klartext i logfilerna. Om det sedan loggar in en användare 3sek senare är det inte svårt att lista ut och matcha användarnamn och lösenord. Problemet är att man vill kunna logga ev intrångsförsök. Vid användarnamn som inte finns, ska man logga det automatiskt? Loggning fortsättning Webservern Apache loggar komplett Url, även det som står efter?-tecknet. Det som står efter?-tecknet (query-strängen) brukar innehålla användarnamn och ev lösenord för gästböcker och liknande. Behövs det verkligen dyka upp i log-filerna? Problemet är att man vill kunna se vem som gjort ett inlägg i en gästbok tex. En lösning: använda metoden post istället för get när det gäller känslig data. Då måste man själv göra nödvändiga loggningar för att kunna kontrollera vem som gjort vad på sin hemsida. Tänk på vad som ska loggas när ni skriver ett program. Ska allt loggas även om det riskerar att innehålla känsliga uppgifter? Vem ska kunna läsa logfilerna?

Lösenord - Hur säkert är det? Ett lösenord på 8a tecken kan vara ett av 256^8 kombinationer. Men i realiteten kan man lista ut ganska mycket om ett lösenord. För det första brukar man inte tillåta svenska tecken och tecken som man inte kan skriva på ett normalt tangentbord. Redan då är man nere i ca 127^8 kombinationer. Därefter kan man anta att ett lösenord inte innehåller fler siffror än tecken, inte fler specialtecken än vanliga tecken, inte fler versaler än gemener osv... Helt plötsligt är man nere i ännu färre kombinationer. Lösenord forts Dessutom använder många användare samma lösenord på flera ställen. Vad finns det för garantier att ett lösenord lagras på ett säkert sätt på ett annat system? Vid ett nytt system, kan man tvinga användaren att använda ett nytt lösenord? Hur ska man lagra lösenordet så att det inte går att komma åt även om man hackar datorn som det ligger lagrat på? Mer läsning finns på http://www.psychpage.com/tech/passwords.html Programinfo - Vem är du? Många datorer och program sprider gladeligen ut information om vad och vilken version de kör. Om nu den versionen har en säkerhetsbrist är det väldigt enkelt för en hackare att skanna runt i ett nätverk för att få reda på vilka datorer som är känsliga för en attack. Om den inte på ett enkelt sätt visar versionsnummer är det svårt för sysadmins att hålla koll på att man har de senaste patcharna. Ska vem som helt kunna få ut information om ett system? Behöver alla användare få reda på vilken tid och med vilka flaggor ett visst program kompilerades? Om man portscannar en dator kan man få en hel del info om möjliga mål för en attack.

Protokollsvagheter tankefel från början Protokoll är det som säger hur en kommunikation ska gå till. En svaghet där drabbar inte bara ett program eller en implementation av ett protokoll, utan alla. Tex i ssh v1 kan man lätt lista ut vilka paket som innehåller lösenordet. Normalt skickas en knapptryckning till servern och ett tecken att visa kommer tillbaka. Vid lösenordet skickas endast paket åt ett håll (klienten får inte tillbaka några tecken att visa). Programmering Varje program får ett eget minnesutrymme som det körs i (i exemplet nedan endast 256byte, i verkligheten 4GB. Principen är densamma). Själva programmet läses in och hamnar på ett ställe och variablerna hamnar på ett annat. För att man ska kunna ha lokala variabler i varje funktion reserveras nytt minne varje gång en funktion anropas.

Buffer overflow Varje instans av en funktion har en egen minnesplats för sina variabler. Men t.ex printf kan ju anropas från flera ställen i koden, hur vet den då vart den var innan anropet? Genom att just innan det "lokala" minnet lägga upp den plats den var på kan den sen hittat tillbaka till vart den var innan funktionsanropet. På så vis kan man anropa samma funktion från flera ställen i koden. När printf avslutar kollar den den sk återhoppsadressen och hoppar tillbaka dit i koden. Det som händer vid en buffer overflow är att man t.ex skriver utanför en array. Eftersom allt ligger i närheten av varandra i minnet (se exempel) riskerar man då att skriva över adressen som den använder för att hitta tillbaka i koden.

Buffer overflow - exempel #include <stdio.h> /* * Kompilatorn optimerar minnesanvändandet och lägger variabler efter varandra * i minnet. Om man skriver in för långt förnamn kommer den att skriva över * till command- bufferten. Om command skulle vara ett kommando att köra (via * system) skulle man kunna skriva in "XXXXXXX rm- rf /" som fname varpå * commandskulle bli "rm- rf /" Kanske inte så bra kommando att köra... ;) * * Att tänka på: Läs inte in mer tecken än var bufferten klarar av. * * Kända buggar: Blaster (hade inte fullgod koll på vad som kom in via * nätverket utan skrev när i en för liten buffert.) * * OpenSSH (Egentligen ett integer overflow som gjorde att man * allokerade en för liten buffert.) */ int main(int argc, char *argv[]) { char command[8] = "ls -l"; char fname[8]; printf("ange ditt förnamn: "); fflush(stdout); gets(fname); printf("förnamn: %s\n", fname); printf("kommando: %s\n", command); return 0; } Buffer overflow - exempel boule[33] ~/zip % gcc tst.c /tmp/ccsbaoqk.o(.text+0x41): In function `main': : warning: the `gets' function is dangerous and should not be used. boule[34] ~/zip % a.out Ange ditt förnamn: Mikael Förnamn: Mikael Kommando: ls -l boule[35] ~/zip % a.out Ange ditt förnamn: Mikael12rm -rf Förnamn: Mikael12rm -rf Kommando: rm -rf boule[36] ~/zip %

Utnyttja buffer overflow Vid en exploit så gör man en kontrollerad buffer overflow. Istället för att skriva sönder återhoppsadressen skriver man dit ett värde som gör att programmet hoppar till den kod som man själv vill köra. Den programkoden får man oftast in via stdin, inläsning från en fil, en miljövariabel via en nätverksuppkoppling eller liknande. Huvudsaken att den finns någonstans i minnet. KONTROLLERA ALL INDATA!! Speciellt om ni skriver ett nätverksprogram eller ett program som ska köras av root/med root-rättigheter. Annars kan programmet hackas på ett väldigt enkelt sätt... Har man en buffert på 10 byte ska man inte undra några omständigheter kunna försöka fylla den med mer än 10 byte. Olika typer av fel Segmentation fault Får man om man försöker komma åt en minnesadress man inte har tillgång till eller försöker skriva till en adress som är read-only. T.ex (NULL). Vanligen har man tappat kontrollen över en pekare eller att återhoppsadressen är trasig och pekar på någon minnesposition som är fel. Illegal instruction Får man om man försöker köra kod som inte är giltig maskinkod. Trolig orsak: kvaddad återhoppsadressen. Bus error Beror på att processorn försöker optimera läsning till och från minnet. På en 32-bitarsmaskin läser den in 4 byte (32- bitar) åt gången. För att det ska bli snabbt måste adressen som den läser/skriver vara jämt delbar med 4. Är den inte det blir det ett bus error. Trolig orsak: man har tappat kontrollen över en pekare eller, återhoppsadressen är trasig.

Vidare läsning På kurssidan finns flertalet artiklar att läsa om man är intresserad av att läsa mer. Vill man lära sig hur man skriver en egen exploit och hur buffer overflows fungerar på riktigt rekommenderas smashing.txt som är tagen från www.phrack.org. Secure-Programs-HOWTO.pdf är en ganska komplett genomgång på olika fel man kan göra. Inte enbart i c- programmering. Rekommenderas att skumma igenom om man vill få en överblick över vilka fallgropar som finns när man skriver kod. Dessa artiklar och de andra som finns där håller ganska hög nivå men är väldigt intressanta om man sätter sig in i de. Sockets Sockets Ett till sätt att kommunicera. Med sockets så kan vi även kommunicera över nätverk eller lokalt på en maskin. Vi måste förs koppla upp förbindelsen mellan de två processerna. Sedan kan vi om vi vill använda read och write för att läsa/skriva info mellan processerna. Många utav funktionerna som jobbar med fildeskriptorer funkar också med sockets Många olika protokoll för kommunikationen kan användas (för internetförbindelser kan vi tex välja mellan TCP och UDP). För mer info -> läs en datakommunikationskurs

#include... #define oops(s) {perror(s); exit(-1); } #define PORT 1999 server int main() { char c; int n, s, sfd; struct sockaddr_in saddr; if ((s = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) == -1) oops("socket") bzero(&saddr, sizeof (saddr)); /* Build the network address for this server */ saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = htonl(inaddr_any); if (bind(s, (struct sockaddr *)&saddr, sizeof (saddr))!= 0) oops("bind") if (listen(s, 1)!= 0) oops("listen") for (;;) { if ((sfd = accept(s, NULL, NULL)) == -1) oops("accept") while ((n = recv(sfd, &c, sizeof(c), 0)) > 0) putchar(c); putchar('\n'); close(sfd); } }

#include... #define oops(s) {perror(s); exit(-1); } #define HOSTNAME "boule" client #define PORT 1999 int main(int argc, char *argv[]) { int s; struct sockaddr_in saddr; struct hostent *hp; if (argc!= 2) fprintf(stderr, "usage: %s message\n", argv[0]), exit(1); bzero(&saddr, sizeof (saddr)); /* Build the network address of the server */ saddr.sin_family = AF_INET; if ((hp = gethostbyname(hostname)) == NULL) oops("gethostbyname") bcopy(hp->h_addr, &saddr.sin_addr, hp->h_length); saddr.sin_port = htons(port); if ((s = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) == -1) oops("socket") /* Here is the place to bind the socket to a port if the client needs a specific port number*/ if (connect(s, (struct sockaddr *)&saddr, sizeof (saddr))!= 0) oops("socket") if (send(s, argv[1], strlen(argv[1]), 0) == -1) oops("write") close(s); exit(0); } boule[7] % gcc -o server server.c -lnsl boule[8] %./server Hej test Lite mer text 34 ^C boule[9] % test 1 boule[179] % gcc -o client client.c -lnsl boule[180] %./client Hej boule[181] %./client "Lite mer text" boule[182] % peppar[18] % gcc -o sun_client client.c -lsocket -lnsl peppar[19] %./sun_client test peppar[20] %./sun_client 34 peppar[21] %

test 2 server: int i;... while ((n = recv(sfd, &i, sizeof(i), 0)) > 0) printf("tal = %d\n", i); client: int i;... sscanf(argv[1], "%d", &i); if (send(s, &i, sizeof(i), 0) == -1) oops("write") boule[11] % gcc -o iserver iserver.c -lnsl boule[12] %./iserver tal = 123 tal = 2063597568 tal = 0 tal = 16777216 tal = 33554432 tal = 0 tal = 1 ^C test 2 boule[93] % gcc -o iclient iclient.c -lnsl boule[94] %./iclient 123 boule[95] %./iclient 0 boule[96] %./iclient 1 boule[97] % peppar[36] % gcc -o isun_client iclient.c -lsocket -lnsl peppar[37] %./isun_client 123 peppar[38] %./isun_client 0 peppar[39] %./isun_client 1 peppar[40] %./isun_client 2 peppar[41] %