Bonjour,
en lisant un livre sur le fuzzing, je suis tombé sur un problème intéressant de race condition :
Imaginons un programme utilisant le setuid linux. Il effectue une écriture dans un fichier avec un code ressemblant à celui-la :
En exécutant ce logiciel, on remarque qu'il y a un laps de temps entre le check des droits et l'écriture dans le fichier..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <unistd.h> #include <sys/types.h> int checkAccess(char* _filename) { struct stat results; stat(_filename, &results); if (results.st_mode & S_IWUSR) return 1; else return 0; } int main(char argc, char* argv[]) { FILE* fp; char* filename = "leg_file.txt"; pid_t pid = getpid(); printf("PID %d\n", pid); while(1) { if(checkAccess(filename) == 1) { printf("10 second for exploit\n"); sleep(10); fp = fopen(filename, "a+"); printf("New open\n"); fwrite("a\n", 1, 2, fp); fclose(fp); printf("Now is close\n"); } } return 1; }
On peut donc utiliser ce lap de temps pour remplacer le fichier légitime :
- leg_file.txt
par
- cp -s /etc/passwd leg_file.txt
Mon soucis est que je ne trouve aucune parade (en code uniquement) pour lutter contre cette race condition.
p.s. Evidemment le sleep est la pour simplifier l'exploit, mais on peut imaginer un bruteforce.
Partager