
Corrección del kernel de OpenVPN upstream para CVE-2026-74727, probada en el kernel de Ubuntu 7.0.0-38.38. Incluye instrucciones de compilación y resultados de pruebas funcionales.
Documentación de una compilación local, pruebas funcionales, revisión enfocada del código fuente y pruebas de regresión deterministas de las invariantes de rehash de IP de VPN y de endpoint de transporte del arreglo upstream asociado a CVE-2026-74727, contra el paquete de código fuente del kernel de Ubuntu linux 7.0.0-38.38 en x86_64. Las pruebas de endpoint de transporte también se recompilaron y ejecutaron en un kernel Generic KASAN compilado localmente.
Esta es una revisión de backport de un arreglo upstream existente, no una vulnerabilidad recién descubierta ni un arreglo de seguridad original. El autor upstream registrado es Antonio Quartulli. El commit registrado es 33ec10567fe14456063daf549fdf1a4f53448e4c.
Parche upstream: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=33ec10567fe14456063daf549fdf1a4f53448e4c
El cambio en drivers/net/ovpn/peer.c evita rehashear un peer que ya ha sido eliminado de la tabla hash de ID de peer. Conserve los encabezados originales del parche, la autoría y la licencia al distribuirlo. Esta documentación no relicencia el parche del kernel.
El parche upstream original se incluye byte por byte. Su SHA-256 coincide con el artefacto utilizado en la sesión de pruebas registrada. Su autor, mensaje de commit y cambios de código se verificaron contra el commit upstream público en GitHub. No se incluye ningún binario.
La suma de verificación del parche se comprobó de forma independiente contra el archivo incluido. La suma de verificación del módulo se registró durante la sesión de pruebas del operador; el binario no se distribuye aquí.
| Artefacto | SHA-256 |
|---|---|
CVE-2026-74727-upstream.patch | baf0962c60b182776a86e040d2ec5b35eea2737c2e2eb6f17f87eb7d2fe47b24 |
ovpn.ko probado | 0853fdce14ce1c4d64857871dc873bf98a1b8fe8243bf042ad6daffc906e6d27 |
Utilice una copia extraída separada del paquete de código fuente exacto de Ubuntu linux 7.0.0-38.38. Instale primero los encabezados del kernel correspondientes y la cadena de herramientas de compilación. El compilador registrado fue Ubuntu GCC 15.2.0-16ubuntu1, coincidiendo con el compilador del kernel en ejecución.
Desde la raíz del código fuente, con el parche en su directorio padre:
patch --dry-run --batch --forward --fuzz=0 -p1 < ../CVE-2026-74727-upstream.patch
patch --batch --forward --fuzz=0 -p1 < ../CVE-2026-74727-upstream.patch
make -C /lib/modules/7.0.0-38-generic/build \
M="$PWD/drivers/net/ovpn" CONFIG_OVPN=m \
CC=x86_64-linux-gnu-gcc -j1 modules
La aplicación del parche registrada utilizó cero fuzz con desplazamientos de línea de -6 y -5. La compilación devolvió el código de salida 0. La generación de BTF se omitió porque vmlinux no estaba disponible. El vermagic del módulo coincidió con 7.0.0-38-generic SMP preempt mod_unload modversions.
Que el vermagic coincida y la compilación sea exitosa no demuestra que un módulo sea seguro ni que la vulnerabilidad haya sido validada por completo.
Las pruebas se realizaron manualmente en una VM de Ubuntu sobre Hyper-V con el kernel 7.0.0-38-generic y Secure Boot deshabilitado. Los resultados se basan en la salida de terminal proporcionada por el operador:
192.0.2.2 a 192.0.2.3; el estado del peer devuelto confirmó el cambio. Esto se limitó a un espacio de nombres de prueba temporal y no modificó la dirección de VPN operativa.El 2026-10-06, dos módulos de prueba independientes ejecutaron la función real ovpn_peer_hash_vpn_ip() extraída del respaldo sin parchear y del código fuente parcheado. Los objetos sintéticos privados se mantuvieron asignados durante todo el proceso. Tras simular la eliminación completada de las tablas hash, la prueba llamó de nuevo a la función bajo ovpn->lock.
| Propiedad | Antes del parche | Después del parche |
|---|---|---|
| El peer activo está registrado en las tablas IPv4 e IPv6 | PASS | PASS |
| El peer eliminado permanece fuera de las tablas IPv4 e IPv6 | FAIL | PASS |
| Buckets IPv4 / IPv6 ocupados tras el rehash del peer eliminado | 1 / 1 | 0 / 0 |
Esta es una comprobación en tiempo de ejecución del invariante específico posterior a la eliminación, no una reproducción de una condición de carrera de eliminación concurrente ni de un use-after-free. El fallo del invariante en la línea base es esperado y demuestra que la prueba distingue las dos versiones de la función. Ambos módulos se descargaron posteriormente. La VPN operativa permaneció activa con su dirección sin cambios. El intervalo de registro revisado contenía los resultados de las pruebas y ningún mensaje coincidente de BUG, Oops, general protection fault ni soft lockup.
Consulte TESTING.md para ver la salida registrada, las instrucciones de reproducción y las limitaciones. El generador está en tests/prepare-ovpn-rehash-regtest.py.
El 2026-10-06, módulos de prueba independientes también ejecutaron la función real ovpn_peer_endpoints_update() extraída de las fuentes sin parchear y parcheadas, con los helpers de binding de producción. Tanto para IPv4 como para IPv6, cabeceras de paquete sintéticas privadas provocaron que un peer activo hiciera float y, a continuación, provocaron otra actualización de endpoint después de que sus entradas hash se hubieran eliminado mientras su almacenamiento permanecía asignado.
| Propiedad, tanto para IPv4 como para IPv6 | Antes del parche | Después del parche |
|---|---|---|
| El peer activo hace float y permanece en la tabla de transporte | PASS | PASS |
| Se alcanza la actualización de endpoint tras la eliminación modelada | PASS | PASS |
| El peer eliminado permanece fuera de la tabla de transporte | FAIL | PASS |
| Buckets de transporte ocupados tras la actualización del peer eliminado | 1 | 0 |
No se transmitió ningún paquete y no se modificaron interfaces reales, peers de VPN ni direcciones. Ambos módulos de prueba se descargaron después; la VPN operativa permaneció activa con su dirección sin cambios. El intervalo de registro revisado contenía los cuatro resultados de las pruebas y ninguna línea coincidente de BUG, Oops, general protection fault ni soft lockup.
Consulte FLOAT-TESTING.md y tests/prepare-ovpn-float-regtest.py para ver el alcance, las instrucciones de reproducción y los resultados registrados.