Heute geht es um RPMs und die Install und Uninstall Scripte die RPMs so mit sich rumschleppen.
Wie man RPM-Files genauer betrachtet
Zunächst schauen wir mal in ein RPM am Beispiel des Zoomclienten für Linux rein, was überhaupt drin ist:
# rpm -ql ./zoom_x86_64.rpm
Allerdings sieht man dabei nur die Dateien des RPM, aber nicht die Scripte oder die Info des RPM:
# less zoom_x86_64.rpm
Ja, genau, less 🙂 Wer hätte das gedacht, daß dies beides gleichzeitig anzeigt 🙂
Name : zoom Version : 2.8.183302.0415 Release : 1 Architecture: x86_64 Install Date: (not installed) Group : default Size : 246299262 License : see https://www.zoom.us/ Signature : RSA/SHA1, Di 16 Apr 2019 09:02:21 CEST, Key ID b903bf1861a7c71d Source RPM : zoom-2.8.183302.0415-1.src.rpm Build Date : Di 16 Apr 2019 08:59:45 CEST Build Host : localhost Relocations : / Packager : Zoom Linux Team <linux-dev@zoom.us> Vendor : Zoom Video Communications, Inc. URL : https://www.zoom.us Summary : Zoom, #1 Video Conferencing and Web Conferencing Service \nZoom, the cloud meeting company, unifies cloud video conferencing, simple online meetings, and group messaging into one easy-to-use platform. Our solution offers the best video, audio, and screen-sharing experience across Zoom Rooms, Windows, Mac, Linux, iOS, Android, and H.323/SIP room systems. Description : Zoom, #1 Video Conferencing and Web Conferencing Service \nZoom, the cloud meeting company, unifies cloud video conferencing, simple online meetings, and group messaging into one easy-to-use platform. Our solution offers the best video, audio, and screen-sharing experience across Zoom Rooms, Windows, Mac, Linux, iOS, Android, and H.323/SIP room systems. -rw-rw-r-- 1 root root 513 Jul 26 2018 /opt/zoom/Droplet.pcm -rw-rw-r-- 1 root root 140 Sep 13 2018 /opt/zoom/Qt/WebSockets/qmldir -rw-rw-r-- 1 root root 2637 Sep 13 2018 /opt/zoom/Qt/labs/calendar/DayOfWeekRow.qml -rw-rw-r-- 1 root root 7835 Sep 13 2018 /opt/zoom/Qt/labs/calendar/DayOfWeekRow.qmlc -rw-rw-r-- 1 root root 2703 Sep 13 2018 /opt/zoom/Qt/labs/calendar/MonthGrid.qml -rw-rw-r-- 1 root root 8747 Sep 13 2018 /opt/zoom/Qt/labs/calendar/MonthGrid.qmlc -rw-rw-r-- 1 root root 2645 Sep 13 2018 /opt/zoom/Qt/labs/calendar/WeekNumberColumn.qml -rw-rw-r-- 1 root root 7835 Sep 13 2018 /opt/zoom/Qt/labs/calendar/WeekNumberColumn.qmlc -rwxrwxr-x 1 root root 117816 Sep 13 2018 /opt/zoom/Qt/labs/calendar/libqtlabscalendarplugin.so -rw-rw-r-- 1 root root 4968 Sep 13 2018 /opt/zoom/Qt/labs/calendar/plugins.qmltypes -rw-rw-r-- 1 root root 187 Sep 13 2018 /opt/zoom/Qt/labs/calendar/qmldir -rwxrwxr-x 1 root root 64624 Sep 13 2018 /opt/zoom/Qt/labs/folderlistmodel/libqmlfolderlistmodelplugin.so -rw-rw-r-- 1 root root 2341 Sep 13 2018 /opt/zoom/Qt/labs/folderlistmodel/plugins.qmltypes -rw-rw-r-- 1 root root 124 Sep 13 2018 /opt/zoom/Qt/labs/folderlistmodel/qmldir
Geht natürlich auch direkt mit rpm :
# rpm -qi foo.rpm
und wer auch die Changelogs sehen will:
# rpm -qi –changelog foo.rpm
Jetzt ging es aber um die Installationsscripte, die ausgeführt werden, wenn man Pakete installiert oder eben deinstalliert:
# rpm -qp –scripts foo.rpm
Wenn man das beim Beispiel Zoom macht, kommt das raus:
# rpm -qp –scripts zoom_x86_64.rpm
Warnung: zoom_x86_64.rpm: Header V4 RSA/SHA1 Signature, Schlüssel-ID 61a7c71d: NOKEY postinstall scriptlet (using /bin/sh): #!/bin/bash # Program: # script to be run after package installation echo "run post install script, action is $1..." #ln -s -f /opt/zoom/ZoomLauncher /usr/bin/zoom #$1 folder path function remove_folder { if [ -d $1 ]; then rm -rf $1 fi } echo current home is $HOME remove_folder "$HOME/.cache/zoom" update-mime-database /usr/share/mime || true #update-desktop-database || true if [ -x "/usr/bin/update-desktop-database" ]; then update-desktop-database || true fi postuninstall scriptlet (using /bin/sh): #!/bin/bash # Program: # script to be run after package removal echo "run post uninstall script, action is $1 ..." [ "$1" == "0" ] || exit 0 echo current home is $HOME if [ -L "/usr/bin/zoom" ]; then rm /usr/bin/zoom fi #$1 folder path function remove_folder { if [ -d $1 ]; then rm -rf $1 fi } #$1 file path function remove_file { if [ -f $1 ]; then rm -f $1 fi } remove_folder "/opt/zoom" remove_folder "$HOME/.zoom/logs" remove_folder "$HOME/.cache/zoom" #remove_file "$HOME/.config/zoomus.conf" #logged_in_users=$(who -q | head -n 1) #sorted_users=$(echo "$logged_in_users"|tr " " "\n"|sort|uniq|tr "\n" " ") #for user in $sorted_users;do # echo "removing $(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.zoom..." # remove_folder "$(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.zoom" # echo "removing $(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.config/zoomus.conf..." # remove_file "$(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.config/zoomus.conf" #done
Orange ist das Installscript, Grün ist das Uninstallscript
Denn Sie wissen nicht, was Sie tun
Ok, was fällt uns daran auf?
echo current home is $HOME ... remove_folder "/opt/zoom" remove_folder "$HOME/.zoom/logs" remove_folder "$HOME/.cache/zoom"
Es soll also im Home des Users etwas gelöscht werden ? Jetzt zeige ich Euch mal was das Script ausgegeben hat :
# dnf erase zoom Abhängigkeiten sind aufgelöst. ================================================================================================================================================================================================================================================================================ Paket Arch Version Paketquelle Größe ================================================================================================================================================================================================================================================================================ Entfernen: zoom x86_64 2.8.183302.0415-1 @@commandline 235 M Transaktionsübersicht ================================================================================================================================================================================================================================================================================ Entfernen 1 Paket Freigegebener Speicherplatz: 235 M Ist dies in Ordnung? [j/N]:j Transaktionsüberprüfung wird ausgeführt Transaktionsprüfung war erfolgreich. Transaktion wird getestet Transaktionstest war erfolgreich. Transaktion wird ausgeführt Vorbereitung läuft : 1/1 Löschen : zoom-2.8.183302.0415-1.x86_64 1/1 Ausgeführtes Scriptlet: zoom-2.8.183302.0415-1.x86_64 1/1 run post uninstall script, action is 0 ... current home is /root Überprüfung läuft : zoom-2.8.183302.0415-1.x86_64 1/1 Entfernt: zoom.x86_64 2.8.183302.0415-1 Fertig.
Na? Wer hats gesehen? … Richtig: „current home is /root“ wie sinnvoll dort Configs u.ä. zu löschen oder gar anzulegen, wo Root doch gar nicht der User ist, des es ausgeführt hat. Um das zu beheben, war der Code hier mal gedacht:
#logged_in_users=$(who -q | head -n 1) #sorted_users=$(echo "$logged_in_users"|tr " " "\n"|sort|uniq|tr "\n" " ") #for user in $sorted_users;do # echo "removing $(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.zoom..." # remove_folder "$(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.zoom" # echo "removing $(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.config/zoomus.conf..." # remove_file "$(grep -w ^$user /etc/passwd | cut -d ":" -f6)""/.config/zoomus.conf" #done
Selbst wenn das einkommentiert gewesen wäre, wäre das wenig hilfreich gewesen, weil was wenn der User gar nicht eingeloggt ist, wenn das Uninstallscript läuft? Genau, dann würden die Files auch nicht gelöscht werden 😀 Da haben sie es dann gleich gelassen 😉
Einmal mit Profis und so..
Wieso habe ich das eigentlich nach Benutzung gelöscht? Ach ja, wegen der sechs CVE Sicherheitslücken allein in den statisch gelinkten QT5 Libraries seit September 2018 😀
# | CVE ID | CWE ID | # of Exploits | Vulnerability Type(s) | Publish Date | Update Date | Score | Gained Access Level | Access | Complexity | Authentication | Conf. | Integ. | Avail. | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | CVE-2018-19873 | 119 | Overflow | 2018-12-26 | 2019-01-08 | 7.5 | None | Remote | Low | Not required | Partial | Partial | Partial | ||||||
An issue was discovered in Qt before 5.11.3. QBmpHandler has a buffer overflow via BMP data. | |||||||||||||||||||
2 | CVE-2018-19872 | 369 | 2019-03-21 | 2019-04-24 | 4.3 | None | Remote | Medium | Not required | None | None | Partial | |||||||
An issue was discovered in Qt 5.11. A malformed PPM image causes a division by zero and a crash in qppmhandler.cpp. | |||||||||||||||||||
3 | CVE-2018-19871 | 400 | 2018-12-26 | 2019-04-25 | 4.3 | None | Remote | Medium | Not required | None | None | Partial | |||||||
An issue was discovered in Qt before 5.11.3. There is QTgaFile Uncontrolled Resource Consumption. | |||||||||||||||||||
4 | CVE-2018-19870 | 476 | 2018-12-26 | 2019-04-25 | 6.8 | None | Remote | Medium | Not required | Partial | Partial | Partial | |||||||
An issue was discovered in Qt before 5.11.3. A malformed GIF image causes a NULL pointer dereference in QGifHandler resulting in a segmentation fault. | |||||||||||||||||||
5 | CVE-2018-19869 | 20 | 2018-12-26 | 2019-04-25 | 4.3 | None | Remote | Medium | Not required | None | None | Partial | |||||||
An issue was discovered in Qt before 5.11.3. A malformed SVG image causes a segmentation fault in qsvghandler.cpp. | |||||||||||||||||||
6 | CVE-2018-19865 | 532 | 2018-12-05 | 2019-05-10 | 5.0 | None | Remote | Low | Not required | Partial | None | None | |||||||
A keystroke logging issue was discovered in Virtual Keyboard in Qt 5.7.x, 5.8.x, 5.9.x, 5.10.x, and 5.11.x before 5.11.3. |
Den Rest der App zu analysieren habe ich mir dann gleich erspart 😉
Beworben wurde das RPM übrigens mit „ab Fedora 21“ .. das ist ja auch nur schon 4 Jahre her. Daher hat ich dann das Filedatum der Libs verwundert, denn die stammen von 2018. Ob das damit wirklich noch „ab Fedora 21“ läuft, hmm, wer weiß, ich probier es jedenfalls nicht aus 😉