2009-09-02 18 views
5

Mam repozytorium git, które musi uruchomić hak po otrzymaniu jako sudo. Binarny, że skompilowany do testowania to wygląda:uruchamianie haka git 'post-receive' z setuidem kończy się niepowodzeniem

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 

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() pobiera identyfikator właściciela post-receive, a następnie próbuje setuid. Podczas uruchamiania tego z dowolnym użytkownikiem (w tym superużytkownikiem) uruchamia skrypt poprawnie jako root. Jednakże, po uruchomieniu przez hak git, systemy nie ustawiają uid. Próbowałem już uruchomić chmod u+s post-receive Próbowałem także innych konfiguracji, ale brakuje mi pomysłów. Jakiś powód, dla którego to zadziałałoby we wszystkich przypadkach, z wyjątkiem sytuacji, gdy git go uruchomi?

btw, platforma Ubuntu Server 9.04 (2.6.28-15), git1.6.0.4, gcc w wersji 4.3.3 (4.3.3-5ubuntu4 Ubuntu)

+0

Czy kiedykolwiek to rozgryzłeś? – Ibrahim

+0

Jedną z kwestii jest drukowanie komunikatu o błędzie, a następnie kontynuowanie wykonywania wywołania system(). Ignorujesz także wynik wywołania system(), a następnie kończysz pracę ze statusem sukcesu (0). –

+0

@Blake: Bit "-as the- with any user" jest niejasny - czy program działa poprawnie, gdy jest uruchamiany jako użytkownik, który naciskasz jako? Myślę, że najbliższym sposobem na zduplikowanie środowiska, w którym działa git, byłoby: 'ssh nazwa_hosta 'cd/ścieżka/do/repo; .git/hooks/post-receive'' – Cascabel

Odpowiedz

0

spróbuj uruchomić program z wiersza poleceń

+0

Działa prawidłowo, gdy nie jest aktywowany przez git. –

1
  1. System plików gdzie repo git jest przechowywana może być zamontowany z opcją nosuid
  2. Jeśli pchają nad ssh zdolność suid może być wyłączona na polecenia wywoływane z ssh (nie CAP_SETUID)

W każdym razie to, co próbujesz zrobić, jest bardzo niewskazane.

1
  1. Uruchom swój program jako demon.
  2. Czekaj na wejście w gnieździe/nazwanej potoce/msgq.
  3. W haczyku wyślij wiadomość do demona z dowolnymi informacjami potrzebnymi do wykonania operacji.
  4. W razie potrzeby wyślij wiadomość z powrotem do haka ze statusem.

Prawdopodobnie będzie to łatwiejsze do zarządzania i bezpiecznego zabezpieczenia.

0

Spróbuj napisać skrypt bootstrap. tj.

#/usr/bin/sh 
./your_program 

Następnie spraw, aby skrypt był haczykiem.

Powiązane problemy