martes, 15 de septiembre de 2009

¿Infectar código fuente?

Supongamos que estaba haciendo un programa en C# con Visual Studio en el que quería poner unos bonitos botones rosas:

gogirls

En realidad es un control personalizado en el que he sobrescrito el método OnPaint, algo así:

image[Offtopic: Molaría poner en el blog algo que colorease el código fuente, pusiera el número de línea, unas scrollbars… ¿se podrá en blogspot?]

Hasta aquí todo mas o menos normal, pero es entonces cuando me fijo que el IDE, Visual Studio, en tiempo de diseño está mostrando el botón exactamente como quedaría una vez compilado y ejecutado el programa.

image

¿Pero como es posible? En tiempo de diseño Visual Studio no puede saber como quedará el botón que yo pinto manualmente, a no ser… que esté ejecutando el método OnPaint para ofrecer al programador una previsualización del formulario tal y como quedará en tiempo de ejecución.

Es decir Visual Studio va a ejecutar lo que halla en el método OnPaint de los controles personalizados que tengamos en el formulario que estemos previsualizando en ese momento.

¿Y si colocásemos en el método OnPaint código malicioso? Un developer que abriese el proyecto y visualizara el diseño del formulario ejecutaría sin saberlo el malvado código malicioso. Esto sería perfecto para infectar a un programador del que sabemos que es muy probable que abra confiadamente el proyecto que le pasemos y trastee felizmente con la interfaz.

Desde aquí podéis bajaos un proyecto de Visual Studio que tras ser abierto y visualizado el form1.cs, se ejecutará la calculadora de Windows sin necesidad de compilar ni ejecutar el proyecto. Nota: Uso el registro “como un mutex” para que solo se ejecute una vez la calculadora.

image

Como he puesto que se ejecute la calculadora de Windows podía haber puesto que se ejecute un binario incluido en el proyecto o que lo descargue y ejecute o … algo mas interesante.

El código malicioso podría buscar todos los proyectos de Visual Studio e insertar en ellos un botón personalizado de 0x0 con un método OnPaint que haga exactamente lo mismo (buscar todos los proyectos e infectarlos, etc…). Y así infectaría todos los proyectos de VS de ese ordenador. Esto en un desarrollador que comparta sus códigos mediante SVN, SourceSafe o CodePlex, SourceSafe podría causar estragos. Sería como un virus en el código fuente.

Y esto me recuerda al virus W32/Induc comentado por aquí, por acá, por allá y por mas allá. Este virus infecta el compilador de Delphi, modifica una dependencia incluida en todos los ejecutables, de modo que cada ejecutable compilado con ese ordenador queda infectado y trata de infectar el compilador de Delphi de los usuarios que lo ejecuten.

¿Sería mas peligroso esto del código fuente? Le faltaría ya de paso no solo infectar el código fuente sino también los ejecutables generados como hace Induc y de paso una vez infectado el equipo eliminar del código fuente las rutinas maliciosas.

Por último quiero destacar que el hecho de que seamos capaces de ejecutar código sin compilar el proyecto tampoco es un gran logro, al fin y al cabo seguramente se conseguiría el mismo efecto insertando la rutina normalmente como parte del programa y esperando a que el programador lo compile y ejecute.

PD: No me gustan los botones rosas con bordes negros solo era un suponer ;)