Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-46331 — pedit COW | Kitploit
Herramientas/GitHubGitHub/v0idnetwork/cve-2026-46331
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónCTFPapers e InvestigaciónAprendizaje y EducaciónExplotación de Binarios
GitHubv0idnetwork/cve-2026-46331

CVE-2026-46331

pedit COW

Ver Repositorio
16hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-46331 (pedit COW) – Vulnerabilidad de Envenenamiento de Caché de Páginas en el Editor de Paquetes de Linux net/sched

Resumen Ejecutivo

CVE-2026-46331 (apodado “pedit COW”) es una falla local de escalada de privilegios en el kernel de Linux en el subsistema de control de tráfico. Un usuario no privilegiado (en un espacio de nombres de red no privilegiado) puede configurar el filtro act_pedit (editor de paquetes) para desencadenar una escritura parcial de copia en escritura (COW) en la caché de páginas. En efecto, el kernel escribe datos controlados por el atacante en la imagen en memoria de un archivo sin marcar la página como privada, corrompiendo la copia en caché de ese archivo. Críticamente, el exploit solo requiere CAP_NET_ADMIN (obtenible en un espacio de nombres de usuario) y no modifica el archivo en disco. En la práctica, una prueba de concepto (PoC) funcional llamada packet_edit_meme fue publicada el 17 de junio de 2026, demostrando cómo sobrescribir la imagen en caché de páginas de un binario setuid (por ejemplo, /bin/su) para generar un shell de root. La vulnerabilidad se origina en un cálculo incorrecto del rango COW en tcf_pedit_act() y ha sido corregida en upstream (4 de junio de 2026) moviendo la verificación de la región escribible al bucle por clave.

  • Afectados: Kernels de Linux (aproximadamente v5.18 hasta 7.1-rc6) con act_pedit. Las versiones estables sin parche (incluyendo muchos kernels de distribuciones) son vulnerables.
  • Impacto: Escalada de privilegios local a root mediante la corrupción de la caché de páginas (envenenamiento de caché de páginas). CVSS v3.1: 6.0 (Medio, AV:L/AC:L/PR:H/UI:N/C:N/I:H/A:H).
  • Exploit: La PoC aprovecha un espacio de nombres de usuario+red no privilegiado para obtener CAP_NET_ADMIN, configura un filtro tc pedit y sobrescribe el punto de entrada ELF de un binario setuid en memoria con shellcode.
  • Mitigación: Actualice el kernel (el parche upstream movió skb_ensure_writable() dentro del bucle por clave). Como solución alternativa, bloquee o descargue el módulo act_pedit o deshabilite los espacios de nombres de usuario no privilegiados (por ejemplo, sysctl user.max_user_namespaces=0). Después de la mitigación, vacíe las cachés (echo 3 > /proc/sys/vm/drop_caches) para eliminar cualquier página envenenada.

Este informe proporciona un análisis técnico detallado de CVE-2026-46331: su causa, explotación, detección y estrategias de remediación, con referencias a avisos de proveedores, CVEs y el exploit público.

Resumen de la Vulnerabilidad

Definición: CVE-2026-46331 es un error de escritura fuera de límites en el subsistema Traffic Control (net/sched) del kernel de Linux, específicamente en la acción act_pedit (editor de paquetes). La función tcf_pedit_act() calcula un rango de “copia en escritura” para operaciones de edición de paquetes antes de iterar sobre las claves tipificadas, utilizando una pista estática tcfp_off_max_hint. Sin embargo, algunas claves (por ejemplo, ediciones de cabecera TCP/UDP) determinan su desplazamiento de bytes final solo en tiempo de ejecución. El código nunca vuelve a verificar la capacidad de escritura para estos desplazamientos dinámicos. Como resultado, las escrituras pueden ocurrir fuera de la región pre-COW: parte de la escritura del paquete nunca se hace privada, lo que lleva a un COW parcial. Esta escritura errónea se propaga a la memoria compartida de la caché de páginas de un archivo (si los buffers del paquete hacen referencia a páginas del archivo), corrompiendo la imagen del archivo en caché.

Antecedentes: La acción editor de paquetes (pedit) de Linux permite a los administradores reescribir bytes arbitrarios dentro de las cabeceras de los paquetes (capas de enlace, red o transporte) a medida que los paquetes atraviesan un filtro tc configurado. Funciona especificando un desplazamiento (posiblemente anclado a una cabecera) y un valor/máscara de 32 bits. Internamente, pedit opera sobre socket-buffers (sk_buff) y debe hacer que la memoria del paquete de destino sea escribible antes de modificarlo (a través de skb_ensure_writable() de manera COW). Idealmente, el kernel debería clonar (copia privada) cualquier página compartida antes de escribir para evitar alterar la memoria utilizada en otro lugar.

Causa Raíz: En tcf_pedit_act(), el código calcula erróneamente el rango escribible solo una vez al inicio, utilizando tcfp_off_max_hint (el desplazamiento estático máximo). Esta pista no incluye ningún desplazamiento de cabecera en tiempo de ejecución que las claves tipificadas añaden cuando se procesa el paquete. Claves como TCP o UDP pueden calcular un desplazamiento basado en la posición de la cabecera IP en tiempo de ejecución (por ejemplo, si una clave anterior desplaza la cabecera de red). Por lo tanto, durante el bucle por clave, el desplazamiento real de una clave puede exceder el rango que fue pre-asignado como escribible. El código entonces escribe en la memoria del paquete a través de skb_store_bits(), pero como la página más allá de la región pre-COW no se hizo privada, la escritura corrompe una página que todavía está compartida con la caché de páginas. En resumen, “calcular el rango del paquete escribible demasiado pronto” causa una escritura fuera de límites y entre páginas. Los desplazamientos negativos (por ejemplo, editar cabeceras Ethernet en ingreso) también se manejan incorrectamente, e incluso offset_valid() carecía de una guardia para INT_MIN, agravando la falla.

Por Qué Ocurre: Este error es esencialmente un error de lógica en el cálculo del rango de copia en escritura. El kernel asumió que el desplazamiento máximo estático (conocido en tiempo de carga) era suficiente para todas las ediciones. No actualizó el rango COW cuando se aplicaron claves con desplazamientos dinámicos. Después de una serie de ediciones en cola, la escritura final podría quedar fuera de la región preverificada. Debido a que los buffers de paquetes pueden hacer referencia a páginas de archivos mapeados en memoria (por ejemplo, a través de mecanismos de copia cero), esta escritura “COW parcial” puede alcanzar la caché de páginas de un archivo en disco. En la práctica, la acción del editor de paquetes puede recibir páginas de un sendfile o splice; por lo tanto, una única operación de filtro de paquetes puede escribir indirectamente datos elegidos por el atacante en la imagen en memoria de un archivo, sin alterar el disco.

Análisis Técnico

Componentes y Flujo de Datos: El código vulnerable reside en el subsistema net/sched de Linux (act_pedit.c). Cuando un paquete coincide con una regla pedit configurada, se invoca tcf_pedit_act(). Internamente, llama a skb_ensure_writable(skb, X) exactamente una vez, donde X = tcfp_off_max_hint. Esto hace que los primeros X bytes del paquete sean privados (COW). Luego, en un bucle sobre cada clave (operación de edición), calcula el desplazamiento de escritura real de la clave sumando el desplazamiento de cabecera en tiempo de ejecución al desplazamiento especificado de la clave, y escribe un valor de 32 bits en el paquete. En pseudocódigo:```c u32 off_max = action->tcfp_off_max_hint; skb_ensure_writable(skb, off_max); for (i = 0; i < num_keys; i++) { u32 hdr_off = compute_header_offset(skb, key[i].hdr_type); u32 write_off = hdr_off + key[i].offset; skb_store_bits(skb, write_off, &key[i].value, 4); }

Debido a que `hdr_off` solo se calcula al procesar cada clave, la llamada inicial a `skb_ensure_writable()` no lo tuvo en cuenta. Si `hdr_off + key[i].offset` supera `off_max`, el código recurre a `skb_store_bits()` en fragmentos en lugar del área lineal principal, lo que significa que escribe en una página no hecha privada. Ese es el punto de fallo.
Descargar herramienta