Intercept ELF loader dans le kernel Linux: fichier fs / binfmt_elf.c via un module de kernel chargeable

Je suis nouveau dans le codage du kernel et je travaille actuellement avec des fichiers ELF qui ont été légèrement modifiés pour des raisons de sécurité; CPU pour décrypter le contenu du ELF modifié.

À l’heure actuelle, la logique ci-dessus a été implémentée dans la fonction fs/binfmt_elf.c fichier fs/binfmt_elf.c de l’arbre source du kernel. Toutefois, il ne s’agit que d’environ 250 lignes de modification de code pour lesquelles je dois recomstackr le kernel. d’improviser cette fonctionnalité en l’implémentant en tant que module de kernel chargeable (LKM) afin que chaque fois qu’un ELF est chargé, il vérifie si c’est le ELF modifié ou non et si c’est le cas, il extrait la clé de la section correspondante.

EDIT: Pour résumer, je cherche à créer un module de kernel chargeable pour lire les sections d’un ELF et extraire le contenu d’une section personnalisée contenant la clé de cryptage et les métadonnées associées et définir ces valeurs dans des registres de CPU.

Oui, c’est possible , mais certainement pas facile. Il existe même une fonctionnalité de kernel “kprobes” prise en charge qui vous permet d’insérer des appels à votre propre code à partir d’emplacements spécifiés (voir Documentation/kprobes.txt ). Si l’insertion d’appels dans votre propre code est insuffisante, je pense que vous devriez utiliser le même type de mécanisme que kprobe: patcher l’emplacement désiré en écrasant les instructions avec jmp s ou en call dans votre propre code.

J’ai déjà travaillé dans une entreprise dont le produit de sécurité avait installé ses crochets en appliquant au kernel Windows des correctifs à l’exécution. C’est à peu près la même chose, bien qu’au moins avec Windows à l’époque, il y avait un nombre fini de versions à prendre en charge.

Donc, c’est tout à fait possible, mais je ne voudrais pas l’essayer. Ce sera très fragile. vous essayerez en fait de toucher une cible en mouvement. Chaque correctif de sécurité du kernel ou toute mise à niveau de version est susceptible de casser votre code.