Fast16: sabotaje de software de alta precisión, 5 años antes de Stuxnet
(sentinelone.com)- Framework de sabotaje no documentado creado en 2005, diseñado para parchear el código en memoria de software de cálculo seleccionado y distorsionar los resultados numéricos
svcmgmt.exeparece por fuera un envoltorio de servicios, pero por dentro contiene una máquina virtual Lua 5.0, bytecode cifrado, DLL auxiliares y el controladorfast16.sys, con lo que ejecuta por separado payloads específicos para cada tareafast16.syses un controlador de sistema de archivos de inicio de arranque que se carga en una etapa muy temprana y luego selecciona.EXEcompilados con Intel C/C++ Compiler para aplicar parches de memoria a nivel kernel- El motor de parches opera con 101 reglas y, en particular, usa bloques de instrucciones FPU para cambiar el escalado de valores en arreglos internos, dejando rastros de haber apuntado a herramientas de cálculo especializadas como ingeniería civil, física y simulación de procesos
- Al combinarlo con la marca
fast16de la filtración de ShadowBrokers, queda claro que ya existía sabotaje industrial de precisión antes de Stuxnet, en una forma que combinaba scripting embebido, targeting estrecho y parches de kernel
Resumen e indicios de identificación
fast16es un framework de ciber-sabotaje no documentado con componentes centrales de 2005, dondefast16.sysapunta selectivamente a software de cálculo de alta precisión, parchea código en memoria y distorsiona los resultados de los cálculossvcmgmt.exeparece por fuera un envoltorio de servicios típico de la era Windows 2000/XP, pero en su interior contiene una máquina virtual Lua 5.0 y un contenedor de bytecode cifrado que el punto de entrada del servicio descifra- En el proceso de rastrear malware basado en Lua, fueron pistas los magic bytes del bytecode
1B 4C 75 61, el byte de versión,LUA_PATHy una API C característica, y en ese flujo se identificósvcmgmt.exe - La cadena
C:\buildy\driver\fd\i386\fast16.pdbdentro desvcmgmt.exesirve como pista forense que conecta el ejecutable del servicio con el proyecto del controlador de kernel - En
drv_list.txtde la filtración de ShadowBrokers de 2017 también aparece el mismofast16, lo que vincula en una sola línea la cadena PDB desvcmgmt.exey el controlador de sabotaje de precisión - La firma de evasión del lado de ShadowBrokers incluía la frase
fast16 *** Nothing to see here – carry on***
Estructura del carrier y modo de ejecución
svcmgmt.exeestá diseñado como un carrier adaptativo que cambia su comportamiento según los argumentos de línea de comandos- Sin argumentos: se ejecuta como servicio de Windows
-p: configuraInstallFlag = 1y se ejecuta como servicio-i: configuraInstallFlag = 1y ejecuta código Lua-r: ejecuta código Lua sin flag de instalación- Cualquier otro
<filename>: opera en modo Wrapper/Proxy, creando dos procesos hijo, uno con el comando original y otro con el comando más el argumento-r
- El almacenamiento interno incluye bytecode Lua cifrado, DLL auxiliares y el controlador
fast16.sys - El entorno Lua está ampliado más allá del estado base y ofrece el módulo
wstring, la función criptográfica simétrica integradab, y módulos de binding para APIs de Windows NT de sistema de archivos, registro, control de servicios y red - El binario carrier externo se mantiene relativamente estable, mientras que los payloads específicos de cada tarea se separan en forma cifrada para poder reutilizarlos según el entorno y el objetivo operativo
- Los identificadores de
svcmgmt.exeson los siguientes- Nombre de archivo
svcmgmt.exe - Tamaño
315,392 bytes - MD5
dbe51eabebf9d4ef9581ef99844a2944 - SHA1
de584703c78a60a56028f9834086facd1401b355 - SHA256
9a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525 - Tipo
PE32 executable for MS Windows 4.00 (console), Intel i386 - Hora de enlace
2005-08-30 18:15:06 UTC
- Nombre de archivo
Estructura de propagación por wormlets y evasión
svcmgmt.exefunciona como un carrier tipo munición de racimo capaz de transportar varios wormlets, y en la muestra confirmada solo se encontró un wormlet SCM- El flujo de ejecución continúa con preparación de configuración, conversión a cadenas anchas, elevación de privilegios, instalación e inicio del servicio
SvcMgmt, despliegue condicional defast16.sys, liberación del wormlet, retraso inicial y ejecución repetida hasta alcanzar un umbral de fallos o una condición externa de terminación - El wormlet SCM apunta a entornos Windows 2000/XP y usa recursos compartidos de archivos con contraseñas de administrador débiles o por defecto para encontrar servidores en la red, copiar el payload y luego iniciar servicios remotos
- La propagación no depende de un protocolo de red personalizado, sino de funciones estándar de administración de Windows como la API de control de servicios y la API de recursos compartidos de archivos
- Antes de instalar,
ok_to_install()llama aok_to_propagate()para revisar el entorno y, salvo que haya una imposición manual, determina si puede propagarse según la presencia de claves de registro de ciertos productos de seguridad - Si existe хотя бы una de las siguientes claves de registro, la instalación se detiene para evitar desplegarse en entornos monitorizados
HKLM\SOFTWARE\Symantec\InstalledAppsHKLM\SOFTWARE\Sygate Technologies, Inc.\Sygate Personal FirewallHKLM\SOFTWARE\TrendMicro\PFWHKLM\SOFTWARE\Zone Labs\TrueVectorHKLM\SOFTWARE\F-SecureHKLM\SOFTWARE\Network Ice\BlackIceHKLM\SOFTWARE\McAfee.com\Personal FirewallHKLM\SOFTWARE\ComputerAssociates\eTrust EZ ArmorHKLM\SOFTWARE\RedCannon\FireballHKLM\SOFTWARE\Kerio\Personal Firewall 4HKLM\SOFTWARE\KasperskyLab\InstalledProducts\Kaspersky Anti-HackerHKLM\SOFTWARE\Tiny Software\Tiny FirewallHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Look n Stop 2.05p2HKCU\SOFTWARE\Soft4EverHKLM\SOFTWARE\Norman Data Defense SystemsHKLM\SOFTWARE\Agnitum\Outpost FirewallHKLM\SOFTWARE\Panda Software\FirewallHKLM\SOFTWARE\InfoTeCS\TermiNET
connotify.dllcumple la función de canal mínimo de reporte- Se registra mediante la API de Windows
AddConnectNotify()y es llamado cada vez que aparece una nueva conexión de red basada en RAS - Descifra cadenas ofuscadas para obtener el named pipe
\\.\pipe\p577, se conecta al pipe local, registra los nombres de conexión remota y local, y luego termina - No es un módulo ejecutable independiente y requiere registro por parte del proceso host
- Nombre de archivo
svcmgmt.dll - Tamaño
45056 bytes - MD5
410eddfc19de44249897986ecc8ac449 - SHA1
675cb83cec5f25ebbe8d9f90dea3d836fcb1c234 - SHA256
8fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9 - Hora de enlace
2005-06-06 18:42:45 UTC - Tipo
PE32 DLL (i386, 4 sections)
- Se registra mediante la API de Windows
Estructura del driver y método de parcheo en memoria
fast16.syses el componente más potente del framework; está configurado como driver de sistema de archivos de inicio de arranque, por lo que se carga en una etapa muy temprana junto con el driver de disco- La configuración es
Start=0,Type=2, grupo de claseSCSI, y se inserta por encima deNTFS,FATyMRxSMB - En la entrada inicial, establece el valor
EnablePrefetcherbajoSession Manager\PrefetchParametersen 0, haciendo que las solicitudes posteriores de páginas de código pasen por toda la pila del sistema de archivos - Mediante cifrado simple de cadenas con XOR y un escaneo de
ntoskrnl.exe, resuelve dinámicamente la API del kernel y expone\Device\fast16,\??\fast16y unDeviceTypepersonalizado 0xA57C - Con
IoRegisterFsRegistrationChange, adjunta un worker device object sobre dispositivos de sistema de archivos activos y nuevos, e interceptaIRP_MJ_CREATE,IRP_MJ_READ,IRP_MJ_CLOSE,IRP_MJ_QUERY_INFORMATION,IRP_MJ_FILE_SYSTEM_CONTROLy las rutas Fast I/O relacionadas - Aunque se carga en el momento del arranque, el verdadero motor de inyección de código a nivel kernel no se activa hasta después de que
explorer.exese haya abierto - El objetivo del parche debe cumplir dos condiciones al mismo tiempo
- El nombre del archivo termina en
.EXE - Justo después del último encabezado de sección PE hay una cadena ASCII imprimible que comienza con
Intel
- El nombre del archivo termina en
- Esta condición apunta a ejecutables compilados con el compilador Intel C/C++, lo que muestra que conocían el toolchain del software objetivo
- A los archivos que cumplen la condición se les aplica una modificación del encabezado PE en memoria; se inyectan de nuevo las dos secciones
.xdatay.pdata, y se rellenan bytes de la sección de código original para mantener una copia limpia del código - Los valores de identificación de
fast16.sysson los siguientes- Nombre de archivo
fast16.sys - Tamaño
44,580 bytes - MD5
0ff6abe0252d4f37a196a1231fae5f26 - SHA1
92e9dcaf7249110047ef121b7586c81d4b8cb4e5 - SHA256
07c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529 - Tipo
PE32 executable for MS Windows 5.00 (native), Intel i386, 5 sections - Hora de enlace
2005-07-19 15:15:41 UTC
- Nombre de archivo
Motor de parcheo basado en reglas y características del objetivo
- El motor de parcheo es un escáner mínimo basado en estados compuesto por 101 reglas; cuando el archivo se lee desde disco, cambia silenciosamente el código ejecutable en memoria mediante lógica de coincidencia de patrones y sustitución
- Para mantener el rendimiento, usa un dispatch array de 256 bytes para descartar rápidamente algunos bytes iniciales, permite wildcards dentro de los patrones y, en algunas reglas, establece y comprueba banderas de estado para ejecutar secuencias de modificación de varias etapas
- La mayoría de los patrones de parcheo corresponden a secuencias de instrucciones comunes en código x86 para secuestrar o afectar el flujo de ejecución, pero uno está compuesto por un bloque mucho mayor de instrucciones FPU
- Este bloque FPU es código dedicado a aritmética de precisión y al escalado de valores en arreglos internos, y muestra una naturaleza distinta a la de una inyección maliciosa común
- Los investigadores convirtieron las reglas de parcheo en patrones hexadecimales de firmas YARA y las aplicaron a un corpus de software de la misma época; hubo menos de 10 archivos con dos o más patrones coincidentes, una cantidad muy reducida
- Los archivos que coincidieron tenían en común que eran herramientas de cálculo especializadas en áreas como ingeniería civil, física y simulación de procesos físicos
- El parche FPU escala los valores pasados a tres arreglos internos para alterar sutilmente los cálculos, lo que muestra que el objetivo no era el acceso no autorizado ni la propagación general, sino la manipulación de resultados numéricos
- Como no se pudieron identificar por completo tanto los binarios objetivo exactos como las cargas de trabajo, el significado de los arreglos no quedó totalmente determinado
- Si los cálculos se verifican en un sistema aparte, este sabotaje podría fallar; pero si el mismo driver se despliega en varios sistemas que comparten la misma red y entorno de seguridad, también se reduce la posibilidad de discrepancias en verificaciones independientes
- En el apéndice se incluyen tal cual algunos patrones extraídos del motor de parcheo
48 89 84 24 9C 00 00 00 4B 0F 8F 79 FF FF FF 00D8 E1 D9 5D FC D9 04 0055 8B EC 83 EC 14 53 56 57 8B 3D ?? ?? ?? ?? 8B 0D 008D 1D ?? ?? ?? ?? 52 8D 05 ?? ?? ?? ?? 51 8D 15 ?? ?? ?? ?? 8D 0D ?? ?? ?? ?? 53 50 52 51 56 57 E8 ?? ?? ?? ?? 83 C4 38 EB 0E 83 EC 04 00B9 01 00 00 00 C1 E7 02 8B BF ?? ?? ?? ?? 8B D7 85 FF 8B 55 30 8B 45 30 D8 C9 8B 75 2C 00 9A 8B 00 00 00 1B 00 90 0F 94 C3 0B D8 33 D2 83 3D 00
Candidatos a objetivos del parche
- Los objetivos con la coincidencia más fuerte en los resultados de pattern matching fueron LS-DYNA 970, PKPM y MOHID
- LS-DYNA 970 es un software de simulación de ingeniería que analiza el comportamiento de materiales y estructuras en condiciones extremas, y se usa para estudiar choques automotrices, explosiones, impactos, conformado de metales y procesos de manufactura; se ha utilizado en los sectores automotriz, aeroespacial, de defensa e investigación militar, manufactura y ciencia de materiales
- Se ha desarrollado desde 1976
- MD5
1d2f32c57ae2f2013f513d342925e972 - SHA1
2fa28ef1c6744bdc2021abd4048eefc777dccf22 - SHA256
5966513a12a5601b262c4ee4d3e32091feb05b666951d06431c30a8cece83010 - Tamaño del archivo
5,225,591 bytes - Link time
2003-10-24 16:34:57 UTC - Tipo de archivo
PE32 executable for MS Windows 4.00 (console), Intel i386, 7 sections
- PKPM es una suite de CAD de ingeniería estructural ampliamente usada en China, compuesta por varios módulos ejecutables que cubren todo el ciclo de diseño de estructuras de edificios
- SATWE es el motor principal encargado del análisis estructural tridimensional de losas, vigas, columnas, muros y marcos en general
- Identificadores del módulo de diseño de cortante en concreto
- MD5
af4461a149bfd2ba566f2abefe7dcde4 - SHA1
586edef41c3b3fba87bf0f0346c7e402f86fc11e - SHA256
09ca719e06a526f70aadf34fb66b136ed20f923776e6b33a33a9059ef674da22 - Tamaño del archivo
7716864 bytes - Tipo de archivo
PE32 executable for MS Windows 4.00 (GUI), Intel i386, 6 sections - Link time
2011-08-26 10:58:17 UTC
- MD5
- Identificadores del módulo Building Structure CAD
- MD5
49a8934ccd34e2aaae6ea1e6a6313ffe - SHA1
3ce5b358c2ddd116ac9582efbb38354809999cb5 - SHA256
8b018452fdd64c346af4d97da420681e2e0b55b8c9ce2b8de75e330993b759a0 - Tamaño
11849728 bytes - Link time
2005-12-01 08:35:46 UTC - MD5
e0c10106626711f287ff91c0d6314407 - SHA1
650fc6b3e4f62ecdc1ec5728f36bb46ba0f74d05 - SHA256
06361562cc53d759fb5a4c2b7aac348e4d23fe59be3b2871b14678365283ca47 - Tamaño
16355328 bytes - Link time
2012-07-07 08:47:11 UTC
- MD5
- Identificadores del motor de análisis estructural SATWE
- MD5
2717b58246237b35d44ef2e49712d3a2 - SHA1
d475ace24b9aedebf431efc68f9db32d5ae761bd - SHA256
bd04715c5c43c862c38a4ad6c2167ad082a352881e04a35117af9bbfad8e5613 - Tamaño
9908224 bytes - Link time
2011-01-12 06:37:39 UTC - MD5
daea40562458fc7ae1adb812137d3d05 - SHA1
1ce1111702b765f5c4d09315ff1f0d914f7e5c70 - SHA256
da2b170994031477091be89c8835ff9db1a5304f3f2f25344654f44d0430ced1 - Tamaño
8454144 bytes - Link time
2012-11-29 03:10:12 UTC - MD5
2740a703859cbd8b43425d4a2cacb5ec - SHA1
ca665b59bc590292f94c23e04fa458f90d7b20c9 - SHA256
aeaa389453f04a9e79ff6c8b7b66db7b65d4aaffc6cac0bd7957257a30468e33 - Tamaño
16568320 bytes - Link time
2014-12-30 03:23:43 UTC - MD5
ebff5b7d4c5becb8715009df596c5a91 - SHA1
829f8be65dfe159d2b0dc7ee7a61a017acb54b7b - SHA256
37414d9ca87a132ec5081f3e7590d04498237746f9a7479c6b443accee17a062 - Tamaño
8089600 bytes - Link time
2009-04-22 01:46:46 UTC - MD5
cb66a4d52a30bfcd980fe50e7e3f73f0 - SHA1
e6018cd482c012de8b69c64dc3165337bc121b86 - SHA256
66fe485f29a6405265756aaf7f822b9ceb56e108afabd414ee222ee9657dd7e2 - Tamaño
9219072 bytes - Link time
N/A
- MD5
- Identificadores de archivos CAD adicionales de PKPM
- MD5
075b4aa105e728f2b659723e3f36c72c - SHA1
145ef372c3e9c352eaaa53bb0893749163e49892 - SHA256
c11a210cb98095422d0d33cbd4e9ecc86b95024f956ede812e17c97e79591cfa - Tamaño
6852608 bytes - Link time
2012-06-18 10:01:54 UTC - MD5
cf859f164870d113608a843e4a9600ab - SHA1
952ed694b60c34ba12df9d392269eae3a4f11be4 - SHA256
7e00030a35504de5c0d16020aa40cbaf5d36561e0716feb8f73235579a7b0909 - Tamaño
8392704 bytes - Link time
2012-11-29 03:10:12 UTC
- MD5
- MOHID es un sistema de modelado hidrológico de código abierto desarrollado por MARETEC del Instituto Superior Técnico de Lisboa, Portugal, que abarca hidrodinámica marina y costera, simulación de calidad del agua, transporte de sedimentos, modelado de derrames de petróleo y seguimiento lagrangiano de partículas
- Señalaron que incluso en la actualidad no han podido identificar de forma concluyente el efecto pretendido del ataque
- MD5
f4dbbb78979c1ee8a1523c77065e18a5 - SHA1
9e089a733fb2740c0e408b2a25d8f5a451584cf6 - SHA256
e775049d1ecf68dee870f1a5c36b2f3542d1182782eb497b8ccfd2309c400b3a - Tamaño del archivo
5443584 bytes - Tipo de archivo
PE32 executable for MS Windows 4.00 (console), Intel i386, 3 sections - Link time
2002-10-18 09:29:54 UTC
- LS-DYNA ha sido citado en reportes públicos sobre las sospechas de violación por parte de Irán de la Sección T del JCPOA, junto con investigaciones de modelado computacional relacionado con el desarrollo de armas nucleares
Reglas de detección e indicadores de compromiso
-
Indicadores de compromiso
- Los tres archivos identificados son fast16.sys, connotify.dll y svcmgmt.exe
fast16.sys: MD50ff6abe0252d4f37a196a1231fae5f26, SHA192e9dcaf7249110047ef121b7586c81d4b8cb4e5, SHA25607c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529connotify.dll: MD5410eddfc19de44249897986ecc8ac449, SHA1675cb83cec5f25ebbe8d9f90dea3d836fcb1c234, SHA2568fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9svcmgmt.exe: MD5dbe51eabebf9d4ef9581ef99844a2944, SHA1de584703c78a60a56028f9834086facd1401b355, SHA2569a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525
-
apt_fast16_carrier
- Fue diseñada para detectar el carrier, el payload Lua y variantes en texto plano, y su hash de referencia es
9a10e1faa86a5d39417cae44da5adf38824dfb9a16432e34df766aa1dc9e3525 - Usa el magic de bytecode de Lua
1B 4C 75 61, y las cadenasbuild_wormlet_table,unpropagate,scm_wormlet_install,install_implant,start_worm,ok_to_propagate - También incluye como condiciones múltiples claves de registro de productos de seguridad como
Symantec,Sygate Personal Firewall,Zone Labs\TrueVector,Kaspersky Anti-Hacker - También detecta patrones de bytes de cadenas cifradas, dos constantes criptográficas, código para descifrar la longitud del contenedor de almacenamiento y una firma de registro de almacenamiento que incluye la cadena
file - La condición se cumple para archivos menores de 10 MB con encabezado MZ cuando se satisfacen 3 elementos de
$s*, 12 de$rk*, cualquier elemento de$e*, la proximidad de 2 constantes criptográficas y uno entre$code1o$stor1, o bien cuando se cumplen el magic de Lua y 7 elementos de$s*
- Fue diseñada para detectar el carrier, el payload Lua y variantes en texto plano, y su hash de referencia es
-
apt_fast16_driver
- Fue diseñada para detectar el driver o archivos de proyecto relacionados, y su hash de referencia es
07c69fc33271cf5a2ce03ac1fed7a3b16357aec093c5bf9ef61fbfa4348d0529 - Usa múltiples cadenas identificadoras de archivos fuente como
@(#)foo.c :,@(#)par.h :,@(#)pae.h :,@(#)ree.c : - Incluye patrones como
\\Device\\fast16,\\??\\fast16,C:\\buildy\\,driver\\fd\\i386\\fast16.pdb,push 0A57Ch ; DeviceType - La firma también incorpora patrones de API que hacen push en forma XOR de
ExAllocatePool,ExAllocatePoolWithTag,ExFreePool,ExFreePoolWithTag - La condición se cumple en archivos menores de 10 MB con encabezado MZ cuando además se satisfacen 2 rutas PDB,
C:\\buildy\\y 1 identificador de fuente,#devtype == 3,pe.machine == pe.MACHINE_I386,pe.subsystem == pe.SUBSYSTEM_NATIVE, cualquiera deapi*, o uno entre 2dev*; o cuando se cumplen 6 identificadores de fuente
- Fue diseñada para detectar el driver o archivos de proyecto relacionados, y su hash de referencia es
-
clean_fast16_patchtarget
- Detecta el software objetivo del parche, está marcado como
most probably cleany su hash de referencia es8fcb4d3d4df61719ee3da98241393779290e0efcd88a49e363e2a2dfbc04dae9 - Usa múltiples patrones de bytes consecutivos desde
$el0hasta$el99 - La condición es: archivo menor de 20 MB, encabezado MZ y 2 o más coincidencias entre las firmas definidas
- Detecta el software objetivo del parche, está marcado como
-
apt_fast16_patch
- Detecta el código de parche en sí, y puede estar presente en archivos parcheados estáticamente o en volcados de memoria
- Su hash de referencia es
0ff6abe0252d4f37a196a1231fae5f26 - Define tres patrones de bytes:
$p1,$p2,$p3 - La condición es
any of them, por lo que se detecta aunque coincida solo uno de los tres patrones
Linaje e implicaciones históricas
- La cadena
@(#)par.h $Revision: 1.3 $dentro del binario ofrece una pista para inferir el linaje de este framework - El prefijo
@(#)remite a la convención de gestión de código fuente de la familia SCCS/RCS del Unix de las décadas de 1970 y 1980, y este tipo de rastro es raro en drivers del kernel de Windows de mediados de los 2000 - Estos artefactos parecen más cercanos a la huella de un ingeniero veterano familiarizado con la cultura y el toolchain de entornos Unix antiguos de alta seguridad que al perfil típico de un desarrollador exclusivamente enfocado en Windows
svcmgmt.exefue subido a VirusTotal hace casi 10 años, pero incluso hoy su tasa de detección sigue siendo muy baja, y solo un motor lo clasifica como malware genérico con confianza limitada- En combinación con las firmas de ShadowBrokers de Territorial Dispute,
fast16obliga a reconsiderar el momento de desarrollo de un grave ciber-sabotaje de nivel estatal y altamente sigiloso fast16muestra, antes que familias más conocidas, una arquitectura coherente que combina motores de scripting embebidos, targeting estrecho basado en compilador y parches a nivel kernel- Durante mucho tiempo casi no hubo análisis públicos, campañas con nombre ni vínculos con incidentes emblemáticos, y las marcas legibles que quedaron adentro también fueron mínimas y contenidas, como
*** Nothing to see here – carry on*** - Se posiciona como un punto de conexión dentro de la evolución APT que lleva a posteriores toolkits basados en Lua y LuaJIT
1 comentarios
Comentarios de Hacker News
Esta parte me pareció especialmente interesante
La comparación de que ver la notación de SCCS/RCS en código del kernel de Windows de 2005 era como encontrarte un teléfono de disco en una oficina hoy en día me pareció bastante convincente
Incluso en el laboratorio de astrofísica donde trabajé en 2006 seguían usando svn, y en el codebase había mucho Fortran con rastros de sistemas de los 70 y 80
Aun así funcionaba bien gracias a compiladores modernos de optimización, y también fue sorprendentemente fluida la migración de Vax a Linux en los 90
Esto me recordó una charla antigua, do over or make due, cuya idea era más o menos que reescribir por completo un codebase grande que básicamente funciona no vale la pena si con herramientas modernas todavía puedes mantenerlo unido y hacerlo servir
Se llamaba MKS, y manejaba un árbol de revisiones específico como un "project file"; incluso la versión rehecha en Java EE se sentía como una reliquia de los 90
En la cabecera de los archivos iban etiquetas como
$Revision: 1.3 $y changelogs, pero en muchos archivos nuevos ni siquiera ponían la etiqueta, así que no se sustituía nada y la consistencia era un desastreLa familia de dispositivos objetivo había empezado a mediados de los 90, pero en ese momento casi nada del código en sí tenía realmente más de 5 años
Aunque solo había unas decenas de ingenieros, los conflictos de commit eran frecuentes y el árbol completo se rompía seguido
Por diversión escribí un script para leer todo el historial e importarlo a git, y con solo retroceder unos cuantos años los registros ya eran un caos total
No sé por qué siguieron usando eso hasta entonces, pero en empresas de hardware era más común de lo que uno pensaría que el control de código fuente se viera poco más o menos como una "carpeta compartida remota", así que supongo que la gestión de versiones del software no era prioridad
En el mundo del cómputo numérico, ese linaje todavía sigue siendo la base
Sí había lugares usando RCS todavía en los 2000, y como herramienta en sí incluso tenía algunas ventajas frente a SVN o CVS
Por ejemplo, uno se imagina que fast16 pudo haberlo escrito alguien que originalmente hacía software de cálculo científico, y Stunex alguien que trabajaba en Siemens
Si las causas que hicieron que el código necesitara refactorización al principio siguen ahí, al final va a volver al mismo estado
Muchas veces esas causas están clavadas muy hondo, incluso en capas psicológicas como hábitos del desarrollador, creencias o traumas profesionales
Si además se cruza la ley de Conway, el equipo termina construyendo software que inevitablemente se parece a la estructura de la organización más grande, y si la organización no cambia, el resultado de la refactorización también suele repetirse
La excepción suele ser cuando te toca un codebase de otro equipo o de un predecesor y ahí sí puedes replantear la estructura
Pero cuando las mismas personas anuncian que van a refactorizar su propio código, muchas veces lo único que logran es fabricar otra ratonera más cómoda para ellas mismas
Mejorar iterativamente algo que nació de tu propia manera de pensar está bien, pero para bajarte del carrusel hay que anotar las causas de una mala arquitectura y examinarse con frialdad
Eso de que "si eres cuidadoso y disciplinado puedes implementar bien incluso un diseño algo malo", como les gusta creer a muchos desarrolladores, por lo general no es cierto
Al final la raíz es el diseño: o aceptas el árbol que creció de ahí o lo talas; solo podarlo tiene límites
Este artículo da bastante escalofrío
El simple hecho de que este malware haya permanecido 20 años por debajo del radar ya da muy mala espina
Aquí está el enlace de descarga para quien tenga curiosidad
https://bazaar.abuse.ch/sample/9a10e1faa86a5d39417cae44da5ad...
Yo probablemente empezaría armando una VM de Windows XP
Eso solo parece el loader
IEEE-754 solo exige redondeo correcto para +-*/ y sqrt
Las funciones trascendentales como sin/cos/exp/log/pow permiten diferencias de unas cuantas ULP al final, y así funcionan en la práctica glibc, musl, MSVC e Intel SVML
Los PID usan operaciones básicas, así que sufren menos por diferencias de libm, pero el control vectorial de motores o la linearización de sensores tocan este tipo de funciones en cada ciclo, así que pequeñas discrepancias se van acumulando
Por eso, incluso sin ningún diff en el código fuente, solo cambiar la libm enlazada puede hacer que el comportamiento en campo empiece a derivar
Estas diferencias realmente aparecen en cosas como la reducción de argumento de Payne-Hanek o en los peores límites del table-maker's dilemma
Supongo que por eso las guías para sistemas críticos de seguridad no dicen simplemente "cumple con IEEE-754", sino que fijan un build específico de libm
De verdad es un hallazgo impresionante
Tengo muchísima curiosidad por saber exactamente qué objetivos tenían estas reglas y cómo alteraban los resultados
Tal vez estaban diseñadas para introducir diferencias solo bajo condiciones de simulación muy específicas, como en un reactor nuclear
Por ejemplo, la ecuación EOS_JWL del manual público [1] es una de las fórmulas que implementa LS-DYNA, y parece que, usada junto con otras ecuaciones, podría servir para calcular cuánto tarda el detonador de una ojiva de misil en hacer explotar la carga principal y generar una onda de presión concreta a 20 m de distancia
Si inviertes ese resultado, también podrías estimar el tiempo de espoleta necesario
Las ecuaciones y parámetros que entran en LS-DYNA vienen de investigaciones científicas como [2], que es un estudio del gobierno de EE. UU. de los años 80 sobre explosivos de alta potencia
Ahí también se incluyen experimentos para medir cómo el explosivo interactúa por fricción con distintos materiales que lo recubren
Como las ecuaciones para modelar explosivos ya están listas, bastaría con tocar un poco esas fórmulas y meter ruido de ±20% al coeficiente de fricción para que un científico o ingeniero sospechara primero de un problema de calidad en la fabricación del acero antes que de una manipulación del software
Una analogía moderna sería imaginar a algún país adversario usando una copia pirateada de Ansys Autodyn 2026 R1 que un grupo chino de cracking publicó en un foro chino y que descargaron de unos pocos seeders detrás de un ISP ruso
Y luego, cuando los resultados experimentales y los calculados empiecen a no coincidir, recién entonces podrían sospechar que la copia fue alterada deliberadamente
Aun así, hoy quizá le resulte más fácil a ese país adversario sacar una copia legítima de una red comprometida de alguna universidad cualquiera o de una consultora aeroespacial o de defensa
También sería ingenuo asumir que un país adversario en 2026 no podría desarrollar el software desde cero
Incluso apoyándose en cálculos manuales o en experimentación podría llegar al resultado que busca
Al final, para validar la calidad de fabricación, de todos modos hacen falta instrumentos y capacidad experimental
El software de simulación sirve sobre todo para reducir el número de maquetas y de pruebas físicas, y así ahorrar tiempo y dinero
Por ejemplo, correr 1000 veces un escenario como el de [3], donde un proyectil impacta una placa de blindaje, es barato; repetir eso en el mundo real cuesta mucho más y toma mucho más tiempo
[1] https://ftp.lstc.com/anonymous/outgoing/jday/manuals/LS-DYNA...
[2] https://www.osti.gov/servlets/purl/6530310
[3] https://www.youtube.com/watch?v=_dv2PecKUBM
Cuando la gente vea que las cosas que publico llevan datos de revisión de RCS, ojalá al menos se detengan un segundo
El libro que leí hace poco es Sandworm: A New Era of Cyberwar and the Hunt for the Kremlin's Most Dangerous Hackers, de Andy Greenberg
Me gustó bastante, y como siguen saliendo nuevos datos, hasta creo que podría ameritar una secuela
Viendo cómo Guix y la computación reproducible se pueden portar incluso a PowerPC o a máquinas legacy, siento que a gobiernos o instituciones tipo 1984, y a algunos grupos de Medio Oriente, eso realmente les debe disgustar mucho
Mientras más heterogéneo sea el entorno, mejor
La cifra clave es el gusano
No lo detectas revisando otra computadora, porque para empezar ni siquiera existe una segunda computadora limpia
Es un hallazgo interesante, pero el comentario sobre control de código fuente me suena un poco desfasado
Incluso en esa época todavía debían quedar cosas parecidas a SCCS, y por un momento hasta me confundí pensando si CVS tenía un estilo similar
Sugiere que los desarrolladores originalmente también trabajaban del lado de UNIX, porque SCCS/RCS eran comunes allá