Présentation du problème
Le noyau Linux ne supporte pas actuellement la variable $ORIGIN, qui permet de spécifier l'emplacement d'un interpréteur de commande. Cela pose problème pour les binaires relocalisables, qui doivent être capables de trouver leur interpréteur de commande sans connaître leur emplacement exact.
Contexte technique
Farid Zakaria a proposé un patch pour ajouter le support de $ORIGIN au noyau Linux. Le patch a été discuté sur la liste de diffusion du noyau Linux et a reçu des commentaires positifs de la part de Christian Brauner, le responsable du sous-système VFS. Christian Brauner a proposé d'utiliser eBPF, un langage de programmation pour le noyau Linux, pour implémenter le support de $ORIGIN.
Implémentation avec eBPF
eBPF permet d'écrire des programmes qui s'exécutent dans le noyau Linux. Ces programmes peuvent être utilisés pour implémenter des fonctionnalités personnalisées, telles que le support de $ORIGIN. Le code suivant montre un exemple de programme eBPF qui implémente le support de $ORIGIN :
SEC("struct_ops.s/match")
bool BPF_PROG(nix_match, struct linux_binprm *bprm)
{
return !bpf_strncmp(bprm->buf, 4, "\x7f" "ELF");
}
SEC("struct_ops.s/load")
int BPF_PROG(nix_load, struct linux_binprm *bprm)
{
char path[256];
long n;
n = bpf_path_d_path(&bprm->file->f_path, path, sizeof(path));
if (n < 0)
return n;
/* derive the loader location from the binary's path */
return bpf_binprm_set_interp(bprm, path, sizeof(path));
}
SEC(".struct_ops.link")
struct binfmt_misc_ops nix = {
.match = (void *)nix_match,
.load = (void *)nix_load,
.name = "nix",
};
Implications et limites
L'implémentation du support de $ORIGIN avec eBPF offre une grande flexibilité et permet de résoudre les problèmes liés aux binaires relocalisables. Cependant, il est important de noter que cette implémentation nécessite une bonne compréhension du fonctionnement du noyau Linux et de la programmation eBPF. De plus, il est important de tester soigneusement les programmes eBPF pour garantir leur sécurité et leur stabilité.