J'expérimente des capacités, sur Debian Gnu / Linux.
J'ai copié / bin / ping dans mon répertoire de travail actuel. Comme prévu, cela ne fonctionne pas, il était à l'origine root setuid.
Je donne ensuite à mon ping les capacités minimales (pas root) en faisant sudo /sbin/setcap cap_net_raw=ep ./ping
, et mon ping fonctionne, comme prévu.
Ensuite, sudo /sbin/setcap -r ./ping
pour révoquer cette capacité. Cela ne fonctionne plus comme prévu.
J'essaie maintenant de faire fonctionner ping avec capsh
.
capsh
n'a pas de privilèges, je dois donc l'exécuter en tant que root, mais ensuite supprimer root et donc tous les autres privilèges.
Je pense que j'ai aussi besoin secure-keep-caps
, ce n'est pas documenté dans capsh
, mais c'est dans le manuel des capacités. J'ai obtenu les numéros de bits /usr/include/linux/securebits.h
. Ils semblent corrects, car la sortie de --print
montre que ces bits sont corrects.
Je tripote depuis des heures, jusqu'à présent je l'ai.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Cependant les ping
erreurs avec ping: icmp open socket: Operation not permitted
, c'est ce qui se passe quand il ne possède pas la capacité. Aussi les --print
spectacles Current: =p cap_net_raw+i
, ce n'est pas suffisant dont nous avons besoin e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
définira la capacité à Current: = cap_net_raw+eip
cela est correct, mais nous laisse comme root
.
Édition-1
J'ai essayé sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Cela produit:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
La première erreur est attendue car secure-noroot: yes
Mais la seconde n'est pasCurrent: = cap_net_raw+eip
Edit-2
Si je mets ==
avant le --print
, il apparaît maintenant Current: = cap_net_raw+i
, ce qui explique l'erreur précédente, mais pas pourquoi nous perdons des capacités lors du passage hors de root, je pensais que cela secure-keep-caps
devrait résoudre ce problème.
Edit-3
D'après ce que je peux voir, je perds Efficace (e) et Autorisé (p), lorsque exec est appelé. C'est prévu, mais je pensais que les bouchons de sécurité devraient empêcher leur perte. Suis-je en train de manquer quelque chose.
Edit-4
J'ai fait plus de recherches et relu le manuel. Il semble que normalement e
et les p
capacités soient perdues lorsque: vous changez d'utilisateur root
(ou appliquez secure-noroot
, faisant ainsi de root un utilisateur normal), cela peut être remplacé par secure-keep-caps
; quand vous appelez exec
, autant que je sache, c'est un invariant.
Pour autant que je sache, cela fonctionne selon le manuel. Autant que je sache, il n'y a aucun moyen de faire quoi que ce soit d'utile capsh
. Pour autant que je sache, pour utiliser les capacités, vous devez: utiliser des capacités de fichier ou avoir un programme prenant en charge les capacités, qui n'utilise pas exec
. Aucun wrapper privilégié donc.
Alors maintenant, ma question est de savoir ce qui me manque, à quoi ça sert capsh
.
Edit-5
J'ai ajouté une réponse concernant les capacités ambiantes. Peut-être capsh
peut-être également être utilisé avec des capacités héritées, mais pour être utiles, celles-ci devront être définies sur le fichier exécutable. Je ne vois pas comment capsh peut faire quelque chose d'utile sans les capacités ambiantes, ou pour permettre des capacités héritées.
Versions:
capsh
à partir de lalibcap2-bin
version du package1:2.22-1.2
- avant edit-3 Je saisis la dernière à
capsh
partirgit://git.debian.org/collab-maint/libcap2.git
et commencé à l' utiliser. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
L'utilisateur-terre est 32 bits.
la source
capsh
le dépôt collab-maint ne vous aurait pas donné la «dernière»capsh
, le paquet Debian ne supporte toujours pas les capacités ambiantes. En amont 2.27 fait.capsh
, en l'absence de température ambiante (comme c'était le cas à l'origine). Qu'est-ce que je rate. Il doit avoir une utilité.Réponses:
Les capacités sont les propriétés des processus. Traditionnellement, il existe trois ensembles:
Les programmes exécutés en tant que root ont toujours toutes les capacités autorisées et efficaces, donc "ajouter" plus de capacités n'a aucun effet notable. (L'ensemble des capacités héritables est normalement vide.) Avec
setcap cap_net_raw+ep ping
vous activez ces capacités par défaut pour tout utilisateur exécutant ce programme.Malheureusement, ces capacités sont liées au fichier exécuté et ne sont pas conservées après l'exécution d'un nouveau processus enfant. Linux 4.3 a introduit des capacités ambiantes qui permettent aux capacités d'être héritées par les processus enfants. (Voir aussi Transformation des capacités pendant execve () dans les capacités (7) .)
Tout en jouant avec les capacités, notez ces pièges:
--keep=1
option decapsh
pour éviter d'effacer les ensembles.Le
capsh
programme de libcap 2.25 n'a pas encore la possibilité de modifier les capacités ambiantes, mais les versions ultérieures ajoutent de nouvelles options. Notez que l'ordre des options est important. Exemple d'utilisation:Astuce: vous pouvez ajouter l'
--print
option n'importe où dans lacapsh
ligne de commande et voir son état actuel des capacités.Remarque:
cap_setpcap
est nécessaire pour--addamb
tandis quecap_setuid,cap_setgid
sont nécessaires pour l'--user
option.la source
La réponse de Lekensteyn semble exacte et complète, mais je vais essayer de fournir une autre explication sous un angle différent qui tentera de souligner le problème résolu par les capacités ambiantes.
Lorsque vous exécutez
sudo capsh --user=<some_user> --
Il y a 2 appels système d'intérêt qui entraînent le recalcul (et potentiellement la suppression) des capacités:setuid
: Selonman capabilities
:En d'autres termes, dans notre
capsh
commande ci-dessus, nous devons nous assurer que SECBIT_KEEP_CAPS est défini lors de l'setuid
appel système. Sinon, toutes les capacités sont perdues. C'est ce que--keep=1
fait. Alors maintenant, la commande devientsudo capsh --user=<some_user> --keep=1 --
execve
: Si nous utilisons l'--keep=1
option, tous les ensembles de capacités (efficaces, autorisés, héritables) sont conservés jusqu'à l'execve
appel système, maisexecve
entraînent également le recalcul des capacités (pour les utilisateurs non root) et de manière moins évidente. En bref, avant l'ajout de l'ensemble de capacités ambiantes , pour qu'une capacité soit dans l'ensemble "autorisé" d'un thread après unexecve
appel, soit:setcap cap_net_raw+p /bin/bash
. Faire cela rend l'ensemble de l'exercice inutile car les ensembles de capacités du thread (autres que l'ensemble de délimitation) n'ont plus aucun effet.setcap cap_net_raw+i
cela ferait l'affaire, mais il s'avère queexecve
les autorisations héritables d'un thread sont supprimées lorsqu'il est appelé par des utilisateurs non privilégiés (ce que nous remercions actuellementsetuid
). Il n'y a donc aucun moyen de satisfaire à cette condition en tant qu'utilisateur non privilégié.Les capacités ambiantes introduites dans Linux 4.3 permettent à un thread de conserver ses capacités même après un
setuid
à un utilisateur non privilégié suivi d'unexecve
, sans avoir à compter sur des capacités de fichier.la source
Il peut y avoir un bug / fonctionnalité dans le noyau. Il y a eu quelques discussions:
Je n'ai aucune idée, si quelque chose a été fait, de le réparer.Edit: Selon http://man7.org/linux/man-pages/man7/capabilities.7.html, il y a un nouvel ensemble de capacités Ambient (depuis Linux 4.3). Il semble que cela permettra ce qui est nécessaire.
la source