Les capacités peuvent-elles être utilisées dans des scripts sans définir le binaire de l'interpréteur?

14

En ce moment, j'utilise cap_net_bind_service MY_USERNAMEdans /etc/security/capability.conf.
Maintenant, il me suffit de définir cap_net_bind_service+il'interpréteur de mon langage de script préféré pour pouvoir ajouter CAP_NET_BIND_SERVICEà l' ensemble efficace via libcap [-ng].

Cela fonctionne bien, mais je me demande s'il existe un moyen de réaliser la même chose sans définir de majuscules pour l'interpréteur binaire. Bien que ce ne soit pas un gros problème (les autres comptes d'utilisateurs n'ont pas de plafond, ils ne peuvent donc pas l'utiliser même avec le bit défini sur le binaire de l'interpréteur), c'est un peu ennuyeux car je dois réinitialiser le drapeau à chaque fois que l'interprète est mis à jour.

ThiefMaster
la source

Réponses:

4

Habituellement, les capacités sont héritées des enfants. Comme indiqué dans la page de manuel :

Un enfant créé via fork (2) hérite des copies des jeux de capacités de son parent.

Le problème avec les scripts est qu'ils ne sont pas directement exécutables. Le noyau passe par une liste de vérifications (le code du noyau se trouve dans fs / binfmt _ *. C). L'un d'eux est "binfmt_script.c", qui vérifie la première ligne pour un shebang, puis appelle le véritable interprète (celui du shebang) avec votre script comme argument. En tant que tel, l'interpréteur standard / commun est appelé et lit simplement votre script comme argument.

Cela signifie que vous devrez définir la capacité sur l'interpréteur, pas sur le script. La même chose s'applique aux suidbits et autres drapeaux spéciaux.

Donc, soit vous faites une copie de votre interprète, définissez les capacités que vous souhaitez (vérifiez également que personne ne peut y accéder via chmod / chown), et appelez cet interprète copié dans votre shebang. Vous pouvez également faire la logique setcap dans votre script.

Adrien M.
la source
Ok, je n'ai pas vu la question posée il y a 2 ans mais jamais fermée ... Aussi, cela ressemble à un doublon de unix.stackexchange.com/questions/87348/…
Adrien M.
mais seulement i(hériter), obtient passé exec. Et ine fait rien par lui-même, cela ne fonctionne que si le fichier a une correspondance i, et je pense que le ebit (efficace) (sauf si le script / exécutable le définit). C'est encore plus complexe que setuid, ce n'est pas un effet de script.
ctrl-alt-delor
1
Je pensais que le shebang était lu par le noyau et non par le shell? ( stackoverflow.com/questions/3009192/how-does-the-shebang-work/… )
Philip Couling
vous avez raison. C'était une mauvaise interprétation que j'ai comprise plus tard. Je l'ai corrigé avec des indications sur l'emplacement du code du noyau pour l'exécution des scripts.
Adrien M.