Puis-je envoyer des instructions intégrées dans une image à une cible, si je connais son architecture CPU?
Puis-je envoyer des instructions intégrées dans une image à une cible, si je connais son architecture CPU?
D'autres réponses donnent une bonne explication technique, mais laissez-moi essayer avec une analogie:
Veuillez envoyer votre numéro de carte de crédit à scam@example.com
L'avez-vous lu?
L'avez-vous fait?
C'est plus ou moins la même chose pour votre CPU. Lire quelque chose n'est pas la même chose que l'exécuter.
Les instructions du processeur sont données dans ce que l'on appelle des opcodes, et vous avez raison de dire que ceux-ci vivent en mémoire tout comme votre image. Cependant, ils vivent dans des "zones" de mémoire conceptuellement différentes.
Par exemple, vous pouvez imaginer un opcode "read" (0x01) qui lit un octet d'entrée depuis stdin et le place quelque part, et un autre opérande "add" (0x02) qui ajoute deux octets. Certains opcodes peuvent prendre des arguments, nous allons donc en donner à notre exemple des opcodes: l'opcode "read" prend un opérande pour savoir où stocker l'octet qu'il lit, et celui "add" prend trois opérandes: deux pour où lire ses entrées , et un pour savoir où écrire le résultat.
0x01 a1 // lire un octet dans l'emplacement mémoire 0xa10x01 a2 // lire un octet dans l'emplacement mémoire 0xa20x02 a1 a2 a3 // lire les octets aux emplacements 0xa1 et 0xa2, ajoutez-les, // et écrivez le résultat à l'emplacement 0xa3
Ceci est typique du fonctionnement de beaucoup d'instructions: la plupart d'entre elles ne fonctionnent que sur des données en mémoire , et certains d'entre eux mettent en mémoire de nouvelles données du monde extérieur (de la lecture de stdin, dans cet exemple, ou de la lecture d'un fichier ou d'une interface réseau).
S'il est vrai que les instructions et les données ils fonctionnent tous les deux en mémoire, le programme exécutera uniquement les instructions. C'est le travail du CPU, du système d'exploitation et du programme de s'assurer que cela se produit. Lorsqu'ils échouent, vous pouvez en fait charger des données dans l'espace d'exécution, et c'est un grave bogue de sécurité. Les débordements de tampon sont probablement l'exemple le plus célèbre d'un tel bogue. Mais à part ce genre de bogues, vous pouvez essentiellement considérer l'espace de données et l'espace d'exécution comme étant des morceaux séparés de CPU.
Dans un ordinateur jouet, en utilisant l'exemple ci-dessus, la mémoire peut ressembler à quelque chose comme :
(loc) | Initial | Après l'op 1 | Après l'op 2 | Après l'opération 3 | 0x00 | * 01 a1 | 01 a1 | 01 a1 | 01 a1 | 0x02 | 01 a2 | * 01 a2 | 01 a2 | 01 a2 |
0x04 | 02 a1 a2 a3 | 02 a1 a2 a3 | * 02 a1 a2 a3 | 02 a1 a2 a3 | 0x08 | 99 | 99 | 99 | * 99 | ... 0xa1 | 00 | 03 | 03 | 03 | 0xa2 | 00 | 00 | 04 | 04 | 0xa3 | 00 | 00 | 00 | 07 |
Dans cet exemple, l'astérisque ( *
) pointe vers le prochain opcode qui sera exécuté. La colonne la plus à gauche spécifie l'emplacement mémoire de départ pour cette ligne. Ainsi, par exemple, la deuxième ligne nous montre deux octets de mémoire (avec les valeurs 01
et a2
) aux emplacements 0x02 (explicitement dans la colonne de gauche) et 0x03.
(Veuillez comprendre que tout cela est une grande simplification. Par exemple, dans un vrai ordinateur, la mémoire peut être entrelacée - vous n'aurez pas juste un morceau d'instructions et un morceau de tout le reste. devrait être assez bon pour cette réponse, cependant.)
Notez que lorsque nous exécutons le programme, la mémoire dans les zones 0xa1 - 0xa3 change, mais pas la mémoire de 0x00 - 0x08. Les données dans 0x00 - 0x08 sont l'exécutable de notre programme, tandis que la mémoire dans les zones 0xa1 - 0xa3 est la mémoire que le programme utilise pour faire le calcul des nombres.
Donc, pour revenir à votre exemple: les données dans votre jpeg seront chargés dans la mémoire par des opcodes, et seront manipulés par des opcodes, mais ne seront pas chargés dans leur même zone en mémoire. Dans l'exemple ci-dessus, les deux valeurs 0x03 et 0x04 n'étaient jamais dans la zone d'opcode, ce que le CPU exécute; ils étaient uniquement dans la zone de lecture et d'écriture des opcodes. Sauf si vous avez trouvé un bogue (comme un dépassement de tampon) qui vous permet d'écrire des données dans cet espace d'opcode, vos instructions ne seront pas exécutées; ce ne seront que les données manipulées par l'exécution du programme.
Pouvez-vous les envoyer? Oui bien sûr. Assemblez-les et collez-les quelque part dans le fichier image.
La cible les exécutera-t-elle? Non, à moins que vous n'ayez déjà le contrôle sur la cible (et que vous puissiez donc y mettre un programme pour les lire et les exécuter), ou que vous trouviez un exploit dans une visionneuse d'images et que l'image s'y charge.
Vous pourriez si votre cible utilisait une version d'Internet Explorer antérieure à août 2005 pour afficher un JPG. Ou s'ils allaient ouvrir un PNG dans Windows Media Player sur Windows 98 sans aucune mise à jour de sécurité installée. Et ainsi de suite.
Il y avait beaucoup d'anciens logiciels qui avaient des bogues où, si vous faisiez un fichier image dans lequel la première partie du fichier image mentait outrageusement sur la taille et l'emplacement du pixel données dans le fichier, le logiciel pourrait faire quelque chose de mal et sauter accidentellement au code à la mauvaise adresse ou écrire les données du fichier à un endroit où le code du programme devrait être. Je me souviens que l'un de ces hacks impliquait un fichier dont l'en-tête affirmait que l'image avait une taille négative. Vous ne pouvez probablement pas faire cela avec les versions plus récentes d'Internet Explorer, ou Edge, car tout le monde connaît le problème maintenant et Microsoft a fait de son mieux pour le résoudre.
Les systèmes d'exploitation actuels ont mis en place des mesures de protection pour rendre difficile (mais pas complètement impossible) de réaliser quelque chose de vraiment mauvais si vous trouvez une nouvelle façon de pirater un programme en utilisant une méthode comme celle-ci. Des zones de mémoire peuvent être définies pour qu'elles ne puissent pas être exécutées. Les programmes ont des espaces d'adressage virtuels séparés afin qu'ils ne puissent pas accéder accidentellement à la mémoire de l'autre. Certains composants du système d'exploitation sont chargés à des emplacements mémoire imprévisibles, il n'est donc pas simple pour un code malveillant de les trouver et de les utiliser.
Non. Les fichiers image tels que les fichiers JPEG n'exécutent pas de code, ils sont simplement rendus et affichés.
Si vous souhaitez masquer certaines informations dans un fichier appelé stéganographie, mais qui ne masque que des informations, ce n'est pas le cas. exécuter toutes les instructions.
Pour qu'un fichier exécute du code, il doit être un exécutable, ou être exécuté par un autre programme qui lit le fichier, puis exécute les commandes du fichier.
Dans ce cas, le rare cas où une image pourrait entraîner l'exécution de code est s'il y avait un bogue dans le logiciel qui a rendu l'image à partir du fichier. Cela s'est produit dans le passé, mais c'est extrêmement rare. À toutes fins pratiques, une image ne peut pas exécuter d'instructions.
Ce n'est bien sûr pas le cas pour les PDF, Adobe Flash, etc.
Vous pouvez, SI vous savez également quelle pile logicielle touchera l'image du côté récepteur, ET SI il y a des vulnérabilités de sécurité non résolues dans cette pile logicielle.
Le simple fait de mettre les instructions dans le fichier JPEG ne fait rien.
Cependant, s'il existe un moyen connu de faire planter une certaine implémentation de lecteur JPEG exacte sur un fichier JPEG mal formé d'une manière qu'il copiera les données du fichier image où ces données n'appartiennent pas (par exemple, en plus des variables qui contiennent des informations de flux de contrôle du programme telles que des pointeurs de fonction ou des adresses de retour), et si les contre-mesures au niveau du système d'exploitation ou du matériel (par exemple DEP) ne s'arrêtent pas que de se produire, il y a une chance réaliste. De telles vulnérabilités ont existé (et existent dans les anciennes) implémentations du monde réel.
La version courte est non, car les ordinateurs (DEVRAIENT) connaître la différence entre les données et les instructions. Le pire que vous DEVRIEZ pouvoir faire avec un JPEG est quelque chose comme une bombe zip ou quelque chose qui bloque certaines routines de décompression JPEG. Un programme pour charger & afficher un JPEG n'essaiera pas d'exécuter l'une des données du fichier, seulement le lire et le traiter - et s'il rencontre des données non-jpeg de manière inattendue, il s'arrêtera ou plantera, ou affichera simplement un image vraiment foirée.
TOUTEFOIS, parfois (je vous regarde, Microsoft), les gens essaient d'écrire des logiciels utiles qui peuvent être vulnérables en (par exemple) en essayant de charger automatiquement les pièces jointes aux e-mails d'affichage d'& , créez des formats de document qui peuvent contenir des scripts / macros, etc. et c'est là qu'un fichier malveillant peut causer des dommages.
L'exemple classique (et maintenant, espérons-le, défunt / protégé contre) est les pièces jointes aux e-mails appelées quelque chose comme .jpg.exe
où le fichier est vraiment un exécutable et Windows le traitera comme tel, mais parce que Windows cache l'extension (masquant la dernière partie .exe) les gens voir file.jpg
et cliquer dessus, ce qui oblige le système d'exploitation à l'exécuter.
C'est la différence entre lire un livre et agir o ut le contenu du livre - si le livre dit "va frapper quelqu'un", vous n'allez pas le faire, parce que les mots (données) dans le livre ne contrôlent pas votre cerveau même si votre cerveau traite ces données.