Re: optimisation vs securite
[ Nouvelle discussion
| Répondre au groupe
|
fr.comp.lang.c ]
Sujet: Re: optimisation vs securite
De: xro...@free.fr.NOSPAM.invalid (Xavier Roche)
Groupes: fr.comp.lang.c
Organisation: Nowhere Corp.
Date: 07. May 2008, 14:00:42
References: 1
|
Thierry B. a écrit :
> problèmes de potentiels buffer-overflow quand Gcc (et d'autres)
> optimisent un peu trop sur certaines condition/tests.
De toute manière, c'est le test <pointeur>+<taille venant de
l'extérieur> qui est potentiellement dangereux.
C'est le cas classique dans beaucoup (trop) de "parseurs" d'objets
structurés (fichiers GIF, PNG, documents divers, etc.) qui ont souvent
une structure du genre:
void parseFoo(const unsigned char *buffer, size_t buffSize) {
/* current pointer */
const unsigned char *ptr;
/* parse all "foo" blocks */
for(ptr = buffer ; ptr + 4 <= buff + buffSize ; ) {
/* next block size */
unsigned int size = ( ptr[0] << 24 )
+ ( ptr[1] << 16 )
+ ( ptr[2] << 8 )
+ ptr[3];
ptr += 4; /* skip size ob next chunk */
/* block not too large/corrupted/truncated ? */
if (ptr + size <= buffer + buffSize) {
..
} else {
break ;
}
ptr += size;
}
}
Une forme moins dangereuse qui évite que l'information extérieure "size"
ne puisse provoquer un débordement (par exemple avec size == 0xfffffffc
qui provoque une boucle rigolote) et de séparer dans la comparaison à
gauche ce qui provient de l'extérieur, et à droite, le reste:
- if (ptr + size <= buffer + buffSize) {
+ if (size <= buffer + buffSize - ptr) {

|
 cette fonctionnalité est reservée aux membres ayant une session active !
|