[ Home | Liste | F.A.Q. | Risorse | Cerca... ]


[ Data: precedente | successivo | indice ] [ Argomento: precedente | successivo | indice ]


Archivio: Novembre 2001 ml@sikurezza.org
Soggetto: Re: weird Windows 2000/XP bug [identificata possibile causa?]
Mittente: KJK::Hyperion
Data: 7 Nov 2001 09:38:51 -0000
At 05.55 03/11/2001 +0100, you wrote:

>Il Bug colpisce il Command Prompt di Windows NT/2000/XP. Il CMD.EXE e il 
>Command.com crashano se una stringa contenente almeno un carattere di 
>tabulazione (ASCII/HEX 09), seguito da una sequenza di backspaces 
>(ASCII/HEX 08) e da un carattere casuale viene visualizzata sullo standard 
>output o lo standard error. In questo caso Windows NT4 si blocca con la 
>classica schermata blu, mentre 2000 e XP si riavviano immediatamente.

Vedo un po' di confusione. Buono lo spirito di fondo, ma esecuzione 
confusionaria.
Primo: improbabile, impossibile che un normalissimo programma causi uno 
schermo blu. cmd.exe e command.com sono due programmi come tanti altri, 
senza nulla di speciale
Secondo: la finestra di console, a differenza di quanto sostengono diffuse 
credenze popolari, non è creata da cmd.exe o command.com, ma:
  - in Windows 95 e 98: le finestre fanno parte del processo kernel32, che 
però si limita ad ospitarle nel suo spazio di indirizzamento, il vero 
codice (nonchè la dialog da cui viene generata la finestra) si trova in 
winoa386.mod, libreria a 16 bit. Inoltre, ad ogni console corrisponde 
un'istanza di una V86 (sempre, anche per programmi a 32 bit)
  - in Windows NT/2000/XP: le finestre di console sono gestite da un 
processo, csrss.exe, che svolge anche, tra le altre, funzioni di gestione 
della tabella dei processi. Nonostante il suo ruolo sia stato notevolmente 
ridimensionato in NT 4, gode comunque di diritti superiori al normale: non 
può essere agganciato dai debugger, non può essere terminato (nemmeno 
modificandone la ACL), e soprattutto si registra all'avvio come il gestore 
degli errori critici (è lui ad esempio a mostrare le finestre di messaggio 
in caso di un GPF), cosa che gli permette, credo unico tra tutti i processi 
in user mode, di mandare il sistema in bugcheck (schermo blu o reset a 
seconda della configurazione)

(riguardo a Cygwin, ricordo che l'I/O su console è pesantemente filtrata, 
passa tutto prima per un'emulazione di termcap con emulazione ANSI. Un test 
potrebbe essere l'esecuzione del file batch della morte all'interno della 
shell 4NT, che quasi sicuramente - a giudicare da quello che riesce a fare 
- usa l'I/O di basso livello, e vedere se intercetta i backspace o se li 
lascia gestire al sistema)

Ricapitoliamo:
  - si tratta di un errore di puntatore nullo nel gestore delle finestre di 
console. DOS non ne è affetto. Windows 98 nemmeno. Tutta la famiglia NT lo è
  - si verifica nella fase di sganciamento, dopo la chiamata ad 
ExitProcess. Ebbene, una delle primissime cose (la prima è una chiamata a 
LdrShutdownProcess, per scaricare le dll) fatte da ExitProcess è comunicare 
a csrss tramite funzioni della famiglia Csr* che un processo è terminato 
(ricordate? mantiene una tabella dei processi attivi)
  - un solo programma ha il potere di mandare in halt il kernel

Tutti gli indizi sembrano puntare il dito contro un unico colpevole: csrss.exe.

Tutto questo ovviamente IMHO e dal basso di una crassa e abissale ignoranza 
in qualsiasi cosa che esuli dai sistemi operativi NT

La mia "scommessa" è che ExitProcess crasha prima di ritornare da 
CsrClientCallServer; cosa avvenga realmente in csrss è un vespaio da 
debuggare perchè CsrClientCallServer alla fine si risolve in una chiamata a 
NtRequestPort o NtRequestWaitReplyPort, comunque in un context switch che 
trasferisce il controllo a csrss, che come ho già detto non è (normalmente) 
debuggabile

Ora comunque lo provo, voglio almeno vedere di che errore si tratta


________________________________________________________
http://www.sikurezza.org - Italian Security Mailing List




[ Home | Liste | F.A.Q. | Risorse | Cerca... ]

www.sikurezza.org - Italian Security Mailing List
(c) 1999-2005