Base de données sysctl

Lorsqu'un pilote ou n'importe quelle partie d'un noyau a besoin de stocker des valeurs ou de mettre à disposition des informations, il peut le faire par l'intermédiaire de la base de données noyau ou sysctl.

Fonctionnement général

Une entrée est sous la forme : clef - valeur. La clef est une chaîne de caractère où chaque nœud est séparé d'un autre par un point. Par exemple : net.ipv4.conf.eth0.accept_redirects.

Une valeur peut être un booléen, un entier, un nombre à virgule flottante ou un texte.

Un système de protection permet de protéger ces données et de restreindre leur accès ou leur modification.

Sécurité - Protection

Une valeur peut être placée en lecture seule ou en lecture / écriture.

Dans tous les cas, il est possible d'autoriser indépendamment la lecture et / ou l'écriture à différentes personnes.

La restriction en lecture et/ou en écriture s'applique sur le GID effectif du processus. Une protection supplémentaire permet de restreindre l'accès à partir d'un code noyau propriétaire.

Restriction d'accès à partir d'un code noyau propriétaire

Pour assurer la protection à partir d'un code noyau propriétaire, il faut garder en mémoire que ce code ne peut accéder qu'à une API noyau restreinte. Lors de l'initialisation de la base de données, une correspondance entre l'API d'accès à sysctl et l'API d'accès restreint sera enregistré dans le gestionnaire des résolutions de symboles. De ce fait, lorsqu'un pilote propriétaire sera chargé, un appel à la base de données utilisera automatiquement l'accès restreint sans possibilité d'utiliser l'accès libre accessible à partir d'un code libre.

Étant donné qu'il n'est pas possible de vérifier le code d'un pilote propriétaire, cette mesure permettra d'empêcher la modification ou l'accès à des données qui n'ont aucun rapport avec le pilote concerné et ainsi faciliter l'isolement du code propriétaire du reste du noyau.

Types de valeurs

Il existe deux manières de stocker les valeurs. Soit le pilote décide de stocker la valeur dans la base de données, soit le pilote enregistre une fonction de rappel (callback) qui sera appelée à chaque fois que la valeur sera accédée ou modifiée.

Ce dernier aspect permet d'offrir un accès à des valeurs dynamiques qui pourront alors, par exemple, être exploités par des applications.

Propagation d'une modification

Dans le cas où une valeur peut être modifiée, il peut être intéressant pour un pilote d'être averti que la valeur a été modifiée pour la répercuter dans le fonctionnement de ce dernier. Pour ce faire, une fonction de rappel (callback) pourra être fournie. Celle-ci sera appelée à chaque modification de la valeur.

Ceci peut être utilisé pour offrir une configuration particulière d'un pilote. Grâce à ce fonctionnement, une application ou un autre pilote pourrait modifier la configuration et celle-ci serait directement répercutée dans le pilote concerné.