Backend et Fullstack

Backend & Fullstack — 9 septembre 2026

Lo nuevo hoy

Today's highlights

Points forts du jour

Click en cualquiera para ir al detalle

Click any item to jump to the full section

Cliquez un élément pour aller à la section complète

🔥

Top Stories

Breaking

Next.js: RCE sin autenticar en la Image Optimization API vía AVIF (CVSS 9.5)

Actualizá ya. Una vulnerabilidad en libheif —la librería que usa sharp, que a su vez usa Next.js para optimizar imágenes— permite ejecución remota de código cuando se optimizan archivos AVIF. Sin autenticación. CVSS 9.5.

El rango afectado es enorme: >= 10.0.0, < 15.5.24 y >= 16.0.0, < 16.3.3. O sea, prácticamente cualquier Next.js de los últimos años con la Image Optimization API expuesta. Parcheado en 15.5.24 y 16.3.3.

Mientras el fix se propaga, Next.js directamente deshabilitó la optimización de AVIF. Esa decisión te dice todo sobre la gravedad: cuando un framework prefiere romper una feature antes que esperar el parche del upstream, no es un caso teórico.

08 Sep 2026
github.com/advisories →
Breaking

Next.js: segundo RCE crítico, sin workaround, en servidores Windows

CVE-2026-75604, y es independiente del bug de AVIF. Aplicaciones que usan Pages y App router sin Cache Component pueden llegar a ejecución remota de código cuando el server corre sobre un filesystem Windows. Afecta >= 13.4.0, < 15.5.24 y >= 16.0.0, < 16.3.3.

El advisory es tajante: «no hay workaround conocido para aplicaciones hosteadas en Windows. Deberías actualizar inmediatamente». Sin mitigación parcial, sin config para desactivar la ruta afectada. Solo el upgrade.

Dos críticos de RCE sin auth en el mismo framework, el mismo día. Si tenés Next.js en producción, esto es lo primero de tu día — y el segundo parche es el mismo release que el primero, así que un solo upgrade te cubre los dos.

08 Sep 2026
github.com/advisories →
Seguridad

sharp 0.35.4: el origen real de la cadena está en libheif

Acá está la raíz de todo lo de arriba. Se encontraron y corrigieron varias vulnerabilidades en la dependencia upstream libheif, dos de ellas críticas en CVSSv3, que pueden llevar a RCE en Linux con glibc bajo ciertas condiciones.

El detalle de scoring es instructivo: el vector de ataque original dice «network», pero sharp no expone ninguna funcionalidad de red, así que lo bajaron a «high» en CVSSv4 — con la advertencia explícita de mirar el Subsequent System Impact. Traducción: el número es más bajo porque sharp no es el que te expone a internet; el framework que lo envuelve sí. Y por eso Next.js puntúa 9.5 y sharp 8.9 por el mismo bug.

Actualizá a 0.35.4, que trae libheif 1.23.2. Si usás un libheif instalado globalmente en vez de los binarios preconstruidos, asegurate de tener 1.23.2 a nivel sistema — el bump de npm no te cubre.

08 Sep 2026
github.com/advisories →
Seguridad

Astro 7.2.8: el mismo agujero de AVIF por el mismo camino

Crítico, y es literalmente el mismo bug: la vulnerabilidad de libheif, usada por el servicio de imágenes Sharp que Astro trae por defecto, lleva a RCE cuando se optimiza un AVIF malicioso. Estás afectado si un atacante puede lograr que Astro procese un AVIF que no controlás.

Fix en Astro 7.2.8, que requiere Sharp 0.35.4. Prestá atención a eso: no alcanza con bumpear Astro si tu lockfile te deja sharp viejo — verificá la versión resuelta de verdad.

08 Sep 2026
github.com/advisories →
🔒

Security

Seguridad

multer: dos nombres de campo y te matan el proceso Node

Cuatro advisories contra multer el mismo día, y el peor es brutal por lo barato: un atacante remoto sin autenticar crashea el proceso Node con un solo request multipart/form-data. Dos nombres de campo de texto crafteados provocan un RangeError: Invalid array length sin capturar dentro del parseo de campos — y no se rutea al error handler de la aplicación, termina el proceso. Todas las apps que usan multer están afectadas. Sin workaround, upgrade a 2.3.0.

Los otros tres: DoS por leak de file descriptors en uploads abortados, DoS por índice de array sobredimensionado en nombres de campo, y bypass del límite de tamaño de archivo por una race en fileFilter asíncrono.

Si tenés un endpoint de upload en Express expuesto a internet, este es tu segundo item del día después de Next.js.

08 Sep 2026
github.com/advisories →
Seguridad

Nodemailer: el parser de direcciones es cuadrático y el de dominios no sigue el estándar

Cuatro advisories. El de severidad alta: lib/addressparser/index.js parsea listas de direcciones separadas por coma en tiempo cuadrático O(n²). Un solo string crafteado en To, Cc, Bcc, From o Reply-To consume CPU proporcional al cuadrado de su longitud y bloquea el event loop de Node entero, negando servicio a todas las demás requests del proceso.

El más sutil, y el que me parece más peligroso: Nodemailer resuelve dominios internacionales (IDN) a una etiqueta Punycode distinta de la que resuelve cualquier parser conforme a UTS-46 — browsers, el WHATWG URL Standard, url.domainToASCII de Node, idna de Python. Usa el codec RFC-3492 crudo sin mapping UTS-46. ¿Consecuencia? Un dominio que tu validador mapea a un dominio confiable, Nodemailer lo entrega a otro. Tu allow-list dice que sí y el mail sale para el atacante.

Sumale el bypass de validación de dominio por mal parseo de comentarios RFC 5322 y el de resolveContent() salteando disableFileAccess/disableUrlAccess. Todo a 9.1.0.

08 Sep 2026
github.com/advisories →
Seguridad

Hono: el fix de CVE-2026-39408 no cubría todas las secuencias de traversal

Tres advisories. El principal es un fix incompleto: toSSG() todavía puede escribir archivos fuera del directorio de salida cuando un parámetro de ruta contiene segmentos .. consecutivos. La causa es elegante y didáctica: la verificación de que el path resultante queda dentro del output normaliza el path con la misma rutina que lo construyó. Si la rutina no normaliza del todo, el chequeo hereda exactamente el mismo punto ciego.

Los otros dos: anidamiento sin límite de dot-notation en parseBody() causando agotamiento de memoria, y el query parser leyendo parámetros después del fragmento de la URL, lo que genera diferenciales de interpretación entre tu app, el proxy y la cache key. Ese último es material clásico de cache poisoning. Fix en 4.13.5.

08 Sep 2026
github.com/advisories →
Seguridad

Vitest: lectura arbitraria de archivos vía redirect mock del dev server

@vitest/mocker registra el path destino de un redirect mock sin validarlo contra la allowlist de file-serving del dev server. Quien pueda alcanzar el WebSocket del dev server registra un mock apuntando fuera del root del proyecto, y cuando se pide ese módulo el hook load devuelve readFile(<path del atacante>) como código fuente del módulo. Explotable sin autenticación a través del mockerPlugin público.

Afecta desde 2.1.0 hasta 4.1.11, y también la línea 5 beta hasta 5.0.0-rc.2. Otro caso más de tooling de desarrollo escuchando más de lo que creías — el mismo tema que venimos viendo toda la semana.

08 Sep 2026
github.com/advisories →
Seguridad

xmldom: catorce advisories, y la deduplicación de atributos es O(M²)

Catorce advisories contra @xmldom/xmldom en un día, la mayoría en 8.7. El más representativo: construye la colección de atributos insertando de a uno en un NamedNodeMap, y cada inserción hace un scan lineal de todos los atributos ya insertados para aplicar la regla de unicidad del DOM. Parsear un elemento con M atributos cuesta 1 + 2 + … + M = O(M²).

Lo que lo hace peor: el payload es XML perfectamente bien formado. No hay nada malformado que detectar, es «un elemento con muchos atributos». Ninguna validación de esquema te salva.

El resto del paquete es un desfile de bypasses de requireWellFormed —por terminadores de línea embebidos en nombres de elemento, atributo, DocType y publicId/systemId, más inyección vía createElement() y setAttribute()— y varios ReDoS más. Parcheado en 0.8.15 y 0.9.12. El paquete legacy xmldom (<= 0.6.0) no tiene fix: migrá.

08 Sep 2026
github.com/advisories →
☁️

Cloud & DevOps

Breaking

Gitea: RCE instalando un git hook desde el endpoint diffpatch

Crítico. El endpoint diffpatch se puede abusar para instalar y ejecutar un git hook desde contenido controlado por el repositorio. Un atacante con acceso de escritura ordinario ejecuta comandos de shell arbitrarios como el usuario del sistema operativo bajo el que corre Gitea.

Y acá está la parte que convierte esto en emergencia: con el registro abierto por defecto, un visitante sin autenticar consigue el acceso de escritura necesario simplemente registrando una cuenta y creando un repositorio. O sea, de anónimo a RCE en dos pasos triviales. Parcheado en 1.27.1.

Si tenés un Gitea self-hosted con registro abierto, cerralo o actualizá ahora mismo.

08 Sep 2026
github.com/advisories →
Seguridad

Netty: un ClientHello fragmentado saltea tu mTLS por SNI (CVSS 9.1)

Crítico, 9.1. Un ClientHello de TLS cuyo header de handshake se reparte entre varios records hace que Netty caiga silenciosamente al SslContext por defecto. Donde la selección por SNI es la única barrera de mTLS, un atacante sin autenticar saltea el requisito de mTLS de la ruta.

La causa es de manual: en SslClientHelloHandler#decode, el guard que debería esperar los 4 bytes del header de handshake chequea el offset equivocado — ignora los 5 bytes del record header que lo preceden — así que nunca dispara. Un off-by-five en el parseo de un protocolo, y se te cae la autenticación mutua.

Parcheado en 4.2.17.Final y 4.1.137.Final. Viene con un segundo advisory por reensamblado cuadrático pre-handshake en el parseo de SNI por defecto.

08 Sep 2026
github.com/advisories →
Seguridad

GitPython: un valor dormido en git-config se despierta como directiva viva (CVSS 9.3)

Crítico, 9.3, y el mecanismo es de los más lindos que vi en el año. Valores multilínea dormidos en un git-config se corrompen convirtiéndose en directivas inyectadas vivas —por ejemplo core.hooksPathen cualquier escritura no relacionada del GitConfigParser. O sea: el valor era inerte, vos escribís otra cosa completamente distinta en el config, y el round trip de lectura-escritura lo activa. De ahí a RCE.

Es un read-then-corrupt-on-rewrite, no una inyección por argumento de un setter. Por eso se escapa de cualquier revisión que mire solo las llamadas a la API. Parcheado en 3.1.59.

Vienen cuatro advisories más de GitPython el mismo día: clone_from() omitiendo --separate-git-dir de las opciones inseguras, denylist incompleta que permite lectura arbitraria vía Repo.blame(), y disclosure de archivos por directiva [include] en un .gitmodules no confiable.

08 Sep 2026
github.com/advisories →
🏗️

Architecture & Best Practices

Destacado

El día que medio ecosistema resultó cuadrático

Contá los del 8 de septiembre: xmldom (dedup de atributos O(M²), ReDoS de PI, parseo cuadrático en recovery, memoria cuadrática), Nodemailer (addressparser O(n²)), Tiptap (ReDoS cuadrático en parseo de atributos Markdown), Netty (reensamblado cuadrático pre-handshake), HTTPX2 (buffering cuadrático de SSE), Colord (rechazo lento de strings malformados), NLTK (tres ReDoS distintos), y este de LiquidJS: el filtro join permite saltear el memoryLimit y crashear el proceso.

No es coincidencia, es una clase de bug que estamos sistemáticamente sin testear. Y tiene una firma reconocible: el input es válido. Bien formado, dentro de los límites de tamaño, pasa cualquier validación de esquema. Lo que lo hace tóxico no es el contenido sino la forma — profundidad de anidamiento, cantidad de atributos, cantidad de elementos en una lista.

La conclusión práctica: tus límites cuentan bytes, y el costo real casi nunca está en los bytes. Un límite de tamaño de request no te protege de un documento chiquito y muy anidado. Cuando escribas un parser, medí el costo en función de la forma del input, no de su peso — y poné un límite explícito sobre esa dimensión.

08 Sep 2026
github.com/advisories →

Backend TypeScript & Runtimes

Release

Node.js 24.21.0: OpenSSL 3.5.8, certificados raíz nuevos y BlockList más rápido

Release cargado de criptografía: OpenSSL sube a 3.5.8, los certificados raíz se actualizan a NSS 3.126, y Undici pasa a 7.29.1. Como minor nuevo, soporte para cargar claves privadas a través de STORE loaders de OpenSSL — útil si tenés las claves en un HSM o en un provider externo en vez de en el filesystem.

Del lado de performance: mejor implementación de histogramas y net.BlockList más rápido. Si usás BlockList para filtrado de IPs en el hot path, ese es un upgrade gratis.

08 Sep 2026
github.com/nodejs →
Release

workerd v1.20260909.1 sostiene la cadencia diaria

Otro release diario del runtime de Workers. En un día donde el resto del ecosistema publicó 99 advisories, la cadencia predecible de Cloudflare es casi un descanso. Revisá el changelog acumulado si trackeás compatibility flags.

09 Sep 2026
github.com/cloudflare →
🔗

Fullstack

Seguridad

Astro 7.3.2: valores dinámicos en script y style de MDX ya se escapan

Además del parche de AVIF, Astro corrige el renderizado de <script> y <style> en MDX: ahora solo el contenido literal se trata como markup confiable (incluido el que inyectan plugins de remark/rehype). Un valor dinámico pasado como child —<script>{value}</script>se escapa como el contenido de cualquier otro elemento en vez de renderizarse crudo. Si querés el comportamiento anterior, ahora hay que optar explícitamente con set:html.

Esa es la decisión correcta: el default pasa a ser seguro y la excepción pasa a ser explícita. Ojo si tenías contenido dinámico legítimo ahí — te va a cambiar el render y tenés que marcarlo a mano.

08 Sep 2026
github.com/withastro →
Release

pnpm 12.4.0 sigue el ritmo de la línea en Rust

Nuevo minor de la línea 12 nativa, apenas días después de 12.3.x. El ritmo de releases desde el rewrite en Rust es notablemente más alto — bueno para los fixes, pero mantené el ojo en los breaking changes acumulados si venís de la línea 11.

08 Sep 2026
github.com/pnpm →
🔥

Top Stories

Breaking

Next.js: unauthenticated RCE in the Image Optimization API via AVIF (CVSS 9.5)

Update now. A vulnerability in libheif — the library used by sharp, which Next.js in turn uses for image optimization — allows remote code execution when AVIF files are optimized. No authentication required. CVSS 9.5.

The affected range is enormous: >= 10.0.0, < 15.5.24 and >= 16.0.0, < 16.3.3. That is essentially any Next.js from the last several years with the Image Optimization API exposed. Fixed in 15.5.24 and 16.3.3.

Until the fix propagates, Next.js has simply disabled AVIF optimization. That decision tells you everything about the severity: when a framework would rather break a feature than wait on an upstream patch, this is not theoretical.

08 Sep 2026
github.com/advisories →
Breaking

Next.js: a second critical RCE, no workaround, on Windows servers

CVE-2026-75604, and it is independent of the AVIF bug. Applications using Pages and App router without Cache Component can reach remote code execution when the server runs on a Windows filesystem. Affects >= 13.4.0, < 15.5.24 and >= 16.0.0, < 16.3.3.

The advisory is blunt: «there is no known workaround for affected windows-hosted applications. You should upgrade immediately». No partial mitigation, no config flag to disable the affected path. Only the upgrade.

Two unauthenticated RCE criticals in the same framework on the same day. If you run Next.js in production this is the first thing in your day — and the second patch ships in the same release as the first, so one upgrade covers both.

08 Sep 2026
github.com/advisories →
Security

sharp 0.35.4: the real origin of the chain is libheif

Here is the root of everything above. Several vulnerabilities were found and fixed in the upstream libheif dependency, two rated Critical under CVSSv3, which can lead to RCE on glibc-based Linux under certain conditions.

The scoring detail is instructive: the original attack vector says «network», but sharp exposes no networking features, so it was down-rated to High under CVSSv4 — with an explicit note to mind the Subsequent System Impact. Translation: the number is lower because sharp is not what exposes you to the internet; the framework wrapping it is. Which is exactly why Next.js scores 9.5 and sharp 8.9 for the same bug.

Upgrade to 0.35.4, which ships libheif 1.23.2. If you use a globally installed libheif rather than the prebuilt binaries, make sure the system has 1.23.2 — the npm bump will not cover you.

08 Sep 2026
github.com/advisories →
Security

Astro 7.2.8: the same AVIF hole through the same path

Critical, and it is literally the same bug: the libheif vulnerability, reached through the Sharp image service Astro ships by default, leads to RCE when a malicious AVIF is optimized. You are affected if an attacker can get Astro to process an AVIF you do not control.

Fixed in Astro 7.2.8, which requires Sharp 0.35.4. Pay attention to that: bumping Astro is not enough if your lockfile pins an older sharp — verify the actually resolved version.

08 Sep 2026
github.com/advisories →
🔒

Security

Security

multer: two field names and your Node process is dead

Four advisories against multer on the same day, and the worst is brutal for how cheap it is: a remote unauthenticated attacker crashes the Node process with a single multipart/form-data request. Two crafted text field names trigger an uncaught RangeError: Invalid array length inside field parsing — and it is not routed to the application error handler, it terminates the process. Every app using multer is affected. No workaround, upgrade to 2.3.0.

The other three: DoS via file descriptor leak on aborted uploads, DoS via oversized array index in field names, and a file size limit bypass through an async fileFilter race condition.

If you have an Express upload endpoint facing the internet, this is your second item of the day after Next.js.

08 Sep 2026
github.com/advisories →
Security

Nodemailer: the address parser is quadratic and the domain parser ignores the standard

Four advisories. The high-severity one: lib/addressparser/index.js parses comma-separated address lists in quadratic O(n²) time. A single crafted string in To, Cc, Bcc, From, or Reply-To burns CPU proportional to the square of its length and blocks Node's entire event loop, denying service to every other request in the process.

The subtler one, and to me the more dangerous: Nodemailer resolves international (IDN) domains to a Punycode label different from every UTS-46-conformant parser — browsers, the WHATWG URL Standard, Node's url.domainToASCII, Python's idna. It uses the raw RFC-3492 codec with no UTS-46 mapping. The consequence? A domain your validator maps to a trusted one, Nodemailer delivers somewhere else. Your allow-list says yes and the mail goes to the attacker.

Add the domain validation bypass via RFC 5322 comment mis-parsing, and resolveContent() bypassing disableFileAccess/disableUrlAccess. All fixed in 9.1.0.

08 Sep 2026
github.com/advisories →
Security

Hono: the CVE-2026-39408 fix did not cover every traversal sequence

Three advisories. The main one is an incomplete fix: toSSG() can still write files outside the output directory when a route parameter contains consecutive .. segments. The cause is elegant and instructive: the check that the resulting path stays inside the output normalizes the path with the same routine that built it. If that routine does not fully normalize, the check inherits exactly the same blind spot.

The other two: unbounded dot-notation nesting in parseBody() causing memory exhaustion, and the query parser reading parameters after the URL fragment, producing interpretation differentials between your app, the proxy, and the cache key. That last one is classic cache poisoning material. Fixed in 4.13.5.

08 Sep 2026
github.com/advisories →
Security

Vitest: arbitrary file read via the dev server's redirect mock

@vitest/mocker registers a redirect mock's target path without validating it against the dev server's file-serving allowlist. Anyone who can reach the dev server's WebSocket registers a mock pointing outside the project root, and when that module is requested the load hook returns readFile(<attacker path>) as the module source. Exploitable without authentication through the public mockerPlugin.

Affects 2.1.0 through 4.1.11, and the 5 beta line up to 5.0.0-rc.2. One more case of development tooling listening more widely than you assumed — the same theme we have been seeing all week.

08 Sep 2026
github.com/advisories →
Security

xmldom: fourteen advisories, and attribute deduplication is O(M²)

Fourteen advisories against @xmldom/xmldom in one day, most at 8.7. The most representative: it builds each element's attribute collection by inserting one at a time into a NamedNodeMap, and every insertion performs a linear scan of all already-inserted attributes to enforce the DOM uniqueness rule. Parsing an element with M attributes costs 1 + 2 + … + M = O(M²).

What makes it worse: the payload is perfectly well-formed XML. There is nothing malformed to detect — it is «one element with many attributes». No schema validation saves you.

The rest of the batch is a parade of requireWellFormed bypasses — via embedded line terminators in element, attribute, DocType, and publicId/systemId names, plus injection through createElement() and setAttribute() — and several more ReDoS. Fixed in 0.8.15 and 0.9.12. The legacy xmldom package (<= 0.6.0) has no fix: migrate.

08 Sep 2026
github.com/advisories →
☁️

Cloud & DevOps

Breaking

Gitea: RCE by installing a git hook through the diffpatch endpoint

Critical. The diffpatch endpoint can be abused to install and execute a git hook from repository-controlled content. An attacker with ordinary write access runs arbitrary shell commands as the OS user Gitea runs under.

And here is what turns this into an emergency: with default open registration, an unauthenticated visitor obtains the required write access by simply registering an account and creating a repository. Anonymous to RCE in two trivial steps. Fixed in 1.27.1.

If you run self-hosted Gitea with open registration, close it or upgrade right now.

08 Sep 2026
github.com/advisories →
Security

Netty: a fragmented ClientHello bypasses your SNI-based mTLS (CVSS 9.1)

Critical, 9.1. A TLS ClientHello whose handshake header spans multiple records makes Netty silently fall back to the default SslContext. Where per-SNI selection is the sole mTLS gate, an unauthenticated attacker bypasses the route's mTLS requirement.

The cause is textbook: in SslClientHelloHandler#decode, the guard that should wait for the 4-byte handshake header checks the wrong offset — it ignores the 5-byte record header preceding it — and therefore never fires. An off-by-five in protocol parsing, and your mutual authentication is gone.

Fixed in 4.2.17.Final and 4.1.137.Final. It ships alongside a second advisory for quadratic pre-handshake reassembly in default SNI parsing.

08 Sep 2026
github.com/advisories →
Security

GitPython: a dormant git-config value wakes up as a live directive (CVSS 9.3)

Critical, 9.3, and the mechanism is one of the prettiest I have seen this year. Dormant multi-line values in a git-config are corrupted into live injected directives — for example core.hooksPathon any unrelated GitConfigParser write. The value was inert, you write something completely different to the config, and the read-write round trip activates it. From there, RCE.

It is a read-then-corrupt-on-rewrite, not an injection through a setter argument. Which is why it slips past any review that only inspects API calls. Fixed in 3.1.59.

Four more GitPython advisories landed the same day: clone_from() omitting --separate-git-dir from unsafe options, an incomplete denylist enabling arbitrary file read via Repo.blame(), and file disclosure through an [include] directive in an untrusted .gitmodules.

08 Sep 2026
github.com/advisories →
🏗️

Architecture & Best Practices

Notable

The day half the ecosystem turned out to be quadratic

Count the September 8 batch: xmldom (O(M²) attribute dedup, PI ReDoS, quadratic recovery parsing, quadratic memory), Nodemailer (O(n²) addressparser), Tiptap (quadratic ReDoS in Markdown attribute parsing), Netty (quadratic pre-handshake reassembly), HTTPX2 (quadratic SSE buffering), Colord (slow rejection of malformed strings), NLTK (three separate ReDoS), and this LiquidJS one: the join filter lets template authors bypass memoryLimit and crash the process.

This is not coincidence, it is a bug class we are systematically failing to test. And it has a recognizable signature: the input is valid. Well-formed, within size limits, passes any schema validation. What makes it toxic is not the content but the shape — nesting depth, attribute count, number of elements in a list.

The practical conclusion: your limits count bytes, and the real cost is almost never in the bytes. A request size limit does not protect you from a small, deeply nested document. When you write a parser, measure cost as a function of the input's shape, not its weight — and put an explicit bound on that dimension.

08 Sep 2026
github.com/advisories →

Backend TypeScript & Runtimes

Release

Node.js 24.21.0: OpenSSL 3.5.8, fresh root certificates, and a faster BlockList

A crypto-heavy release: OpenSSL moves to 3.5.8, root certificates update to NSS 3.126, and Undici goes to 7.29.1. New as a minor, support for loading private keys through OpenSSL STORE loaders — useful when your keys live in an HSM or an external provider rather than the filesystem.

On performance: an improved histogram implementation and a faster net.BlockList. If you use BlockList for IP filtering on the hot path, that is a free upgrade.

08 Sep 2026
github.com/nodejs →
Release

workerd v1.20260909.1 holds the daily cadence

Another daily Workers runtime release. On a day when the rest of the ecosystem published 99 advisories, Cloudflare's predictable cadence is almost a relief. Read the accumulated changelog if you track compatibility flags.

09 Sep 2026
github.com/cloudflare →
🔗

Fullstack

Security

Astro 7.3.2: dynamic values in MDX script and style are now escaped

Alongside the AVIF patch, Astro fixes <script> and <style> rendering in MDX: only literal content is now treated as trusted markup (including content injected by remark/rehype plugins). A dynamic value passed as a child — <script>{value}</script> — is escaped like any other element's content instead of rendered raw. To get the old behavior you must now opt in explicitly with set:html.

That is the right call: the default becomes safe and the exception becomes explicit. Watch out if you had legitimate dynamic content there — your render will change and you have to mark it by hand.

08 Sep 2026
github.com/withastro →
Release

pnpm 12.4.0 keeps the Rust line moving

A new minor on the native 12 line, days after 12.3.x. The release rhythm since the Rust rewrite is noticeably higher — good for fixes, but keep an eye on accumulated breaking changes if you are coming from the 11 line.

08 Sep 2026
github.com/pnpm →
🔥

Top Stories

Breaking

Next.js : RCE non authentifiée dans l'Image Optimization API via AVIF (CVSS 9.5)

Update now. A vulnerability in libheif — the library used by sharp, which Next.js in turn uses for image optimization — allows remote code execution when AVIF files are optimized. No authentication required. CVSS 9.5.

The affected range is enormous: >= 10.0.0, < 15.5.24 and >= 16.0.0, < 16.3.3. That is essentially any Next.js from the last several years with the Image Optimization API exposed. Fixed in 15.5.24 and 16.3.3.

Until the fix propagates, Next.js has simply disabled AVIF optimization. That decision tells you everything about the severity: when a framework would rather break a feature than wait on an upstream patch, this is not theoretical.

08 Sep 2026
github.com/advisories →
Breaking

Next.js : seconde RCE critique, sans contournement, sur serveurs Windows

CVE-2026-75604, and it is independent of the AVIF bug. Applications using Pages and App router without Cache Component can reach remote code execution when the server runs on a Windows filesystem. Affects >= 13.4.0, < 15.5.24 and >= 16.0.0, < 16.3.3.

The advisory is blunt: «there is no known workaround for affected windows-hosted applications. You should upgrade immediately». No partial mitigation, no config flag to disable the affected path. Only the upgrade.

Two unauthenticated RCE criticals in the same framework on the same day. If you run Next.js in production this is the first thing in your day — and the second patch ships in the same release as the first, so one upgrade covers both.

08 Sep 2026
github.com/advisories →
Sécurité

sharp 0.35.4 : l'origine réelle de la chaîne est libheif

Here is the root of everything above. Several vulnerabilities were found and fixed in the upstream libheif dependency, two rated Critical under CVSSv3, which can lead to RCE on glibc-based Linux under certain conditions.

The scoring detail is instructive: the original attack vector says «network», but sharp exposes no networking features, so it was down-rated to High under CVSSv4 — with an explicit note to mind the Subsequent System Impact. Translation: the number is lower because sharp is not what exposes you to the internet; the framework wrapping it is. Which is exactly why Next.js scores 9.5 and sharp 8.9 for the same bug.

Upgrade to 0.35.4, which ships libheif 1.23.2. If you use a globally installed libheif rather than the prebuilt binaries, make sure the system has 1.23.2 — the npm bump will not cover you.

08 Sep 2026
github.com/advisories →
Sécurité

Astro 7.2.8 : la même faille AVIF par le même chemin

Critical, and it is literally the same bug: the libheif vulnerability, reached through the Sharp image service Astro ships by default, leads to RCE when a malicious AVIF is optimized. You are affected if an attacker can get Astro to process an AVIF you do not control.

Fixed in Astro 7.2.8, which requires Sharp 0.35.4. Pay attention to that: bumping Astro is not enough if your lockfile pins an older sharp — verify the actually resolved version.

08 Sep 2026
github.com/advisories →
🔒

Security

Sécurité

multer : deux noms de champ et le processus Node meurt

Four advisories against multer on the same day, and the worst is brutal for how cheap it is: a remote unauthenticated attacker crashes the Node process with a single multipart/form-data request. Two crafted text field names trigger an uncaught RangeError: Invalid array length inside field parsing — and it is not routed to the application error handler, it terminates the process. Every app using multer is affected. No workaround, upgrade to 2.3.0.

The other three: DoS via file descriptor leak on aborted uploads, DoS via oversized array index in field names, and a file size limit bypass through an async fileFilter race condition.

If you have an Express upload endpoint facing the internet, this is your second item of the day after Next.js.

08 Sep 2026
github.com/advisories →
Sécurité

Nodemailer : le parser d'adresses est quadratique et celui de domaines ignore le standard

Four advisories. The high-severity one: lib/addressparser/index.js parses comma-separated address lists in quadratic O(n²) time. A single crafted string in To, Cc, Bcc, From, or Reply-To burns CPU proportional to the square of its length and blocks Node's entire event loop, denying service to every other request in the process.

The subtler one, and to me the more dangerous: Nodemailer resolves international (IDN) domains to a Punycode label different from every UTS-46-conformant parser — browsers, the WHATWG URL Standard, Node's url.domainToASCII, Python's idna. It uses the raw RFC-3492 codec with no UTS-46 mapping. The consequence? A domain your validator maps to a trusted one, Nodemailer delivers somewhere else. Your allow-list says yes and the mail goes to the attacker.

Add the domain validation bypass via RFC 5322 comment mis-parsing, and resolveContent() bypassing disableFileAccess/disableUrlAccess. All fixed in 9.1.0.

08 Sep 2026
github.com/advisories →
Sécurité

Hono : le correctif de CVE-2026-39408 ne couvrait pas toutes les séquences

Three advisories. The main one is an incomplete fix: toSSG() can still write files outside the output directory when a route parameter contains consecutive .. segments. The cause is elegant and instructive: the check that the resulting path stays inside the output normalizes the path with the same routine that built it. If that routine does not fully normalize, the check inherits exactly the same blind spot.

The other two: unbounded dot-notation nesting in parseBody() causing memory exhaustion, and the query parser reading parameters after the URL fragment, producing interpretation differentials between your app, the proxy, and the cache key. That last one is classic cache poisoning material. Fixed in 4.13.5.

08 Sep 2026
github.com/advisories →
Sécurité

Vitest : lecture arbitraire de fichiers via le redirect mock du dev server

@vitest/mocker registers a redirect mock's target path without validating it against the dev server's file-serving allowlist. Anyone who can reach the dev server's WebSocket registers a mock pointing outside the project root, and when that module is requested the load hook returns readFile(<attacker path>) as the module source. Exploitable without authentication through the public mockerPlugin.

Affects 2.1.0 through 4.1.11, and the 5 beta line up to 5.0.0-rc.2. One more case of development tooling listening more widely than you assumed — the same theme we have been seeing all week.

08 Sep 2026
github.com/advisories →
Sécurité

xmldom : quatorze advisories, et la déduplication d'attributs est en O(M²)

Fourteen advisories against @xmldom/xmldom in one day, most at 8.7. The most representative: it builds each element's attribute collection by inserting one at a time into a NamedNodeMap, and every insertion performs a linear scan of all already-inserted attributes to enforce the DOM uniqueness rule. Parsing an element with M attributes costs 1 + 2 + … + M = O(M²).

What makes it worse: the payload is perfectly well-formed XML. There is nothing malformed to detect — it is «one element with many attributes». No schema validation saves you.

The rest of the batch is a parade of requireWellFormed bypasses — via embedded line terminators in element, attribute, DocType, and publicId/systemId names, plus injection through createElement() and setAttribute() — and several more ReDoS. Fixed in 0.8.15 and 0.9.12. The legacy xmldom package (<= 0.6.0) has no fix: migrate.

08 Sep 2026
github.com/advisories →
☁️

Cloud & DevOps

Breaking

Gitea : RCE en installant un git hook via l'endpoint diffpatch

Critical. The diffpatch endpoint can be abused to install and execute a git hook from repository-controlled content. An attacker with ordinary write access runs arbitrary shell commands as the OS user Gitea runs under.

And here is what turns this into an emergency: with default open registration, an unauthenticated visitor obtains the required write access by simply registering an account and creating a repository. Anonymous to RCE in two trivial steps. Fixed in 1.27.1.

If you run self-hosted Gitea with open registration, close it or upgrade right now.

08 Sep 2026
github.com/advisories →
Sécurité

Netty : un ClientHello fragmenté contourne votre mTLS par SNI (CVSS 9.1)

Critical, 9.1. A TLS ClientHello whose handshake header spans multiple records makes Netty silently fall back to the default SslContext. Where per-SNI selection is the sole mTLS gate, an unauthenticated attacker bypasses the route's mTLS requirement.

The cause is textbook: in SslClientHelloHandler#decode, the guard that should wait for the 4-byte handshake header checks the wrong offset — it ignores the 5-byte record header preceding it — and therefore never fires. An off-by-five in protocol parsing, and your mutual authentication is gone.

Fixed in 4.2.17.Final and 4.1.137.Final. It ships alongside a second advisory for quadratic pre-handshake reassembly in default SNI parsing.

08 Sep 2026
github.com/advisories →
Sécurité

GitPython : une valeur dormante de git-config se réveille en directive vivante

Critical, 9.3, and the mechanism is one of the prettiest I have seen this year. Dormant multi-line values in a git-config are corrupted into live injected directives — for example core.hooksPathon any unrelated GitConfigParser write. The value was inert, you write something completely different to the config, and the read-write round trip activates it. From there, RCE.

It is a read-then-corrupt-on-rewrite, not an injection through a setter argument. Which is why it slips past any review that only inspects API calls. Fixed in 3.1.59.

Four more GitPython advisories landed the same day: clone_from() omitting --separate-git-dir from unsafe options, an incomplete denylist enabling arbitrary file read via Repo.blame(), and file disclosure through an [include] directive in an untrusted .gitmodules.

08 Sep 2026
github.com/advisories →
🏗️

Architecture & Best Practices

Notable

Le jour où la moitié de l'écosystème s'est révélée quadratique

Count the September 8 batch: xmldom (O(M²) attribute dedup, PI ReDoS, quadratic recovery parsing, quadratic memory), Nodemailer (O(n²) addressparser), Tiptap (quadratic ReDoS in Markdown attribute parsing), Netty (quadratic pre-handshake reassembly), HTTPX2 (quadratic SSE buffering), Colord (slow rejection of malformed strings), NLTK (three separate ReDoS), and this LiquidJS one: the join filter lets template authors bypass memoryLimit and crash the process.

This is not coincidence, it is a bug class we are systematically failing to test. And it has a recognizable signature: the input is valid. Well-formed, within size limits, passes any schema validation. What makes it toxic is not the content but the shape — nesting depth, attribute count, number of elements in a list.

The practical conclusion: your limits count bytes, and the real cost is almost never in the bytes. A request size limit does not protect you from a small, deeply nested document. When you write a parser, measure cost as a function of the input's shape, not its weight — and put an explicit bound on that dimension.

08 Sep 2026
github.com/advisories →

Backend TypeScript & Runtimes

Release

Node.js 24.21.0 : OpenSSL 3.5.8, nouveaux certificats racine et BlockList plus rapide

A crypto-heavy release: OpenSSL moves to 3.5.8, root certificates update to NSS 3.126, and Undici goes to 7.29.1. New as a minor, support for loading private keys through OpenSSL STORE loaders — useful when your keys live in an HSM or an external provider rather than the filesystem.

On performance: an improved histogram implementation and a faster net.BlockList. If you use BlockList for IP filtering on the hot path, that is a free upgrade.

08 Sep 2026
github.com/nodejs →
Release

workerd v1.20260909.1 tient la cadence quotidienne

Another daily Workers runtime release. On a day when the rest of the ecosystem published 99 advisories, Cloudflare's predictable cadence is almost a relief. Read the accumulated changelog if you track compatibility flags.

09 Sep 2026
github.com/cloudflare →
🔗

Fullstack

Sécurité

Astro 7.3.2 : les valeurs dynamiques dans script et style MDX sont échappées

Alongside the AVIF patch, Astro fixes <script> and <style> rendering in MDX: only literal content is now treated as trusted markup (including content injected by remark/rehype plugins). A dynamic value passed as a child — <script>{value}</script> — is escaped like any other element's content instead of rendered raw. To get the old behavior you must now opt in explicitly with set:html.

That is the right call: the default becomes safe and the exception becomes explicit. Watch out if you had legitimate dynamic content there — your render will change and you have to mark it by hand.

08 Sep 2026
github.com/withastro →
Release

pnpm 12.4.0 maintient le rythme de la ligne Rust

A new minor on the native 12 line, days after 12.3.x. The release rhythm since the Rust rewrite is noticeably higher — good for fixes, but keep an eye on accumulated breaking changes if you are coming from the 11 line.

08 Sep 2026
github.com/pnpm →