Maison >Tutoriel système >Linux >Vous pouvez essayer d'utiliser les solutions suivantes pour intercepter les fonctions du noyau Linux

Vous pouvez essayer d'utiliser les solutions suivantes pour intercepter les fonctions du noyau Linux

PHPz
PHPzavant
2024-02-15 17:33:31745parcourir

Vous pouvez essayer les solutions suivantes pour intercepter les fonctions du noyau Linux :

Utilisez l'API de sécurité Linux

Du point de vue des meilleures pratiques, nous pensons que l'utilisation de la fonction hook de l'API de sécurité Linux est le meilleur choix, car ce socket est conçu à cet effet. Les points clés du code du noyau incluent les appels de fonctions de sécurité, qui peuvent entraîner une escalade de l'installation de modules de sécurité. Ce module peut étudier le contexte d'une opération spécifique et décider de l'autoriser ou de l'interdire. Malheureusement, LinuxSecurityAPI a deux limitations majeures :

调用linux内核函数_linux内核调试方法总结_linux调用内核函数

En fait, les développeurs du noyau ont des idées différentes quant à savoir si le système peut contenir plusieurs modules de sécurité, et il est certain que les modules ne peuvent pas être chargés dynamiquement. Pour garantir qu'un système reste sécurisé dès le départ, les modules de sécurité doivent faire partie du noyau. Pour cette raison, afin d'utiliser l'API de sécurité Linux, nous devons créer un noyau Linux personnalisé.

Changer la table des appels système

Comme il est principalement utilisé pour les opérations effectuées par les applications utilisateur, nous pouvons l'implémenter au niveau des appels système. Tous les gestionnaires d'appels système Linux sont stockés dans la table sys_call_table. La modification des valeurs de ce tableau entraîne une modification du comportement du système. Nous pouvons le faire en accrochant l'appel système en enregistrant l'ancienne valeur du gestionnaire et en ajoutant notre propre gestionnaire à la table. Ces méthodes présentent également certains avantages et inconvénients.

Les principaux avantages sont les suivants :

Cependant, ces méthodes présentent également plusieurs inconvénients :

La mise en œuvre technique est plus complexe. En fait, il n'est pas difficile de remplacer les valeurs dans le tableau Appelez les fonctions du noyau Linux , mais il existe quelques tâches supplémentaires qui nécessitent des conditions individuelles et des solutions non évidentes :

调用linux内核函数_linux内核调试方法总结_linux调用内核函数

Accrochez uniquement les appels système. Étant donné que cette approche vous permet de remplacer les gestionnaires d’appels système, elle limite considérablement les points d’entrée. Toute détection supplémentaire peut être effectuée immédiatement avant ou après l'appel système, nous disposons uniquement des paramètres de l'appel système et de leurs valeurs de retour. Par conséquent, nous pouvons parfois avoir besoin de vérifier soigneusement les autorisations d'accès du processus et la validité des paramètres d'appel système. Il est rapporté que dans certains cas, la nécessité de copier deux fois la mémoire du processus utilisateur entraînera des dépenses supplémentaires. Par exemple, lorsqu'un paramètre passe par l'aiguille de la montre, il y a deux copies : une créée par nous-mêmes et une créée par le gestionnaire d'origine.

Utilisez Kprobes

Kprobes — Une API conçue pour le traçage et le débogage du noyau Linux. Kprobes permet l'installation de pré- et post-processeurs pour toute instruction du noyau ainsi que de gestionnaires d'entrée et de retour de fonction. Les gestionnaires ont accès aux registres et peuvent les modifier. De cette façon, nous avons la possibilité de surveiller le flux d’exécution des fichiers et de le modifier.

调用linux内核函数_linux内核调试方法总结_linux调用内核函数

Les principales utilisations de Kprobes pour suivre les fonctions du noyau Linux sont les suivantes :

Les Kprobes ont aussi des inconvénients :

Épissage

Une manière classique de configurer le hooking des fonctions du noyau : remplacez les instructions au début de la fonction par un saut inconditionnel vers un gestionnaire personnalisé. L'instruction d'origine est connectée à un emplacement différent et exécutée avant de revenir à la fonction interceptée. Pour cette raison, en deux sauts, le code peut être fusionné en fonction. Cela fonctionne de la même manière que l'optimisation des sauts de kprobes. En utilisant l'épissage, vous pouvez obtenir les mêmes résultats qu'en utilisant kprobes, mais avec moins de frais généraux et un contrôle total sur le processus.

Les avantages de l'épissage sont très importants :

Cependant, ces méthodes présentent un inconvénient majeur : la complexité technique. Remplacer le code machine dans une fonction n’est pas chose aisée. Afin d'utiliser le splicing pour appeler les fonctions du noyau Linux , les opérations suivantes doivent être effectuées :

Relativement parlant, l'épissage peut être un moyen très utile d'accrocher les fonctions du noyau Linux. Mais la mise en œuvre de cette méthode est trop compliquée. Parce que, compte tenu de nos propres capacités et d'autres incitations, nous ne sommes pas prêts à adopter ces méthodes pour le moment, nous les utilisons donc comme candidates.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer