Voltar

Responder a la compromisión de eMudhra CA

En octubre de 2026, se descubrió que ocho autoridades de certificación intermedias (CAs) de eMudhra tenían claves privadas que cualquiera puede deducir. Usa esta guía para encontrar los almacenes de confianza en tus dispositivos que aún confían en las raíces comprometidas y para limpiarlos.


 

Funcionalidad

Descripción general

Los navegadores y sistemas operativos bloquearon los ocho intermedios en cuestión de días. Cualquier cosa que lleve su propia copia de las raíces confiables no recibió ese bloqueo: herramientas de línea de comandos, entornos de ejecución y agentes siguen confiando en certificados falsificados hasta que su archivo raíz cambie.

Factorial IT elimina las dos raíces comprometidas del paquete CA del agente de Factorial IT en cada Mac, Windows y Linux inscritos. Los nuevos paquetes de inscripción vienen sin ellas. Un dispositivo que está fuera de línea recibe la solución tan pronto como se reconecta. No hay nada que debas hacer con respecto al agente.

Cada otro almacén de confianza pertenece al sistema operativo, a las herramientas de tu equipo o a tus propias aplicaciones, así que el tiempo es tuyo. Tienes dos rutas:

  • Un agente personalizado, Cerrar la exposición de CA de eMudhra, que solicita a un administrador antes de cada cambio.
  • A mano, con los informes de detección y scripts de remediación de Fleet.

 

Qué sucedió

En abril de 2025, eMudhra creó las ocho claves privadas como enteros menores a 256, cuando deberían haber sido números aleatorios de 384 bits. Cada clave, por lo tanto, puede ser reconstruida en milisegundos. Con una clave, cualquiera puede firmar un certificado para cualquier nombre de host. Seis de los intermedios emiten certificados TLS; los otros dos firman código.

Cada intermedio existe dos veces: una vez emitido por las raíces emSign de eMudhra, y una vez como una firma cruzada del root de AAA Certificate Services de Sectigo. En total, 16 certificados deben ser desconfiados. Dos raíces también deben ser eliminadas de cualquier archivo CA que aún las contenga: emSign ECC Root CA - G3 y AAA Certificate Services.

Fecha (2026) Evento
17 de octubre Un investigador informa sobre las claves. Chrome y Firefox bloquean los 16 certificados.
18 de octubre eMudhra revoca los ocho intermedios. Las firmas cruzadas de Sectigo son revocadas el 19 de octubre.
20 de octubre Microsoft envía el bloqueo a través de las actualizaciones automáticas de la lista de confianza de Windows.
Para el 22 de octubre Apple envía el bloqueo en macOS, iOS y iPadOS.

Ninguno de los certificados TLS de estos intermedios aparece en los registros de Transparencia de Certificados (CT). Por lo tanto, los navegadores que aplican CT nunca estuvieron abiertos a ataques. La mayoría de los otros clientes, incluyendo curl, ignoran CT. Un atacante también debe estar en la ruta de red, por ejemplo, a través de una red Wi-Fi maliciosa, un enrutador o proxy secuestrado, o DNS manipulado.

 

Qué permanece expuesto

Los bloqueos de Apple y Microsoft solo protegen el software que verifica a través del sistema operativo o verifica la revocación. El software con su propio archivo de raíces sigue aceptando cadenas falsificadas hasta que alguien actualice ese archivo.

Ruta de confianza Cubierto por los bloqueos del proveedor Peor caso si se deja tal como está Quién lo soluciona
Navegadores y aplicaciones que verifican a través del sistema operativo (Safari, Mail, Windows Schannel, Go en macOS y Windows) Sí, una vez que se instala la actualización del sistema operativo Ninguno Nada más allá de las actualizaciones del sistema operativo
El paquete CA del agente de Factorial IT No Un servidor impostor de Factorial IT recoge resultados de consultas y la clave del nodo del dispositivo, y envía sus propias consultas Factorial IT
Herramientas de línea de comandos de macOS (curl, git, python3, perl, ruby, openssl lee /etc/ssl/cert.pem) No: Apple no actualizó este archivo Contraseñas y tokens de API leídos en tránsito; instaladores curl | sh intercambiados por malware Tú
Paquete del sistema Linux (ca-certificates) Solo después de la actualización del paquete. El 21 de octubre, Rocky Linux 9 y Fedora 44 estable aún enviaban la raíz. Cualquier herramienta de OpenSSL y GnuTLS en el dispositivo puede ser suplantada: copias de seguridad, webhooks, agentes de monitoreo, clientes de bases de datos Tú
Dispositivos Windows que se perdieron la actualización de Microsoft (fuera de línea, solo WSUS, o bloqueados por Políticas de Grupo) No Certificados TLS falsificados aceptados; malware firmado con los dos intermedios de firma de código pasa las verificaciones de firma Tú
Node.js y Electron No: las compilaciones oficiales incorporan un instantáneo de raíz fijado en la versión Las claves de API y las llamadas de servicio a servicio van al atacante, incluso en un dispositivo parcheado Tú
certifi y pip instalados con pip No: cada uno lleva sus propias raíces Lo mismo que Node.js Tú
Binarios de Go en Linux No: Go lee el paquete del sistema allí CLIs de nube, kubectl y terraform envían sus credenciales a una API impostora Tú
Contenedores, servidores e imágenes de CI No: cada imagen lleva su propio paquete Lo mismo que el paquete del sistema Linux, en cada imagen construida antes de la solución Tú

Los paquetes que instales con apt o dnf no están en riesgo, porque están firmados con GPG.

 

Qué Factorial IT soluciona para ti

El agente de Factorial IT trae su propio paquete CA: /opt/orbit/certs.pem en macOS y Linux, y C:\Program Files\Orbit\certs.pem en Windows. Su componente osquery se basa en este archivo, no en el almacén de confianza del sistema operativo, para comunicarse con tu servidor de Factorial IT. El archivo se escribe una vez, cuando se instala el agente, y nunca se actualiza. Por eso los bloqueos del proveedor nunca lo alcanzan.

Factorial IT elimina ambas raíces de este archivo en cada dispositivo inscrito. No lo toques tú mismo: los scripts de remediación a continuación notan que ya está limpio y lo dejan en paz.

En Linux, el actualizador del agente se basa en el paquete del sistema, así que actualizar ca-certificates también lo cubre. En macOS y Windows, el actualizador verifica a través del sistema operativo, por lo que los bloqueos de Apple y Microsoft ya lo protegen.

 

Cómo usar

Elige una de las dos rutas para los almacenes de confianza que Factorial IT no maneja:

  1. Con un agente personalizado. Sigue la ruta manual en tu nombre y espera la aprobación de un administrador antes de cada cambio. Consulta Solucionar con un agente personalizado a continuación.
  2. A mano. Ejecutas los informes de detección y scripts de remediación tú mismo. Consulta Solucionar manualmente a continuación.

Sea cual sea la ruta que tomes, termina actualizando los entornos de ejecución que llevan sus propias raíces, luego verifica el resultado como se describe en Verificar.

 

Solucionar con un agente personalizado

La plantilla del agente Cerrar la exposición de CA de eMudhra se ejecuta cada dos horas y avanza en etapas. Nunca ejecuta un script de remediación hasta que un administrador aprueba su ticket.

  1. Ve a Agentes de IA > Agentes, haz clic en Explorar plantillas, filtra por Equipo y abre Cerrar la exposición de CA de eMudhra.
  2. En las instrucciones, encuentra PILOT DEVICES y escribe un grupo de dispositivos o nombres de dispositivos después de Pilot:. Si lo dejas en blanco, el agente sugiere hasta tres Macs, tres dispositivos Linux y tres dispositivos Windows que aún necesitan la solución.
  3. Haz clic en Crear. El agente comienza en su próximo desencadenador. Para ver una ejecución primero, abre el agente y haz clic en Ejecución en seco: cada acción se registra en lugar de llevarse a cabo.
  4. El agente abre un único ticket, Compromiso de CA de eMudhra: qué queda por solucionar, y envía un correo a los administradores una vez. Responde a ese ticket para aprobar el piloto, y luego el despliegue.
Etapa Qué hace el agente Qué necesita de ti
Inventario Agrega el kit de remediación de eMudhra de Factorial IT: tres informes que cada computadora ejecuta cada hora y, en la biblioteca de scripts, un script de verificación de solo lectura, scripts de remediación de macOS y Linux de Fleet, el script de Windows de Factorial IT, y el script de Windows de Fleet para que los administradores lo ejecuten a mano. Abre su ticket con los dispositivos agrupados por hallazgo. Nada. Los primeros resultados llegan en menos de una hora.
Piloto Ejecuta el script de remediación de cada plataforma en los dispositivos piloto y publica cada resultado en el ticket. Una aprobación en el ticket
Despliegue Los ejecuta en cada Mac y dispositivo Linux con un hallazgo del sistema y en cada dispositivo Windows al que no ha llegado el bloqueo de Microsoft, luego verifica que sus próximos informes estén limpios. Una aprobación en el ticket
Personas Abre un ticket en nombre de cada persona cuyos entornos de ejecución solo ellos pueden actualizar (Node.js, Python certifi, binarios de Go), y les dice qué actualizar. Una aprobación antes de que escriba a ellos
Hecho Cierra su ticket cuando no queda nada por solucionar, y dice que el agente puede ser pausado. Pausar el agente

Además de las etapas, el agente:

  • Informa a los administradores de inmediato, en el ticket y por correo electrónico, si un dispositivo tiene uno de los intermedios comprometidos.
  • Lista los Macs que no pueden alcanzar los servidores de actualización de Apple, y los dispositivos Windows donde una Política de Grupo detiene la actualización de Microsoft.
  • Nunca ejecuta el script de Windows de Fleet, porque Microsoft Defender lo bloquea. Si un antivirus rechaza una de sus ejecuciones, informa a los administradores. Ellos pueden descargar el script de la biblioteca de scripts y ejecutarlo donde su antivirus lo permita.
  • Deja el paquete del agente de Factorial IT en manos de Factorial IT. Nunca restaura una copia de seguridad, y nunca bloquea, borra o reinicia un dispositivo.

Una vez que se completa el trabajo, el kit permanece donde está.

 

Solucionar manualmente

Paso 1: ejecutar los informes de detección

Fleet proporciona un informe de detección por sistema operativo. En la consola de Fleet, crea un informe y pega el SQL para cada sistema operativo a continuación. También puedes gestionar los tres en GitOps con emudhra-ca-compromise.reports.yml, que los ejecuta una vez al día.

Informe de macOS

SELECT 'root_in_keychain' AS finding, common_name AS item, path AS detail,
       CASE sha1
        WHEN '3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1' THEN 'ROOT_TRUSTED emSign ECC Root CA - G3 (Apple root store; Apple block via trustd)'
        WHEN 'd1eb23a46d17d68fd92564c2f1f1601764d8e349' THEN 'ROOT_TRUSTED AAA Certificate Services (Sectigo cross-sign path)'
        ELSE 'ROOT_TRUSTED emSign Root TLS/CS CA - G3 (not in Apple store by default; manually added)'
       END AS status
FROM certificates
WHERE sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1',
              'd1eb23a46d17d68fd92564c2f1f1601764d8e349',
              '39d3236e4a609ab6190cbfa1ad02b3cc61dfc2c3',
             '1f74b6010a219fd9ca058d07aa053d15efd9300d')
UNION ALL
-- /etc/ssl/cert.pem is used by Apple-shipped curl, git, python3, ruby, perl, openssl. Apple did NOT update it.
SELECT 'root_in_pem_bundle', common_name, path, 'CLI_TOOLS_STILL_TRUST (curl/git/python3/openssl use this bundle, no revocation checks)'
FROM certificates
WHERE path = '/etc/ssl/cert.pem'
  AND sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1',
           'd1eb23a46d17d68fd92564c2f1f1601764d8e349')
UNION ALL
SELECT 'compromised_intermediate_present', common_name, path || ' sha1=' || sha1, 'IOC_HIT investigate'
FROM certificates
WHERE subject_key_id IN ('e21e2fe71c19390e554b62c120245735248a2514',  -- EM DV TLS CA - G3B
                   '9bd86551afe7e72c37ad08ee6919d9bf3784ae0a',  -- EM OV TLS CA - G3B
                    '3edc20d9894698877b873fd88147b25c15d84706',  -- EM EV TLS CA - G3B
                       'ae7e105c3c2996c1a847270559f1e03dd4e50af3',  -- EM DV TLS CA - G3C
                      '34eaea0cebc90adaf9d0c5e2ed9b78c9879e1b6c',  -- EM OV TLS CA - G3C
                        '79fae8eccfdb0d758da458d69fb6eddc7c49dee6',  -- EM OV CS CA - G3B
                     'ee6f73298d6fbfa7b31bc39534f61556447866b7') -- EM OV CS CA - G3C
   OR sha1 IN ('a99b289464f3b44343270a7a1e910f02370483fe','1396be1372bc93dfa2a433ca964dba91548a6e57',
                '5f014e0db3bb8f950e0598ab280846d383fc57be','5dfa19197d1c1cf629af7c0cd865543c5050227c',
              'f33acd1f5d31aa81ac18c72c928446226d3d5914','19069bd6533bff93fb67c71fb3376b4ea7402c3b',
              '8ad23bc78845d6faae1d534bac89f0e36ba55a11','4b0944c14f8c2ccba4e4f32104ad920fa15ee331',
              '7fcc31aab874ce6c8ee8584f54cfd08646b54117','305fc1e253dcab71b95d4995dae3cb09d562f22a',
              'c988f3d0cc1629ffc43165d6464c9b6ef73d6e48','8588708e875a1f8aa83524f3559080f7e17068c7',
  
```html
             'd33195a244046a3263fb5e0e83c6803a5b2e7bc3','ee26d7ae3cc71718f6e07d7d0095076f0c158f63',
               '1f4a5d178f8b6a8ef0f6784155bd5fea91158b12','7fde64753a957b98f172fd2ab0d922551909c7ba')
UNION ALL
-- Apple envió el bloque el 2026-10-19 através de la "Valid" base de datos de trustd (no un cambio de llave).
SELECT 'apple_block_applied', 'trustd valid.sqlite3', datetime(mtime, 'unixepoch') || 'Z',
       CASE WHEN mtime >= 1792368000 THEN 'OK_VALID_DB_UPDATED_SINCE_2026-10-19'
           ELSE 'STALE_NO_APPLE_BLOCK (offline o MobileAsset bloqueado)' END
FROM file
WHERE path = '/private/var/protected/trustd/valid.sqlite3'
UNION ALL
SELECT 'homebrew_ca_certificates', name, version,
       CASE WHEN version >= '2026-09-25_1' THEN 'FIXED' ELSE 'UPDATE brew upgrade ca-certificates' END
FROM homebrew_packages
WHERE name = 'ca-certificates'
UNION ALL
SELECT 'python_certifi', name || ' uid=' || uid, version || ' ' || path,
       CASE WHEN CAST(substr(version, 1, 4) AS INTEGER) * 10000
              + CAST(substr(version, 6, instr(substr(version, 6), '.') - 1) AS INTEGER) * 100
             + CAST(substr(version, 6 + instr(substr(version, 6), '.')) AS INTEGER) >= 20261019
           THEN 'FIXED' ELSE 'UPDATE certifi>=2026.10.19' END
FROM python_packages
WHERE name = 'certifi'
UNION ALL
SELECT 'toolchain', name, version, 'REVIEW Go>=1.27.3/1.26.10, Node>=22.23.4/24.22.1/26.12.1 (binarios construidos anteriormente siguen siendo vulnerables)'
FROM homebrew_packages
WHERE name IN ('go', 'node')
UNION ALL
-- fleetd envía su propio CA bundle. osqueryd lo usa (no la tienda de confianza del SO) para TLS hacia Fleet.
-- Se escribe en el momento de instalación y nunca se actualiza, así que el bloqueo del vendedor del SO no lo cubre.
SELECT 'fleetd_osquery_ca_bundle', common_name, path,
       'EXPOSED osqueryd-to-Fleet TLS confía en esta raíz; ejecuta el script de remediación'
FROM certificates
WHERE path = '/opt/orbit/certs.pem'
  AND sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1', 'd1eb23a46d17d68fd92564c2f1f1601764d8e349')
UNION ALL
SELECT 'fleetd_agent', 'orbit ' || version, 'canal=' || orbit_channel || ' scripts_enabled=' || scripts_enabled,
       'INFO orbit es Go; en macOS verifica TLS a través del SO, así que el bloqueo de Apple se aplica'
FROM orbit_info
UNION ALL
-- Go herramientas instaladas con go install (cada usuario ~/go/bin).
SELECT 'go_binary', name || ' ' || version, installed_path || ' ' || go_version,
       CASE WHEN CAST(substr(go_version, 5) AS INTEGER) >= 28
             OR (CAST(substr(go_version, 5) AS INTEGER) = 27 AND CAST(substr(go_version, 8) AS INTEGER) >= 3)
            OR (CAST(substr(go_version, 5) AS INTEGER) = 26 AND CAST(substr(go_version, 8) AS INTEGER) >= 10)
           THEN 'FIXED_GO'
           ELSE 'REBUILD con Go>=1.27.3/1.26.10' END
FROM go_binaries
UNION ALL
SELECT 'host', name, version || ' (' || build || ')', 'INFO'
FROM os_version;

Informe de Linux

SELECT 'root_in_ca_bundle' AS finding, common_name AS item, path AS detail,
       CASE sha1
         WHEN '3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1' THEN 'UNPATCHED emSign ECC Root CA - G3 todavía confiado (ca-certificates fijos lo eliminan)'
         WHEN 'd1eb23a46d17d68fd92564c2f1f1601764d8e349' THEN 'AAA Certificate Services confiado: Sectigo ruta de firma abierta (los paquetes derivados de Mozilla ya no lo envían; paquete antiguo o agregado manualmente)'
         ELSE 'emSign Root TLS/CS CA - G3 presente (no en el paquete de Mozilla; agregado manualmente)'
       END AS status
FROM certificates
WHERE sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1',
                'd1eb23a46d17d68fd92564c2f1f1601764d8e349',
                '39d3236e4a609ab6190cbfa1ad02b3cc61dfc2c3',
                '1f74b6010a219fd9ca058d07aa053d15efd9300d')
UNION ALL
SELECT 'compromised_intermediate_present', common_name, path || ' sha1=' || sha1, 'IOC_HIT investigar'
FROM certificates
WHERE subject_key_id IN ('e21e2fe71c19390e554b62c120245735248a2514',  -- EM DV TLS CA - G3B
                        '9bd86551afe7e72c37ad08ee6919d9bf3784ae0a',  -- EM OV TLS CA - G3B
                       '3edc20d9894698877b873fd88147b25c15d84706',  -- EM EV TLS CA - G3B
                       'ae7e105c3c2996c1a847270559f1e03dd4e50af3',  -- EM DV TLS CA - G3C
                         '34eaea0cebc90adaf9d0c5e2ed9b78c9879e1b6c',  -- EM OV TLS CA - G3C
                          'a6255e80a94db7f3967c1bc791df92bcee4beb5f',  -- EM EV TLS CA - G3C
                        '79fae8eccfdb0d758da458d69fb6eddc7c49dee6',  -- EM OV CS CA - G3B
                         'ee6f73298d6fbfa7b31bc39534f61556447866b7') -- EM OV CS CA - G3C
   OR sha1 IN ('a99b289464f3b44343270a7a1e910f02370483fe','1396be1372bc93dfa2a433ca964dba91548a6e57',
``````html
        '5f014e0db3bb8f950e0598ab280846d383fc57be','5dfa19197d1c1cf629af7c0cd865543c5050227c',
               'f33acd1f5d31aa81ac18c72c928446226d3d5914','19069bd6533bff93fb67c71fb3376b4ea7402c3b',
               '8ad23bc78845d6faae1d534bac89f0e36ba55a11','4b0944c14f8c2ccba4e4f32104ad920fa15ee331',
               '7fcc31aab874ce6c8ee8584f54cfd08646b54117','305fc1e253dcab71b95d4995dae3cb09d562f22a',
               'c988f3d0cc1629ffc43165d6464c9b6ef73d6e48','8588708e875a1f8aa83524f3559080f7e17068c7',
               'd33195a244046a3263fb5e0e83c6803a5b2e7bc3','ee26d7ae3cc71718f6e07d7d0095076f0c158f63',
               '1f4a5d178f8b6a8ef0f6784155bd5fea91158b12','7fde64753a957b98f172fd2ab0d922551909c7ba')
UNION ALL
-- Fijo: Ubuntu 20260816ubuntu0.{22.04,24.04,26.04,26.10}.1, Debian 20250419~deb12u2 / 20250419+deb13u1, Fedora 2026.2.92_v9.0.319, Alpine 20261020-r0
SELECT 'ca_certificates_pkg', nombre, versión || ' estado=' || estado, 'COMPARAR con la versión fija para esta distribución'
FROM deb_packages
WHERE nombre = 'ca-certificates'
UNION ALL
SELECT 'ca_certificates_pkg', nombre, versión || '-' || release, 'COMPARAR con la versión fija para esta distribución'
FROM rpm_packages
WHERE nombre = 'ca-certificates'
UNION ALL
SELECT 'python_certifi', nombre || ' uid=' || uid, versión || ' ' || ruta,
       -- Certifi empaquetado en la distribución (Debian/Ubuntu dist-packages, Fedora/RHEL site-packages).
       CASO CUANDO ruta LIKE '/usr/lib/python3/dist-packages%'
              O ruta LIKE '/usr/lib/python3%/site-packages%'
              O ruta LIKE '/usr/lib64/python3%/site-packages%'
            ENTONCES 'OK_DISTRO_CERTIFI (parcheado para usar el paquete del sistema; ver ca_certificates_pkg)'
  CUANDOCAST(substr(versión,1,4)ASINTEGER)*10000
+CAST(substr(versión,6,instr(substr(versión,6),'.')-1)ASINTEGER)*100
+CAST(substr(versión,6+instr(substr(versión,6),'.'))ASINTEGER)>=20261019
ENTONCES'FIXED'ELSE'ACTUALIZARcertifi>=2026.10.19'FIN
FROMpython_packages
WHEREnombre='certifi'
UNIONALL
SELECT'toolchain',nombre,versión,'REVISARGo>=1.27.3/1.26.10,Node>=22.23.4/24.22.1/26.12.1(binariosconstruidosanteriormentepermanecenvulnerables)'
FROMdeb_packages
WHEREnombreIN('golang-go','nodejs')
UNIONALL
SELECT'toolchain',nombre,versión||'-'||release,'REVISARGo>=1.27.3/1.26.10,Node>=22.23.4/24.22.1/26.12.1'
FROMrpm_packages
WHEREnombreIN('golang','nodejs')
UNIONALL
--fleetdenvíasupropioCAbundle.osquerydlousa(nolatiendadeconfianzadelS.O.)paraTLSaFleet.
--Seescribeenelmomentodeinstalaciónynuncaserefresca,asíqueelbloqueodelvendedordelS.O.nolocubre.
SELECT'fleetd_osquery_ca_bundle',nombre_común,ruta,
'EXPUESTOosqueryd-a-FleetTLSconfíaenestaraíz;ejecutaelscriptderemediación'
FROMcertificados
WHEREruta='/opt/orbit/certs.pem'
Ysha1IN('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1','d1eb23a46d17d68fd92564c2f1f1601764d8e349')
UNIONALL
SELECT'fleetd_agent','orbit'||versión,'canal='||orbit_channel||'scripts_enabled='||scripts_enabled,
'INFOorbitesGo;enLinuxleeelpaquetedelsistema,asíqueessegurosolounavezquelasfilasroot_in_ca_bundlehandesaparecido'
FROMorbit_info
UNIONALL
--HerramientasGoinstaladascongoinstall(cadausuario~/go/bin).
SELECT'go_binary',nombre||''||versión,ruta_instalada||''||go_version,
CASOCUANDOCAST(substr(go_version,5)ASINTEGER)>=28
O(CAST(substr(go_version,5)ASINTEGER)=27YCAST(substr(go_version,8)ASINTEGER)>=3)
O(CAST(substr(go_version,5)ASINTEGER)=26YCAST(substr(go_version,8)ASINTEGER)>=10)
ENTONCES'FIXED_GO'
ELSE'RECONSTRUIRconGo>=1.27.3/1.26.10'FIN
FROMgo_binaries
UNIONALL
SELECT'host',nombre,versión||''||platform_like,'INFO'
FROMos_version;

Informe de Windows

SELECT 'root_in_cert_store' AS hallazgo, nombre_común AS elemento,
       ubicación_del_store || '\' || store || ' usuario=' || nombre_de_usuario AS detalle,
       CASO sha1
         CUANDO '3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1' ENTONCES 'ROOT_TRUSTED emSign ECC Root CA - G3'
         CUANDO 'd1eb23a46d17d68fd92564c2f1f1601764d8e349' ENTONCES 'ROOT_TRUSTED AAA Certificate Services (Sectigo cross-sign path)'
         CUANDO '39d3236e4a609ab6190cbfa1ad02b3cc61dfc2c3' ENTONCES 'ROOT_TRUSTED emSign Root TLS CA - G3 (Microsoft root store)'
         ELSE 'ROOT_TRUSTED emSign Root CS CA - G3 (Microsoft root store, code signing)'
       FIN AS estado
FROM certificados
WHERE sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1',
               'd1eb23a46d17d68fd92564c2f1f1601764d8e349',
               '39d3236e4a609ab6190cbfa1ad02b3cc61dfc2c3',
                '1f74b6010a219fd9ca058d07aa053d15efd9300d')
UNION ALL
SELECT 'compromised_intermediate_present', nombre_común,
       ubicación_del_store || '\' || store || ' usuario=' || nombre_de_usuario || ' sha1=' || sha1, 'IOC_HIT investigar (intermedio en caché o cadena de firma)'
FROM certificados
WHERE store <> 'Certificados No Confiables'
  Y (subject_key_id IN ('e21e2fe71c19390e554b62c120245735248a2514',  -- EM DV TLS CA - G3B
                    '9bd86551afe7e72c37ad08ee6919d9bf3784ae0a',  -- EM OV TLS CA
``````html
 - G3B
                         '3edc20d9894698877b873fd88147b25c15d84706',  -- EM EV TLS CA - G3B
                        'ae7e105c3c2996c1a847270559f1e03dd4e50af3',  -- EM DV TLS CA - G3C
                      '34eaea0cebc90adaf9d0c5e2ed9b78c9879e1b6c',  -- EM OV TLS CA - G3C
                      'a6255e80a94db7f3967c1bc791df92bcee4beb5f',  -- EM EV TLS CA - G3C
                       '79fae8eccfdb0d758da458d69fb6eddc7c49dee6',  -- EM OV CS CA - G3B
                        'ee6f73298d6fbfa7b31bc39534f61556447866b7') -- EM OV CS CA - G3C
   OR sha1 IN ('a99b289464f3b44343270a7a1e910f02370483fe','1396be1372bc93dfa2a433ca964dba91548a6e57',
               '5f014e0db3bb8f950e0598ab280846d383fc57be','5dfa19197d1c1cf629af7c0cd865543c5050227c',
               'f33acd1f5d31aa81ac18c72c928446226d3d5914','19069bd6533bff93fb67c71fb3376b4ea7402c3b',
              '8ad23bc78845d6faae1d534bac89f0e36ba55a11','4b0944c14f8c2ccba4e4f32104ad920fa15ee331',
               '7fcc31aab874ce6c8ee8584f54cfd08646b54117','305fc1e253dcab71b95d4995dae3cb09d562f22a',
              'c988f3d0cc1629ffc43165d6464c9b6ef73d6e48','8588708e875a1f8aa83524f3559080f7e17068c7',
              'd33195a244046a3263fb5e0e83c6803a5b2e7bc3','ee26d7ae3cc71718f6e07d7d0095076f0c158f63',
               '1f4a5d178f8b6a8ef0f6784155bd5fea91158b12','7fde64753a957b98f172fd2ab0d922551909c7ba'))
UNION ALL
-- Bloqueo explícito agregado por remediate-emudhra-ca-compromise-windows.ps1. "Certificados No Confiables" es el nombre en inglés
-- nombre para mostrar de la tienda Desautorizada. El bloqueo de CTL de Microsoft no aparece aquí.
SELECT 'disallowed_store_block', COUNT(DISTINCT sha1) || ' de 16 intermediarios comprometidos',
       'LocalMachine\Untrusted Certificates',
       CASE WHEN COUNT(DISTINCT sha1) = 16 THEN 'OK_EXPLICITLY_DISTRUSTED'
            ELSE 'NOT_PRESENT ejecutar el script de remediación para un bloqueo explícito' END
FROM certificates
WHERE store_location = 'LocalMachine'
  AND store = 'Untrusted Certificates'
  AND sha1 IN ('a99b289464f3b44343270a7a1e910f02370483fe','1396be1372bc93dfa2a433ca964dba91548a6e57',
               '5f014e0db3bb8f950e0598ab280846d383fc57be','5dfa19197d1c1cf629af7c0cd865543c5050227c',
               'f33acd1f5d31aa81ac18c72c928446226d3d5914','19069bd6533bff93fb67c71fb3376b4ea7402c3b',
              '8ad23bc78845d6faae1d534bac89f0e36ba55a11','4b0944c14f8c2ccba4e4f32104ad920fa15ee331',
              '7fcc31aab874ce6c8ee8584f54cfd08646b54117','305fc1e253dcab71b95d4995dae3cb09d562f22a',
              'c988f3d0cc1629ffc43165d6464c9b6ef73d6e48','8588708e875a1f8aa83524f3559080f7e17068c7',
              'd33195a244046a3263fb5e0e83c6803a5b2e7bc3','ee26d7ae3cc71718f6e07d7d0095076f0c158f63',
               '1f4a5d178f8b6a8ef0f6784155bd5fea91158b12','7fde64753a957b98f172fd2ab0d922551909c7ba')
UNION ALL
-- El bloqueo de Microsoft 2026-10-20 se envía através del CTL Desautorizado auto-actualización (CTL Updater), no Windows Update.
SELECT 'ctl_autoupdate_policy', name, 'data=' || data,
       CASE WHEN name = 'DisableRootAutoUpdate' AND data = '1' THEN 'BLOCK_WILL_NOT_ARRIVE auto root update deshabilitado por política'
           WHEN name = 'EnableDisallowedCertAutoUpdate' AND data = '0' THEN 'BLOCK_WILL_NOT_ARRIVE actualización CTL deshabilitada por política'
           ELSE 'OK' END
FROM registry
WHERE key = 'HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot'
  AND name IN ('DisableRootAutoUpdate', 'EnableDisallowedCertAutoUpdate')
UNION ALL
SELECT 'disallowed_ctl_sync', name, 'key_mtime=' || datetime(mtime, 'unixepoch') || 'Z',
       CASE WHEN mtime >= 1792454400 THEN 'OK_AUTOUPDATE_KEY_WRITTEN_SINCE_2026-10-20'
            ELSE 'NOT_SYNCED_SINCE_BLOCK (offline, WSUS-only, o política)' END
FROM registry
WHERE key = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\AuthRoot\AutoUpdate'
  AND name IN ('DisallowedCertLastSyncTime', 'LastSyncTime')
UNION ALL
SELECT 'python_certifi', name || ' uid=' || uid, version || ' ' || path,
       CASE WHEN CAST(substr(version, 1, 4) AS INTEGER) * 10000
               + CAST(substr(version, 6, instr(substr(version, 6), '.') - 1) AS INTEGER) * 100
              + CAST(substr(version, 6 + instr(substr(version, 6), '.')) AS INTEGER) >= 20261019
           THEN 'FIXED' ELSE 'UPDATE certifi>=2026.10.19' END
FROM python_packages
WHERE name = 'certifi'
UNION ALL
SELECT 'toolchain', name, version, 'REVIEW Go>=1.27.3/1.26.10, Node>=22.23.4/24.22.1/26.12.1 (binaries compilados anteriormente permanecen vulnerables)'
FROM programs
WHERE name LIKE 'Go Programming Language%' OR name = 'Node.js'
UNION ALL
-- fleetd envía su propio bundle CA. osqueryd lo utiliza (no la tienda de Windows) para TLS hacia Fleet.
-- Windows osquery no puede analizar archivos PEM, así que coincide una línea única de cada raíz
-- (fleetd bundles envuelven en 76 columnas). La unión salta hosts sin el archivo.
SELECT 'fleetd_osquery_ca_bundle',
       CASE WHEN l.line LIKE 'CBeQyh%' THEN 'emSign ECC Root CA - G3' ELSE 'AAA Certificate Services' END,
       l.path, 'EXPUESTO osqueryd-a-Fleet TLS confía en esta raíz; ejecuta el script de remediación'
FROM file f
JOIN file_lines l ON l.path = f.path
WHERE f.path = 
```'C:\Program Files\Orbit\certs.pem'
  Y l.line EN ('CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7',
                '8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C')
UNIÓN TODAS
SELECCIONAR 'fleetd_agent', 'orbit ' || versión, 'canal=' || orbit_channel || ' scripts_enabled=' || scripts_enabled,
       'INFO orbit está Go; en Windows verifica TLS a través del S.O., así que el bloqueo de Microsoft aplica'
DE orbit_info
UNIÓN TODAS
-- Go herramientas instaladas con go install (cada usuario/a go\bin).
SELECCIONAR 'go_binary', nombre || ' ' || versión, ruta_instalada || ' ' || go_version,
       CASO CUANDO CAST(substr(go_version, 5) AS ENTERO) >= 28
              O (CAST(substr(go_version, 5) AS ENTERO) = 27 Y CAST(substr(go_version, 8) AS ENTERO) >= 3)
              O (CAST(substr(go_version, 5) AS ENTERO) = 26 Y CAST(substr(go_version, 8) AS ENTERO) >= 10)
           ENTONCES 'FIXED_GO'
           SINO 'RECONSTRUIR con Go>=1.27.3/1.26.10' FIN
DE go_binaries
UNIÓN TODAS
SELECCIONAR 'host', nombre, versión || ' compilación ' || compilación, 'INFO'
DE os_version;

Cada informe devuelve cuatro columnas (finding, item, detail, y status) y una fila por señal. Si un hallazgo no tiene fila, no fue encontrado.

Hallazgo Qué significa
compromised_intermediate_present One de los 16 certificados revocados se encuentra en un almacén local. Investiga quién lo colocó allí.
root_in_ca_bundle / root_in_pem_bundle Un archivo CA del sistema aún confía en una raíz comprometida. Las herramientas de línea de comandos están expuestas.
fleetd_osquery_ca_bundle El paquete del agente de IT de Factorial aún confía en una raíz comprometida. Factorial IT lo limpia.
apple_block_applied / disallowed_ctl_sync Si se aplicó el bloqueo de Apple o Microsoft. STALE o NOT_SYNCED significa que no se aplicó.
disallowed_store_block Solo Windows: cuántos de los 16 certificados el script de remediación ha desautorizado explícitamente.
ctl_autoupdate_policy La Política de Grupo bloquea las actualizaciones automáticas de desconfianza de Microsoft.
ca_certificates_pkg, homebrew_ca_certificates, python_certifi, toolchain Versiones de paquetes y runtime, para comparar con las versiones fijas en Actualiza los runtimes que llevan sus propias raíces.
go_binary Una herramienta Go en el go/bin de un usuario/a construida con Go anterior a 1.27.3 o 1.26.10.
root_in_keychain / root_in_cert_store, fleetd_agent, host Solo contexto. Apple y Microsoft envían ambas raíces en cada dispositivo y bloquean los intermedios en su lugar, por lo que estas filas permanecen después de la corrección.

Si una fila fleetd_osquery_ca_bundle sigue allí en un dispositivo que ha estado en línea durante un día entero, necesitamos revisarla. Envía un correo a support@factorial.it con el nombre del dispositivo.

 

Paso 2: ejecutar los scripts de remediación

Fleet mantiene un script de remediación para cada S.O.:

Script Qué cambia
remediate-emudhra-ca-compromise-macos.sh Elimina ambas raíces de /etc/ssl/cert.pem, y actualiza los fórmulas de Homebrew ca-certificates y certifi como propietario de Homebrew.
remediate-emudhra-ca-compromise-linux.sh Actualiza ca-certificates (apt, dnf, yum, zypper, apk). Donde la distribución aún no tiene solución, desconfía de las raíces de manera nativa: una entrada ! en /etc/ca-certificates.conf en Debian, Ubuntu y Alpine, un archivo de lista negra de p11-kit en Fedora, RHEL, Arch y openSUSE.
remediate-emudhra-ca-compromise-windows.ps1 Agrega los 16 intermedios al almacén de Certificados No Confiables de la máquina, para dispositivos que la actualización de Microsoft no puede alcanzar. Microsoft Defender lo bloquea: usa el script de IT de Factorial para Windows a continuación.

Los scripts dejan el paquete del agente de IT de Factorial intacto una vez que Factorial IT lo ha limpiado. Puedes ejecutarlos más de una vez sin problemas. Antes de editar un archivo, guardan una copia de seguridad *.pre-emudhra de él. Códigos de salida: 0 significa que el dispositivo está protegido, 2 significa que algo necesita revisión, y 1 significa un error. Cuando una ejecución se muestra como Fallida, su salida explica por qué.

  1. Descarga cada script de GitHub con Descargar archivo en bruto. Luego, en la consola de Factorial IT, ve a Gestión de Dispositivos > Scripts > Biblioteca y arrástralo a Agregar un script. El nombre y la plataforma se completan automáticamente.
  2. Haz clic en Ejecutar script > Objetivo por grupo de dispositivos, elige un grupo pequeño como los dispositivos del equipo de IT, y revisa la salida en Historial de Ejecuciones.
  3. Ejecuta cada script nuevamente, esta vez con Objetivo todos los dispositivos.
  4. Verifica un dispositivo contra los hosts de prueba públicos y ejecuta los informes nuevamente, como se describe en Verificar.

Si Microsoft Defender está activado. Defender detiene el script de Windows de Fleet antes de que comience, ya sea que lo inicies con Ejecutar script o manualmente. El script contiene los certificados comprometidos, por lo que la ejecución falla con ScriptContainedMaliciousContent. En esos dispositivos tienes dos opciones: ejecutar el script de IT de Factorial para Windows a continuación, o dejar que la actualización automática de confianza de Microsoft solucione el dispositivo. Para lo segundo, conecta el dispositivo a Internet y elimina la Política de Grupo mencionada en la fila ctl_autoupdate_policy del informe de Windows.

 

Script de IT de Factorial para Windows

distrust-emudhra-intermediates-windows.ps1 obtiene cada uno de los 16 intermedios de crt.sh por su SHA-256, verifica los bytes y lo agrega a Certificados No Confiables. Debido a que no contiene certificado, Microsoft Defender permite su ejecución. El dispositivo debe poder acceder a crt.sh. Códigos de salida: 0 cuando todos los 16 están desautorizados, 2 cuando algunos no pudieron ser descargados (las líneas WARN dan la razón), y 1 en caso de error. Guárdalo con ese nombre de archivo y agrégalo a la biblioteca de scripts junto a los demás.

# distrust-emudhra-intermediates-windows.ps1
# Agrega los 16 intermediarios comprometidos de eMudhra (octubre 2026) a la tienda de Certificados No Confiables de esta máquina,
# el bloqueo que Microsoft envía a través de su actualización automática de confianza, para un dispositivo que no la recibió.
# No incorpora ningún certificado: cada uno se descarga de crt.sh por SHA-256 y se agrega solo cuando sus bytes coinciden.
# Salida: 0 = todos 16 son no confiables, 2 = algunos no se pudieron descargar o agregar (lee las líneas WARN), 1 = error.

$ErrorActionPreference = 'Stop'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$Sha256 = @(
    '42C4ACCD12C4F59597925E1A08A7A90102608543809308D50EC427E118BA1493'  # EM DV TLS CA - G3B (a través de emSign),
    '45A883F349AEDFD5F3A649B5498FFB121712BA8B448F3F2A91DBC5A766FCDDBE'  # EM DV TLS CA - G3B (a través de Sectigo AAA),
    '98B896625C0C230ADEEC3EB2CF6AAD5001ECF9156A68644E82374CE5833BC25B'  # EM OV TLS CA - G3B (a través de emSign),
    '5F1DED4DD590AF74631290CF073B122A2AAC6A1FA479778A0BD43579BD832699'  # EM OV TLS CA - G3B (a través de Sectigo AAA),
    'E7568FE6E12331F4FD7DE61DA4C7559D0F8EB192A218D4741A3BA75184333838'  # EM EV TLS CA - G3B (a través de emSign),
    '579480AEA166290BD3C643589E795FC0D0E54E86505D180F1DFF99EFD3199512'  # EM EV TLS CA - G3B (a través de Sectigo AAA),
    '0164D7CEAE5BB909C272AF151FF44B1177AE9B47D9424B94F1D9558C30934D19'  # EM DV TLS CA - G3C (a través de emSign),
    '62B7F9868263F72F6911FC78CEAF72C1979158B7368BF648683BB2AA39B02E72'  # EM DV TLS CA - G3C (a través de Sectigo AAA),
    'CB6E15165AC802E9B3F993F16C25D41F4E81C21EBDE71AE1B012AC00BF9C7C3F'  # EM OV TLS CA - G3C (a través de emSign),
    '7485B51C0ED192878FA1D2F948FB529AE1842CC5086C4B67F7BE5B2039DE9489'  # EM OV TLS CA - G3C (a través de Sectigo AAA),
    '432EC25F0D28DE9006D97BF752F17BBB2CD41F669933FCB072D9A1148D0261F3'  # EM EV TLS CA - G3C (a través de emSign),
    'FD9D5C2DBBD4995AB69B8D50C439D9527B00529199C2FD01B2174EB58F07021F'  # EM EV TLS CA - G3C (a través de Sectigo AAA),
    '9E39DE2881273ACC225A149C72BA3E0F51424963669AB633EE1DC7DF5DB067B4'  # EM OV CS CA - G3B (a través de emSign),
    'A496E23AC0CAB8155FC9B117B97EAE368EFCBB9041AEC8804D5A308D2D01C2D8'  # EM OV CS CA - G3B (a través de Sectigo AAA),
    '4B2460A466F95FD40113BCDCCA2CEB29B3B093921DE45474DA7DF48874C630B1'  # EM OV CS CA - G3C (a través de emSign),
    '84112972B8E59D14560AE7E7119654474AAD119990CF3722BFC1E3B91615E1FD'  # EM OV CS CA - G3C (a través de Sectigo AAA)
)

function Get-Sha256Hex([byte[]]$Bytes) {
    $sha = [Security.Cryptography.SHA256]::Create()
    try { return -join ($sha.ComputeHash($Bytes) | ForEach-Object { $_.ToString('X2') }) } finally { $sha.Dispose() }
}

function Get-Certificate([string]$Fingerprint) {
    $client = New-Object Net.WebClient
    for ($attempt = 1; $attempt -le 5; $attempt++) {
    try {
        try {
    $pem = $client.DownloadString("https://crt.sh/?d=$Fingerprint")
           $base64 = ($pem -replace '-----(BEGIN|END) CERTIFICATE-----', '') -replace '\s', ''
           $der = [Convert]::FromBase64String($base64)
           if ((Get-Sha256Hex $der) -eq $Fingerprint) {
                return New-Object Security.Cryptography.X509Certificates.X509Certificate2 (, $der)
            }
           [Console]::WriteLine("WARN      crt.sh respondió con otros bytes para $Fingerprint (intento $attempt)")
       } catch {
            [Console]::WriteLine("WARN      crt.sh: $($_.Exception.Message) para $Fingerprint (intento $attempt)")
        }
        Start-Sleep -Seconds (3 * $attempt)
    }
    return $null
}

$store = New-Object Security.Cryptography.X509Certificates.X509Store('Disallowed', 'LocalMachine')
$store.Open('ReadWrite')
try {
    $present = @{}
    foreach ($cert in $store.Certificates) { $present[(Get-Sha256Hex $cert.RawData)] = $true }

    $added = 0
    foreach ($fingerprint in $Sha256) {
    if ($present.ContainsKey($fingerprint)) { Write-Output "PRESENT   $fingerprint"; continue }
        $cert = Get-Certificate $fingerprint
        if ($null -eq $cert) { continue }
        $store.Add($cert)
        $present[$fingerprint] = $true
        $added++
        Write-Output "ADDED     $fingerprint $($cert.Subject)"
    }

    $missing = @($Sha256 | Where-Object { -not $present.ContainsKey($_) }).Count
    Write-Output "VERIFY    $($Sha256.Count - $missing) de $($Sha256.Count) intermediarios comprometidos en Certificados No Confiables ($added agregados)"
    if ($missing -gt 0) { exit 2 }
    exit 0
} finally {
    $store.Close()
}

 

Bueno saber después de ejecutar los scripts
  • Reinicia los servicios de larga duración en servidores Linux. La mayoría de las herramientas solo leen el paquete CA cuando inician.
  • Ejecuta el informe de macOS nuevamente después de cada actualización de macOS. Una actualización puede restablecer /etc/ssl/cert.pem a su estado original.
  • Presta atención a que Homebrew sea omitido. Si brew no puede ejecutarse como el propietario de Homebrew, por ejemplo, porque no se ha aceptado la licencia de Xcode, el script de macOS de Fleet omite Homebrew silenciosamente y aún así sale con 0. El informe de macOS sigue mostrando su fila de homebrew_ca_certificates. Ejecuta sudo xcodebuild -license accept en esa Mac, luego ejecuta el script nuevamente. La copia que el agente personalizado coloca en la biblioteca de Scripts imprime una advertencia y sale con 2 en su lugar.

 

Revertir un cambio
  • En macOS y Linux, copia cada respaldo *.pre-emudhra sobre el archivo del que fue tomado. En Linux, también elimina los archivos emudhra-*.pem añadidos a la carpeta de lista negra de p11-kit, restaura /etc/ca-certificates.conf.pre-emudhra si existe, y ejecuta update-ca-certificates o update-ca-trust.
  • En Windows, abre certlm.msc y elimina las 16 entradas añadidas de Certificados No Confiables.

No restaures nunca el paquete del agente de IT de Factorial. Hacerlo haría que confíe nuevamente en las raíces comprometidas.

 

Automatiza la solución con políticas de Fleet

En la consola de Fleet, crea una política por sistema operativo y establece su automatización de Ejecutar script al script de remediación correspondiente. Los dispositivos que no cumplen con la política se reparan a sí mismos. Fleet mantiene las tres políticas en GitOps en emudhra-ca-compromise.policies.yml. Si un dispositivo sigue fallando, el script se negó a cambiar el paquete del agente, y la salida del script proporciona la razón.

Política de macOS. Pasa cuando /etc/ssl/cert.pem y el paquete del agente ya no contienen ninguna de las raíces:

SELECT 1 FROM os_version WHERE NOT EXISTS (
  SELECT 1 FROM certificates
  WHERE path IN ('/etc/ssl/cert.pem', '/opt/orbit/certs.pem')
    AND sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1', 'd1eb23a46d17d68fd92564c2f1f1601764d8e349'));

Política de Linux. Pasa cuando no hay almacén de certificados y el paquete del agente no contiene ninguna raíz:

SELECT 1 FROM os_version WHERE NOT EXISTS (
  SELECT 1 FROM certificates
  WHERE sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1', 'd1eb23a46d17d68fd92564c2f1f1601764d8e349'))
AND NOT EXISTS (
  SELECT 1 FROM certificates
  WHERE path = '/opt/orbit/certs.pem'
    AND sha1 IN ('3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1', 'd1eb23a46d17d68fd92564c2f1f1601764d8e349'));

Política de Windows. Se aprueba cuando el paquete del agente no contiene ninguno de los certificados raíz. Windows osquery no puede leer archivos PEM, así que la consulta busca una línea que solo aparece en cada raíz:

SELECT 1 FROM os_version WHERE NOT EXISTS (
  SELECT 1 FROM file f JOIN file_lines l ON l.path = f.path
  WHERE f.path = 'C:\Program Files\Orbit\certs.pem'
    AND l.line IN ('CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7',
                  '8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C'));

 

Actualizar los entornos de ejecución que llevan sus propias raíces

Estas herramientas vienen con su propia copia de las raíces, así que solo una nueva versión las corrige. Actualízalas en estaciones de trabajo, servidores e imágenes de contenedor. Luego reconstruye tus imágenes y cualquier binario que compiles tú mismo/a.

Software Corregido en
Node.js 22.23.4, 24.22.1, 26.12.1
Electron (y las aplicaciones de escritorio construidas sobre él) 42.11.16, 43.8.1, 44.9.1
Go (reconstruir cada binario construido con una cadena de herramientas más antigua) 1.26.10, 1.27.3
Java 8u511, 11.0.33.0.2, 17.0.21.0.2, 21.0.13.0.2, 25.0.5.0.2, 27.0.1.0.2
Python 3.13.17, 3.14.9, 3.15.1
Python certifi 2026.10.19
pip 26.2.2
uv 0.13.4
Conda 26.9.4
Bun 1.4.4
Deno 2.9.8
Rust webpki-roots / webpki-root-certs 1.0.10
Rust rustls-webpki 0.103.16
Docker Desktop 4.96.2
Homebrew ca-certificates 2026-09-25_1
curl CA bundle (cacert.pem) 2026-10-20

En Linux, la corrección viene en el paquete ca-certificates:

Distribución Versión ca-certificates corregida
Ubuntu 22.04, 24.04, 26.04, 26.10 20260816ubuntu0.22.04.1, 20260816ubuntu0.24.04.1, 20260816ubuntu0.26.04.1, 20260816ubuntu0.26.10.1
Debian 12, Debian 13 20250419~deb12u2, 20250419+deb13u1
Fedora 2026.2.92_v9.0.319
Alpine 20261020-r0
Arch Linux (ca-certificates-mozilla) 3.131.1-1

certifi instalado desde la distribución, como python3-certifi en Debian y Ubuntu, utiliza el paquete del sistema. Para la lista actualizada de software corregido, consulta el sitio de divulgación.

 

Verificar

Dos hosts de prueba públicos presentan certificados de un intermediario comprometido: uno encadena a la raíz de emSign, el otro a la firma cruzada de Sectigo. Un cliente protegido rechaza ambos.

curl -sS -o /dev/null -w '%{http_code}\n' https://dv-g3b-emudhra.we-have-a-problem.com/
curl -sS -o /dev/null -w '%{http_code}\n' https://dv-g3b-aaa-emudhra.we-have-a-problem.com/
Invoke-WebRequest -UseBasicParsing https://dv-g3b-emudhra.we-have-a-problem.com/

Si obtienes un error de certificado, el cliente está protegido. Si obtienes 200, todavía confía en la cadena falsificada. Después, lee nuevamente los informes, o el ticket del agente: los hallazgos del paquete del sistema y el hallazgo del paquete del agente de Factorial deberían haber desaparecido.

 

Referencia: certificados comprometidos

Las dos raíces que deben eliminarse de los paquetes CA:

Raíz SHA-1 Incluido en
emSign ECC Root CA - G3 3043fa4ff257dca0c380ee2e58ea78b23fe6bbc1 Apple, Chrome, Microsoft, Mozilla
AAA Certificate Services (Sectigo) d1eb23a46d17d68fd92564c2f1f1601764d8e349 Apple, Microsoft (eliminado de Chrome y Mozilla)

Dos raíces adicionales emiten los intermediarios directamente. Solo la tienda de Microsoft las contiene, y Microsoft bloquea los intermediarios mismos:

Raíz SHA-1
emSign Root TLS CA - G3 39d3236e4a609ab6190cbfa1ad02b3cc61dfc2c3
emSign Root CS CA - G3 1f74b6010a219fd9ca058d07aa053d15efd9300d

Los 16 intermediarios comprometidos:

Intermediario Uso Emitido por SHA-1
EM DV TLS CA - G3B TLS emSign Root TLS CA - G3 a99b289464f3b44343270a7a1e910f02370483fe
EM DV TLS CA - G3B TLS AAA Certificate Services 1396be1372bc93dfa2a433ca964dba91548a6e57
EM OV TLS CA - G3B TLS emSign Root TLS CA - G3 5f014e0db3bb8f950e0598ab280846d383fc57be
EM OV TLS CA - G3B TLS AAA Certificate Services 5dfa19197d1c1cf629af7c0cd865543c5050227c
EM EV TLS CA - G3B TLS emSign Root TLS CA - G3 f33acd1f5d31aa81ac18c72c928446226d3d5914
EM EV TLS CA - G3B TLS AAA Certificate Services 19069bd6533bff93fb67c71fb3376b4ea7402c3b
EM DV TLS CA - G3C TLS emSign Root TLS CA - G3 8ad23bc78845d6faae1d534bac89f0e36ba55a11
EM DV TLS CA - G3C TLS AAA Certificate Services 4b0944c14f8c2ccba4e4f32104ad920fa15ee331
EM OV TLS CA - G3C TLS emSign Root TLS CA - G3 7fcc31aab874ce6c8ee8584f54cfd08646b54117
EM OV TLS CA - G3C TLS AAA Certificate Services 305fc1e253dcab71b95d4995dae3cb09d562f22a
EM EV TLS CA - G3C TLS emSign Root TLS CA - G3 c988f3d0cc1629ffc43165d6464c9b6ef73d6e48
EM EV TLS CA - G3C TLS AAA Certificate Services 8588708e875a1f8aa83524f3559080f7e17068c7
EM OV CS CA - G3B Firma de código emSign Root CS CA - G3 d33195a244046a3263fb5e0e83c6803a5b2e7bc3
EM OV CS CA - G3B Firma de código AAA Certificate Services ee26d7ae3cc71718f6e07d7d0095076f0c158f63
EM OV CS CA - G3C Firma de código emSign Root CS CA - G3 1f4a5d178f8b6a8ef0f6784155bd5fea91158b12
EM OV CS CA - G3C Firma de código AAA Certificate Services 7fde64753a957b98f172fd2ab0d922551909c7ba

Huellas digitales SHA-256, números de serie e identificadores de clave. Los dos certificados de un intermediario utilizan la misma clave, por lo que también comparten su identificador de clave sujeto (SKI).

EM DV TLS CA - G3B (via emSign)
  SHA-256  42C4ACCD12C4F59597925E1A08A7A90102608543809308D50EC427E118BA1493
  Serial   A4AEE678F23362B4C0E460B772F214
  SKI      E21E2FE71C19390E554B62C120245735248A2514

EM DV TLS CA - G3B (via Sectigo AAA)
  SHA-256  45A883F349AEDFD5F3A649B5498FFB121712BA8B448F3F2A91DBC5A766FCDDBE
  Serial   A024FDF4BA665C785CE4A020483858B7
  SKI      E21E2FE71C19390E554B62C120245735248A2514

EM OV TLS CA - G3B (via emSign)
  SHA-256  98B896625C0C230ADEEC3EB2CF6AAD5001ECF9156A68644E82374CE5833BC25B
  Serial   6CADA367FB1C100088120EA202D568
  SKI      9BD86551AFE7E72C37AD08EE6919D9BF3784AE0A

EM OV TLS CA - G3B (via Sectigo AAA)
  SHA-256  5F1DED4DD590AF74631290CF073B122A2AAC6A1FA479778A0BD43579BD832699
  Serial   E94223BDE92F914E5AB9ACABFDAC3710
  SKI      9BD86551AFE7E72C37AD08EE6919D9BF3784AE0A

EM EV TLS CA - G3B (via emSign)
  SHA-256  E7568FE6E12331F4FD7DE61DA4C7559D0F8EB192A218D4741A3BA75184333838
  Serial   C7C41EFE92D825F05EAE841A4A82C1
  SKI      3EDC20D9894698877B873FD88147B25C15D84706

EM EV TLS CA - G3B (via Sectigo AAA)
  SHA-256  579480AEA166290BD3C643589E795FC0D0E54E86505D180F1DFF99EFD3199512
  Serial   D8F8685E4F2BD9D82402A85A1C1EB731
  SKI      3EDC20D9894698877B873FD88147B25C15D84706

EM DV TLS CA - G3C (via emSign)
  SHA-256  0164D7CEAE5BB909C272AF151FF44B1177AE9B47D9424B94F1D9558C30934D19
  Serial   588B2E3C2BB8CDA13E1A1209254321
  SKI      AE7E105C3C2996C1A847270559F1E03DD4E50AF3

EM DV TLS CA - G3C (via Sectigo AAA)
  SHA-256  62B7F9868263F72F6911FC78CEAF72C1979158B7368BF648683BB2AA39B02E72
  Serial   91F347F1A5B7D39962B95E0EE4E299D1
  SKI      AE7E105C3C2996C1A847270559F1E03DD4E50AF3

EM OV TLS CA - G3C (via emSign)
  SHA-256  CB6E15165AC802E9B3F993F16C25D41F4E81C21EBDE71AE1B012AC00BF9C7C3F
  Serial   296926C227A3A1526392B19482A504
  SKI      34EAEA0CEBC90ADAF9D0C5E2ED9B78C9879E1B6C

EM OV TLS CA - G3C (via Sectigo AAA)
  SHA-256  7485B51C0ED192878FA1D2F948FB529AE1842CC5086C4B67F7BE5B2039DE9489
  Serial   8D5A4811939EF447D77111CDD9849AE9
  SKI      34EAEA0CEBC90ADAF9D0C5E2ED9B78C9879E1B6C

EM EV TLS CA - G3C (via emSign)
  SHA-256  432EC25F0D28DE9006D97BF752F17BBB2CD41F669933FCB072D9A1148D0261F3
  Serial   8009928A64107601AF05FA2F19F109
  SKI      A6255E80A94DB7F3967C1BC791DF92BCEE4BEB5F

EM EV TLS CA - G3C (via Sectigo AAA)
  SHA-256  FD9D5C2DBBD4995AB69B8D50C439D9527B00529199C2FD01B2174EB58F07021F
  Serial   05F078752DECE7A1BB8595D303167171
  SKI      A6255E80A94DB7F3967C1BC791DF92BCEE4BEB5F

EM OV CS CA - G3B (via emSign)
  SHA-256  9E39DE2881273ACC225A149C72BA3E0F51424963669AB633EE1DC7DF5DB067B4
  Serial   7818933F8F85B4619A2B35FBA83D0A
  SKI      79FAE8ECCFDB0D758DA458D69FB6EDDC7C49DEE6

EM OV CS CA - G3B (via Sectigo AAA)
  SHA-256  A496E23AC0CAB8155FC9B117B97EAE368EFCBB9041AEC8804D5A308D2D01C2D8
  Serial   41E32B73AC185D6CE0D7480BACF84E69
  SKI      79FAE8ECCFDB0D758DA458D69FB6EDDC7C49DEE6

EM OV CS CA - G3C (via emSign)
  SHA-256  4B2460A466F95FD40113BCDCCA2CEB29B3B093921DE45474DA7DF48874C630B1
  Serial   544B7F922C31AE220A4A922916F6E6
  SKI      EE6F73298D6FBFA7B31BC39534F61556447866B7

EM OV CS CA - G3C (via Sectigo AAA)
  SHA-256  84112972B8E59D14560AE7E7119654474AAD119990CF3722BFC1E3B91615E1FD
  Serial   D6A5EF613B390F32EF9CDF349F772841
  SKI      EE6F73298D6FBFA7B31BC39534F61556447866B7

emSign Root TLS CA - G3 (root)
  SHA-256  7DD78D5F4F13459A83DFF9ABBBA62EDBAF6F2D102BF257FD712F4D9F2746ED8D
  Serial   0E760672F143459FC8FE0AB0BC05E394
  SKI      E13AAB217CF1E34D54AED472B7FD8B5942209054

emSign Root CS CA - G3 (root)
  SHA-256  F2EDAAFF3D9B701FB4D14C9F285F8C0BAD90FC3BCC1FA07D47F4718EDABA34A5
  Serial   018FCEC927C116F59C997EDC0CCD2E2B
  SKI      687403F885CA8D5450571D16E0C8DE450DABCD2D

AAA Certificate Services (root)
  SHA-256  D7A7A0FB5D7E2731D771E9484EBCDEF71D5F0C3E0A2948782BC83EE0EA699EF4
  Serial   01
  SKI      A0110A233E96F107ECE2AF29EF82A57FD030A4B4

emSign ECC Root CA - G3 (root)
  SHA-256  86A1ECBA089C4A8D3BBE2734C612BA341D813E043CF9E8A862CD5C57A36BBE6B
  Serial   3CF607A968700EDA8B84
  SKI      7C5D028413D4CC8A9B81CE171C2E291E9C486342

 

Fuentes


 

Consejos y mejores prácticas

  • Deja el paquete del agente a Factorial IT. No lo edites ni lo restaures. Los scripts ya lo omiten una vez que está limpio.
  • Comienza con un grupo piloto. Ejecuta cada script en un puñado de dispositivos, lee la salida y luego despliega a todos los dispositivos.
  • Mantén el sistema operativo actualizado. Los navegadores y aplicaciones que verifican a través del sistema operativo solo son seguros una vez que se instala la actualización de Apple o Microsoft.
  • No olvides los entornos de ejecución y las imágenes. Node.js, Electron, binarios de Go, certifi y las imágenes de contenedor permanecen expuestos incluso en un dispositivo parcheado. Actualízalos y recompílalos.
  • Verifica nuevamente después de las actualizaciones de macOS. Una actualización puede restaurar /etc/ssl/cert.pem, así que ejecuta el informe de macOS después de cada una.
  • Reinicia los servicios en servidores Linux. La mayoría de las herramientas leen el paquete CA solo al inicio.
  • Trata un intermedio encontrado en un dispositivo como un incidente. Una fila compromised_intermediate_present significa que alguien o algo colocó ese certificado allí.

 

Resolución de problemas y FAQ

Resolución de problemas

  • El script de Windows de Fleet falla con ScriptContainedMaliciousContent. Microsoft Defender lo bloqueó, porque el script contiene los certificados comprometidos. Ejecuta el script de Factorial IT para Windows en su lugar, o conecta el dispositivo en línea y levanta la Política de Grupo mencionada en la fila ctl_autoupdate_policy.
  • El script de Factorial IT para Windows sale con 2. Algunos certificados no pudieron ser descargados. Lee las líneas WARN y verifica que el dispositivo pueda alcanzar crt.sh.
  • El script de macOS sale con 0 pero homebrew_ca_certificates sigue allí. Homebrew fue omitido, generalmente porque la licencia de Xcode no ha sido aceptada. Ejecuta sudo xcodebuild -license accept en el Mac y ejecuta el script nuevamente.
  • Una fila fleetd_osquery_ca_bundle permanece después de un día completo en línea. Envía un correo a support@factorial.it con el nombre del dispositivo.
  • Una política de Fleet sigue fallando en un dispositivo. El script se negó a cambiar el paquete del agente. Su salida explica por qué.
  • El informe de Windows muestra NOT_SYNCED o BLOCK_WILL_NOT_ARRIVE. El bloqueo de Microsoft no ha llegado al dispositivo: está fuera de línea, usa solo WSUS, o una Política de Grupo detiene la actualización automática. Ejecuta el script de remediación, o corrige la causa.
  • El informe de macOS muestra STALE_NO_APPLE_BLOCK. El Mac no ha recibido el bloqueo de Apple. Probablemente esté fuera de línea o no pueda alcanzar los servidores de actualización de Apple.
  • Un host de prueba devuelve 200. Ese cliente aún confía en la cadena falsificada. Verifica qué tienda de confianza utiliza y corrígelo con los pasos anteriores.

 

FAQ

  1. ¿Necesito hacer algo por el agente de Factorial IT?
    No. Factorial IT elimina ambas raíces del paquete del agente en cada dispositivo inscrito, y los nuevos paquetes de inscripción vienen sin ellas.
     
  2. Mis dispositivos están actualizados. ¿Estoy seguro?
    Los navegadores y aplicaciones que verifican a través del sistema operativo lo están. Las herramientas de línea de comandos en macOS, el paquete del sistema Linux, Node.js, Electron, certifi, binarios de Go en Linux y las imágenes de contenedor no lo están, hasta que los corrijas.
     
  3. ¿Podrían mis usuarios haber sido atacados a través de sus navegadores?
    No a través de navegadores que imponen la Transparencia de Certificados: ningún certificado TLS de estos intermedios aparece en los registros CT. Un atacante también necesitaría estar en la ruta de red.
     
  4. ¿Están en riesgo los paquetes instalados con apt o dnf?
    No. Están firmados con GPG.
     
  5. ¿Es seguro ejecutar los scripts de remediación dos veces?
    Sí. Mantienen un respaldo *.pre-emudhra de cada archivo que cambian, por lo que también puedes revertir.
     
  6. ¿Por qué permanecen las filas root_in_keychain y root_in_cert_store después de la reparación?
    Son solo contexto. Apple y Microsoft mantienen ambas raíces en cada dispositivo y bloquean los intermedios en su lugar.
     
  7. ¿El agente personalizado reiniciará o borrará dispositivos?
    No. Nunca restaura un respaldo, bloquea, borra o reinicia un dispositivo, y espera la aprobación de un administrador antes de cada etapa.
     
  8. ¿Qué pasa con el kit de remediación cuando se completa el trabajo?
    Permanece en su lugar. El agente cierra su ticket y te dice que puede ser pausado.

¿Te fue útil este artículo?

Give feedback about this article

¿No encuentras lo que estás buscando?

Nuestro equipo de servicio al cliente está aquí para ti.

Contáctanos

Knowledge Base Software powered by Helpjuice