logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 01-08-2018 19:36:36

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Les "capabilities" du noyau linux

Bonjour smile

Voici un sujet qui fâche. smile

Certaines commandes linux triviales doivent avoir un bit setuid/suid pour pouvoir travailler en espace noyau:

find / -type f -perm -4000


/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/eject/dmcrypt-get-device
/usr/lib/spice-gtk/spice-client-glib-usb-acl-helper
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/chromium/chrome-sandbox
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/sudo
/usr/sbin/exim4
/bin/su
/bin/mount
/bin/umount
/bin/fusermount
 



Sauf que ces commandes ont tous les pouvoirs, une fois qu'elles tournent en root, alors que ce n'est pas, toujours, nécessaire.

On a, donc, décidé de fractionner les privilèges root en une trentaines de privilèges partiels que l'on appelle capacités.

Comme pour le bit setuid, on peut appliquer ces capacités sur les fichiers (dans les attributs étendus) grâce à la commande "setcap". Par contre, les processus ont, aussi, des capacités.

Il existe une page de manuel en français concernant les capacités: http://manpages.ubuntu.com/manpages/bio … ies.7.html

Les capacités sont utilisées par les containers comme LXC.

La commande ping n'a plus de bit suid et utilise, maintenant, la capacité cap_net_raw. Vous pouvez le vérifier en lançant la commande "getcap /bin/ping".

On peut imaginer à l'avenir que beaucoup des commandes, listées au dessus, y passent.

Est-ce que vous connaissiez cette fonctionnalité ? Qu'en pensez vous ?

Dernière modification par Beta-Pictoris (02-08-2018 14:24:30)

Hors ligne

#2 02-08-2018 10:01:02

naguam
Membre
Lieu : Quelque part
Distrib. : Plusieurs
Noyau : Ça dépend
(G)UI : La CLI il n'y a que ça de vrai!
Inscription : 13-06-2016

Re : Les "capabilities" du noyau linux

Oui enlever des privilèges à certaines commandes root qui ont "trop de droits" est en effet parfois utiles smile.
Il ne faut pas oublier que certaines nécessitent aussi ces droits même si en surface on en a pas toujours l'impression (notamment avec certains arguments).
Aussi setuid permet aussi de transférer des droits aux users (en espace utilisateur donc) et c'est parfois dangereux. Par exemple, on peut faire beaucoup de dégât avec mount, si si smile.

Cependant c'est une réflexion plutôt intéressante smile et ce n'est pas une mauvaise idée/fonctionnalité c'est d'ailleurs pour ça que c'est possible smile.
Faut juste l'utiliser à bon escient smile.

Je connaissais cette techno, même si ce qui m’intéresse plus particulièrement, ce sont les cgroups.

Ps: le but n'est pas de partir hors sujet avec les cgroups mais de le partager à l'auteur du premier post car le sujet m'y a fait penser.

Dernière modification par naguam (02-08-2018 10:03:28)

Hors ligne

#3 02-08-2018 13:30:28

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

Les cgroups font aussi partie de mes intérêts. Ils permettent de définir des quotas d'accès aux ressources (mémoire, charge cpu,...),de taguer et d'isoler les processus.
Ils sont, surtout, utilisés par systemd, mais, aussi, par lxc.
On pourra créer un sujet plus tard là dessus.

En attendant, je peux donner un exemple simple d'utilisation des capacités linux:

Je veux pouvoir afficher le contenu du tous les fichiers, avec la commande cat, avec mon compte utilisateur.

Je fais d'abord une copie de la commande 'cat' dans mon profil (non root):

cp /bin/cat ~


Je vérifie, ensuite, ses capacités:

getcap cat


Il n'y en a pas. S'il y en avait, elles auraient été perdues à la copie.

Je vais ajouter la capacité 'CAP_DAC_OVERRIDE' à la commande 'cat'.

Dans la page de manuel de 'capabilities', je peux lire:

       CAP_DAC_OVERRIDE
              Contourne les permissions de lecture,  écriture  et  exécution.  (DAC  est  l'abréviation  de  « discretionary  access
              control », contrôle d'accès à volonté).


Sur un fichier (ou un processus), une capacité est définie par 3 bits:

  • Le bit de capacité permise. C'est lui qui donne les droits maximum. Il va être transmis au processus correspondant au fichier.

  • Le bit de capacité effective. Il va être transmis au processus correspondant au fichier. Le noyau linux regarde celui-là pour donner les accès. Le processus peut modifier son bit de capacité effective pour brider ou libérer sa capacité (à condition que le bit de capacité permise soit activé).

  • Le bit de capacité héritable. Active le bit de capacité permise du processus lancé par un execve sous certaines conditions . On y reviendra plus tard


On va activer le bit de capacité permise (p) et le bit de capacité effective (e) sur le fichier cat.

setcap cap_dac_override+ep cat


La plupart des applications n'ont pas été réécrites pour tenir compte des capacités. Elles n'ajusteront, donc, pas leurs bits de capacité effective.
C'est pour cela que l'on force l'activation du bit de capacité effective.

Résultat:

getcap cat


cat = cap_dac_override+ep


On peut, maintenant, essayer, d'afficher le contenu du fichier '/etc/shadow' sur lequel le commun des mortels n'a pas de droit:

./cat /etc/shadow


Je confirme, je vois bien le contenu du fichier. smile

Est-ce que tout ceci est clair pour vous ? smile

Dernière modification par Beta-Pictoris (02-08-2018 14:26:05)

Hors ligne

#4 02-08-2018 16:49:21

raleur
Membre
Inscription : 03-10-2014

Re : Les "capabilities" du noyau linux

Beta-Pictoris a écrit :

Voici un sujet qui fâche


Surtout si on écrit des approximations.

Beta-Pictoris a écrit :

Certaines commandes linux triviales doivent avoir un bit setuid/suid pour pouvoir travailler en espace noyau


1) Une commande ne travaille pas en espace noyau. Son code s'exécute exclusivement en espace utilisateur. Lorsqu'elle a besoin d'effectuer une opération qui doit être réalisée en espace noyau, elle lance un appel système qui transfère l'exécution au code du noyau.

2) Ne pas confondre le bit SUID et les privilèges root. Le bit SUID fait exécuter le programme avec les droits du propriétaire de l'exécutable. Il ne donne les droits root que si le propriétaire est root.

3) Les commandes qui sont SUID root ne sont pas triviales. C'est pourquoi elles doivent être codées avec soin pour éviter les failles d'élévation de privilège.

Beta-Pictoris a écrit :

Comme pour le bit setuid, on peut appliquer ces capacités sur les fichiers (dans les attributs étendus) grâce à la commande "setcap".


A condition que le système de fichiers supporte les attributs POSIX étendus. Ça va être le cas des principaux systèmes de fichiers utilisés avec GNU/Linux comme ext*, mais pas forcément de systèmes de fichiers moins courants. Je n'ai pas d'exemple à donner, mais c'est un point à prendre en compte.

naguam a écrit :

on peut faire beaucoup de dégât avec mount


Un exemple concret ?
Que je sache, un utilisateur ne peut monter un système de fichiers que si cela a été déclaré explicement dans /etc/fstab avec l'option "user" ou "users".


Il vaut mieux montrer que raconter.

Hors ligne

#5 02-08-2018 19:23:07

naguam
Membre
Lieu : Quelque part
Distrib. : Plusieurs
Noyau : Ça dépend
(G)UI : La CLI il n'y a que ça de vrai!
Inscription : 13-06-2016

Re : Les "capabilities" du noyau linux

raleur, je ne pensais pas à dangereux pour le système en soit mais imagine si un user maladroit a les droits pour utiliser mount et monte une clef usb dans un répertoire non vide genre /home/<user>/Documents et que ça écrase tous les documents qui sont dedans (et testé sous gentoo peut être que debian dis attention répertoire non-vide, j'ai pas testé), toujours que il s'en mordra les doigts, cat est dans le même genre de cas a un autre niveau. Cela dis il y a plus grave, les forkbomb sont exécutables en user sans droits particuliers et avec la configuration par default, c'est fatal, faut reboot. (j'ai testé sur machine et dans container docker limité et non limité)

Sinon, merci raleur pour les précisions que tu apportes. smile

Dernière modification par naguam (02-08-2018 19:26:22)

Hors ligne

#6 02-08-2018 19:52:14

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

raleur a écrit :

1) Une commande ne travaille pas en espace noyau. Son code s'exécute exclusivement en espace utilisateur. Lorsqu'elle a besoin d'effectuer une opération qui doit être réalisée en espace noyau, elle lance un appel système qui transfère l'exécution au code du noyau.


Oui, c'est exact, c'est une erreur de ma part. J'ai voulu simplifier mon explication au maximum. Si on parle de processus évoluant en mode utilisateur ou en mode noyau, est-ce que ça te va ? smile

raleur a écrit :

2) Ne pas confondre le bit SUID et les privilèges root. Le bit SUID fait exécuter le programme avec les droits du propriétaire de l'exécutable. Il ne donne les droits root que si le propriétaire est root.


Oui, c'est aussi exact, mais comme quasiment toutes les commandes système ont "root" comme propriétaire, j'ai omis ce détail.
Par contre, cela montre une différence importante avec les capacités. Ces dernières ne sont pas limitées au propriétaire du fichier.

raleur a écrit :

3) Les commandes qui sont SUID root ne sont pas triviales. C'est pourquoi elles doivent être codées avec soin pour éviter les failles d'élévation de privilège.


Je dis "trivial" parce que ce sont des commandes que l'on utilise couramment pour certaines d'entre elles.

Dernière modification par Beta-Pictoris (03-08-2018 17:02:29)

Hors ligne

#7 02-08-2018 23:50:41

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

Je vais donner un autre exemple,

Je vais appliquer la capacité 'CAP_DAC_READ_SEARCH' à la commande 'bash'.

       CAP_DAC_READ_SEARCH
              * Contourne les permissions de lecture de fichiers et celles de lecture et exécution des répertoires ;
              * Invoque open_by_handle_at(2).


Par rapport à la capacité 'CAP_DAC_OVERRIDE', celle-ci ne contourne pas les permissions en écriture.

setcap CAP_DAC_READ_SEARCH+ep /bin/bash



Je lance 'bash' et je vérifie les capacités du processus 'bash' courant grâce à la comande 'getpcaps <pid>'

bash

# $$ est une variable retournant le pid du processus courant.

getpcaps $$


Capabilities for `3242': = cap_dac_read_search+ep


Maintenant, la complétion automatique des chemins n'est plus limitée aux répertoires sur lesquels on possède des permissions. smile

Je peux, par exemple, saisir '/boot/efi/EFI/BOOT...' par complétion alors que je n'ai, normalement, pas de permission pour accéder au répertoire '/boot/efi/EFI'.

Par contre, la capacité n'est pas transmise aux commande externes:

ls /boot/efi/EFI/BOOT


ls: impossible d'accéder à '/boot/efi/EFI/BOOT/': Permission non accordée


Selon vous, y a t'il un moyen d'accéder au contenu d'un fichier rien qu'avec des commandes internes au 'bash' ?

Dernière modification par Beta-Pictoris (03-08-2018 00:13:13)

Hors ligne

#8 06-08-2018 22:31:26

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

Alors, pas d'idée ? smile

Dernière modification par Beta-Pictoris (06-08-2018 22:31:34)

Hors ligne

#9 07-08-2018 15:22:33

MicP
Membre
Inscription : 29-02-2016

Re : Les "capabilities" du noyau linux

Bonjour

…moyen d'accéder au contenu d'un fichier rien qu'avec des commandes internes au 'bash' …

Pour faire afficher le contenu du fichier ~/.bashrc
par bash et ses commandes internes :

while read; do echo $REPLY; done < ~/.bashrc

Dernière modification par MicP (07-08-2018 15:26:51)

Hors ligne

#10 07-08-2018 16:20:51

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

Effectivement, ça marche ! smile

Appliquer la capacité 'CAP_DAC_READ_SEARCH' au bash donne, donc, le moyen de lire le contenu de tous les fichiers du système ! Et pas uniquement de faire de la complétion dans tout le système de fichier.

Dernière modification par Beta-Pictoris (07-08-2018 16:28:04)

Hors ligne

#11 07-08-2018 20:15:25

MicP
Membre
Inscription : 29-02-2016

Re : Les "capabilities" du noyau linux

[Hors Sujet]

Ce n'est pas le but,
mais je m'amusais à essayer d'en faire une ligne de commandes n'utilisant que bash qui donnerait un équivalent de la sortie de cat,
et j'en suis arrivé à cette ligne de commandes :

(IFS=;while read -r; do echo $REPLY; done < ~/.bashrc)

Les parenthèses, c'est juste pour que tout ça s'exécute dans un sous-shell
de façon à ce que la variable IFS ne soit modifiée que dans ce sous-shell et pas dans le shell courant.

[/Hors Sujet]

Dernière modification par MicP (07-08-2018 20:15:48)

Hors ligne

#12 08-08-2018 01:03:40

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : Les "capabilities" du noyau linux

On peut réserver le droit à certains utilisateurs d'utiliser les capacités de certaines commandes.

Pour cela, il faut 2 conditions:

  • Que des bits de capacités héritables soient activés sur les commandes que l'on veut exécuter.

  • Que les utilisateurs aient le droit d'utiliser certaines capacités.


Pour autoriser les utilisateurs à utiliser des capacités, il faut installer le paquet "libpam-cap" et ajouter les lignes suivantes à la fin du fichier "/etc/pam.d/common-auth" :

auth  optional      pam_cap.so


L'activation des capacités pour les utilisateurs étant, donc, prise en charge par "pam", il faut, ensuite éditer le fichier "/etc/security/capability.conf".
Si on veut, par exemple, donner à l'utilisateur toto le droit d'utiliser les capacités "cap_net_admin" et "cap_net_raw", on peut ajouter les lignes suivantes dans le fichier:

cap_net_admin,cap_net_raw  toto
none  *


A partir de maintenant, quand l'utilisateur toto se loguera, ses processus auront leurs bits de capacité héritable "cap_net_admin" et "cap_net_raw" activés.

Ce n'est pas suffisant. Il faut, maintenant, définir les commandes qui vont bénéficier des mêmes capacités pour cet utilisateur:

setcap cap_net_admin,cap_net_raw+ie <fichier exécutable>


Comment ça marche ? :
Le processus appelant (bash) et le fichier exécutable ayant leurs bits de capacité héritable activés, le processus résultant aura ses bits de capacité permise activés.

Dernière modification par Beta-Pictoris (08-08-2018 01:05:38)

Hors ligne

Pied de page des forums