Los vectores de ataque menos evidentes suelen ser los más interesantes y peligrosos. Un ejemplo claro es el proyecto EvilSln, disponible en GitHub, que explota la deserialización insegura en archivos .suo
de Visual Studio para introducir un backdoor que se ejecuta simplemente al abrir una solución.
Desde campañas previas como la del grupo Lazarus (2021), que usó comandos maliciosos en proyectos para ejecutar código durante la compilación, ya se sabía que los proyectos de Visual Studio podían ser abusados para ejecución remota. Sin embargo, estas técnicas requerían que el usuario compilara o interactuara activamente con el proyecto.
El hallazgo de EvilSln es más insidioso: aprovecha la carga automática del archivo .suo
—un archivo binario y oculto generado automáticamente en la carpeta .vs
— que Visual Studio abre sin avisos de seguridad ni diálogo de confianza, incluso ignorando las protecciones como zonas de confianza (Trust Zones) o marcas MOTW (Mark of the Web).
El .suo
(Solution User Options) guarda configuraciones de usuario, estados de ventanas y otros metadatos en un formato Structured Storage binario poco documentado. Pero al abrir la solución, Visual Studio:
-
Enumera los VSPackages cargados.
-
Llama al método
IVsPersistSolutionOpts.LoadUserOptions
, pasando unStream
con el contenido del.suo
. -
En concreto, la clase
VSCorePackage
delega la carga aVsToolboxService.LoadOptions(Stream)
. -
VsToolboxService
usa unBinaryFormatter.Deserialize()
sin restricciones para leer objetos almacenados.
El uso de BinaryFormatter
es crítico porque permite la ejecución de código arbitrario al deserializar tipos que pueden contener payloads maliciosos (como se puede generar con ysoserial.net
).
La explotación en detalle
-
El atacante genera un payload serializado malicioso (p. ej. un objeto que en el constructor o métodos de deserialización ejecuta
calc.exe
o código PowerShell). -
Este payload se inserta en el stream adecuado dentro del
.suo
. -
El
.suo
se distribuye junto a un proyecto legítimo (GitHub, redes sociales, phishing). -
Al abrir la solución, Visual Studio deserializa automáticamente el
.suo
sin alertas y ejecuta el payload en memoria. -
La ejecución ocurre sin compilación ni interacción adicional, y no hay warnings de Smartscreen ni diálogos de confianza.
/App1/Form1.cs/App1.sln/.vs/App1/v17/.suo <-- payload inyectado aquí (stream específico con objeto serializado malicioso)
- Nunca abrir proyectos de orígenes no confiables o desconocidos.
- Revisar la configuración de Visual Studio para activar manualmente “trusted locations” y otras protecciones (aunque por defecto están deshabilitadas).
- Usar herramientas para inspeccionar
.suo
y otros archivos binarios de soluciones. - Considerar abrir los proyectos en entornos aislados o máquinas virtuales.
Comentarios
Publicar un comentario