exécuter le hook ‘post-receive’ git avec setuid échoue

J’ai un repository git qui doit exécuter un hook post-réception sous le nom de sudo. Le binary que j’ai compilé pour tester ceci ressemble à ceci:

#include  #include  #include  int main() { int ret; ret = setuid(geteuid()); if(!ret) { fprintf(stderr, "error setting uid %d \n", ret); } system("[...command only sudo can access...]"); return 0; } 

geteuid() récupère l’ID de propriétaire de post-receive , puis essaie de définir. Lorsque vous exécutez cela avec un utilisateur (y compris le super utilisateur), il exécute correctement le script en tant que root. Cependant, lorsqu’ils sont déclenchés par le hook git, les systèmes ne parviennent pas à définir le uid. J’ai essayé de faire fonctionner chmod u+s post-receive J’ai également essayé d’autres configurations, mais je suis à court d’idées. Une raison pour laquelle cela fonctionnerait dans tous les cas, sauf quand git le déclenche?

btw, plateforme Ubuntu Server 9.04 (2.6.28-15), git1.6.0.4, gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

  1. Le système de fichiers dans lequel le repository git est stocké peut être monté avec l’option nosuid
  2. Si vous utilisez ssh, la fonctionnalité suid peut être désactivée pour les commandes appelées avec ssh (no CAP_SETUID)

Dans tous les cas, ce que vous essayez de faire est très déconseillé.

  1. Exécutez votre programme en tant que démon.
  2. Attendez l’entrée sur un socket / named pipe / msgq.
  3. En revanche, envoyez un message à votre démon avec les informations dont il a besoin pour effectuer l’opération.
  4. Si nécessaire, renvoyez un message au statut avec le statut.

Cela sera probablement plus facile à gérer et à sécuriser correctement.

essayez d’exécuter votre programme à partir de l’invite de commande

Essayez d’écrire un script bootstrap. c’est à dire

 #/usr/bin/sh ./your_program 

Ensuite, faites que le script devienne le crochet.