* 10 *

Softwaresikkerhet II

Selv-test spørsmål

  1. Anta at du skriver et program og at du trenger å konstruere hele navnet til filen som du skal åpne. Filennavnet består av et directory-path og selve nodenavnet. Nodenavn kan vanligvis ikke være lengre enn 255 tegn. Forklar minst to ting som er galt med dette:
    
    char *BuildName(char *path, char *name)
    
    { char buffer[256];
    
    sprintf(buffer,"%s/%s",path,name);
    
    return buffer;
    }
    
    
  2. Skriv om funksjonen slik at den er sikker. Hint, bruk strlen() for å sjekke lengder.
  3. Anta at filbanen var et brukerområde, og vi akter å skrive til en fil, e.g.
    name = BuildName("/home/mark",".cshrc");
    
    fp = fopen(name,"w");
    
    
    Beskriv en sikker måte som en systemprosess kan bruke for å åpne filen. Beskriv hva som kan gå galt med denne enkle operasjonen.
  4. Forklar hav som menes med en race condition.
  5. Forklar hva som menes med sandbox security model.
  6. Beskriv de forbyggende tiltak Java tar mot sikkerhetsproblemer.

Karaktergivende oppgaver

Hensikten med det praktiske arbeidet denne uke er å demonstrere flere software tabber.

  1. Det første problemet har med å sette rettigheter på nye filer. Filer ender ikke alltid opp med de rettighetene som opprinnelig var intensjonen. Attributtarv kan ødelegge dette. Se på følgende manualsidene:
    man 2 chmod
    man stat
    
    Forandre koden i Security Kit filen appl.cpp slik at den innholder følgende:
    main ()
    
    { FILE *fp;
      struct stat statbuf;
    
    umask(0);   // Change this and remove it...see what happens
    
    if ((fp = fopen("newfile","w")) == NULL)
       {
       perror("fopen");
       return error;
       }
    
    fprintf(fp,"This is an example file.");
    
    fclose(fp);
    
    // Now check permissions
    
    if (stat("newfile",&statbuf) == -1)
       {
       perror("stat");
       return error;
       }
    
    printf("The file perms on the file are %o\n",statbuf.st_mode & 07777);
    
    chmod("newfile",0755);
    
    if (stat("newfile",&statbuf) == -1)
       {
       perror("stat");
       return error;
       }
    
    printf("The file perms on the file are now %o\n",statbuf.st_mode & 07777);
    }
    
    
    Kompiler og kjør dette programmet. Prøv å slette umask linjen fra programmet og forandre verdien til umask i shellet i stedet:
    % umask 0
    % ./appl
    % umask 022
    % ./appl
    % umask 077
    % ./appl
    
    Husk det å slette filen newfile mellom prøvene for å se virkningen av filopprettelse. Arv av attributter fører til problemer!

  2. I Security Kit, tast inn følgende programmet. Dette programmet bruker en pipe-strøm for å eksekvere en shellkommando (ls -al). Det leser output fra kommandoen og skriver den tilbake på skjermen.
    
    main()
    
    { FILE *pp;
      char line[1024];
    
    line[0] = '\0';
    
    if ((pp = popen("ls -al","r")) == NULL)
       {
       printf("cannot open\n");
       exit(0);
       }
    
    while(!feof(pp))
       {
       fgets(line,1024,pp);
       printf("comm: %s",line);
       }
    
    printf("Done with program\n");
    
    pclose(pp);
    }
    
    
    Legg merke til hvordan programmet ikke spesifiserer en PATH for kommandoen ls, men programmet kompilerer og kjører allikevel. Grunnen er at et implisitt Bourne shell brukes for å tolke kommandoen.

    Bytt ut:

    popen()   ->  cfpopen()
    pclose()      cfpclose()
    
    i programmet og legg merke til at programmet ikke lenger eksekveres. I stedet åpnes det en blank datastrøm til kommandoen som ikke ble funnet. Selv om dette oppførselet er noe suspekt indikerer det at ingen shell er lenger involvert i forsøk på å eksekvere kommandoer.

    Uansett bør en PATH alltid skrives eksplisitt. Sjekk hva som skjer dersom du linker kommandoen ls til directoryet du kjører fra:

    ln -s /bin/ls ./ls
    
    Kjor programmet på nytt og bekreft at exec funksjonen som jobber bak kulissene for (cf)popen ser etter programmer uten PATH i current-directory. Dette kan også føre til feil.
  3. Hensikten med denne oppgaven er å simulere race-conditions i sakte film. Dette dreier seg om hvordan datastrømmer kan vekselvirke med delte ressurser og hvordan crackers kan utnytte den tiden en prosess sover til å lure noe inn i datastrømmen.

    For å utføre oppgaven kommer du til å trenge tre vinduer, en per prosess. En sender en mottager og en angriper. Du må kompilere programmene nedenfor. Du trenger ikke Security Kit for å gjøre dette, det bør holde å kompilere med:

    gcc -o prog1 prog1.c
    
    osv.

    Her er senderprogrammet. Det er et meget forenklet program som genererer en strøm med data. For å gjøre ting klarest mulig skriver den ut en liste med tall Disse skrives til en fil som heter pipe_simul, som er en representasjon av en pipe (rør) mellom programmene. F.eks. det kune være en Unix pipe eller det kunne være en nettverksforbindelse mellom klient og server.

    #include 
    
    main()
    
    { FILE *fp;
      int i;
      char line[1024];
    
    for (i = 0; i < 10; i++)
       {
       if ((fp = fopen("pipe_simul","a")) == NULL)
          {
          exit(1);
          }
    
       fprintf(fp,"Line %d\n",i);
    
       fclose(fp);
    
       sleep(5);  /* simulate context switch or delay between packets */
       }
    }
    
    Her er mottaker programmet. Det leser datastrømmen fra pipen og sender outputen til skjermen.
    #include 
    
    main()
    
    { FILE *fp;
      char line[1024];
    
    fp = fopen("pipe_simul","r");
    
    while (!feof(fp))
       {
       fgets(line,1023,fp);
    
       printf("read: %s\n",line);
    
       sleep(5);   /* Context switch */
       }
    
    fclose(fp);
    }
    
    Kompiler disse programmene og kjør dem, i et vindu for seg. Start det første programmet først. Du bør observere at det første programmet skriver data, og at det andre programmet leser dem. Se gjennom programmene og pass på at du skjønner hvorfor dette skjer.

    Slett nå filen pipe_simul og start pånytt. Denne gangen, når prosessene kjører, prøv å taste følgende inn i det tredje vinduet:

    echo "Attack by a man in the middle" >> pipe_simul
    
    Du bør se at denne setningen dukker opp i utskrikten til det andre programmet, etter en kort stund. Du kan øke hastigheten hvis du vil for å gjøre ting mer realistisk, ved å redusere sleep-tiden. Skjønner du hvordan dette kan brukes for å lure et challenge-response system?

    Poenget er dette: så lenge en mann i midten har tilgang til det mediet som brukes for å overføre/lagre data, så er det lett å utføre et slikt angrep. I Internett-tilfellet har hver maskin tilgang til internettet. Angriperen trenger selvsagt kunnskaper om hva slags transaksjoner som foregår for å forandre en samtale. Det blir også mye vanskeligere å oppnå ettersom hastigheten øker og alt blir mer tidskritisk.

Din gruppe bør dokumentere disse oppgavene til den neste obligatoriske innleveringen.

Back