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: 0
ponieważ wiersz “TracerPid” z wartością “0” oznacza, że żaden proces nie “śledzi” tego procesu. Za pomocą 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: 2061163
Dokł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: 2061163
Zawsze też możemy wyłączyć możliwość śledzenia w systemie.
Więcej informacji: Detecting the Presence of a Debugger in Linux, How do you detect that you’re being ptraced?
Ostatni komentarz :