
Correctif du noyau OpenVPN en amont pour CVE-2026-74727, testé sur le noyau Ubuntu 7.0.0-38.38. Comprend les instructions de compilation et les résultats des tests fonctionnels.
Documentation d'une compilation locale, de tests fonctionnels, d'une revue ciblée du code source et de tests de régression déterministes sur les invariants de rehash de l'IP VPN et du point de terminaison de transport du correctif amont associé à CVE-2026-74727, sur le paquet source du noyau Ubuntu linux 7.0.0-38.38 en x86_64. Les tests du point de terminaison de transport ont également été recompilés et exécutés sur un noyau Generic KASAN compilé localement.
Il s'agit d'une revue de rétroportage d'un correctif amont existant, et non d'une vulnérabilité nouvellement découverte ni d'un correctif de sécurité original. L'auteur amont enregistré est Antonio Quartulli. Le commit enregistré est 33ec10567fe14456063daf549fdf1a4f53448e4c.
Correctif amont : https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=33ec10567fe14456063daf549fdf1a4f53448e4c
La modification dans drivers/net/ovpn/peer.c empêche le rehash d'un pair déjà supprimé de la table de hachage des ID de pairs. Conservez les en-têtes, la paternité et la licence du correctif original lors de sa distribution. Cette documentation ne relicencie pas le correctif du noyau.
Le correctif amont original est inclus octet pour octet. Son SHA-256 correspond à l'artefact utilisé lors de la session de test enregistrée. Son auteur, son message de commit et ses modifications de code ont été vérifiés par rapport au commit amont public sur GitHub. Aucun binaire n'est inclus.
La somme de contrôle du correctif a été vérifiée indépendamment par rapport au fichier inclus. La somme de contrôle du module a été enregistrée lors de la session de test de l'opérateur ; le binaire n'est pas distribué ici.
| Artefact | SHA-256 |
|---|---|
CVE-2026-74727-upstream.patch | baf0962c60b182776a86e040d2ec5b35eea2737c2e2eb6f17f87eb7d2fe47b24 |
ovpn.ko testé | 0853fdce14ce1c4d64857871dc873bf98a1b8fe8243bf042ad6daffc906e6d27 |
Utilisez une copie extraite séparée du paquet source Ubuntu exact linux 7.0.0-38.38. Installez d'abord les en-têtes de noyau correspondants et la chaîne d'outils de compilation. Le compilateur enregistré était Ubuntu GCC 15.2.0-16ubuntu1, correspondant au compilateur du noyau en cours d'exécution.
Depuis la racine des sources, avec le correctif dans son répertoire parent :
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
L'application du correctif enregistrée a utilisé un fuzz nul avec des décalages de ligne de -6 et -5. La compilation a renvoyé le code de sortie 0. La génération BTF a été ignorée car vmlinux était indisponible. Le vermagic du module correspondait à 7.0.0-38-generic SMP preempt mod_unload modversions.
Un vermagic correspondant et une compilation réussie n'établissent pas qu'un module est sûr ni que la vulnérabilité a été entièrement validée.
Les tests ont été effectués manuellement sur une VM Ubuntu Hyper-V avec le noyau 7.0.0-38-generic et Secure Boot désactivé. Les résultats sont basés sur la sortie terminal fournie par l'opérateur :
192.0.2.2 à 192.0.2.3 ; l'état du pair renvoyé a confirmé le changement. Cela était confiné à un espace de noms de test temporaire et n'a pas modifié l'adresse VPN opérationnelle.Le 2026-10-06, deux modules de test autonomes ont exécuté la fonction réelle ovpn_peer_hash_vpn_ip() extraite de la sauvegarde non corrigée et de la source corrigée. Des objets synthétiques privés sont restés alloués tout au long. Après avoir simulé une suppression terminée des tables de hachage, le test a appelé à nouveau la fonction sous ovpn->lock.
| Propriété | Avant correctif | Après correctif |
|---|---|---|
| Le pair actif est inscrit dans les tables IPv4 et IPv6 | PASS | PASS |
| Le pair supprimé reste en dehors des tables IPv4 et IPv6 | FAIL | PASS |
| Buckets IPv4 / IPv6 occupés après rehash d'un pair supprimé | 1 / 1 | 0 / 0 |
Il s'agit d'une vérification à l'exécution de l'invariant spécifique post-suppression, et non d'une reproduction d'une course de suppression concurrente ou d'un use-after-free. L'échec de l'invariant de la base de référence est attendu et démontre que le test distingue les deux versions de la fonction. Les deux modules ont ensuite été déchargés. Le VPN opérationnel est resté actif avec son adresse inchangée. L'intervalle de journal examiné contenait les résultats des tests et aucun message correspondant à BUG, Oops, general protection fault ou soft lockup.
Voir TESTING.md pour la sortie enregistrée, les instructions de reproduction et les limites. Le générateur se trouve dans tests/prepare-ovpn-rehash-regtest.py.
Le 2026-10-06, des modules de test autonomes ont également exécuté la fonction réelle ovpn_peer_endpoints_update() extraite des sources non corrigées et corrigées, avec les helpers de liaison de production. Pour IPv4 et IPv6, des en-têtes de paquets synthétiques privés ont provoqué le float d'un pair actif, puis ont provoqué une autre mise à jour de point de terminaison après la suppression de ses entrées de hachage alors que son stockage restait alloué.
| Propriété, pour IPv4 et IPv6 | Avant correctif | Après correctif |
|---|---|---|
| Le pair actif flotte et reste dans la table de transport | PASS | PASS |
| La mise à jour du point de terminaison est atteinte après la suppression modélisée | PASS | PASS |
| Le pair supprimé reste en dehors de la table de transport | FAIL | PASS |
| Buckets de transport occupés après la mise à jour d'un pair supprimé | 1 | 0 |
Aucun paquet n'a été transmis, et aucune interface, pair VPN ou adresse réels n'ont été modifiés. Les deux modules de test ont ensuite été déchargés ; le VPN opérationnel est resté actif avec son adresse inchangée. L'intervalle de journal examiné contenait les quatre résultats des tests et aucune ligne correspondant à BUG, Oops, general protection fault ou soft lockup.
Voir FLOAT-TESTING.md et tests/prepare-ovpn-float-regtest.py pour la portée, les instructions de reproduction et les résultats enregistrés.