Steve Gibson a posté une nouvelle fort intéressante à propos de la
dernière "faille" de sécurité des fichiers WMF. Je place faille entre
guillemets, car beaucoup de questions se posent aujourd'hui sur la
présence de cette dernière.
Pour résumer, le format WMF est un format metafile (càd une liste de
commandes graphiques GDI appliquées à un contexte, qui sont sérialisées
dans un fichier pour être "rejouées" ; càd sur l'écran, l'imprimante, un
buffer graphique, etc.)
En gros, le fichier comportera une liste de commandes telles que "change
la couleur du pinceau en rouge", "trace un trait", "trace un carré ici",
etc. Lors qu'il sera rejouté sur un device, comme un écran, il permettra
de recomposer l'image ou de l'imprimer.
Lors d'une impression [sur un context, qui peut être un écran, encore
une fois], un contexte graphique peut contenir un callback en cas
d'erreur de traitement. Pour une imprimante, cela peut être un problème
de papier, d'encre, ou une simple annulation de la part de l'utilisateur.
Cela permet alors d'interrompre une impression, proposer à l'utilisateur
de reprendre, etc.
Ce callback est interne au programme, comme le sont tous les callbacks.
La procédure d'interruption de MsPaint ne sera pas la même que celle de
Photoshop, etc. Si vous utilisez une fonction système acceptant un
callback, vous placez VOTRE callback, pas celui d'un voisin.
Ainsi un tel callback n'a virtuellement aucun interêt DANS un fichier
meta (2). A l'exterieur, oui, dans le programme réalisant l'impression.
Mais quel interêt a l'intérieur du fichier meta lui même ? De plus, pour
qu'il puisse fonctionner, il faut prévoir la sérialisation de ce code ;
ce qui demande quelques adaptations [code ne nécessitant pas de
rellocation, càd du code relatif]
Il y a encore pire (3): le callback serait executé directement
uniquement si la taille du record est déclarée avec une taille invalide
de .. 1 octet. Troublant ? Un bug assez étonnant, et qui pose de
sérieuses questions sur le but recherché lors de l'ajout de cette
fonctionnalité.
La faille WMF, une fausse vrai faille cachant une vrai fausse backdoor ?
(2)
Windows MetaFiles are a completely different sort of animal.
When you create a MetaFile you are actually creating a MetaFile
Device Context that starts out blank. Then, as the GDI
functions in the MetaFile are executed, those GDI drawing
functions are "drawn" or applied onto the Metafile's Device
Context.
But MetaFiles are not "printed", to do that you need a "printer
Device Context", which is different from screen contexts and
metafile contexts. So it makes no sense to set an abort proc in
a metafile. But even so, there would presumably be no reason
for not allowing an abort proc to be set."
(3)
And, what's more ... remember my posting yesterday where I said
that I had some initial trouble getting my own tester to trigger
the exploit? The reason for that was the clincher for me, up to
this point: The only way to get this special behavior is to
deliberately mis-set the LENGTH of that ESCAPE/SetAbortProc
metafile record to ONE.
But since EVERY METAFILE RECORD starts out with a mandatory
four-byte record length, followed by a two-byte function code,
the smallest possible record is six-bytes, or a size of THREE
words. Therefore the use of a word-length of ONE is impossible.
It was put in there as a safety interlock to prevent the mis-
firing of this backdoor in the event that some whacky metafile
would actually HAVE a needless (because it's not a printer
device context) Escape/SetAbortProc metafile record.
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
mais bien par l'extension
Non.
Exemples:
Un fichier avec mime "text/plain" et extension .txt qui renvoi une image <http://xroche.free.fr/test/faketest/sommaire.txt?ct=text/plain> -> IE affiche l'image -> Mozilla télécharge le fichier et l'ouvre dans un éditeur de texte (comportement correct)
Un fichier avec mime "text/html" et extension .html qui renvoi une image <http://xroche.free.fr/test/faketest/sommaire.html?ct=text/html> -> IE affiche l'image -> Mozilla télécharge le fichier et l'ouvre dans une nouvelle fenêtre, mode HTML (comportement correct)
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.html?ct=text/plain> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Emmanuel Florac wrote:
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
mais bien par l'extension
Non.
Exemples:
Un fichier avec mime "text/plain" et extension .txt qui renvoi une image
<http://xroche.free.fr/test/faketest/sommaire.txt?ct=text/plain>
-> IE affiche l'image
-> Mozilla télécharge le fichier et l'ouvre dans un éditeur de texte
(comportement correct)
Un fichier avec mime "text/html" et extension .html qui renvoi une image
<http://xroche.free.fr/test/faketest/sommaire.html?ct=text/html>
-> IE affiche l'image
-> Mozilla télécharge le fichier et l'ouvre dans une nouvelle fenêtre,
mode HTML (comportement correct)
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image
<http://xroche.free.fr/test/faketest/install.html?ct=text/plain>
-> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
mais bien par l'extension
Non.
Exemples:
Un fichier avec mime "text/plain" et extension .txt qui renvoi une image <http://xroche.free.fr/test/faketest/sommaire.txt?ct=text/plain> -> IE affiche l'image -> Mozilla télécharge le fichier et l'ouvre dans un éditeur de texte (comportement correct)
Un fichier avec mime "text/html" et extension .html qui renvoi une image <http://xroche.free.fr/test/faketest/sommaire.html?ct=text/html> -> IE affiche l'image -> Mozilla télécharge le fichier et l'ouvre dans une nouvelle fenêtre, mode HTML (comportement correct)
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.html?ct=text/plain> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Xavier Roche
Xavier Roche wrote:
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.html?ct=text/plain> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Il fallait bien entendu lire:
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.zip?ct=audio/mp3> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Xavier Roche wrote:
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image
<http://xroche.free.fr/test/faketest/install.html?ct=text/plain>
-> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Il fallait bien entendu lire:
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image
<http://xroche.free.fr/test/faketest/install.zip?ct=audio/mp3>
-> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.html?ct=text/plain> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Il fallait bien entendu lire:
Un fichier avec mime "audio/mp3" et extension .zip qui renvoi une image <http://xroche.free.fr/test/faketest/install.zip?ct=audio/mp3> -> IE et Mozilla lancent un lecteur multimédia (comportement correct, ouf)
Laurent Blume
Xavier Roche wrote:
Emmanuel Florac wrote:
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
[snip exemples]
Je l'ai vu faire de manière un peu étonnante, en me battant avec un servlet générant des fichiers XLS, si je me rappelle bien.
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est classique, mais dans les logs Apache, je voyais 2 requêtes: une première, incomplète, de IE, et immédiatement après, une seconde, complète, d'Office (différent User-Agent).
Avec Firefox, une seule requête apparaissait, celle de Firefox.
Laurent
Xavier Roche wrote:
Emmanuel Florac wrote:
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
[snip exemples]
Je l'ai vu faire de manière un peu étonnante, en me battant avec un
servlet générant des fichiers XLS, si je me rappelle bien.
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est
classique, mais dans les logs Apache, je voyais 2 requêtes: une
première, incomplète, de IE, et immédiatement après, une seconde,
complète, d'Office (différent User-Agent).
Avec Firefox, une seule requête apparaissait, celle de Firefox.
Non, je ne crois pas, la détection n'a jamais été par le contenu
Sisi. Très souvent.
(comment ferait il?)
Signature du fichier ("GIF87a" ou "GIF89a")
[snip exemples]
Je l'ai vu faire de manière un peu étonnante, en me battant avec un servlet générant des fichiers XLS, si je me rappelle bien.
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est classique, mais dans les logs Apache, je voyais 2 requêtes: une première, incomplète, de IE, et immédiatement après, une seconde, complète, d'Office (différent User-Agent).
Avec Firefox, une seule requête apparaissait, celle de Firefox.
Laurent
Xavier Roche
Laurent Blume wrote:
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est classique, mais dans les logs Apache, je voyais 2 requêtes: une première, incomplète, de IE, et immédiatement après, une seconde, complète, d'Office (différent User-Agent).
Et vous n'avez pas joué avec du contenu attaché délivré par POST dans ce genre de cas. Selon la version d'IE, vous pouvez très bien avoir deux POST, un seul POST et un GET (!), ou encore un POST et rien d'autre (mais ça ne fonctionne pas)
Le comportement est en général non déterministe, même avec une version donnée de IE.
C'est rassurant ..
Laurent Blume wrote:
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est
classique, mais dans les logs Apache, je voyais 2 requêtes: une
première, incomplète, de IE, et immédiatement après, une seconde,
complète, d'Office (différent User-Agent).
Et vous n'avez pas joué avec du contenu attaché délivré par POST dans ce
genre de cas. Selon la version d'IE, vous pouvez très bien avoir deux
POST, un seul POST et un GET (!), ou encore un POST et rien d'autre
(mais ça ne fonctionne pas)
Le comportement est en général non déterministe, même avec une version
donnée de IE.
Il fallait que l'URL de la servlet se termine par .xls, ça, c'est classique, mais dans les logs Apache, je voyais 2 requêtes: une première, incomplète, de IE, et immédiatement après, une seconde, complète, d'Office (différent User-Agent).
Et vous n'avez pas joué avec du contenu attaché délivré par POST dans ce genre de cas. Selon la version d'IE, vous pouvez très bien avoir deux POST, un seul POST et un GET (!), ou encore un POST et rien d'autre (mais ça ne fonctionne pas)
Le comportement est en général non déterministe, même avec une version donnée de IE.
C'est rassurant ..
Nicob
On Thu, 19 Jan 2006 12:05:20 +0000, Erwan David wrote:
Il n'y a pa longtemps un fichier .jpg en image/jpeg contenant du html+js exécutait le js. Il doit trainer encore quelque part (chercher cupholder.jpg) et en plus il acédait au lecteur de CD...
S'il ouvre le lecteur CD, ce ne doit pas être du JavaScript, mais sans doute du VBScript. Après un petit Google (code non testé) :
SCRIPT language=VBScript> <!--
Set oWMP = CreateObject("WMPlayer.OCX.7" ) Set colCDROMs = oWMP.cdromCollection
if colCDROMs.Count >= 1 then For i = 0 to colCDROMs.Count - 1 colCDROMs.Item(i).Eject Next ' cdrom End If
--> </SCRIPT>
Nicob
On Thu, 19 Jan 2006 12:05:20 +0000, Erwan David wrote:
Il n'y a pa longtemps un fichier .jpg en image/jpeg contenant du
html+js exécutait le js. Il doit trainer encore quelque part (chercher
cupholder.jpg) et en plus il acédait au lecteur de CD...
S'il ouvre le lecteur CD, ce ne doit pas être du JavaScript, mais sans
doute du VBScript. Après un petit Google (code non testé) :
SCRIPT language=VBScript>
<!--
Set oWMP = CreateObject("WMPlayer.OCX.7" )
Set colCDROMs = oWMP.cdromCollection
if colCDROMs.Count >= 1 then
For i = 0 to colCDROMs.Count - 1
colCDROMs.Item(i).Eject
Next ' cdrom
End If
On Thu, 19 Jan 2006 12:05:20 +0000, Erwan David wrote:
Il n'y a pa longtemps un fichier .jpg en image/jpeg contenant du html+js exécutait le js. Il doit trainer encore quelque part (chercher cupholder.jpg) et en plus il acédait au lecteur de CD...
S'il ouvre le lecteur CD, ce ne doit pas être du JavaScript, mais sans doute du VBScript. Après un petit Google (code non testé) :
SCRIPT language=VBScript> <!--
Set oWMP = CreateObject("WMPlayer.OCX.7" ) Set colCDROMs = oWMP.cdromCollection
if colCDROMs.Count >= 1 then For i = 0 to colCDROMs.Count - 1 colCDROMs.Item(i).Eject Next ' cdrom End If