Seite 1 von 4

Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 3:54 am
von nufan
Hier ein Stückchen C-Code, das eine Sicherheitslücke beinhaltet:

Code: Alles auswählen

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

#define MAX_LEN 1024

int main( int argc, char *argv[] )
{
  char password[MAX_LEN] = {0};
  char input[MAX_LEN] = {0};
  int inputLength;
  int passwordLength;
    
  printf( "----- Vulnerable Screen Locker -----\n" );
  printf( "Enter password: " );
  fflush( stdout );
  fgets( password, sizeof( password ), stdin );
  passwordLength = strlen( password );
  password[passwordLength - 1] = '\0';
  --passwordLength;
  printf( "\nScreen locked\n" );
  
  while( 1 )
  {
    printf( "\n\nEnter password to unlock: " );
    fflush( stdout );
    fgets( input, sizeof( input ), stdin );
    inputLength = strlen( input );
    input[inputLength - 1] = '\0';
    --inputLength;
    if( passwordLength == inputLength && strcmp( input, password ) == 0 )
    {
      printf( "Screen unlocked\n" );
      return 0;
    }
    printf( "Incorrect password. This incident will be reported. Password tried: " );
    printf( input );
    fflush( stdout );
  }
  
  return 0;
}
Wer findet den Fehler? ;) Zugegeben, es ist nicht ganz trivial, aber doch schaffbar :)

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 8:59 am
von cloidnerux
Muss ich das Programm nicht einfach nur zum Crashen bringen indem ich entweder kein oder ein sehr langes Passwort eingebe, sodass der Buffer überläuft?

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 9:30 am
von nufan
cloidnerux hat geschrieben:Muss ich das Programm nicht einfach nur zum Crashen bringen indem ich entweder kein oder ein sehr langes Passwort eingebe, sodass der Buffer überläuft?
Wie genau willst du das machen? Ich verwende zum Einlesen fgets() mit einer Zeichenbegrenzung.

Ok, ich muss zugeben meine Aufgabenbeschreibung war etwas knapp. Das von mir geschriebene Programm ist natürlich stark vereinfacht. Es soll angenommen werden, dass das zuerst eingegebene Passwort nicht bekannt ist und nicht am Bildschirm steht. Trotzdem soll man ins if mit der Ausgabe "Screen unlocked\n" und dem return kommen.

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 9:58 am
von naums
Ich stelle mal 2 Fragen:

Code: Alles auswählen

strlen ( string);
zählt das das Nullbyte mit?

Code: Alles auswählen

  --passwordLength;
warum ziehst du passwordLength eins ab und weist den Wert nirgendwohin zu? genau das gleiche mit inputLength. Theoretisch sollten die beiden Formulierungen keinen Zweck haben, weil der neu berechnete Wert keiner Variablen zugewiesen wird.

MFG

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 10:13 am
von Yoghurt
--passwordLength
<=> passwordLength -= 1
<=> passwordLength = passwordLength - 1

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 10:18 am
von nufan
naums hat geschrieben:

Code: Alles auswählen

strlen ( string);
zählt das das Nullbyte mit?
Nein. Das hättest du aber auch in der Referenz finden können ^^
naums hat geschrieben:

Code: Alles auswählen

  --passwordLength;
warum ziehst du passwordLength eins ab und weist den Wert nirgendwohin zu? genau das gleiche mit inputLength. Theoretisch sollten die beiden Formulierungen keinen Zweck haben, weil der neu berechnete Wert keiner Variablen zugewiesen wird.
Weil fgets() das Newline (\n) an den String dranhängt. Das will ich aber nicht. Ich überschreibe das \n einfach mit \0 und es ist weg. Natürlich ist mein String danach um 1 Zeichen kürzer, deswegen dekrementiere ich passwordLength bzw. inputLength.

Kaum sagt man etwas von einer Sicherheitslücke suchen alle nach Bufferoverflows in der Eingabe... ^^

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 10:23 am
von naums
okay, ich benutze meistens:

Code: Alles auswählen

i--; // anstelle von --i;
Deshalb war mir der og. Umstand nicht bewusst.

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 11:11 am
von Yoghurt
Wenn die Dekrementierung (bzw. Inkrementierung) allein steht macht es keinen Unterschied ob die Postfix- oder Präfix-Schreibweise verwendet wird.

Hier würde es einen Unterschied machen:

Code: Alles auswählen

int a, b;
a = 3;
b = --a;
//b = a--;
if(a == b) { printf("gleich\n"); } else { printf("ungleich\n"); }
Je nachdem ob du die Dekrementierung als Präfix oder als Postfix schreibst wird sie vor (prä) oder nach (post) der Verwendung der Variablen ausgeführt.

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 11:23 am
von Kerli
Ich würde einfach raufscrollen und schauen was dort für ein Passwort steht :)

Re: Finde die Sicherheitslücke ;)

Verfasst: Mi Jan 16, 2013 11:29 am
von nufan
Kerli hat geschrieben:Ich würde einfach raufscrollen und schauen was dort für ein Passwort steht :)
Joa... aber wie bereits erwähnt:
dani93 hat geschrieben:Ok, ich muss zugeben meine Aufgabenbeschreibung war etwas knapp. Das von mir geschriebene Programm ist natürlich stark vereinfacht. Es soll angenommen werden, dass das zuerst eingegebene Passwort nicht bekannt ist und nicht am Bildschirm steht. Trotzdem soll man ins if mit der Ausgabe "Screen unlocked\n" und dem return kommen.
^^