Ich habe ein kurzes Skript erstellt, welches alle gefundenen liblzma.so Bibliotheken auf die verdächtige Signatur überprüft.
Das Skript nutzt find zum Finden <g>.
Es benötigt einen Start-Pfad (z.B. /)
Es gibt die Option -x (-xdev bei find), welche die Suche auf das aktuell gemountete Dateisystem beschränkt um z.B. keine gemounteten Netzwerk-Dateisysteme zu durchsuchen.
Der wesentliche Teil des Scannens beruht auf dem Skript von cyclone:
https://github.com/cyclone-github/scripts/blob/main/xz_cve-2024-3094-detect.sh
#/usr/bin/bash
# by: GerBra, archlinux.de forum
# 2024-04-01
#
# ./find_and_proof_lzma.sh <startpath> [-x]
# startpath : where to start searching
# -x : use find with -xdef option, so stay in current mounted filesystem
# and don't descend into other mounted filesystems.
# If ex. /home is a seperated mounted partition you may need
# running the script dedicated for this or other mounts.
#
# For permission issues you may run the script with root privileges.
if [[ -z $1 ]]; then
echo "Please specify a path to start searching, ex. /"
exit 1
fi
[[ "x$2" == "x-x" ]] && xdef=true
found=0
vulnerable=0
if [[ $xdef == true ]]; then
echo "Searching for liblzma in: $1 (staying in THIS filesystem)"
LANG=C find "$1" -xdev -name liblzma.so* -type f -print > "./liblzma.places"
else
echo "Searching for liblzma in: $1 (descending into ALL underlying filesystems)"
LANG=C find "$1" -name liblzma.so* -type f -print > "./liblzma.places"
fi
while read -r LINE; do
echo "-------- Checking ----------------------------------------------"
echo "$LINE"
found=$((found+=1))
# https://github.com/cyclone-github/scripts/blob/main/xz_cve-2024-3094-detect.sh
# Thanks to cyclone for the script
if hexdump -ve '1/1 "%.2x"' "$LINE" | grep -q 'f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410'; then
echo "Function signature in liblzma: VULNERABLE"
vulnerable=$((vulnerable+=1))
else
echo "Function signature in liblzma: OK"
fi
done < "./liblzma.places"
printf "\nliblzma places found: %d, vulnerable: %d\n" $found $vulnerable
rm "./liblzma.places"
Um auf alle Verzeichnisse/Dateien zugreifen zu dürfen sollte das Skript mit Root-Privilegien gestartet werden.
//Edit:
Ein Lauf als User für /usr sieht z.B. so aus:
$ sh find_and_proof_lzma.sh /usr/
Searching for liblzma in: /usr/ (descending into ALL underlying filesystems)
find: '/usr/share/factory/etc/audit/plugins.d': Permission denied
find: '/usr/local/tank/lost+found': Permission denied
-------- Checking ----------------------------------------------
/usr/lib32/liblzma.so.5.6.1
Function signature in liblzma: OK
-------- Checking ----------------------------------------------
/usr/lib/liblzma.so.5.6.1
Function signature in liblzma: OK
liblzma places found: 2, vulnerable: 0