A noter que Microsoft connait ce problème et n’as pas souhaité le corrigé car il faut le privilege debug, en gros si vous avez le privilege debug, pour Microsoft vous avez le droit de tout faire. (Meme si y a un priviliege chargement de driver, c pas grave :p)
5.
Taron | novembre 3rd, 2007 at 13:01
Ouais c’est vrai que ça craint un peu.. c’est une porte ouverte aux rootkits.
6.
b0l0k | novembre 3rd, 2007 at 17:02
Hmm, je croyais que t’avais deja fais un article sur les callgates
En tout cas, bon article
7.
whiskas | novembre 5th, 2007 at 16:58
« Sous Windows GS n’est pas utilisé »
Sous windows xp x64 il me semble que si, en fait le fs: reste pour la retro-compatibilite avec les app en 32bits, et donc contient le TEB en 32bits, alors que gs: pointe vers un TEB version 64bits.
A confirmer, je suis prive de windows. :\
8.
admin | novembre 6th, 2007 at 00:26
« Recall that the gs segment register refers to the base address of the TEB on x64. »
:] from http://www.nynaeve.net/?p=185
9.
martin | novembre 8th, 2007 at 07:29
On peut faire un far call sur un descripteur de tss et ca fait un chgt de tache automatique(sauvegarde/restauration de tous
les registres) avec une seule instruction. Ca a ete declare trop couteux par Jolitz il y a 20ans avec le premier port bsd sur pc.
donc la technique n’est plus utilisee a tort a mon avis.
Je pense que tu as utilise un emulateur pour le test?
Si oui il y a un petit bug et sur un descripteur type 12 fait un TaskSwitch() au lieu d’un simple Callgate() inter segment?
Sinon ?
Je voulais juste parler d’un problème non négligeable avec les callgate sous Windows.
Le système de callgate est effectivement un service proposé par l’architecture des x86 mais Windows de les tolère pas !
En effet, Windows permet un passage du Ring3 à Ring0 sous certaines conditions. Et en particulier, il faut que lors du passage de Ring3 à Ring0 les interruptions soient masquées.
Ceci est bien effectué automatiquement par le processeur en utilisant une interruption ou l’instruction sysenter mais pas en utilisant une callgate.
Il faut donc masquer les interruptions soit même avec l’instruction cli et les démasquer avec l’instruction sti (ce que tu fais). Mais cela ne suffit pas car il y a toujours un risque que le thread en cours soit switché avant le masquage des interruptions (avant l’exécution de cli).
Et lorsque cela arrive, c’est le crash.
Donc, en fait, la technique marche mais il y a toujours un risque de BSOD.
Il y a quelques années, je m’étais pris la tête avec cette histoire de callgate et je n’ai jamais trouvé de solution. Pour que cela soit fiable à 100%, il faudrait masquer les interruptions avant d’appeler la callgate. Donc il faudrait masquer les interruptions à partir du Ring3. Et là, je n’ai pas de solution.
Pour vérifier cela, il suffit de faire une petite boucle qui appelle la callgate infiniment. Ça devrait s’arrêter sur un beau BSOD dans un temps plus ou moins long.
[...] TSS se fait en accédant avec un FAR JMP ou FAR CALL sur une task gate (équivalent d’une callgate pour une tâche) pouvant se situé aussi bien dans la GDT que la [...]
12 Comments
1. Taron | novembre 2nd, 2007 at 16:57
http://www.f-secure.com/weblog/archives/kasslin_AVAR2006_KernelMalware_paper.pdf
2. admin | novembre 2nd, 2007 at 17:05
Pas mal, j’avais pas vu … moi au moins je fournit un code d’exemple
3. Taron | novembre 3rd, 2007 at 00:13
Ouais c’est pas une nouvelle méthode mais je trouve que tu l’illustres très bien… en plus avec un code ui..
4. mxatone | novembre 3rd, 2007 at 11:21
Très interessant et bien expliqué.
Si vous souhaitez plus de détails :
http://www.securiteam.com/windowsntfocus/5TP0B2KC0K.html
A noter que Microsoft connait ce problème et n’as pas souhaité le corrigé car il faut le privilege debug, en gros si vous avez le privilege debug, pour Microsoft vous avez le droit de tout faire. (Meme si y a un priviliege chargement de driver, c pas grave :p)
5. Taron | novembre 3rd, 2007 at 13:01
Ouais c’est vrai que ça craint un peu.. c’est une porte ouverte aux rootkits.
6. b0l0k | novembre 3rd, 2007 at 17:02
Hmm, je croyais que t’avais deja fais un article sur les callgates
En tout cas, bon article
7. whiskas | novembre 5th, 2007 at 16:58
« Sous Windows GS n’est pas utilisé »
Sous windows xp x64 il me semble que si, en fait le fs: reste pour la retro-compatibilite avec les app en 32bits, et donc contient le TEB en 32bits, alors que gs: pointe vers un TEB version 64bits.
A confirmer, je suis prive de windows. :\
8. admin | novembre 6th, 2007 at 00:26
« Recall that the gs segment register refers to the base address of the TEB on x64. »
:] from http://www.nynaeve.net/?p=185
9. martin | novembre 8th, 2007 at 07:29
On peut faire un far call sur un descripteur de tss et ca fait un chgt de tache automatique(sauvegarde/restauration de tous
les registres) avec une seule instruction. Ca a ete declare trop couteux par Jolitz il y a 20ans avec le premier port bsd sur pc.
donc la technique n’est plus utilisee a tort a mon avis.
Je pense que tu as utilise un emulateur pour le test?
Si oui il y a un petit bug et sur un descripteur type 12 fait un TaskSwitch() au lieu d’un simple Callgate() inter segment?
Sinon ?
10. Babewn | novembre 17th, 2007 at 18:01
Moi j’aime le colgate
avec ca j’ai la bouche fraiche pendant 24h
11. YoLeJedi | décembre 30th, 2007 at 22:33
Salut,
Sympa ton article Ivan.
Je voulais juste parler d’un problème non négligeable avec les callgate sous Windows.
Le système de callgate est effectivement un service proposé par l’architecture des x86 mais Windows de les tolère pas !
En effet, Windows permet un passage du Ring3 à Ring0 sous certaines conditions. Et en particulier, il faut que lors du passage de Ring3 à Ring0 les interruptions soient masquées.
Ceci est bien effectué automatiquement par le processeur en utilisant une interruption ou l’instruction sysenter mais pas en utilisant une callgate.
Il faut donc masquer les interruptions soit même avec l’instruction cli et les démasquer avec l’instruction sti (ce que tu fais). Mais cela ne suffit pas car il y a toujours un risque que le thread en cours soit switché avant le masquage des interruptions (avant l’exécution de cli).
Et lorsque cela arrive, c’est le crash.
Donc, en fait, la technique marche mais il y a toujours un risque de BSOD.
Il y a quelques années, je m’étais pris la tête avec cette histoire de callgate et je n’ai jamais trouvé de solution. Pour que cela soit fiable à 100%, il faudrait masquer les interruptions avant d’appeler la callgate. Donc il faudrait masquer les interruptions à partir du Ring3. Et là, je n’ai pas de solution.
Pour vérifier cela, il suffit de faire une petite boucle qui appelle la callgate infiniment. Ça devrait s’arrêter sur un beau BSOD dans un temps plus ou moins long.
Voilà pour la petite histoire
Bonne fêtes,
Lionel
12. Ivanlef0u’s Blog &r&hellip | septembre 20th, 2008 at 14:48
[...] TSS se fait en accédant avec un FAR JMP ou FAR CALL sur une task gate (équivalent d’une callgate pour une tâche) pouvant se situé aussi bien dans la GDT que la [...]
Trackback this post