Dlaczego strace / gdb nie dołącza się do procesu, mimo że jestem rootem?

26
  • Zalogowałem się jako root, ale stracedaje mi to:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 pkt / 2 00:00:00 111
     3810 pkt / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): Operacja niedozwolona
    Nie można dołączyć do procesu. Jeśli Twój identyfikator użytkownika jest zgodny z identyfikatorem użytkownika celu
    sprawdź proces / proc / sys / kernel / yama / ptrace_scope lub spróbuj
    ponownie jako użytkownik root. Aby uzyskać więcej informacji, zobacz /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • Następnie próbowałem użyć gdbdo debugowania programu wieloprocesowego w Eclipse CDT z rozwidleniem, co dało mi ten sam wynik / błąd:

    wprowadź opis zdjęcia tutaj

Jakieś pomysły?

andreykyz
źródło
Ponieważ ptrace_scope ma wartość zero, nie powinno to mieć znaczenia, ale tak jak w eksperymencie możesz spróbować prostszego użycia strace, gdzie proces śledzenia jest rodzicem śledzonego procesu. Na przykład strace /bin/echo test? Czy to daje ten sam komunikat o błędzie?
Jordan Uggla
@EliahKagan, teoretycznie to, co opisano OP, nie może wystąpić przy braku błędu jądra. Jeśli masz trochę czasu w ciągu najbliższych 24 godzin i potrafisz zamienić swój komentarz w odpowiedź, byłoby wspaniale - moje testy Precise nie wykazały żadnych problemów, a w ten sposób byłaby ostateczna odpowiedź, że było trochę dziwactwa w konfiguracji OP ... nie wrócił od pierwszego pytania z 29 maja.
Ish
@EliahKagan, Jedno uderzyło mnie po ponownym przeczytaniu bitu „operacja niedozwolona” - ponieważ widziałem go już wiele razy, kiedy rzekomo rootuję na OpenVZ VPS / VMs (dzielą jądro maszyny hosta, więc nie , jesteś tylko królem swojej małej wyspy) ... może tak było? Zobacz tę pastę
owski
@izx Twoja pasta wygasła. Mam ten problem (w pojemniku), każdy wgląd byłby miły
Kunal Tyagi,

Odpowiedzi:

25

Jednym z powodów, dla których pojawia się błąd:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

Jest tak, ponieważ proces został już dołączony do z gdb, stracelub podobny. Aby sprawdzić, czy tak jest, uruchom:

grep TracerPid /proc/$THE_PID/status

Jeśli jest niezerowy, oznacza to pid istniejącego programu, który już uruchamia śledzenie tego procesu.

Nathan Kidd
źródło
Nie zauważamy tego, jeśli debugujemy w Eclipse ... który już korzysta z GDB
ernesto
Dzięki za zwrócenie na to uwagi. Uruchomiłem program przez opakowanie strace. Program rozwidla się, a następnie sam się wykonuje. Wykluczone dziecko szybko umiera, gdy uruchamia opakowanie strace, które nie dołącza się, ponieważ proces nadrzędny jest już pod kontrolą strace.
Rob Kennedy,
18

Jak skomentował izx , powinno to być możliwe tylko z powodu błędu jądra. Tak więc każdemu, kto może obecnie wytworzyć ten problem - w tym zwłaszcza oryginalny plakat z tym pytaniem - dobrze byłoby zgłosić go jako błąd , dokładnie i uważnie czytając tę ​​stronę, a następnie uruchamiając ubuntu-bug linuxna zaatakowanym komputerze . Powinno to zostać zgłoszone linuxw Ubuntu, a nie w stosunku do jądra głównego (w górę), chyba że można go wytworzyć w jądrze głównym (trzeba by było yamazaładować).

Oczekiwanym zachowaniem w każdej wersji Ubuntu rozpoczynającej się od Ubuntu 10.10 jest to, że proces A nie może śledzić działającego procesu B, chyba że B jest bezpośrednim dzieckiem A (lub A działa jako root). Jest to ulepszenie bezpieczeństwa, które sprawia, że ​​proces, który został zaatakowany przez osobę atakującą, nie może korzystać z funkcji debugowania udostępnianych przez jądro do wykrywania informacji z innych procesów. Wyjaśniono to w sekcji zakresu ptrace na stronie wiki społeczności Funkcje zabezpieczeń .

To restrykcyjne zachowanie jest domyślne, ale można je zmienić, aby umożliwić procesowi A śledzenie dowolnego uruchomionego procesu B, który jest uruchamiany z tym samym identyfikatorem użytkownika, co własny proces A. Oznacza to, że możesz skonfigurować swój system, aby umożliwić dowolnemu procesowi wzajemne debugowanie. Upraszcza to dołączanie debugerów do już działających procesów.

Ustawienie tego jest widoczne w /proc/sys/kernel/yama/ptrace_scope sysctl . 1oznacza bardziej restrykcyjne zachowanie i 0mniej restrykcyjne zachowanie. Ustawienie można odczytać za pomocą:

cat /proc/sys/kernel/yama/ptrace_scope

Mniej restrykcyjne (inne niż domyślne) zachowanie można ustawić za pomocą:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Bardziej restrykcyjne (domyślne) zachowanie można ustawić (lub cofnąć) za pomocą:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Oryginalny plakat tego pytania nie tylko nie był w stanie dołączyć straceinstancji do aktualnie uruchomionego procesu z ptrace-scopeustawionym na 0, ale oryginalny plakat nie był w stanie tego zrobić podczas uruchamiania stracejako root. Trudno zrozumieć, jak może to być coś innego niż błąd - zdecydowanie polecam zgłoszenie go jako jednego.

Na początku myślałem, że jestem w stanie odtworzyć problem, w którym ptrace_scopeustawienie parametru 0jest ignorowane i traktowane tak, jakby było 1. Ale już nie wierzę, że tak jest, ponieważ ponownie zrobiłem te same rzeczy i nie mogę odtworzyć problemu. Przetestowałem to na:

  • Fizyczna maszyna Lubuntu Amd64, której używam codziennie jako głównego urządzenia.
  • Maszyna wirtualna VirtualBox z uruchomionym CD Live Lubuntu Precise i386 (12.04).
  • Identyczna maszyna wirtualna VirtualBox z systemem Quantal i386 (Ubuntu + 1) codziennie na żywo (20120608).

Na wszystkich trzech komputerach występuje oczekiwane zachowanie i nie mogę odtworzyć stanu, o jaki pyta oryginalny plakat tego pytania. Oto tekst z terminala (z systemu Precise Live):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

strace kontynuowałem produkcję wiadomości, dopóki nie zawiesiłem, zgodnie z oczekiwaniami.

Kończę, zalecając ponownie, aby zgłosić to jako błąd. Maksymalnie wyczerpujące wyszukiwanie tekstu na https://bugs.launchpad.net (które obejmuje wszelkie zgłoszone błędy Ubuntu) dla tekstu ptrace_scopedaje tylko garść wyników, w których wyraźnie nie ma raportów o tym błędzie . Zgłoszenie błędu pomogłoby innym, może prowadzić do obejścia lub naprawy i jest prawdopodobnie jedynym znaczącym sposobem na kontynuowanie pracy nad tym problemem (zakładając, że problem nadal występuje).

Eliah Kagan
źródło
Dzięki za sugestię, przeczytam ją szczegółowo jutro i może dodam kilka podtytułów, ale myślę, że jest to bardzo dokładne :)
ish
w moim poście możesz zobaczyć: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Zrobiłem to: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz
W konsoli wszystko działa łatwo. Ale jeśli uruchomiłem program w zaćmieniu i wypróbowałem strace z konsoli, pojawia się problem.
andreykyz
2
może być efektem ubocznym śledzonego procesu? Miałem ten sam problem, gdy korzystałem z gdb w procesie nadrzędnym z dzieckiem w trybie zezwolenia na rozwidlenie
Jamie Pate
2
Ten błąd też pojawia się 14.04. Czy ktoś wie, czy kiedykolwiek zgłoszono błąd?
detly