Pracuję, mam na to dowody
2023-09-18
Telefony nas śledzą, komputery nas śledzą, ulice śledzą nas oczami CCTV, pracodawcy mierzą nam puls i liczą poruszenia myszką, sklepy patrzą nam przez ramię BLE, gdy zatrzymujemy się przy półce, serwisy społecznościowe nas śledzą i w zamian dają nam możliwość śledzenia innych. Śledzą nas „dla naszego dobra”, „dla ich dobra” oraz dla „wyższego dobra”. Jedyna osoba, która nie ma ochoty nas śledzić to nieopłacony prywatny detektyw.
Skoro jest to nieunikniona rzeczywistość może czas zacząć się śledzić samemu, jak bohater książki PKD, „Przez ciemne zwierciadło”. Podczas gdy normalni ludzie używający normalnych systemów operacyjnych otrzymują inwigilację w prezencie, użytkownicy Linuksa, w duchu DIY, muszą zbudować sobie swój własny panoptykon klecąc jakąś serię poleceń w Bashu z nadzieją, że im się to nie rozsypie.
Kilka dni temu sprzątałem swoje archiwum. Okazało się na przykład, że mam pół terabajta obrazów nieistniejącego już serwera, za które wystawiają mi rachunek co miesiąc. Pośród różnych plików znalazłem niewielką paczkę nazwaną x11.tar.gpg
i po chwili przypomniałem sobie, co to jest. Kiedyś wymyśliłem że napiszę sobie program, który będzie logował nazwę aktywnego okna do pliku tekstowego i dzięki temu będę mógł wiedzieć, co robiłem. Zrobiłem, wstawiłem go do crontaba i zapomniałem. Potem znalazłem efekt, spakowałem go, zaszyfrowałem i wrzuciłem do zamrażarki.
Kodu samego programu nie zachowałem, a przynajmniej nie mogę znaleźć. Bez wątpienia był bezwartościowy. Byłem za to ciekawy jak szybko uda mi się odtworzyć go przy pomocy typowego skryptu-pająka. Mam zainstalowany xdotool
i po tym jak zerknąłem w jego olbrzymi manpage widziałem, że się nada.
xdotool
służy do automatyzacji X11. Można nim wysyłać wydarzenie takie jak wciśnięcie klawiszy, ruch myszki, zmieniać geometrię okien, statusy. Można też odczytać informacje o klasie, identyfiaktorze i innych atrybutach dostępnych dla rzeczy działających pod kontrolą X11.
Wpisałem xdotool getactivewindow getwindowname
w terminalu i otrzymałem poprawną odpowiedź — zsh
. Doskonale, możemy zacząć się śledzić samemu. Postanowiłem, że zamiast zapisywania dowodów do pliku tekstowego przez >>
użyjemy prawdziwej bazy danych, wtedy możemy zarządać donosami na siebie w sposób wygodny, a co najważniejsze uzyskane zeznania będą dokładne.
Na początek sprawdzimy, czy nasza baza danych istnieje, a jeśli nie, utworzymy ją wraz z potrzebną tablicą. SQLite przyjmuje polecenia bezpośrednio z stdio
, nie ma się więc o co martwić.
#!/bin/bash
if [ ! -f ispy.db ]; then
echo "Database initialization"
echo "CREATE TABLE ispy(id INTEGER PRIMARY KEY AUTOINCREMENT, created_at, window_title)" | sqlite3 ispy.db
fi
Teraz nie pozostaje nic innego jak kręcić się w nieskończoność i karmić nowopowstałą bazę informacjami.
while :
do
echo "INSERT INTO ispy(created_at, window_title) VALUES (datetime('now'), '"$(xdotool getactivewindow getwindowname)"')" | sqlite3 ispy.db
# tak, też widzę sql-injection przy użyciu spreparowanego
# <title> ;)
sleep 5
done
Jeśli przyszłoby Wam na myśl odpalanie tego w cronie czy w supervisord musicie pamiętać że są one zwykle uruchomione poza kontekstem waszej sesji X11, musicie więc odpalić taki skrypt przekazując zmienną środowiskową DISPLAY
(lub ustawiając ją w samym skrypcie).
Czyli na przykład DISPLAY=:0 ./ispy.bash
.
Wielkiej magii tu nie odkryliśmy. Skoro już się szpiegujemy to powinniśmy dołożyć wszelkich starań aby z zebranych dowodów prokuratura mogła ugrać jak najcięższy wyrok. Obraz wart jest tysiaca słów. Dodajmy więc obraz.
Użyjemy scrot
, aby zrzucić zawartość ekranu, mogrify
aby dodać tekst do zrzuconej klatki, będzie on zawierał to samo, co u góry: nazwę okna. Następnie scalimy wszystkie te obrazy w bardzo poszatkowaną animację. Teraz możecie doświadczyć pełnej autoinwigilacji.
Zaczniemy od obsługi przerwania działania skrptu. Nie ma sensu za każdym razem przekodowywać wideo, starczy że będzie to ostatnia operacja.
#!/bin/bash
DISPLAY=:0
STORAGE_PATH="/tmp"
trap encode SIGINT
encode() {
ffmpeg -r 2 -pattern_type glob -i "$STORAGE_PATH/*.png" \
-an -vcodec libx264 -pix_fmt yuv420p \
-profile:v baseline -level 3 \
$STORAGE_PATH/out.mp4
exit 0
}
Potem ten sam taniec, pętla, obraz, modyfikacja obrazu, sen.
while :
do
filename=`date +"%Y%m%d%H%M%S"`
echo "Capturing $filename"
r="text 0,0 \""$(xdotool getactivewindow getwindowname)"\""
scrot -D $DISPLAY $STORAGE_PATH/$filename.png
mogrify -pointsize 40 \
-fill white \
-undercolor black \
-gravity south \
-draw "$r" $STORAGE_PATH/$filename.png
sleep 5
done
Cudo. I żeby było zupełnie fair postanowiłem, że nagram sam siebie pisząc pierwszą wersję tego tekstu. Będzie się ona pewnie różniła od tej opublikowanej, musicie mi wybaczyć prace edytorskie. Jeżeli z jakiegoś powodu nie wyskoczy Wam kontrolka wideo, możecie zerknąć bezpośrednio.
Muzykę jumano psych858o^Onslaught
W tym odcinku serialu „rzeczy, które są bezużyteczne ale podstępnie inspirują Was do eksperymentowania z komputerem” to chyba wszystko. Miłej paranoi.
Posłowie dla ludzi używających tmuxa: standardowe formatowanie tytułu okna jest nieco dzikie, zawiera identyfikator sesji i czasem ciężko się zorientować. Możecie dodać te dwie linie do konfiguracji, wtedy pozostaje tylko czysta nazwa procesu:
set-option -g set-titles on
set-option -g set-titles-string '#W'