Existe-t-il un moyen pour un attaquant d'utiliser mkdir pour compromettre un système?

22

Je configure un compte utilisateur restreint pour l'utilisateur ricardo, un utilisateur gênant sur mon système. Je veux lui accorder le droit de créer des répertoires en utilisant sudo, ce qu'il doit parfois faire. J'envisage cette règle dans mon /etc/sudoersdossier:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

En utilisant uniquement cette règle, y a-t-il un moyen pour ricardo de compromettre intentionnellement ou accidentellement le système?

Ricardo Altamirano
la source
2
Si vous avez un système de fichiers avec un nombre d'inodes statique, il pourrait utiliser tous vos inodes.
jordanm
2
@schaiba Il aime bricoler et voir s'il peut exploiter le système et ne lit pas toujours les pages de manuel autant qu'il le devrait.
Ricardo Altamirano
8
Une bonne formation des utilisateurs, combinée à aucun sudo pour le moment, serait la chose recommandée à faire de ma part.
schaiba
2
Comme le dit @schaiba, vous pouvez utiliser ces utilisateurs en leur enseignant et en leur donnant des responsabilités (sous étroite surveillance). J'ai vu des guerres entre sysdamins et les utilisateurs, car les premiers ont trop essayé de verrouiller le système. Les utilisateurs étaient plus nombreux que les administrateurs système 10 à 1, et même alors ( sans accès à Internet aujourd'hui!), La défaite des administrateurs système était humiliante. Ne vous mettez jamais dans une telle position!
vonbrand
2
C'est le cas d'un ricardo de trop. Ou du moins, parlait ainsi BOFH ...
Deer Hunter

Réponses:

21

Je soupçonne qu'une attaque comme celle-ci fonctionnerait, où «quelque chose» est un module du noyau qui tentera de se charger après le montage de rootfs:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

Notez également que vous pouvez utiliser d'autres noms, en fonction des alias déclarés dans le module. Je suppose qu'il ne sera pas chargé jusqu'à ce que depmod soit exécuté, ce qui se produira la prochaine fois qu'il y aura une mise à jour du noyau - donc mkdiril ne s'affichera même pas récemment dans le journal sudo.

Il y a beaucoup de choses dans / etc qui lisent tous les fichiers d'un répertoire, parfois récursivement. Pire encore, certains de ces répertoires n'existent pas par défaut, et la seule façon de les connaître est de lire la page de manuel, les scripts d'initialisation, etc. pour le programme qui les utilise. Certains, pire encore, sont obsolètes et ne peuvent même plus être documentés.

edit: Pensé à quelques autres répertoires, ceux-ci dans /usr/local:

  • /usr/local/lib/perl/5.14.2(diffère selon la version de Perl, essayez perl -Vde le découvrir). Créez-y un Filesous - répertoire et mettez-y un Find.pm. Désormais, chaque fois que quelqu'un utilise File::Find, il utilise la version de l'attaquant. De même, faites de même avec Getopt::Long. Les utilitaires système sont souvent écrits en Perl, donc cela donne probablement racine. (Essayez ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • Je pense que Python, Ruby, etc. ont des répertoires similaires. Les utilitaires système sont également écrits en Python.
  • Subvertissez beaucoup de choses que quelqu'un compile avec des sous-répertoires de /usr/local/include.
derobert
la source
Oh, mais si <evil user> peut copier des modules là où le noyau les chargera, le jeu est terminé avant le démarrage.
vonbrand
1
@vonbrand <evil user> ne peut normalement pas, mais a utilisé le sien sudo mkdirpour créer un nouveau répertoire où il le peut.
derobert
20

En s'exécutant en mkdirtant que root, l'utilisateur peut empêcher d'autres processus / utilisateurs de créer de nouveaux fichiers et répertoires en créant des répertoires avec des noms identiques (et / ou des droits incorrects) auparavant.

Cela pourrait être important pour la sécurité, en particulier avec les fichiers journaux et de verrouillage .

Comme l'a noté jordanm , le nombre maximal d' inodes peut également être utilisé, ce qui peut bloquer l'ensemble du système.

En ajoutant l'utilisateur à des groupes spécifiques (ou en utilisant des ACL ), vous devriez pouvoir résoudre les problèmes sans accorder de droits via sudo.

jofel
la source
Grands points. Je vais probablement laisser de mkdircôté la liste des commandes que ricardo est autorisé à utiliser.
Ricardo Altamirano
Si c'est pour épuiser les inodes, un simple for((i = 0;; i++)); do touch $i; donefera l'affaire (bashisme, désolé; mais vous avez l'idée).
vonbrand
@vonbrand Sauf que ce n'est pas aussi root, il sera donc arrêté par un quota. Bien sûr, d'autres sudocommandes envisagées par OP peuvent également permettre d'épuiser les inodes; OP doit être conscient de ce vecteur DoS.
derobert
11

Vous devez le rediriger vers une prison chroot. Ou encore mieux, pour une petite VM, qu'il peut planter une fois par heure. Il vous suffit de fournir une nouvelle copie.

ott--
la source
Je le recommande vivement. Donnez-lui un accès root sur sa propre machine virtuelle.
emory
à un chroot ^ H ^ H ^ H ^ H ^ Prison de Hounty ...
Deer Hunter
6

Il existe des possibilités grâce à la possibilité de créer des répertoires avec un accès en écriture. Avec mkdir -m 777 blahl' ricardoutilisateur peut écrire tout ce qu'ils veulent dans le nouveau répertoire. Vous auriez besoin d'un processus sur le système fonctionnant déjà en tant qu'utilisateur différent qui recursera dans une arborescence de répertoires pour charger la configuration, les scripts ou les modules. Ensuite, l'utilisateur pourrait éventuellement ajouter ses propres éléments à charger ou à exécuter. La première chose à laquelle je peux penser, c'est si vous exécutez un serveur Web qui peut exécuter php ou cgi. Vous pouvez ensuite exécuter des scripts en tant que cet utilisateur. J'ai du mal à trouver des exemples plus réels, en particulier rootceux, mais je suis sûr qu'ils sont sur le point.

ssh est un exemple de démon qui intercepte ce type de scénario. Si vous avez créé un .sshrépertoire pour un utilisateur qui n'en avait pas et mettez votre propre authorized_hostsfichier en place. sshdremarque que les autorisations des répertoires sont trop ouvertes et ignore la clé publique.

Vous pourriez certainement vous ennuyer en créant des répertoires où des fichiers devraient apparaître (comme des fichiers tmp transitoires ou des fichiers d'échange) que beaucoup de programmes ne géreraient pas bien.

Vous pouvez créer de nombreux groupes de contrôle, mais il ne semble pas que vous en fassiez quoi que ce soit. Vous pourriez peut-être mettre un système à genoux au moins. Il a fallu environ 10000 cgroups sur une boîte avec 256M pour que le tueur OOM retire sshd.

Si vous contrôlez l' -moption mkdiret l'UMASK de l' sudoenvironnement, je pense que c'est redevenu une nuisance.

Mat
la source