Autorisations de fichiers sous Linux

Salut tout le monde. Nous nous mettons activement au travail et préparons déjà de nombreux lancements puissants en janvier. Entre autres, les inscriptions ont été annoncées pour un nouveau volet du cours préféré de tous. "Administrateur Linux". En prévision du lancement, nous partageons traditionnellement les traductions du matériel utile.

Autorisations de fichiers sous Linux

Les autorisations de fichiers offrent une alternative sûre aux exécutables SUID, mais peuvent sembler un peu déroutantes au début.


Nous savons tous que les binaires SUID sont mauvaise décision d'un point de vue sécurité. Heureusement, si votre application nécessite des privilèges limités, il existe un moyen plus efficace appelé autorisations de fichiers.

Je vais vous faire gagner du temps si vous souhaitez éviter de lire l'article ci-dessus en détail : Essentiellement, les autorisations de fichiers autorisent les processus qui s'exécutent en tant que root et sont donc autorisés à faire quelque chose pour conserver certaines capacités, limitées. cette listelorsqu'ils abandonnent leurs privilèges et sont exécutés par un utilisateur non privilégié. Cela signifie que si un attaquant parvient à compromettre un processus en utilisant un débordement de tampon ou un autre exploit, il ne pourra pas profiter d'autre chose que certains privilèges minimaux dont le processus a réellement besoin.

Les autorisations sont idéales pour les services qui s'exécutent généralement toujours en tant que root, mais qu'en est-il des utilitaires de ligne de commande ? Heureusement, cela est également pris en charge à condition que les bons utilitaires soient installés. Si vous utilisez Ubuntu, vous aurez par exemple besoin du package libcap2-bin. Vous devrez également exécuter un noyau non archaïque (à partir de la version 2.6.24).

Ces fonctions permettent d'associer des autorisations à des fichiers exécutables, de la même manière que pour définir le bit SUID, mais uniquement pour un ensemble spécifique d'autorisations. Utilitaire setcap utilisé pour ajouter et supprimer des autorisations d’un fichier.

La première étape consiste à sélectionner les autorisations dont vous avez besoin. Pour les besoins de cet article, je suppose qu'il existe un outil de diagnostic réseau appelé tracewalk, qui devrait pouvoir utiliser douilles brutes. Cela nécessite généralement que l'application soit exécutée en tant que root, mais lors de la visualisation liste il s'avère que seule une autorisation est requise CAP_NET_RAW.

En supposant que vous soyez dans le répertoire où se trouve le binaire tracewalk, vous pouvez ajouter cette autorisation comme ceci :

sudo setcap cap_net_raw=eip tracewalk

Ignorez le suffixe pour l'instant =eip pour résoudre le problème, j'en parlerai dans quelques secondes. Notez que le nom de l'autorisation est en minuscules. Vous pouvez maintenant vérifier si vous avez correctement configuré les autorisations avec :

setcap -v cap_new_raw=eip tracewalk

Ou vous pouvez lister toutes les autorisations définies pour un exécutable donné :

getcap tracewalk

Pour référence, vous pouvez également supprimer toutes les autorisations de l'exécutable avec :

setcap -r tracewalk

À ce stade, vous devriez pouvoir exécuter l'exécutable en tant qu'utilisateur non privilégié, et il devrait pouvoir travailler avec des sockets bruts, mais ne disposer d'aucun des autres privilèges dont dispose l'utilisateur root.

Alors, que signifie cet étrange suffixe ? =eip? Cela nécessite une certaine compréhension de la nature des autorisations. Chaque processus dispose de trois ensembles d'autorisations - efficace, héréditaire et autorisé:

  • Efficace Les autorisations sont celles qui définissent ce qu'un processus peut réellement faire. Par exemple, il ne peut pas gérer les sockets brutes si CAP_NET_RAW n'est pas dans l'ensemble effectif.
  • Disponible les autorisations sont celles qu'un processus est autorisé à avoir s'il les demande à l'aide de l'appel approprié. Ils empêchent un processus de faire quoi que ce soit à moins qu'il n'ait été spécifiquement écrit pour demander ladite autorisation. Cela permet d'écrire des processus pour ajouter des autorisations critiques à l'ensemble effectif uniquement pour la période pendant laquelle elles sont réellement requises.
  • Héritable les autorisations sont celles qui peuvent être héritées dans l'ensemble accessible du processus enfant généré. Pendant la chirurgie fork() ou clone() le processus enfant reçoit toujours une copie des autorisations du processus parent puisqu'il exécute toujours le même exécutable à ce stade. Un ensemble héritable est utilisé lorsque exec() (ou équivalent) est appelé pour remplacer le fichier exécutable par un autre. À ce stade, l'ensemble disponible du processus est masqué par l'ensemble héritable pour obtenir l'ensemble accessible qui sera utilisé pour le nouveau processus.

Donc l'utilitaire setcap nous permet d'ajouter les permissions de ces trois ensembles indépendamment pour un exécutable donné. Notez que la signification des groupes est interprétée légèrement différemment pour les autorisations de fichiers :

  • Disponible les autorisations de fichier sont celles qui sont toujours disponibles pour un fichier exécutable, même si le processus parent qui l'a appelé ne les disposait pas. On les appelait autrefois permis « forcés ».
  • Hérité les autorisations de fichier définissent un masque supplémentaire qui peut également être utilisé pour supprimer les autorisations de l'ensemble du processus appelant. Elles s'appliquent en plus de l'ensemble hérité du processus appelant, de sorte que l'autorisation n'est héritée que si elle existe dans les deux ensembles.
  • Efficace les autorisations de fichiers ne sont en réalité qu'un seul bit, pas un ensemble, et si elles sont définies, cela signifie que l'intégralité de l'ensemble disponible est également copié dans l'ensemble effectif du nouveau processus. Cela peut être utilisé pour ajouter des autorisations à des processus qui n'ont pas été spécifiquement écrits pour les demander. Puisqu'il s'agit d'un bit, si vous le définissez pour une autorisation, il doit être défini pour toutes les autorisations. Vous pouvez le considérer comme un élément hérité car il est utilisé pour permettre aux autorisations d'être utilisées par des applications qui ne les prennent pas en charge.

Lors de la spécification des autorisations via setcap trois lettres e, i и p sont efficace, héritable et accessible ensembles respectivement. Ainsi, la spécification précédente :

sudo setcap cap_net_raw=eip tracewalk

...indique que la résolution CAP_NET_RAW doit être ajouté aux ensembles disponibles et hérités et que le bit effectif doit également être défini. Cela remplacera toutes les autorisations précédemment définies sur le fichier. Pour définir plusieurs autorisations à la fois, utilisez une liste séparée par des virgules :

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Guide des autorisations discute de tout cela plus en détail, mais j'espère que cet article a démystifié un peu ce qui se passe. Il ne reste que quelques mises en garde et astuces à mentionner.

Premièrement, les fonctionnalités des fichiers ne fonctionnent pas avec les liens symboliques - vous devez les appliquer au fichier binaire lui-même (c'est-à-dire la cible du lien symbolique).

Deuxièmement, ils ne fonctionnent pas avec des scripts interprétés. Par exemple, si vous souhaitez attribuer une autorisation à un script Python, vous devez l'attribuer à l'interpréteur Python lui-même. Il s'agit évidemment d'un problème de sécurité potentiel, car tous les scripts exécutés avec cet interpréteur auront l'autorisation spécifiée, même si cela reste bien mieux que de le rendre SUID. La solution de contournement la plus courante semble consister à écrire un exécutable distinct en C ou équivalent capable d'effectuer les opérations nécessaires et de l'appeler à partir d'un script. Ceci est similaire à l'approche utilisée par Wireshark qui utilise un binaire /usr/bin/dumpcap pour effectuer des opérations privilégiées :

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Troisièmement, les autorisations de fichiers sont désactivées si vous utilisez une variable d'environnement LD_LIBRARY_PATH pour des raisons évidentes de sécurité(1). de même pour LD_PRELOAD, Pour autant que je sache.

1. Puisqu'un attaquant peut évidemment remplacer l'une des bibliothèques standards et utiliser LD_LIBRARY_PATHpour forcer que sa bibliothèque soit appelée de préférence à celle du système, et donc avoir son propre code arbitraire exécuté avec les mêmes privilèges que l'application appelante.

C'est tout. Plus de détails sur le programme du cours peuvent être trouvés sur webinaire, qui aura lieu le 24 janvier.

Source: habr.com

Ajouter un commentaire