Skip to content
Snippets Groups Projects
Commit 96f38ce6 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Notizen und Beispiel-Programme: Sicherheit

parent 1f71736d
No related branches found
No related tags found
No related merge requests found
Treiber-Entwicklung, Echtzeit- und Betriebssysteme, 27.06.2016
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:) Der Bootvorgang
:) Die Unix-Shell
:) Treiber
:) Signale
:) Massenspeicher
:) Speicherverwaltung
:) Netzwerk
:) Echtzeit
:) User-Space-Treiber
:) Grafik
? Netzwerk: Programmierung
! Sicherheit
Sicherheit
==========
Angriff auf einen Rechner:
1. Benutzer dazu bringen, ein selbstgeschriebenes Programm auszuführen (MalWare)
Beispiel: tolles_bild.jpg.exe
2. Benutzer dazu bringen, ein vorhandenes Programm mit Sicherheitslücke
mit selbstgeschriebenen Daten auszuführen (MalWare)
Beispiele: Macro-, JavaScript-, Flash- und PDF-Würmer
3. Aus dem Netz: ein laufendes Programm mit Sicherheitslücke
mit selbstgeschriebenen Daten füttern
Beispiel: http://xkcd.com/327/
"Robert'); DROP TABLE Students; --"
INSERT INTO Students (Name='Robert', Klasse='3b', Telefon='12345');
INSERT INTO Students (Name='Robert'); DROP TABLE Students; -- ', Klasse='3b', Telefon='12345');
Gegenmaßnahme:
gegen 1: Medienkompetenz
gegen 2. und 3.: keine Sicherheitlücken programmieren
Sicherheitslücken in Programmen
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer-Overflow: siehe Rechnertechnik
Gegenmaßnahmen:
* ordentlich programmieren
- ordentlich einrücken
- Compiler-Warnungen aktivieren und beachten
* automatische Code-Analyse
- Compiler: gcc oder llvm mit Warnungen
- statisch: [sp]lint, sparse (cgcc)
automatische Suche nach typischen Fehlern
- dynamisch: valgrind
ausführbares Programm wird auf Speicherfehler analysiert
--> finden viele, aber nicht alle Fehler
* Speicherschutzmechanismen des Compilers und des Betriebssystems
- Hardware-Unterstützung: DEP/NX (siehe: Speicherverwaltung)
- Canary: http://www.drdobbs.com/240001832
- ASLR: http://heise.de/-2718449
- Austricksen: http://security.stackexchange.com/questions/20497
#include <stdio.h>
int main (void)
{
printf ("Hauptprogramm, vor printf\n");
printf ("Hello, world!\n");
printf ("Hauptprogramm, nach printf\n");
return 0;
}
#include <stdio.h>
int main (void)
{
char *str1 = "Hello, world!";
char *str2 = "";
scanf ("%s", str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
#include <stdio.h>
int main (void)
{
char *str1 = "Hello, world!";
char *str2 = "Hier ist viel Platz.";
scanf ("%s", str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
#include <stdio.h>
int main (void)
{
char str1[] = "Hello, world!";
char str2[] = "Hier ist viel Platz.";
scanf ("%s", str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
#include <stdio.h>
#include <sys/mman.h>
int main (void)
{
char *str1 = "Hello, world!";
char *str2 ="Hier ist viel Platz.";
mprotect (str1, 65536, PROT_WRITE | PROT_READ);
scanf ("%s", str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
#include <stdio.h>
int main (void)
{
/* printf ("Hauptprogramm, vor printf\n"); */
printf ("Hello, world!\n");
/* printf ("Hauptprogramm, nach printf\n");
*/
return 0;
}
#include <stdio.h>
int main (void) { printf ("Hello, world!\n"); return 0; }
#include <stdio.h>
int main (void)
{
int a = 3;
int b = 2;
if (b != 0)
printf ("a / b = %d\n", a / b);
else
printf ("Kann nicht durch 0 dividieren.\n");
printf ("Ciao!\n");
return 0;
}
#include <stdio.h>
int main (void)
{
int a = 6;
int b = 2;
if (b = 0)
{
printf ("Kann nicht durch 0 dividieren.\n");
printf ("Ciao!\n");
}
else
printf ("a / b = %d\n", a / b);
return 0;
}
#include <stdio.h>
int main (void)
{
int a = 6;
int b = 2;
if ((b = 0))
{
printf ("Kann nicht durch 0 dividieren.\n");
printf ("Ciao!\n");
}
else
printf ("a / b = %d\n", a / b);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int *a = malloc (5 * sizeof (int));
for (int i = 1; i <= 5; i++)
a[i] = i;
for (int i = 1; i <= 5; i++)
printf ("%d\n", a[i]);
return 0;
}
#include <stdio.h>
int main (void)
{
char *str1 = "Hello, world!";
char *str2 = "";
scanf ("%s", &str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
#include <stdio.h>
int main (void)
{
char *str1 = "Hello, world!";
char *str2 = "";
printf ("str2 = %x --> %x\n", str2, *str2);
scanf ("%s", &str2);
printf ("str2 = %x --> %x\n", str2, *str2);
printf ("%s\n%s\n", str1, str2);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment