L'accès privilégié aux fichiers et répertoires est en fait déterminé par les capacités, et pas seulement par l'être root
ou non. Dans la pratique, a root
généralement toutes les capacités possibles, mais il y a des situations où tout / plusieurs d'entre eux pourraient être abandonnés, ou certains donnés à d'autres utilisateurs (leurs processus).
En bref, vous avez déjà décrit le fonctionnement des vérifications de contrôle d'accès pour un processus privilégié. Voici comment les différentes capacités l'affectent réellement:
La principale capacité ici estCAP_DAC_OVERRIDE
un processus qui peut "contourner la lecture, l’écriture et l’exécution de vérifications d’autorisations". Cela inclut la lecture et l'écriture dans tous les fichiers, ainsi que la lecture, l'écriture et l'accès aux répertoires.
Il ne s'applique pas réellement à l'exécution de fichiers qui ne sont pas marqués comme exécutables. Le commentaire entregeneric_permission
( fs/namei.c
), avant la vérification d'accès pour les fichiers, dit que
Les DAC en lecture / écriture sont toujours remplaçables. Les DAC exécutables sont remplaçables lorsqu'il y a au moins un bit d'exécution défini.
Et le code vérifie qu'il y a au moins un x
bit défini si vous essayez d'exécuter le fichier. Je soupçonne que ce n'est qu'une fonctionnalité pratique, pour éviter d'exécuter accidentellement des fichiers de données aléatoires et d'obtenir des erreurs ou des résultats étranges.
Quoi qu'il en soit, si vous pouvez remplacer les autorisations, vous pouvez simplement faire une copie exécutable et l'exécuter. (Bien que cela puisse faire une différence dans la théorie des fichiers suid d'un processus était capable d'autorisations de fichiers remplaçant ( CAP_DAC_OVERRIDE
), mais n'a pas eu d' autres capacités connexes ( CAP_FSETID
/ CAP_FOWNER
/ CAP_SETUID
). Mais avoir CAP_DAC_OVERRIDE
permet d' éditer /etc/shadow
et d'autres choses comme ça, il est à peu près égale d'avoir juste un accès root complet de toute façon.)
Il y a aussi la CAP_DAC_READ_SEARCH
capacité qui permet de lire tous les fichiers et d'accéder à tous les répertoires, mais pas de les exécuter ou d'y écrire; et CAP_FOWNER
cela permet à un processus de faire des choses qui sont généralement réservées uniquement au propriétaire du fichier, comme changer les bits d'autorisation et le groupe de fichiers.
Remplacer le bit collant sur les répertoires n'est mentionné que sous CAP_FOWNER
, il semble donc que CAP_DAC_OVERRIDE
ce ne serait pas suffisant pour l'ignorer. (Cela vous donnerait une autorisation d'écriture, mais généralement dans les répertoires collants, vous en avez de toute façon et +t
cela la limite.)
(Je pense que les périphériques spéciaux comptent comme des "fichiers" ici. Au moins, il generic_permission()
n'y a qu'une vérification de type pour les répertoires, mais je n'ai pas vérifié en dehors de cela.)
Bien sûr, il existe encore des situations où même les fonctionnalités ne vous aideront pas à modifier les fichiers:
- certains fichiers
/proc
et /sys
, comme ce ne sont pas vraiment des fichiers réels
- SELinux et autres modules de sécurité qui pourraient limiter root
chattr
immuable +i
et n'ajoute que des +a
drapeaux sur ext2 / ext3 / ext4, qui arrêtent même root, et empêchent également les renommages de fichiers, etc.
- systèmes de fichiers réseau, où le serveur peut faire son propre contrôle d'accès, par exemple
root_squash
dans NFS mappe root à personne
- FUSE, qui je suppose pourrait tout faire
- montures en lecture seule
- périphériques en lecture seule
capabilities(7)
page de manuel - pensez à déposer un rapport de bogue!root
avoir desrw-
autorisations sur (presque) n'importe quel fichier, et pour obtenir l'x
autorisation, lex
bit doit être défini sur les autorisations utilisateur / groupe / autres sur le fichier. Mais qu'en est-il des répertoires, a-troot
-il desrwx
autorisations sur n'importe quel répertoire (même si un répertoire n'a aucune autorisation (----------
))?CAP_DAC_OVERRIDE
permet de remplacer toutes les autorisations de répertoire, vous pouvez donc lire, écrire et accéder aux répertoires (c.-à-d. Répertorier le contenu, créer et dissocier des fichiers). Le commentaire que j'ai cité au sujet du bit d'exécution est dans le contexte des fichiers (uniquement).C'est exactement comme vous l'avez remarqué pour les autorisations par défaut:
Lire écrire:
par défaut, l'utilisateur root peut accéder à n'importe quel fichier du système. Vous pouvez supprimer cet accès en modifiant des attributs comme l'expliquer ici: chattr . Ceci est ensuite lié aux capacités.
Exécuter: l'
utilisateur root n'a pas d'autorisation d'exécution sauf si au moins un des bits d'exécution est défini.
la source
Le
myFile.txt
est obtenu parchmod 000 myFile.txt
.---------
signifie qu'il n'y a aucune autorisation pour l'utilisateur, le groupe et autres.L'utilisateur root a une capacité illimitée de modifier ce fichier. La lecture / écriture est accordée. Pour exécuter ce fichier, l'utilisateur root doit tout de même le rendre exécutable. (chmod 100, 010 ou 001)
la source
Le mode d'exécution est traité un peu différemment des autres modes.
Les autorisations de lecture et d'écriture sont utilisées pour appliquer les politiques de sécurité. le
root
utilisateur est généralement à l'abri des restrictions de sécurité (il y a quelques exceptions, comme les fichiers immuables, et des fonctionnalités modernes comme les capacités ont rendu cela plus fin), c'est pourquoi un autre nom pour ce compte est le "superutilisateur".L'autorisation d'exécution est davantage un mode consultatif, distinguant si le fichier est destiné à être exécutable ou s'il s'agit uniquement de données. Pour cette raison, même l'utilisateur root s'y conforme - il est inutile d'exécuter un fichier de données. Si aucune des autorisations d'exécution n'est définie, root ne peut pas exécuter le fichier; si l'un d'eux est défini, il le peut. Bien sûr, puisque root a également l'autorisation de modifier les autorisations de n'importe quel fichier, le compte peut rendre un fichier exécutable s'il le souhaite (sauf si le système de fichiers est en lecture seule).
BTW, les scripts sont un cas intéressant à cet égard. Les scripts sont des fichiers de données pour l'interprète concerné. Si le script a une
#!
ligne, vous pouvez l'exécuter en tant que programme - l'interpréteur nommé dans le shebang est exécuté avec le nom de fichier du script comme argument. Mais cela ne sera fait que si l'autorisation d'exécution est définie. D'un autre côté, vous pouvez simplement exécuter l'interpréteur directement, par exemple/bin/bash scriptname
. Les interprètes ne se soucient que s'ils peuvent lire le fichier, ils ne vérifient pas les autorisations d'exécution.la source
Permettez-moi de vous expliquer théoriquement.
Si un fichier ou un répertoire dispose d'une autorisation comme X pour exécuter mais rien d'autre et que quelqu'un comme l'utilisateur Steve possède le fichier, root peut également exécuter le fichier.
Rappelez-vous toujours que sous Linux, root peut tout faire, il n'y a aucune restriction sur root.
la source