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 :

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;
}
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..

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.