Selon man 7 capabilities
CAP_DAC_READ_SEARCH
* Bypass file read permission checks and directory read and execute permission checks;
* Invoke open_by_handle_at(2).
Cela a fonctionné pour moi. (les lignes commençant par '#' sont root, celles avec '$' sont non root) dans ce cas l'utilisateur non root est dans le wheel
groupe.
# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root
find: ‘/root’: Permission denied
$ sudofind /root
/root /root
/root/Testbed
...
...
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec 4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =
Compte tenu de ce que la capacité accorde, cela correspond exactement à ce que vous voulez.Je n'ai pas vérifié de manière exhaustive si find
a une fonctionnalité qui vous permet de lire des octets à l'intérieur des fichiers, mais des choses évidentes comme LD_PRELOAD
et les attaques de shim de bibliothèque ne devraient pas fonctionner en raison de la nature des vérifications setuid sous Linux, et les bits de capacité ne sont pas non plus hérités par les processus enfants (contrairement au setuid brut), c'est donc un autre bonus.
Gardez à l'esprit que ce que vous voulez faire soulève d'éventuels problèmes de confidentialité en ce qui concerne la création ou l'accès à des fichiers temporaires, et le programme pourrait être utilisé comme base pour monter une condition de concurrence / tentative d'escalade de privilèges (contre des programmes qui créent des noms de fichiers bien connus mais ne faites pas les vérifications de sécurité correctes).
En outre, certaines applications mal écrites peuvent s'appuyer sur des métadonnées de fichiers ou une structure arborescente pour transmettre un sens ou masquer des données. Cela pourrait entraîner la divulgation d'informations restreintes ou révéler des documents privilégiés inconnus autrement (la sécurité par l'obscurité, je le sais, mais c'est une chose que les fournisseurs de sources fermées en particulier aiment faire, malheureusement).
Par conséquent, faites attention et méfiez-vous de le faire et comprenez qu'il y a toujours un risque associé à cela même si les choses évidentes ne fonctionnent pas.
Oh, et je serais intéressé de voir si quelqu'un a une attaque de preuve de concept qui utilise ce mécanisme comme base pour l'élévation des privilèges dans les commentaires !
Qu'en est-il de la localisation ?
locate lit une ou plusieurs bases de données préparées par updatedb(8) et écrit les noms de fichiers correspondant à au moins un des MOTIFS sur la sortie standard, un par ligne. Si --regex n'est pas spécifié, les MOTIFS peuvent contenir des caractères globaux. Si un PATTERN ne contient aucun caractère global,locate se comporte comme si le modèle était PATTERN .
Par défaut, locate ne vérifie pas si les fichiers trouvés dans la base de données existent toujours. locate ne peut jamais signaler les fichiers créés après la mise à jour la plus récente de la base de données pertinente.
Ou peut-être même slocate :
Secure Locate offre un moyen sécurisé d'indexer et de rechercher rapidement des fichiers sur votre système. Il utilise un encodage incrémentiel tout comme GNU locate pour compresser sa base de données afin d'accélérer la recherche, mais il stocke également les autorisations et la propriété des fichiers afin que les utilisateurs ne voient pas les fichiers auxquels ils n'ont pas accès.
Cette page de manuel documente la version GNU de slocate. slocatePermet aux utilisateurs du système de rechercher des systèmes de fichiers entiers sans afficher les fichiers non autorisés.
Je donnerais aux utilisateurs les autorisations appropriées.
Par défaut, si le umask est 022
, des répertoires sont créés afin que tout le monde puisse répertorier et classer les fichiers qu'ils contiennent. Sinon, vous pouvez modifier manuellement l'autorisation du répertoire pour qu'elle soit au niveau du bit ou de ses anciennes autorisations et 0555
:
chmod +0555 foo
Et si ces utilisateurs n'ont pas l'autorisation d'exécution sur tous les parents de ce répertoire (par exemple, le répertoire personnel d'un autre utilisateur), cela signifie probablement que vous devriez placer le premier répertoire ailleurs.
Si vous voulez seulement laisser certains utilisateurs lire et exécuter ce répertoire, vous pouvez changer son mode en 0750
, placez ces utilisateurs dans un groupe et changez le propriétaire du groupe de l'annuaire en ce groupe :
groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo