miejsce

ptrace to wywołanie systemowe występujące w systemie Unix i kilku systemach operacyjnych typu Unix . Używając ptrace (nazwa jest skrótem od „śledzenia procesu”) jeden proces może sterować innym, umożliwiając kontrolerowi sprawdzanie i manipulowanie stanem wewnętrznym celu. ptrace jest używany przez debuggery i inne narzędzia do analizy kodu, głównie jako pomoc w tworzeniu oprogramowania.

Używa

ptrace jest używany przez debuggery (takie jak gdb i dbx ), przez narzędzia śledzące, takie jak strace i ltrace , oraz przez narzędzia do pokrycia kodu . ptrace jest również używany przez wyspecjalizowane programy do łatania uruchomionych programów, unikania nienaprawionych błędów lub przezwyciężania zabezpieczeń. Może być ponadto używany jako piaskownica i jako symulator środowiska uruchomieniowego (na przykład emulacja dostępu root dla oprogramowania innego niż root).

Dołączając się do innego procesu za pomocą wywołania ptrace, narzędzie ma szeroką kontrolę nad działaniem swojego celu. Obejmuje to manipulowanie jego deskryptorami plików , pamięcią i rejestrami . Może pojedynczo przechodzić przez kod celu, może obserwować i przechwytywać wywołania systemowe i ich wyniki, a także może manipulować programami obsługi sygnałów celu oraz zarówno odbierać, jak i wysyłać sygnały w jego imieniu. Możliwość zapisu do pamięci celu pozwala na zmianę nie tylko jego składnicy danych, ale także własnego segmentu kodu aplikacji , umożliwiając kontrolerowi instalowanie punktów przerwania i łatanie działającego kodu celu.

Ponieważ zdolność do sprawdzania i modyfikowania innego procesu jest bardzo potężna, ptrace może dołączać tylko do procesów, do których właściciel może wysyłać sygnały (zwykle tylko do własnych procesów); konto superużytkownika może śledzić prawie każdy proces (z wyjątkiem init w jądrach starszych niż 2.6.26) . W systemach Linux z zabezpieczeniami opartymi na możliwościach możliwość ptrace jest dodatkowo ograniczona przez funkcję CAP_SYS_PTRACE lub przez moduł zabezpieczeń systemu Linux YAMA . We FreeBSD jest to ograniczone przez więzienia FreeBSD i obowiązkową kontrolę dostępu zasady.

Ograniczenia

Komunikacja między kontrolerem a celem odbywa się przy użyciu powtarzających się wywołań ptrace, przekazując między nimi mały blok pamięci o stałym rozmiarze (co wymaga dwóch przełączeń kontekstu na wywołanie); jest to bardzo nieefektywne podczas uzyskiwania dostępu do dużych ilości pamięci celu, ponieważ można to zrobić tylko w słowa (z wywołaniem ptrace dla każdego słowa). Z tego powodu w 8. edycji Uniksa wprowadzono procfs , który umożliwia dozwolonym procesom bezpośredni dostęp do pamięci innego procesu - po nim pojawił się 4.4BSD, a użycie /proc do obsługi debuggera zostało odziedziczone przez Solaris, BSD i AIX i w większości skopiowane przez Linuksa. Niektóre, jak np Solaris całkowicie usunęli ptrace jako wywołanie systemowe, zachowując je jako wywołanie biblioteki, które reinterpretuje wywołania ptrace w kategoriach procfs platformy. Takie systemy używają ioctls w deskryptorze otwartego pliku /proc do wydawania poleceń kontrolowanemu procesowi. Z drugiej strony FreeBSD rozszerzył ptrace, aby usunąć wspomniane problemy i ogłosił, że procfs jest przestarzały z powodu nieodłącznych problemów projektowych. [ niejasne ] [ potrzebne źródło ]

ptrace zapewnia tylko najbardziej podstawowy interfejs niezbędny do obsługi debuggerów i podobnych narzędzi. Programy używające go muszą mieć dogłębną wiedzę na temat specyfiki systemu operacyjnego i architektury, w tym układu stosu, binarnego interfejsu aplikacji , mechanizmu wywołań systemowych , zniekształcania nazw , formatu wszelkich danych debugowania oraz są odpowiedzialne za zrozumienie i dezasemblację kodu maszynowego sobie. Ponadto programy, które wstrzykują kod wykonywalny do procesu docelowego lub (jak gdb) umożliwiają użytkownikowi wprowadzanie poleceń wykonywanych w kontekście celu, muszą same generować i ładować ten kod, zwykle bez pomocy programu ładującego .

Wsparcie

Uniksa i BSD

ptrace został po raz pierwszy zaimplementowany w wersji 6 Unix i był obecny zarówno w gałęziach SVr4 , jak i 4.3BSD Uniksa. ptrace jest dostępny jako wywołanie systemowe w systemach IRIX , IBM AIX , NetBSD , FreeBSD , OpenBSD i Linux . ptrace jest zaimplementowane jako wywołanie biblioteki w Solarisie, zbudowane na systemie plików procfs jądra Solarisa; Sun zauważa, że ​​ptrace w systemie Solaris ma zapewniać kompatybilność i zaleca, aby nowe implementacje korzystały z bogatszego interfejsu dostarczanego przez proc. UnixWare również oferuje ograniczone ptrace, ale podobnie jak Sun, SCO zaleca wdrażającym korzystanie z bazowych funkcji procfs. HP-UX obsługiwał ptrace do wydania 11i v3 (został wycofany na rzecz ttrace , podobnego wywołania specyficznego dla systemu operacyjnego, w 11i v1).

System operacyjny Mac

MacOS firmy Apple również implementuje ptrace jako wywołanie systemowe. Wersja Apple dodaje specjalną opcję PT_DENY_ATTACH – jeśli proces wywoła tę opcję na sobie, kolejne próby prześledzenia procesu zakończą się niepowodzeniem. Apple używa tej funkcji, aby ograniczyć użycie debuggerów w programach, które manipulują zawartością zabezpieczoną DRM , w tym iTunes . PT_DENY_ATTACH on również wyłącza DTrace do monitorowania procesu. Debugery w systemie OS X zwykle używają kombinacji ptrace i Mach Interfejsy API maszyn wirtualnych i wątków. ptrace (ponownie z PT_DENY_ATTACH) jest dostępny dla programistów dla Apple iPhone .

Linuks

Linux daje również procesom możliwość zapobiegania przyłączaniu się do nich innych procesów. Procesy mogą wywołać prctl i wyczyścić swoją flagę PR_SET_DUMPABLE ; w późniejszych jądrach uniemożliwia to procesom innym niż root śledzenie procesu wywołującego; agent OpenSSH używa tego mechanizmu, aby zapobiec przejęciu sesji ssh przez ptrace. Późniejsze wersje Ubuntu są dostarczane z jądrem Linuksa skonfigurowanym tak, aby zapobiegać dołączaniu ptrace z procesów innych niż rodzic śledzonego procesu; pozwala to gdb i strace kontynuować pracę podczas uruchamiania procesu docelowego, ale uniemożliwia im dołączenie do niepowiązanego uruchomionego procesu. Sterowanie tą funkcją odbywa się za pomocą /proc/sys/kernel/yama/ptrace_scope ustawienie. W systemach, w których ta funkcja jest włączona, polecenia takie jak „ gdb --attach ” i „ strace -p ” nie będą działać.

Począwszy od Ubuntu 10.10 , ptrace może być wywoływane tylko w procesach potomnych.

Android

W przypadku niektórych telefonów z Androidem z zablokowanym programem ładującym, ptrace służy do przejęcia kontroli nad procesem init w celu umożliwienia „drugiego rozruchu” i zastąpienia plików systemowych. [ potrzebne źródło ]

Linki zewnętrzne