以管理员身份安全地浏览 Web 和读取电子邮件

Michael Howard
Microsoft Security Engineering

摘要:Michael Howard 讨论了在使用任何工具访问 Internet 时,如何通过去掉不必要的管理特权来以管理员身份运行并安全地访问 Internet 数据。

下载 DropMyRights.msi 文件

*

“用管理帐户运行会危及您的计算机和数据”,对此我已经说过多次,但是我将再重申一遍。因此,当某个人说他们必须以管理员身份操作计算机时,我总是试图说服他们,从安全的角度来看,这不是正确的操作。说归说,我偶尔也会碰到理由充分的人。例如,我使用办公室内的某台计算机安装最新的 Windows 日更新版本,并且我需要以管理员身份安装 OS。但是,当我以管理员身份在该计算机上运行时,不会以任何方式读取电子邮件、浏览 Web 或访问 Internet,这一点很重要。我之所以不这样做,是因为 Web 是当今大多数令人讨厌的攻击的来源。

如果某个人确实希望浏览 Web,该怎么办?亦或是读取电子邮件,或者进行即时消息处理等,而且由于某种原因必须在管理上下文中运行,那该怎么办?如果您查看对计算机的主要威胁,就会发现它们都来自用户通过浏览器和电子邮件客户程序等工具与 Web 进行的交互。虽然的确存在非用户交互的攻击,如 Blaster (http://www.cert.org/advisories/CA-2003-20.html) 和 Lion (http://www.sans.org/y2k/lion.htm),但是这在一定程度上解释了我们为什么在 Windows XP SP2 中打开了防火墙!

有关以非管理员身份运行的最佳做法,我建议您查阅Aaron Margosis 的网络日记,以便收集有关在 Windows 中以非管理员身份运行的提示。

本页内容
举例说明为何以管理员身份运行不好举例说明为何以管理员身份运行不好
更多详细信息更多详细信息
DropMyRights 应用程序DropMyRights 应用程序

举例说明为何以管理员身份运行不好

某个令人讨厌的恶意软件 之所以会发挥作用,就是因为浏览 Web 的用户是管理员。一个很好的例子就是名为 W32.Beagle.AV@mm 的 Bagle/Beagle 蠕虫的最新变种。我建议您在计算机系统招致了该蠕虫后,仔细研究它的行为。Symantec 在 http://securityresponse.symantec.com/avcenter/venc/data/w32.beagle.av@mm.html 上有一篇不错的详细描述文章。我之所以说“招致”,是因为该恶意软件不是利用编码或设计缺陷,而是利用简单的人为错误来执行的。

该恶意软件执行的许多操作都需要管理权限,这些操作包括:

在 system32 目录中创建文件。

终止各个进程。

禁用 Windows 防火墙。

下载文件并将其写入到 system32 目录中。

删除 HKLM 中的注册表值。

如果运行电子邮件客户程序的用户不是管理员,那么所有这些操作都会失败。

因此,如果您能够以非管理员身份浏览 Web、阅读电子邮件等(即使您需要以管理员身份执行普通的日常任务),不是很有用(亦或:更安全)吗?幸运的是,Windows XP 和 Windows Server 2003 以及更高版本都可以使用受限制的令牌来支持此功能。

更多详细信息

Windows XP 和 Windows Server 2003 以及更高版本都支持名为软件限制策略(又称为 SAFER)的功能,该功能允许用户或软件开发人员以较低的特权运行代码,而无需让用户在应用程序启动时输入凭据信息。例如,管理员可以在应用程序启动时,从应用程序的令牌中去掉某些 SID 和特权,从而以普通用户身份运行应用程序。一些应用程序(最典型的是面向 Internet 的应用程序,如 Web 浏览器、即时消息或电子邮件客户程序)绝对不能在管理上下文中运行。

DropMyRights 应用程序

DropMyRights 是一个非常简单的应用程序,它可以帮助那些必须以管理员身份运行的用户在更安全的上下文(非管理员的上下文)中运行应用程序。这是通过以下方法来完成的:提取当前用户的令牌,从该令牌中删除各种特权和 SID,然后使用该令牌启动另一个进程(如 Internet Explorer 或 Outlook)。该工具完全适用于 Mozilla 的 Firefox、Eudora 或 Lotus Notes 电子邮件。

代码再简单不过了。其核心代码如下:

//
DWORD wmain(int argc, wchar_t **argv) {
   DWORD fStatus = ERROR_SUCCESS;
   if (2 != argc && 3 != argc) {
      Usage();
      return ERROR_INVALID_PARAMETER;
   }
   // get the SAFER level
   DWORD hSaferLevel = SAFER_LEVELID_NORMALUSER;
   if (3 == argc && argv[2]) {
      switch(argv[2][0]) {
         case 'C' : 
         case 'c' :  hSaferLevel = SAFER_LEVELID_CONSTRAINED; 
                  break;
         case 'U' :
         case 'u' :   hSaferLevel = SAFER_LEVELID_UNTRUSTED;
                  break;
         default  :   hSaferLevel = SAFER_LEVELID_NORMALUSER;
                  break;
      }
   }
   // get the command line, and make sure it's not bogus
   wchar_t *wszPath = argv[1];
   size_t cchLen = 0;
   if (FAILED(StringCchLength(wszPath,MAX_PATH,&cchLen)))
      return ERROR_INVALID_PARAMETER;
    SAFER_LEVEL_HANDLE hAuthzLevel = NULL;
    if (SaferCreateLevel(SAFER_SCOPEID_USER,
                         hSaferLevel,
                         0, 
             &hAuthzLevel, NULL)) {
        //  Generate the restricted token we will use.
        HANDLE hToken = NULL;
        if (SaferComputeTokenFromLevel(
            hAuthzLevel,    // SAFER Level handle
            NULL,           // NULL is current thread token.
            &hToken,        // Target token
            0,              // No flags
            NULL)) {        // Reserved
         STARTUPINFO si;
         ZeroMemory(&si, sizeof(STARTUPINFO));
         si.cb = sizeof(STARTUPINFO);
         si.lpDesktop = NULL;
         // Spin up the new process
         PROCESS_INFORMATION pi;
         if (CreateProcessAsUser( 
            hToken,
            wszPath, NULL,
            NULL, NULL,
            FALSE, CREATE_NEW_CONSOLE,
            NULL, NULL,  
            &si, &pi)) {
               CloseHandle(pi.hProcess);
               CloseHandle(pi.hThread);
         } else {
            fStatus = GetLastError();
            fwprintf(stderr,L"CreateProcessAsUser failed (%lu)/n",fStatus);
         } 
      } else {
         fStatus = GetLastError();
      }
      SaferCloseLevel(hAuthzLevel);
   } else {
      fStatus = GetLastError();
   }
   return fStatus;
}

在本文开头提供了源代码和可执行文件。现在,让我们看一下如何将应用程序配置为以较低的特权运行应用程序。

安装

只需将 DropMyRights.exe 复制到某个文件夹中,然后,对于要以较低特权运行的每个应用程序,按照以下三部分中的步骤操作。

创建快捷方式

创建一个快捷方式,输入 DropMyRights.exe 作为目标可执行文件,然后输入您要以较低特权执行的应用程序的路径。

例如:

C:/warez/dropmyrights.exe "c:/program files/internet explorer/iexplore.exe"

图 1 显示了这在屏幕上的外观。


1. 要以较低特权运行的应用程序的路径

更新快捷方式名称

接下来,更新快捷方式的名称,使其表示目标可执行文件,而非 dropmyrights。我通常会在应用程序名称的后面加上单词“(Safer)”,以表示该应用程序将在更安全的安全上下文中运行。也可以添加“(Non-admin)”,如图 2 所示。

secure11152004-fig2

2. 更新快捷方式名称

设置图标和运行模式

最后,在创建快捷方式之后,将快捷方式的 Run 选项设置为 Minimized,如果需要的话,还可以选择一个新图标。


3. “Run”选项设置为“Minimized”,或者更改图标

高级选项

DropMyRights 的参数如下所示:

DropMyRights {path} [N|C|U]

这些变量的含义解释如下:

Path 是要启动的应用程序的完整路径。

N 表示以普通用户身份运行应用程序。如果您未提供参数,这将是默认值。

C 表示以受限制的用户身份运行应用程序。

U 表示以不受信任的用户身份运行应用程序。有时,这将导致某些应用程序失败。

用来标识其中每个设置所执行操作的最佳方法就是查看得到的进程令牌。以下各表显示了对进程令牌进行的更改。

表 1. 管理帐户
SID限制 SID特权
DOMAIN/Domain Users 
Everyone 
BUILTIN/Administrators 
BUILTIN/Users 
NT AUTHORITY
/INTERACTIVE 
NT AUTHORITY
/Authenticated Users
/LOCAL

SeChangeNotifyPrivilege 
SeSecurityPrivilege
SeBackupPrivilege 
SeRestorePrivilege 
SeSystemtimePrivilege
SeShutdownPrivilege
SeRemoteShutdownPrivilege 
SeTakeOwnershipPrivilege
SeDebugPrivilege
SeSystemEnvironmentPrivilege 
SeSystemProfilePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeLoadDriverPrivilege
SeCreatePagefilePrivilege
SeIncreaseQuotaPrivilege
SeUndockPrivilege 
SeManageVolumePrivilege 
SeCreateGlobalPrivilege
SeImpersonatePrivilege
表 2. 普通用户(“N”)
SID限制 SID特权

DOMAIN/Domain Users Everyone BUILTIN
/Administrators BUILTIN/Users NT AUTHORITY
/INTERACTIVE NT AUTHORITY
/Authenticated Users LOCAL

SeChangeNotifyPrivilege

表 3. 受限制的用户(“C”)
SID限制 SID特权
DOMAIN/Domain Users 
Everyone
BUILTIN/Administrators 
BUILTIN/Users
NT AUTHORITY/INTERACTIVE
NT AUTHORITY/Authenticated Users
LOCAL
DOMAIN/Domain Users 
Everyone
BUILTIN/Users
NT AUTHORITY/INTERACTIVE
NT AUTHORITY/Authenticated Users
LOCAL
NT AUTHORITY/RESTRICTED

SeChangeNotifyPrivilege

表 4. 不受信任的用户(“U”)
SID限制 SID特权
DOMAIN/Domain Users 
Everyone
BUILTIN/Administrators 
BUILTIN/Users
NT AUTHORITY/INTERACTIVE
NT AUTHORITY/Authenticated UsersLOCAL
NT AUTHORITY/RESTRICTED 
Everyone
NT AUTHORITY/INTERACTIVE
NT AUTHORITY/Authenticated Users
BUILTIN/Users

SeChangeNotifyPrivilege

红叉标记表示该 SID 仍在令牌中,但它是一个拒绝 SID。具有此特性的 SID 是一个仅限拒绝的 SID。当系统执行访问检查时,会检查是否有适用于该 SID 的拒绝访问的 ACE,但是它会忽略适用于该 SID 的允许访问的 ACE。

最大的特权和 SID 增量介于管理帐户和普通用户帐户之间。正如您所看到的那样,除 Bypass Traverse Checking 特权(又称为 SeChangeNotifyPrivilege)以外的所有特权都从令牌中去掉了。受约束的用户和不受信任的用户是普通用户的较小增量,而且您可能会开始看到一些应用程序因安全限制错误而失败。我的观点是,对于大多数任务使用 Normal(默认值),如果您认为可能会浏览恶意或危险的网站,则可以使用 Constrained。

发现安全缺陷

许多人都解决了我在上一篇文章中的错误。当代码只从该文件读取时,CreateFile 函数会为所有访问打开该文件。FILE_ALL_ACCESS 应当替换为 GENERIC_READ 或类似内容。这是不好的,因为很可能只有管理员(而非普通用户)才可以使用该代码。我经常看到此错误。

您是否能发现这个代码缺陷?前几天,我碰到过这个错误,它是某个 Java DNS 程序中的一个错误。这是一个有趣的错误,我在 C# 中重新编写并总结了这个缺陷。

Int16 req;
...
while (true) {
    getRequest();
    req++;
    arr[req] = DateTime.Now;
}

Michael Howard 是 Microsoft 安全工程设计组的高级安全项目经理,他与别人合著了 Writing Secure Code 一书(现在是第二版),并且他是 Designing Secure Web-based Applications for Windows 2000 一书的主要作者。他还与别人合编了 IEEE Security & Privacy Magazine 中的 Basic Training。他致力于确保人们所设计、构建、测试和记录的系统符合安全要求。他最喜欢的一句话是“一人之工具,他人之凶器”。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DropMyRight是由微软程序员迈克尔•霍华德研制的工具软件.一个能够把其他程序的运行路径作为参数的小工具。例如,一个系统管理员身份的用户想要以更加安全的方式运行Internet Explorer,那么他可以运行下面的这个命令行:C:\path\to\dropmyrights.exe "C:\Program Files\Internet Explorer\iexplore.exe" C这样,就能让IE以比较低的系统权限(Level C)来运行,即“受限用户身份(Constrained user)”。在这种情况下,倘若IE或者Firefox出现任何安全漏洞,其影响都能得到极大程度的控制。“DropMyRight”这个小工具所涉及到的三个参数如下:N 代表着 普通用户(Normal User) C 代表着 受限用户(Constrained User) U 代表着 不受信任用户 (该设置将导致大多数网络应用软件的无法运行).      呃.. 看了简介,也瞅了“照片”,各位同学有没有觉得这个小东东很贴近我们的实际应用?它确实是个很棒的工具。   最初.. 小编已记不清最初是怎么找到这个软件的了,但几乎可以肯定是与IE有关,最初小编的电脑中是不安装杀毒软件的,自然也不知防火墙为何物,那时是“暗黑破坏神”1.09年代。不装杀软绝不是因为想“裸奔”,当时也没那个资本,说出来不怕同学们笑,是因为那时对杀软完全没有概念。那时我们同玩“暗黑破坏神”的一位战友,人很好,在自己的PC上设置了FTP服务,我们可以从他那下载到很多好东西。呃.. 那是个精神生活贫乏的年代,没有BT,不知有没有EMULE(小编很晚才用这个),那时很多下载资源还都是通过FTP的方式被下载,在网友间传播,比如那时有很多论坛都设有自己的FTP下载服务,但只对注册用户开放,或需要你混到星级会员才可,那个年代.. 2001,2002左右吧~   呃,说远了,回来继续说杀软件的事情。我们那位战友公布了自己的FTP之后,很快又在论坛上发贴,很气愤的说某某人到底想干吗?为什么疯狂的攻击FTP服务器,有什么意见直说,IP是x.x.x.x,我一看,那正是小编本人的IP。经过沟通,认错,博取同情,提出需求等一系列流程后,FTP大哥向我推荐Symantec的杀软+防火墙,安装完毕后扫描系统,当时在PC中就查出上千的病毒文件,看着这触目惊心的画面,小编心想还是重将吧,这次重装WINDOWS 2000,标志着一个新时代的开始,也标志着将我周围的哥们儿们带入了一个全新的时代…….   但很快发现,想不中招,仅靠杀软还是不够的,小编的机器依然会中招,只是可能,由以前的周装机延长至月装机,例汤啊,月度的。小编是思进取的,开始使用杀软只能算是启萌教育,很快小编学会了使用GHOST,如获至宝,再后来就再没什么进步了, 这种不痛不痒,但也不舒服的日子持续了数年有余,主要是除了杀软,小编不知还能靠谁?直到后来小编将自己的本地用户权限由管理员降为了普通用户——这回应该算是找到终极解决方案了。   在使用普通用户数日后,小编对用户权限有了概念,这时觉得DropMyRight确是个实用的工具。其实对于规范用户权限,在公司中是很容易做到的,但有两种用户可能会无视相关的公司系统策略,一是公司的网络管理员,目地当然是给自己行个方便,二是公司的老板们,网管们的贿赂手段,目的当然是给他们行个方便,同时也给自己行个方便。在此也提一下家庭用户,所有家庭用户相信都是处在:使用管理员用户+防病毒软件 这一应用环境下。这一环境就好像是在搞拔河比赛,一方是病毒,另一方是防毒软件,论天下谁是英雄?基本上都会是病毒,防毒软件在个把月后基本上都会让系统死得很难看。不知大家有没有想过一件事,系统(WINDOWS),病毒,防毒软件这三者到底是个啥关系?普遍的认为杀软是警察(形象光辉高大,并且能一肩抗起所有职责),系统是BABY(太弱),而病毒是坏蛋,对于这个观念是如何形成的,并根植于每个人的脑中,其实很大程度上是有人希望我们这么想.. 在这样一种关系中,我们普遍都认为,系统是被保护的对像,应该生活在无菌病房中(相信很多人在重装完系统后第一件事就是安装杀软件吧,然后才是安装驱动及其它程序,足见大家对安全还是蛮重视的),它没有一点自己我保护能力,所有的战斗都发生在病毒与杀软之间,经过数回合的较力,最终杀软被病毒踩在脚下,我们尽力了,杀软说,用户说:我们原谅你,都怪WINDOWS太弱了, WINDWOS刚要说。。。。。。,众杀软卫士立即大声说:你什么也不用说了,有我们呢…!久而久之,WINDOWS几近成了个哑吧,只会说很有限的几个字,像什么漏洞,补丁,UPDATE,冲击波,ms08-067之类。   在病毒与杀软的拔河比赛中,WINDOWS有没有立场呢?当然有,它靠得是什么?基本上靠得就是用户权限。打个比方,在一场拔河比赛中,病毒是坏蛋这个自不必说,小编觉得WINDWOS就像是个胖子,而且是个有很多FAT的胖子,它有多重?一打儿病毒加一起,它们来玩拔河比赛,病毒也不一定能占到什么便宜。杀软这时再哪?因为WINDOWS太胖了,挠痒痒会有问题,杀软正在挠ing…   怎么才能让WINDWOS由BABY变为胖子?其实很简单,使用“普通用户”就可以了,如果在做到这点的基础上定期UPDATE补丁,那WINDOWS就会变得更肥!当然此肥非彼肥,此处越肥越安全,并不是越肥系统越慢。但要注意,第一点是前提,只做第二点没有一点意义。做到第二点不难,但做到第一点有时确实不易,尤其对于公司中老板级的用户,对于家庭用户,这也将是个两难的选择,使用普通用户必然会带来一定的不方便,相对于安全,我想大部分用户还是会放弃使用普通用户。   WINDOWS系统被病毒搞死,其实威胁很大程度上来自三个方面,一是INTERNET,二是U盘,三是公司局域网本身,这回不说二与三,只说一。   病毒想在系统中搞破坏其实还是挺难的,因为首先它需要管理员权限将自己安装在系统中,如果安装不成功,那此时的病毒基本上是做不了什么的。对于这种未成气候的病毒,杀软能很好的处理,并且一般处理过之后还都会弹出醒目的信息,好似在向用户邀功一般。杀软始终是配角,WINDOWS很结实,可惜它不能杀毒,但它能很好的保护自己,我们需要杀软,但绝不是用它来做WINDWOS的保姆。但现实的情况却是,很多用户无法使用普通用户,那我们可不可以对某几个程序“使用”普通用户,只要防住几个点,WINDOWS也能变成个“准”胖子。方法当然有,使用起来也很简单,小编开头所说的DropMyRight就可以做到这些。   说了那么多好处,关键是如何使用。DropMyRight在网上可以下载到,是一个dropmyrights.msi文件,安装后会在用户指定的目录下产生数个文件,如下图:      "C:\Documents and Settings\jj1\My Documents\MSDN\DropMyRights\DropMyRights.exe" "C:\Program Files\Maxthon\Maxthon.exe" /n   小编上网使用的是MAXTHON,以此为例解释一下DropMyRights的使用。"C:\Documents and Settings\jj1\My Documents\MSDN\DropMyRights\DropMyRights.exe"这一段指的是DropMyRights的安装路径,"C:\Program Files\Maxthon\Maxthon.exe"是maxthon的安装路径,两者之间以一个空格分隔,最后的/n便是DropMyRights的运行参数,N指的是普通用户权限。   做个最简单的测试就知有没有效果了,使用MAXTHON在C:\WINDOWS下创建文件,如果创建成功,那证明浏览器是不安全的,如果创建失败,那证明浏览器是安全的。      上网是危险地~ 那是因为你还没有使用DropMyRights,呵呵,广告词?不过确实管用。   还有一个细节问题,那就是我如何方便的得到程序的安装路径呢,手工KEY IN还是不够方便,一个简便的方法是为程序创建一个快捷方式,然后在此快捷方式上点击右键,查看其属性,在“目标(T)”一栏显示的就是程序路径了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值