Nvidia 安全漏洞

计算机系统安全性:请注意。

我最近在阅读有关“ Window HiJacking”的文章

https://www.unknowncheats.me/forum/a...ay-betray.html 。 它说明了如何“ HiJack”一个窗口成为可信窗口。

作者讨论了这一点,以及如何测试HiJack以验证其是否有效。 测试时,发现另一个劫持事件已经发生并且正在进行。 据报道是通过Nvidia。 您应该阅读整篇文章。 无论Nvidia的“借口”是什么,他们的安全漏洞似乎都吸引了受信任的Windows程序,并且作者谈论了如何使用Nvidia进程来破坏使用此类受信任的Windows程序的其他程序。

无论那个作者是谁:谢谢你揭示这一点。

据报道,基本逻辑支持了这一点:普通用户计算机中的Nvidia卡可用于破坏他人软件的安全性。 示例:Person_A编写一些软件; 他们的软件直接使用Nvidia图形(不仅是使用它的系统,而是软件直接使用它); 但Nvidia本身通过Person_A对Nvidia的软件依赖关系不断侵犯该Person_A的软件。 那很不好。

有人编写了一些软件,并想利用像Nvidia这样的市场巨头的假定利益来帮助使他们的用户交互更好或更流畅,或者以某种方式使他们更容易编程,然后Nvidia这样做了吗? 那很不好。

这是其中的一些页面,以防“尝试”使用的功能被从互联网上删除。

作者的话:

这是它的代码,可以运行并检测最常见的叠加层(不要犹豫,测试自己的叠加层):


OverlayFinder.cpp
    #include 
    #include 
    #include 
    #include 
    #include  
    #define MAX_CLASSNAME 255
    #define MAX_WNDNAME MAX_CLASSNAME 
    using namespace std; 
    struct OverlayFinderParams {
        DWORD pidOwner = NULL;
        wstring wndClassName = L"";
        wstring wndName = L"";
        RECT pos = { 0, 0, 0, 0 }; // GetSystemMetrics with SM_CXSCREEN and SM_CYSCREEN can be useful here
        POINT res = { 0, 0 };
        float percentAllScreens = 0.0f;
        float percentMainScreen = 0.0f;
        DWORD style = NULL;
        DWORD styleEx = NULL;
        bool satisfyAllCriteria = false;
        vector hwnds;
    }; 
    BOOL CALLBACK EnumWindowsCallback(HWND hwnd, LPARAM lParam);
    vector OverlayFinder(OverlayFinderParams params); 
    int main() {
        cout << "Search for suspicious windows presenting the characteristics of game cheats overlays." << endl;
        cout << "Play with it to try to detect your own overlay and improve your system accordingly." << endl;
        cout << endl; 
        OverlayFinderParams params;
        params.style = WS_VISIBLE;
        params.styleEx = WS_EX_LAYERED | WS_EX_TRANSPARENT;
        params.percentMainScreen = 90.0f;
        params.satisfyAllCriteria = true;
        vector hwnds = OverlayFinder(params); 
        cout << "Searching for windows WS_VISIBLE, WS_EX_LAYERED, ES_EX_TRANSPARENT, taking 90%+ of the screen..." << endl;
        cout << endl; 
        for (int i(0); i < hwnds.size(); ++i) {
            DWORD pid = 0;
            DWORD tid = GetWindowThreadProcessId(hwnds[i], &pid);
            cout << "Window #" << i+1 << " found: HWND 0x" << hex << (int)hwnds[i] << " | Thread: " << dec << tid << " | PID: " << pid << endl;
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
            if (hProcess) {
                char cheatPath[MAX_PATH] = "";
                GetProcessImageFileNameA(hProcess, (LPSTR)&cheatPath, MAX_PATH);
                CloseHandle(hProcess);
                string cheatPathStr = cheatPath;
                cout << cheatPathStr << endl;
            }
            cout << "----------------" << endl;
        } 
        cout << endl;
        system("pause"); 
        return EXIT_SUCCESS;
    } 
    BOOL CALLBACK EnumWindowsCallback(HWND hwnd, LPARAM lParam) {
        OverlayFinderParams& params = *(OverlayFinderParams*)lParam; 
        unsigned char satisfiedCriteria = 0, unSatisfiedCriteria = 0; 
        // If looking for windows of a specific PDI
        DWORD pid = 0;
        GetWindowThreadProcessId(hwnd, &pid);
        if (params.pidOwner != NULL)
            if (params.pidOwner == pid)
                ++satisfiedCriteria; // Doesn't belong to the process targeted
            else
                ++unSatisfiedCriteria; 
        // If looking for windows of a specific class
        wchar_t className[MAX_CLASSNAME] = L"";
        GetClassName(hwnd, className, MAX_CLASSNAME);
        wstring classNameWstr = className;
        if (params.wndClassName != L"")
            if (params.wndClassName == classNameWstr)
                ++satisfiedCriteria; // Not the class targeted
            else
                ++unSatisfiedCriteria; 
        // If looking for windows with a specific name
        wchar_t windowName[MAX_WNDNAME] = L"";
        GetWindowText(hwnd, windowName, MAX_CLASSNAME);
        wstring windowNameWstr = windowName;
        if (params.wndName != L"")
            if (params.wndName == windowNameWstr)
                ++satisfiedCriteria; // Not the class targeted
            else
                ++unSatisfiedCriteria; 
        // If looking for window at a specific position
        RECT pos;
        GetWindowRect(hwnd, &pos);
        if (params.pos.left || params.pos.top || params.pos.right || params.pos.bottom)
            if (params.pos.left == pos.left && params.pos.top == pos.top && params.pos.right == pos.right && params.pos.bottom == pos.bottom)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        // If looking for window of a specific size
        POINT res = { pos.right - pos.left, pos.bottom - pos.top };
        if (params.res.x || params.res.y)
            if (res.x == params.res.x && res.y == params.res.y)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        // If looking for windows taking more than a specific percentage of all the screens
        float ratioAllScreensX = res.x / GetSystemMetrics(SM_CXSCREEN);
        float ratioAllScreensY = res.y / GetSystemMetrics(SM_CYSCREEN);
        float percentAllScreens = ratioAllScreensX * ratioAllScreensY * 100;
        if (params.percentAllScreens != 0.0f)
            if (percentAllScreens >= params.percentAllScreens)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        // If looking for windows taking more than a specific percentage or the main screen
        RECT desktopRect;
        GetWindowRect(GetDesktopWindow(), &desktopRect);
        POINT desktopRes = { desktopRect.right - desktopRect.left, desktopRect.bottom - desktopRect.top };
        float ratioMainScreenX = res.x / desktopRes.x;
        float ratioMainScreenY = res.y / desktopRes.y;
        float percentMainScreen = ratioMainScreenX * ratioMainScreenY * 100;
        if (params.percentMainScreen != 0.0f)
            if (percentAllScreens >= params.percentMainScreen)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        // Looking for windows with specific styles
        LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
        if (params.style)
            if (params.style & style)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        // Looking for windows with specific extended styles
        LONG_PTR styleEx = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
        if (params.styleEx)
            if (params.styleEx & styleEx)
                ++satisfiedCriteria;
            else
                ++unSatisfiedCriteria; 
        if (!satisfiedCriteria)
            return TRUE; 
        if (params.satisfyAllCriteria && unSatisfiedCriteria)
            return TRUE; 
        // If looking for multiple windows
        params.hwnds.push_back(hwnd);
        return TRUE;
    } 
    vector OverlayFinder(OverlayFinderParams params) {
        EnumWindows(EnumWindowsCallback, (LPARAM)¶ms);
        return params.hwnds;
    }
作者的进一步报价:
令我震惊的惊喜

当我第一次运行覆盖检测器以检测自己的旧覆盖时,检测器实际上不是一个而是两个窗口。
显然我的系统上有另一个窗口,即WS_VISIBLE,WS_EX_LAYERED,WS_EX_TRANSPARENT和完全全屏(1920x1080),我认为这可能是检测器中的错误,因此我使用Process Hacker进行了检查,没有,不是一个错误:
更多:
那不完美吗?
我非常想劫持一个窗口,然后使其具有覆盖的属性,以至于我完全错过了这样的窗口可能已经真正存在于我的系统中的可能性!
好吧,我想不是生成程序,而是修改窗口以及所有这些……我们可以直接使用该窗口。
蛋糕上的绝对优势在于,由于它是NVIDIA窗口,因此许多游戏玩家也将拥有它,因此它变得更难被发现!

Nvidia等(作者引述):

编辑,针对AMD用户。
我们感谢@dracorx,让我知道AMD显然也具有相同类型的可利用窗口。
它在Radeon Overlay解决方案中(我尚未验证,请报告是否使用)
看起来可能是这样:
  • Nvidia安全漏洞。
  • Radeon安全漏洞。
  • 硬编码内置视频卡安全漏洞。

处理它。 如果您编写软件并且想要更好或更简单的图形,请考虑安全性成本。 有人通过您的程序通过视频卡的“后门”将您的程序注入到您的程序中,从而迫使您的程序执行您从未打算做的令人讨厌的事情,这可能不是您想要的。

返回自己在程序内部对图形进行编程的步骤,并且不要集成对任何多媒体(声音,视频等)硬件的任何依赖。

不要轻描淡写的安全性。

From: https://bytes.com/topic/security/insights/973661-nvidia-security-breach

你可能感兴趣的:(Nvidia 安全漏洞)