BookinglyTech News
Software

Una biblioteca de criptografía dispara falsos positivos de Windows Defender en una app Tauri

Una actualización que introdujo la librería sodiumoxide provocó que el binario de Roblox Account Manager fuera marcado como Trojan:Win32/Wacatac.B!ml en Microsoft Defender.

3 min de lecturaDev.to0 vistas

Una versión de la aplicación de escritorio Roblox Account Manager empezó a ser detectada por Microsoft Defender como Trojan:Win32/Wacatac.B!ml. El binario no había cambiado su comportamiento; la única diferencia era la inclusión de la biblioteca de criptografía sodiumoxide.

El autor, que desarrolla la app con Rust + Tauri 2 y React, observó que VirusTotal mostraba 1/75 detecciones, todas provenientes del motor de aprendizaje automático de Microsoft. Un análisis rápido con pefile reveló que los imports y la entropía del ejecutable eran idénticos a la versión anterior, por lo que la hipótesis inicial fue que el modelo había “cambiado de parecer”. Esa suposición resultó equivocada.

Bisección contra VirusTotal

Para aislar el culpable se utilizó una rutina que, mediante la API pública de VirusTotal (4 peticiones por minuto, 500 al día), subía cada build y anotaba si el informe contenía detecciones. Con git bisect se fue reduciendo el rango de commits hasta encontrar el que introdujo la dependencia de sodiumoxide, que enlaza estáticamente la biblioteca C libsodium.

Los clasificadores de malware tienden a asociar binarios que combinan almacenamiento de credenciales, inyección de input y código nativo de criptografía con ransomware, por lo que la presencia de libsodium fue suficiente para que el modelo lo marcara.

Reemplazo sin romper a los usuarios

El reto era migrar a una solución puramente Rust sin impedir que los usuarios existentes descifraran sus archivos. Se optó por los crates de RustCrypto que replican la API de libsodium: argon2 = "0.6", crypto_secretbox = "0.1" y sha2 = "0.10". Se implementó la derivación de clave con Argon2i v0x13 (OPSLIMIT/MEMLIMIT_MODERATE) y se reprodujo exactamente la disposición del MAC y el ciphertext de crypto_secretbox.

Un test de integración verifica que un fixture cifrado con la versión anterior se descifra sin errores. Si cualquier parámetro (versión de Argon2, coste de memoria, posición del MAC) se desvía, el test falla, evitando que se bloquee a los usuarios.

Impacto en la cadena de compilación

El cambio introdujo una penalización de rendimiento en los builds de depuración: Argon2 en Rust es mucho más lento que la versión precompilada de libsodium (5,4 s vs 0,3 s por derivación). Para mitigarlo se ajustó el perfil de desarrollo en Cargo.toml con opt-level = 3 para todas las dependencias, reduciendo el tiempo total de pruebas de 230 s a 41 s.

Resultados finales

Archivo Antes Después
Ejecutable .exe 1/75 (Wacatac.B!ml) 0/75, Defender limpio
Instalador MSI (requiere admin) 0/61 0/75
Instalador NSIS (sin admin) 3/7 0/75

El binario quedó libre de detecciones y la experiencia de instalación mejoró. El caso muestra cómo una simple elección de dependencia puede afectar a los motores de detección basados en IA y por qué es crucial validar cada cambio con herramientas como VirusTotal.

Queda por ver si futuros entrenamientos del modelo de Microsoft tendrán en cuenta que el uso legítimo de libsodium no implica comportamiento malicioso, o si los desarrolladores deberán seguir prefiriendo implementaciones puras Rust para evitar falsos positivos.