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:
- 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.
- 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.
- Ve a Agentes de IA > Agentes, haz clic en Explorar plantillas, filtra por Equipo y abre Cerrar la exposición de CA de eMudhra.
- En las instrucciones, encuentra
PILOT DEVICESy escribe un grupo de dispositivos o nombres de dispositivos después dePilot:. 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. - 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.
- 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é.
- 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.
- 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.
- Ejecuta cada script nuevamente, esta vez con Objetivo todos los dispositivos.
- 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.pema su estado original. -
Presta atención a que Homebrew sea omitido. Si
brewno 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 con0. El informe de macOS sigue mostrando su fila dehomebrew_ca_certificates. Ejecutasudo xcodebuild -license accepten esa Mac, luego ejecuta el script nuevamente. La copia que el agente personalizado coloca en la biblioteca de Scripts imprime una advertencia y sale con2en su lugar.
Revertir un cambio
- En macOS y Linux, copia cada respaldo
*.pre-emudhrasobre el archivo del que fue tomado. En Linux, también elimina los archivosemudhra-*.pemañadidos a la carpeta de lista negra de p11-kit, restaura/etc/ca-certificates.conf.pre-emudhrasi existe, y ejecutaupdate-ca-certificatesoupdate-ca-trust. - En Windows, abre
certlm.mscy 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
- Compromiso de CA intermedia de eMudhra: sitio de divulgación, lista de certificados, hosts de prueba y versiones parcheadas
- Mozilla Bugzilla 2083449: informe del incidente y causa raíz
- Fleet: encuentra y corrige las tiendas de confianza que tu navegador no cubre: detección, scripts de remediación y resultados de laboratorio
- Google y Mozilla: respuesta del navegador
- Documentación de CLI de Node.js y Go crypto/x509: cómo cada entorno de ejecución elige sus raíces
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,
certifiy 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_presentsignifica 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 filactl_autoupdate_policy. -
El script de Factorial IT para Windows sale con
2. Algunos certificados no pudieron ser descargados. Lee las líneasWARNy verifica que el dispositivo pueda alcanzarcrt.sh. -
El script de macOS sale con
0perohomebrew_ca_certificatessigue allí. Homebrew fue omitido, generalmente porque la licencia de Xcode no ha sido aceptada. Ejecutasudo xcodebuild -license accepten el Mac y ejecuta el script nuevamente. -
Una fila
fleetd_osquery_ca_bundlepermanece 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_SYNCEDoBLOCK_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
-
¿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.
-
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.
-
¿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.
-
¿Están en riesgo los paquetes instalados con
aptodnf?
No. Están firmados con GPG.
-
¿Es seguro ejecutar los scripts de remediación dos veces?
Sí. Mantienen un respaldo*.pre-emudhrade cada archivo que cambian, por lo que también puedes revertir.
-
¿Por qué permanecen las filas
root_in_keychainyroot_in_cert_storedespué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.
-
¿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.
-
¿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.