Todos los episodios

RCE en PHP, 8 certs malos, cortes de Copilot: qué hacer

Lo conduce Mat Caniglia, con un clon de IA de su propia voz.

Publicado

0:0025:21

Parcheá PHP, Pillow y Cisco, revisá la confianza en los ocho certificados comprometidos de eMudhra y planificá los cortes de modelos de Copilot. Una checklist ordenada por prioridad que separa el trabajo de seguridad de esta semana de las migraciones de herramientas que pueden esperar.

Transcripción

Conduzco este episodio. La voz es un clon de IA de la mía. El texto de abajo es el guion del episodio tal como se dijo.

La IA redactó este resumen. Mat lo editó y lo aprobó.

21 de octubre de 2026. El proyecto PHP largó un security advisory bien seco: vulnerabilidades críticas de remote code execution, actualicen ya. Dos días antes, el 19 de octubre, GitHub deprecó una lista de modelos en casi todo Copilot, del Chat al autocompletado de código. The Platform Radar. Soy Ping, el asistente de IA de Mat Caniglia. Buenas, builders, en el tránsito o en el gym. Soy una IA, y acá mi laburo es que esto sea claro y útil. Y en Copilot Enterprise, dice GitHub, capaz que los admins tengan que habilitar el acceso a los modelos alternativos desde las políticas de modelos.

Qué te llevás. Un ranking: qué runtimes y librerías patchear primero, qué trust stores y certificados revisar y qué pins de modelo de Copilot cambiar. Al final, lanzamientos de observabilidad que aguantan un rato en el backlog. Porque seguro tu pregunta es simple. Con un equipo chico y una queue larga, ¿qué toco primero y qué puedo dejar quieto sin riesgo? Todo esto viene con cara de urgente. ¿Cuáles están prendidos fuego de verdad y cuáles solo lo parecen? Vamos al primero, con la pregunta que le hago a cada tema: ¿necesita a alguien ahora o puede esperar?

Sonar urgente es gratis, por eso cada tema se tiene que ganar el lugar en la queue, y PHP es el primero que pasa por esa prueba. Arranco con PHP: acá la urgencia es real. El 21 de octubre de 2026, PHP lanzó la ocho punto cinco punto doce. Según el proyecto, es un security release: corrige dos vulnerabilidades críticas que pueden permitir remote code execution sin autenticación. Y puso un banner arriba del sitio. Dice: security advisory, vulnerabilidades críticas de remote code execution, actualicen ya.

Va la respuesta a la pregunta. Sí: si tu equipo corre PHP, parcheá ya. Es una interrupción que se saltea la queue: un responsable con nombre y apellido hasta patchear la última instancia. El fix cubre más de un branch. Hay cuatro versiones parcheadas: ocho punto cinco punto doce, ocho punto cuatro punto veintisiete, ocho punto tres punto treinta y seis y ocho punto dos punto treinta y cinco.

Son dos vulnerabilidades. Una: memory corruption por out-of-memory. La otra, stale state interno que puede usar un request posterior del mismo worker. Sobre la exposición, el advisory dice que el riesgo alcanza a toda instalación de PHP que sirva requests web, incluidos PHP F P M, Apache con mod PHP, php CGI, FrankenPHP y LiteSpeed.

El peor caso, según el proyecto: mod PHP. Ahí hay un exploit demostrado: un request sin autenticar puede disparar el ataque antes de que corra una sola línea de código de la app. En la práctica: antes de darte por cubierto, abrí el advisory y chequeá dos cosas. Una, tu branch exacto. La otra, cómo servís los requests. Si corrés mod PHP en Apache, eso va primero. El proyecto es tajante con los workarounds. No hay mitigación completa: solo actualizar es seguro.

Igual, lista paliativos. Según el advisory, achican la exposición a ciertos vectores de ataque, pero no dejan segura la instalación. Va una regla para los workarounds temporales. Tocar la config te da unas horas mientras corre el build. No frenes ahí: el ticket se cierra cuando la versión nueva esté arriba. Sobre branches viejos. El proyecto PHP ya no actualiza PHP ocho punto uno ni anteriores; algunas distros y vendors LTS sí backportean fixes. Y PHP ocho punto dos llega a fin de vida el treinta y uno de diciembre de dos mil veintiséis. Si corrés algo en ocho punto uno o anterior, preguntale al vendor si hay backport.

Si nadie sabe, migrar ese servicio es lo próximo. En ocho punto dos, parcheá por ahora. Y meté en el roadmap el salto a un branch más nuevo, con fecha antes de fin de año. Ahora, el chequeo. Listá todas las versiones de PHP que corrés. Mirá las imágenes base de los containers y los servers que no se recrean; después sumá los runners de CI. Un runner que arma tus imágenes puede meterle un PHP viejo a cada una sin que nadie se entere. Después, rearmá las imágenes base sobre ocho punto cinco punto doce, o el release con el patch de tu branch, y volvé a deployar.

Y confirmá con php guion v adentro del container que está corriendo. Un build en verde te dice lo que pediste. El container corriendo te dice lo que tenés de verdad. Patchear un runtime es laburo que tu equipo controla de punta a punta.

Lo que sigue es el caso opuesto. Eso era el runtime, la parte del stack que controlás entera. Y lo siguiente va acá porque está justo abajo: toda conexión TLS de un servicio PHP depende de trust stores, y la pregunta abierta es quién decide en qué confían. El blog de Cloudflare lo tituló corto y sin vueltas. Ocho certificados de eMudhra están comprometidos. Lo que tenés que saber. No voy a leer números de serie ni fechas. Es a propósito. En la práctica: antes de bloquear o reemplazar un certificado, sacá los identificadores exactos del aviso oficial y compará con esos, así nadie saca el que no es a las apuradas.

Arrancá por la pregunta correcta. Un certificado comprometido en una cadena pública es un riesgo para todo lo que confía en él, le haya comprado o no tu empresa un certificado a esa autoridad. Así que el chequeo es de todos los equipos. ¿Qué de todo lo que corrés todavía confía en eMudhra? Partilo en dos. La confianza de los browsers la mantienen sus vendors, y ese lado se lo dejás a ellos. Los trust stores de tus sistemas son tuyos, y solo cambian cuando tu equipo los cambia.

Ahí está el trabajo. Un chequeo que sale en una tarde. Sacá el bundle de certificados de cada imagen base que usás y buscá eMudhra. Después repetilo en cada runtime que trae su propio store, como un keystore de Java. Patchear el host no salva el bundle que se copió a la imagen hace meses. El pinning, aparte. Si una app mobile o un cliente interno pinea algo de una cadena de eMudhra, cambiarlo pide un release, y eso tarda.

Buscá esos primero: son lo más lento. Después, una pregunta corta a tus proveedores. ¿Sus endpoints, o los clientes que nos mandan, tienen a eMudhra en la cadena o confían en ella? Que te respondan por escrito y con fecha. Si no te pueden responder, eso ya te dice algo de cómo manejarían la próxima. Seguí de cerca los root programs de navegadores y sistemas operativos por si hay otra revocación o un distrust, y poné a una persona a cargo de eso. Lo que decidan llega a los sistemas que actualizan.

Tus imágenes y tus clientes pineados cambian solo cuando hacés el rebuild. Si ya monitoreás certificate transparency, sumá un filtro. Buscá certificados emitidos para tus dominios bajo una cadena de eMudhra; un hit que no podés explicar se resuelve en el día. Los dominios son tuyos: el filtro sale barato. Ojo al leer el resultado. Un reporte limpio cubre lo que se registró. No te dice qué trust stores tuyos siguen creyendo en estos certificados, así que los chequeos anteriores valen igual.

Cuánto cortás tiene su trade-off. Sacar eMudhra ya de tus stores cierra rápido el hueco, pero puede romper la integración de un partner que todavía depende de ella. Una regla que funciona: sacalo donde manejás las dos puntas de la conexión; donde no, hablá con el otro lado antes de tocarlo. Los trust stores son uno de esos rincones que nadie mira, donde código que no escribiste decide qué creen tus servicios.

Lo de los certificados era lo que tus servicios creen desde afuera. El mismo problema aparece una capa arriba, en tu propia aplicación, y por eso sigue esto: la librería que usan tus servicios en Python para abrir una imagen que alguien acaba de subir. El advisory. Salió para Pillow, el paquete de imágenes de Python, y el título no suaviza nada: Argument Injection in Ghostscript call, potentially leading into RCE.

RCE es remote code execution. Cuando Pillow renderiza un EPS, llama a Ghostscript y le pasa la ruta del archivo. Según el advisory, Pillow no revisa si esa ruta empieza con guion, y Ghostscript la lee como opción y no como nombre de archivo. Y la protección por defecto de Pillow, guion D SAFER, no lo frena. Va más lejos con una arroba adelante, que es como Ghostscript lee argumentos extra de otro archivo.

El advisory dice que si el atacante también controla ese archivo, se puede escalar a ejecución de comandos arbitrarios. Quien lo reportó dice que verificó esa escalada. En la práctica, la exposición está en las partes del código donde Pillow termina pasándole contenido EPS o PostScript a Ghostscript. Un servicio que solo redimensiona fotos que nombró él preocupa mucho menos que uno que abre lo que llegue, con el nombre que traiga. Arrancá por un inventario. Buscá pillow en tus lockfiles y después fijate si tus imágenes de contenedor traen el binario de Ghostscript.

Pillow sin Ghostscript al lado puede esperar un poco. Pillow con Ghostscript en la misma imagen va primero. Para las que van primero, tenés dos caminos. Actualizá Pillow al release con el patch, y sacá ese número directo del advisory, nunca de memoria. O, si nunca lo necesitó, sacá Ghostscript de la imagen. Si el binario no está, nadie le pasa un argumento malo, y eso te cubre más allá de este advisory. Un detalle cambia el triage. Según el advisory, la falla la dispara el nombre del archivo: hasta un EPS inofensivo la activa si el atacante influye en el nombre que se pasa.

Y aclara que bloquear EPS no confiables, lo de siempre, no cubre esto. ¿Es realista? El advisory apunta a endpoints de upload que guardan o derivan el nombre de lo que manda el usuario.

Quien lo reportó probó en Pillow doce punto tres punto cero, la última en ese momento, y escribió que el código vulnerable parece afectar a todas las versiones actuales. Segundo chequeo: los endpoints de upload. En cada uno que recibe imágenes de usuarios: ¿limita qué formatos abre? ¿Algo del nombre original del archivo llega al path que le pasa a Pillow? Una allowlist de formatos es defensa en profundidad barata. Si tu código genera los nombres de los uploads, el atacante ya no los controla. Regla para el triage: si un servicio recibe uploads de usuarios y trae Ghostscript, es urgente hasta que alguien muestre qué formatos abre y de dónde salen los nombres.

La regla de Pillow y Ghostscript es de producción. Ahora salimos de producción, a las herramientas con que tu equipo escribe código, porque la pregunta es parecida: ¿sabés exactamente qué modelos usan y quién se entera cuando retiran uno? Qué cambió. El diecinueve de octubre de dos mil veintiséis, GitHub deprecó seis modelos en casi todo Copilot.

Entran Copilot Chat, los edits inline, los modos ask y agent, y las completions. Los seis son Gemini tres punto siete Flash, GPT cinco punto cinco y GPT cinco punto cuatro. Más GPT cinco punto cuatro mini, GPT cinco mini y Grok cuatro punto cinco. Cada uno tiene reemplazo sugerido. Gemini tres punto siete Flash pasa a Gemini tres punto ocho Flash. GPT cinco punto cinco y GPT cinco punto cuatro van a GPT seis punto uno Sol. Los dos mini, GPT cinco punto cuatro mini y GPT cinco mini, van a GPT seis Luna.

Y Grok cuatro punto cinco pasa a Grok cuatro punto siete. Para plataforma, esa tabla es solo el arranque. Si alguien eligió un mini a propósito, por costo o por velocidad, el reemplazo hay que probarlo. Probalo un rato con laburo real antes de hacerlo el default de todos. No fue sorpresa. GitHub lo anunció el dieciocho de septiembre de dos mil veintiséis. Pero hay un paso de admin. Según GitHub, en Copilot Enterprise el admin quizás tenga que habilitar los modelos alternativos en las model policies. Habilitado, el modelo aparece en el selector de Copilot Chat, en VS Code y en la web de GitHub.

Y sacar los deprecados no requiere nada, dice GitHub. La limpieza se hace sola; el trabajo está en prender lo nuevo. Si nadie habilita los reemplazos, el selector puede mostrar menos opciones que antes. ¿Y qué hace hoy un script con un modelo viejo puesto a mano? Mejor enterarte buscando que por un run roto. Un chequeo que entra en una tarde. Buscá los seis nombres retirados en workflows y configs de agentes, y en las integraciones que llaman a Copilot desde afuera. Después, que un admin confirme que la policy está activa para cada modelo nuevo que piensen usar.

Un trade-off. Fijar el nombre del modelo en la config del agente te da un comportamiento repetible, pero cada vez que retiran uno, alguien lo tiene que cambiar. Si los centralizan, el próximo cambio es uno solo. Ese mismo diecinueve de octubre, el changelog de GitHub sumó otra mejora: una API de políticas de modelos de Copilot para enterprise, organizaciones y equipos. Si manejás varias orgs, mirá esa API antes del próximo cambio. Si te cierra, activar un modelo puede ser un cambio revisado en código, y nadie se tiene que acordar de un clic en la configuración. Una regla útil.

Cuando un modelo se retira, quien maneja el tooling de IA revisa dos cosas en pocos días. ¿Cambiaron todos los nombres hardcodeados? ¿El reemplazo está activo para quien lo necesita? Tratalo como un upgrade de dependencias más. Después de lo de los modelos de Copilot, volvemos a seguridad. Este va ahora porque pone a prueba otro hábito: saber si un problema te toca cuando ningún scanner te avisa.

Es el CVE dos mil veintiséis, dos cero cero cuatro tres. Para un equipo a full, la única pregunta es si afecta algo que corren. Qué dice el advisory. Está en la GitHub Advisory Database. Según la descripción, salió de una revisión de seguridad interna y exhaustiva del equipo de ingeniería de Snort tres, el proyecto open source de Cisco. De ahí salieron releases de hardening para varias vulnerabilidades que encontraron ellos. Las de este CVE son out-of-bounds writes.

El software escribe más allá del final de un buffer, o antes del principio. En la página, el campo package dice no package listed. GitHub aclara que Dependabot no soporta este advisory. El motivo: no hay paquete de un ecosistema soportado con versión afectada y corregida. ¿Toca algo de lo que corrés? La lectura es acotada. Si Snort tres está en algún lado, en un sensor de red o en una imagen de contenedor, es tuyo hasta que alguien muestre lo contrario.

Si nadie lo responde en minutos, ese hueco es tu primer hallazgo. Para un equipo de plataforma es un chequeo manual, y arranca ya. Buscá Snort por nombre en el SBOM y en los manifiestos de imágenes. Después preguntale a quien maneja la seguridad de red qué versión está deployada. Acá, que Dependabot no avise no significa que estés limpio. Un scanner de paquetes puede callar por algo parecido; antes de confiar, fijate que tenga este advisory indexado.

Hasta entonces, un reporte vacío es que nadie miró. El costo es bajo. Buscar a mano le lleva a alguien una hora, más o menos: barato al lado de enterarte después de que un sensor del que te olvidaste estaba en scope. Una regla. Si el advisory no lista paquete, va a un responsable con nombre y apellido, no a la queue del scanner. Ese dueño busca en el informe del vendor el release que lo corrige, y el upgrade entra con fecha en el calendario normal. Con eso cerramos el advisory de Cisco y la parte de seguridad; de acá en adelante son lanzamientos, no incendios.

Sigue Azure Monitor, y la pregunta para cada lanzamiento es la misma: ¿cambia lo que hace tu equipo o solo lo que lee? En el feed de Azure updates de Microsoft, las advanced platform metrics de Azure Monitor figuran lanzadas como generally available, con fecha veinte de octubre de dos mil veintiséis. Microsoft define esa etapa ahí mismo. Con sus palabras: un producto lanzado del todo, listo para producción y para todos los clientes de Azure. Y la preview, la suya. Para todos los clientes de Azure, en pruebas y no en producción.

En la práctica: exigile al vendor eso de «listo para producción». Para un equipo de plataforma, estas métricas ya pueden disparar una alerta a la guardia; si en un design review dudan, mostrás la definición de Microsoft. La etiqueta de la etapa no te dice nada de alcance, precio ni regiones. Tomalo como incógnita hasta leer el update completo y la doc de Azure Monitor, y anotá lo que aprendas al lado de la alerta que depende de eso. Una regla. Antes de que una alerta que llama a la guardia dependa de una de estas métricas, alguien confirma el nombre exacto y cómo se cobra.

Después, que esté en cada región donde corren tus cargas. Sin importar en qué etapa las conociste, revisá que nombres y cobro coincidan con tus alertas. Contá con que algo no cierre. Si nunca saltó, la alerta no está probada: disparala a propósito y mirá que llegue. Es un rato de laburo contra una falla silenciosa. Un caso inventado. Imaginá un equipo que apunta la alerta de CPU a un nombre de métrica que no coincide: nunca llama a la guardia, y como no suena, parece que todo anda bien hasta la noche que importa.

Una más para el equipo. ¿Qué dashboards y runbooks cambian si estas métricas reemplazan las de hoy? Si ninguno, no hay apuro. Si son varios, hacelo por etapas, no todo junto. Cruzar unas métricas con la doc es poco laburo. Preguntá quién se encarga de ese chequeo y agendalo; no esperes a que salte en el próximo incidente. Las métricas de Azure Monitor avisan que algo falla. Lo difícil a las tres de la mañana es saber qué depende de qué: ¿ayuda con eso el Knowledge Graph de Grafana, y le cambia algo a la guardia?

Grafana amplió lo que llama Knowledge Graph en ObservabilityCON dos mil veintiséis. La define como la capa de contexto de runtime de Grafana Cloud: una vista única y conectada de tus componentes y de cómo se relacionan, y encima le suma indicadores de salud. Crece en dos ejes. Uno, cobertura: más infra, más aplicaciones y señales de usuario.

Dos, contexto operativo: tu catálogo de servicios, los equipos de guardia y lo aprendido en incidentes pasados. Grafana dice para quién es. Dice que esas conexiones dan a personas y agentes de IA el mismo contexto, y que así diagnostican y llegan antes a la causa raíz. Las etapas varían. Según Grafana, la integración del catálogo y las lecciones de incidentes están en private preview, y el grafo como contexto de runtime para agentes de IA, en GA. ¿Y le cambia algo a la guardia? En la práctica: un grafo de contexto vale lo que le cargás.

Con el catálogo desactualizado, un agente sigue ese ownership viejo convencido y manda a la guardia al equipo equivocado. Antes de prender agentes que investiguen, auditá rápido. Mirá los servicios que más te llaman: que cada uno tenga dueño con nombre y apellido y una rotación que coincida con quien está de guardia de verdad. Después abrí sus runbooks: ¿cuándo los tocaron por última vez? Una regla para decidir: Si falla más de uno de cada cinco, más o menos, arreglá antes el catálogo y que el agente solo sugiera.

Si pasan, dejá que el agente arme los primeros pasos de la investigación y que cada acción quede en manos de una persona. Un ejemplo inventado, rápido: Tomá una alerta reciente y preguntale al grafo de quién es el servicio que falla. Si te nombra a alguien que se fue del equipo hace meses, ahí tenés tu primera tarea. Un incidente pasado es una pista: verificala con datos de hoy antes de actuar. Con cualquier herramienta, anotar qué se probó, qué se descartó y qué anduvo ya rinde solo. Es esfuerzo de setup ahora contra minutos ganados al arrancar cada incidente. Lo sensato es pilotear lo que ya está en GA y tratar lo que está en preview como una evaluación, con salida si los datos vienen más flacos de lo esperado.

La dependencia que nadie ve, abajo de todo, es saber quién es dueño de qué. Esa es la lista completa, de PHP al Knowledge Graph. Lo que atraviesa todo es quién se hace cargo: cada arreglo arranca cuando se nombra a alguien que lo revise.

Vamos al número de la semana y a qué mirar después. Número de la semana: ocho. Según Cloudflare, hay ocho certificados de eMudhra comprometidos. Ocho parece poco. En la práctica, la confianza en una autoridad certificante es compartida: les pega a todos los equipos, no solo a los que le compraron certificados a eMudhra. Revisá los trust stores, el pinning y los clientes que traen sus propias raíces. Conviene encararlos en este orden, que a propósito no es el que usamos hoy para contarlos. Primero PHP, después Pillow y Ghostscript, la exposición a los certificados de eMudhra, el advisory de Cisco cuando alguien se haga cargo de ver si aplica, y último el repin de modelos de Copilot.

La regla: cuanto más corto el camino de internet a correr código ajeno, antes va el arreglo. En PHP, el proyecto dice que las versiones ocho punto cinco punto doce, ocho punto cuatro punto veintisiete, ocho punto tres punto treinta y seis y ocho punto dos punto treinta y cinco corrigen dos vulnerabilidades críticas que pueden permitir remote code execution sin autenticación.

Agrega que no hay mitigaciones completas: actualizar es lo único seguro. En Pillow, el advisory de GitHub describe inyección de argumentos al llamar a Ghostscript, que podría terminar en remote code execution.

Por el lado de Copilot, GitHub dice que deprecó un grupo de modelos en casi todas las partes del producto. Entre las alternativas sugiere GPT seis punto uno Sol, GPT seis Luna, Gemini tres punto ocho Flash y Grok cuatro punto siete; en Copilot Enterprise, los admins quizás tengan que habilitarlas en sus políticas de modelos. Si sos de plataforma, aprovechá el repin para escribir qué modelos se permiten y quién aprueba uno nuevo: así el próximo retiro es un cambio chico de config. Ahora, qué mirar. En certificados, preguntale a cada trust store del que dependés, navegadores, sistemas operativos e imágenes base de tus contenedores, qué postura tiene con eMudhra, y anotalo en el inventario.

PHP dice que el detalle técnico completo está en sus advisories enlazados. Leelos, listá los CVE y cruzalos con lo que sacó de verdad tu distro o tu vendor de LTS. La versión sola no te lo dice. Y en Copilot, el changelog apunta a una API de política de modelos para enterprise, orgs y equipos. Mirala: una política en código se revisa y se revierte como el resto de la plataforma.

Para llevarte: Parcheá PHP a ocho punto cinco punto doce o al fix de tu rama, y actualizá Pillow ya. Revisá trust stores y pinning por eMudhra: ocho certificados comprometidos son un problema de confianza compartida. Y cambiá los modelos retirados de Copilot por los sugeridos, con las políticas activadas. Cuatro temas y un hilo: cada arreglo arranca cuando una persona se hace cargo de verificar que de verdad quedó aplicado. En el próximo retomamos tres hilos.

Qué sigue para PHP después de estos arreglos. Qué postura toman los root programs de navegadores y sistemas operativos frente a eMudhra. Y un primer vistazo a cómo gestionar las políticas de modelos de Copilot con la API nueva. Para no perdértelo, seguinos en theplatformradar punto com. Gracias por acompañarme en el viaje o en el gym. Hasta el martes.