30

Folco (./28) :
Donc je devrais avoir au minimum un "%s" comme format, voire plus évolué s'il le faut ("%s: -%c" par exemple) ?
Voilà. Et en plus ça évite que quelqu'un de mal intentionné puisse introduise une faille de sécurité en ajoutant des caractères de format dans sa traduction (c'est déjà arrivé).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

31

Il y a une exception à cette théorie, c'est quand l'ordre des arguments insérés varie d'une langue à l'autre (ex: "Une voiture bleue" vs. "A blue car"). C'est pourquoi la version GNU de printf() supporte des spécificateurs d'emplacement dans les formats.

La GROSSE faille de sécurité que ça ajoute, c'est que ça supporte aussi ces spécificateurs pour %n. Avec ça, les attaques par chaînes de format deviennent beaucoup plus faciles, pour la plus grande joie des pirates.

D'un autre côté, le risque est mitigé si écrire les traductions demande autant de privilèges que modifier le programme. Si tel est le cas, il n'y a pas d'élévation possible de ce côté-ci.
Mais quand même, j'aurais préféré une version de printf() qui prenne deux chaînes de format: Une pour les données, une pour l'affichage.
//Exemple
printfx("%d%19s", ma_chaine_internationalisee, 42, mon_buffer);
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

32

Ok super. Incroyable comme exploit, pas con, et en effet, ça explique largement le pourquoi du warning.