[转载]最小权限的挑战
by:Michael Howard转自:[url]http://www.hoky.org/[/url]
安全领域存在这样一种观点:执行某项任务只要有刚好足够的权限就可以了。为什么是这样呢?还是让我从一个小故事讲起吧。几年前,我在一家大银行从事安全咨询和编程工作。上班第一天,我惊讶地发现我的帐户竟然是域管理员组的成员。我询问为什么我是域管理员时,负责我工作的主管告诉我,因为我将要开发应用程序,而开发应用程序就要求我是一名域管理员。我立即要求将我的帐户改为普通用户,而不要作为管理员。原因很简单,开发应用程序不需要用户拥有这样的特权帐户。但是为什么不能是域管理员呢?原因同样简单,如果银行遇到任何严重危及安全的情况,域管理员都是第一个受怀疑的对象,因为他们拥有那么大的能力。如果我的帐户只是一个简单用户,而简单用户做不了太多事情,因此也就少有机会危及系统的安全。当然,域管理员应该是值得信任的人,但我宁愿是一个没有什么特权的可信用户。不妨称我为偏执狂!
最小权限和操作系统
使用应用程序时,最小权限的概念同样适用。运行应用程序时,您的权限应当始终以足够完成工作为准,而没有必要拥有更大的权限。阅读邮件时,您无需拥有管理员权限;撰写文档时,也只需要您的帐户是普通用户就可以了。某些任务要求比较大的权限,例如配置计算机和管理用户帐户。但是让人诧异的是,几乎没有什么任务要求用户具有至高无上的权限,因此,大多数用户没有必要拥有管理员权限。
为什么要在软件中设置最小权限呢?
好,现在我们来讨论一下为什么要在软件中设置最小权限。假设攻击者可以利用您的进程做一些危险的事情,再假设您的代码正在以较高的权限运行。猜猜危险的黑客会拥有什么级别的权限?没错,是您的进程的所有权限。因此,如果该进程正在由具有管理员权限的用户使用,危险的黑客将具有相同的权限。一旦危险的黑客具有管理员权限,他就可以利用计算机为所欲为。真正的为所欲为!有一个很好的例子:如果您的代码存在缓冲区溢出漏洞,攻击者注入的代码就可以以管理员身份运行。从这个故事得到的教训是:除非绝对需要管理员权限,否则切勿以管理员身份运行您的应用程序。
为什么应用程序要求高级权限呢?
通常,有三个原因要求以高级权限执行应用程序。这三个原因是:
访问控制列表 (ACL) 问题。
权限问题。
使用 LSA 机密。
下面我们来详细介绍每个原因。
ACL 问题
假设 NTFS 分区上有一个文件夹,该文件夹具有以下 ACL:
SYSTEM(完全控制)
Administrators(完全控制)
Everyone(读取)
除非您是管理员或系统帐户(许多服务都以系统帐户运行)等特权帐户,否则您只能在该文件夹中读取文件。您无法写入、无法删除、也无法做其他任何事情。如果您的应用程序尝试执行读取之外的任何文件输入/输出操作,则将收到访问被拒绝的错误信息。要习惯这一信息——拒绝访问是错误 #5!
这是一个非常常见的问题。将数据写入文件系统的保护区域或操作系统的其他部分(例如注册表)的应用程序要求应用程序用户具有管理员权限,才能正确运行。您知道有多少种游戏可以将排行榜信息写入 C:\Program Files 目录吗?让我替您回答,非常非常多。这就存在一个问题,因为这意味着游戏玩家必须是管理员。由于很多游戏都允许用户通过 Internet 与别人一起玩,这意味着他们必须打开套接字,如果游戏套接字处理代码中出现缓冲区溢出或类似的漏洞,攻击者就可以利用这一漏洞运行代码,并且代码将以管理员身份运行。游戏结束!
ACL 问题略有不同:它是开放的资源,拥有的权限比需要的要多。例如,假设某个文件上存在上面定义的相同 ACL,代码将为 GENERIC_ALL 打开该文件。那么,用户需要使用什么帐户才能使代码运行不会失败呢?Administrator(管理员)或 SYSTEM(系统)帐户。GENERIC_ALL 等同于完全控制。也就是说,您希望打开该文件,并且能够对文件执行任何操作,但是您的代码只需要读取文件。需要为 GENERIC_ALL 打开该文件吗?不,当然不。代码可以为 GENERIC_READ 打开该文件,但想想会发生什么情况?运行此应用程序的任何用户都可以成功地打开该文件,因为在该文件中存在 Everyone(读取)ACE。
记住,在 Windows NT
页:
[1]