P
roces debugowania (ang. debugging) polega na kontrolowanym wykonaniu programu pod nadzorem debugera. Podobnie wygląda proces śledzenia (ang. tracing), który działa zarówno w trybie debugowania, jak i rejestrowania wybranych zdarzeń w czasie rzeczywistym. W systemie Linux często możemy spotkać się z tego typu czynnościami w kontekście podsłuchiwania innych procesów. Zatem pozostaje pytanie, czy istnieje możliwość sprawdzenia czy dany proces jest aktualnie poddawany procesowi śledzenia lub debugowania? Otóż każdy uruchamiany proces może zajrzeć do ścieżki /proc/self/status i sprawdzić, czy klucz TracerPid ma inną wartość niż 0:
agresor@darkstar:~$ cd /proc/self; cat status | egrep -B7 ^TracerPid Name: bash Umask: 0022 State: S (sleeping) Tgid: 2998765 Ngid: 0 Pid: 2998765 PPid: 2998764 TracerPid: 0ponieważ wiersz “TracerPid” z wartością “0” oznacza, iż żaden proces nie “śledzi” tego procesu. dzięki języka Python możemy napisać prosty skrypt o nazwie show_debbuger.py, który sprawdzi czy aktualnie w systemie jest uruchomiony jakiś proces, który jest śledzony i poda nam jego dane:
#!/usr/bin/env python3 # Debugger detector v0.1 import os import re def show_debugger(proc_path: str): pid_list, pid_found = [], [] for pid in os.listdir(proc_path): if os.path.isdir(os.path.join(proc_path, pid)) and pid.isnumeric(): pid_list.append(pid) for pid_number in pid_list: full_path = os.path.join(proc_path, pid_number, 'status') if os.path.isfile(full_path): with open(full_path, 'r') as proc_file: status_file = proc_file.read() tracer_pid = re.search(r'(?P<name>TracerPid.*)\s+(?P<pid>\d+)', status_file).group('pid') if tracer_pid != '0': process_name = re.search(r'Name:\s+(?P<name>\w+)', status_file).group('name') tracer_path = os.path.join(proc_path, tracer_pid, 'status') with open(tracer_path, 'r') as tracer_file: status_file = tracer_file.read() tracer_name = re.search(r'Name:\s+(?P<name>\w+)', status_file).group('name') print(f'Process: {process_name} with PID: {pid_number} is traced with:' f' {tracer_name} with PID: {tracer_pid}') pid_found.append(pid_number) if pid_found: return True else: print('No process tracing found!') return False if __name__ == '__main__': show_debugger('/proc')W pierwszej konsoli możemy sprawdzić czysty system:
root@darkstar:~#./show_debbuger.py No process tracing found!W drugiej konsoli uruchamiamy strace na dowolnym procesie i uruchamiamy skrypt ponownie:
root@darkstar:~#./show_debbuger.py Process: sshd with PID: 2055265 is traced with: strace with PID: 2061163Dokładamy jeszcze gdb ponownie sprawdzając system:
root@darkstar:~#./show_debbuger.py Process: multipathd with PID: 352 is traced with: gdb with PID: 2061871 Process: sshd with PID: 2055265 is traced with: strace with PID: 2061163Zawsze też możemy wyłączyć możliwość śledzenia w systemie.
Więcej informacji: Detecting the Presence of a Debugger in Linux