概述
安全上下文指的是一类定义某个进程允许做什么的许可和权限的集合。Windows中的安全上下文是通过登录会话(Logon Session)定义的,并通过访问令牌维护。顾名思义,登录会话表示某个用户在某台计算机上的某次会话过程。开发者可以通过访问令牌与登录会话进行交互。访问令牌所有用的许可和权限可以与登录会话的不同,但始终是它的一个子集。
安全上下文的概念范围是很广的,权限、特权、访问令牌、完整性等级等等都包含在其中。
这就是软件限制策略和UAC工作原理中的最核心部分。
所以在这里讨论的内容,都是属于安全上下文的范畴。
有不少人问过这样的问题:仅仅一条软件限制策略规则——IE基本用户,安全么?
那么我可以有点遗憾地告诉你,不安全,至少不能做到很安全,但仍然很强大
现在再介绍一下基本用户:
基本用户实质上是一个安全等级(SAFER LEVEL),当然除了基本用户外还有其它的安全等级,以下一一列出
SAFER_LEVELID_DISALLOWED 不允许的 ,对应值 0x00000 (0x代表16进制)
SAFER_LEVELID_UNTRUSTED 不信任的 ,对应值 0x01000
SAFER_LEVELID_CONSTRAINED 受限的 ,对应值 0x10000
SAFER_LEVELID_NORMALUSER 基本用户 ,对应值 0x20000
SAFER_LEVELID_FULLYTRUSTED 不受限的 ,对应值 0x40000
其中不受限的和不允许的默认就是开启的,也就是DefaultLevel的值为 0x40000 + 0x00000 = 0x40000
到这里大家应该明白为什么我们把Levels的值设为0x31000能打开其它安全等级了吧
——0x01000 + 0x10000 + 0x20000 正好等于 0x31000,而 Levels + DefaultLevel = 0x71000 ,正好可以打开所有的安全等级
现在我们只关心基本用户的情况,基本用户到底是一种怎样的限制?
微软的简单说明是:Allows programs to execute as a user that does not have Administrator or Power User access rights. Software can access resources accessible by normal users.
也就是说基本用户相当于一个普通用户(Users组的帐户)的权限
运行在该等级下的程序,被排除了本地管理员组的成员关系,同时还排除了仅分配给管理员的特权。运行在该安全上下文中的进程,拥有标准用户的特权和访问权限,防止该进程修改系统文件和注册表键值,同时防止该进程使用只有管理员才能拥有的特权,例如“加载和卸载设备驱动程序”特权。
顺带补充一下,绝大部分的程序在基本用户都是能正常运行的,即使是杀软的GUI。
事实上,我们可以看到,基本用户令牌中把Administrators的SID标记为“拒绝”,同时它只有一个特权——“跳过遍历检查”,这其实只是一个很卑微的特权
基本用户与受限帐户的不同
主要有三点
1.基本用户没有“关闭系统”和“从插接工作站中取出计算机”特权。这意味着基本用户下的程序无法关闭或重启计算机了。如果使用策略规则Explorer基本用户的话,你就会发现“关闭系统”的按钮直接消失了。不过要实现关机还是有方法的,例如同时按Ctrl+Alt+Del呼出任务管理器来关机,或者曲线救国,先注销,然后再关机 =_= 不过也并不麻烦
2.基本用户把Administrators组标记为“拒绝”,而不是从Administrators组中除去
图:
标记为拒绝(deny only)的意思是,在形式上,基本用户下的程序仍然属于Admin组,但实际上却没有管理员被允许的权限,只有被拒绝的权限。而受限用户是不属于Administrators组的,但却可以通过一些途径使之隶属于该组,这个就是帐户提权了。
3.基本用户是内置安全等级,而受限帐户却不是。受限帐户的特权可以任意指派,但基本用户却无法这样做。因此基本用户的特权提升也是不允许的。
不过大体来说,受限帐户登陆“相当于”Shell基本用户。另外值得一提的就是,无论受限帐户还是基本用户,都可以利用Runas(或者右键里的“运行方式”)来以其它帐户身份临时运行一个程序,关于这点在下文会再提及。
那为什么说基本用户其实并非十分安全?
那是因为基本用户并没有定义足够安全的安全边界
什么是安全边界?安全边界就是一道隔离墙,如果没有通过安全策略的验证,代码和数据就不能打破这道隔离墙。举个例子,在不同的会话中运行的用户帐户,会通过Windows安全边界进行分隔。如果没有其他用户的允许,一个用户不能读取或者修改其他用户的数据,也不能让其他用户执行代码。如果由于某些原因而可以绕过安全策略,这就意味着Windows系统存在bug(或者是第三方代码的原因)。
在基本用户等级所形成的隔离沙盒中,唯一的缺陷是:在隔离沙盒中的进程是以当前用户的受限形式运行的,所以只要受限用户(Users组)有权读写的文件、注册表键值、甚至别的进程的权限,该进程都能访问。这样就能打穿隔离沙盒的墙壁,如果恶意代码是专门为这种受限环境而编写的,那么它就可以利用这种手段,绕过隔离沙盒的限制。
例如基本用户下的程序可以通过注入或发送消息的方法控制高等级的进程,如Shell。不过具有System权限的进程仍然无法访问(需要DEBUG特权)。
当然基本用户不会因此而变得没有实用价值。因为基本用户可以配合NTFS权限和注册表权限的调整而增加安全性。
前面说过,基本用户没有管理员的权限,但属于Users组,那么我们可以通过设置NTFS权限来限制基本用户
至于NTFS权限如何设置,这里提供一个基本的思路:
1.下载区(数据区,例如Documents and Settings下的大部分位置,IE缓存等)允许读写、创建、删除,即开放NTFS的FD权限,但不允许运行程序(这点可以用软件限制策略的“不允许”来实现)
2.程序区,包括系统目录,Program Files和其它程序目录,允许Users读取和运行,但不允许写。必要时可以设为允许创建和写新文件,但对已存在的文件保持只读,但工作量会稍大一点
3.想BT点的,可以对Windows等关键目录实行白名单策略
如此设置后,使用基本用户的安全性就会大大提高。
理论上,凡是会外联的程序都应以低权限运行,而且这些程序往往不需要任何管理员权限就能正常运行。典型的例子就是浏览器和下载工具。而对于外来的不信任数据源,如可移动设备,可以直接不允许运行,这样,简单的安全策略就能应付大部分的安全危险了。
还有就是有人问到的ARP问题。基本用户是不能阻止ARP攻击的,但却可以在ARP攻击下保你安然无恙。例如ARP挂马,受攻击的还是浏览器,浏览器基本用户依然能防,只是掉线问题无法解决罢了。
事实上在降权后,还能感染破坏系统的病毒已经是极少数了,如果权限设置得当的话,病毒甚至无法进入本地或者根本无法运行,例如针对病毒的入口封锁战术。
至于这种降权能达到怎样的安全效果之前已经讨论过了,当然是可以很强大,这里就不再赘述
降权与提权:
目前实现软件降权运行的有这么几种方法:
1.软件限制策略
2.Runas
3.Vista的UAC
4.使用DropMyRights、PsExec和Proccess Explorer的“以受限用户运行”
5.使用受限用户登陆
软件限制策略的规则适合作为静态防御,Runas、DropMyRights等可以作为动态的补充
至于1和5,我更推荐1,因为受限用户的环境完全可以用基本用户来模仿,只要Shell基本用户就可以了,而且比受限用户更安全。
值得一说的是Vista的UAC,UAC工作时,默认让Shell运行在类似基本用户的环境中,这点与基本用户还是很相似的,而它与静态规则相比的优势是:它能够即时更改进程的安全上下文,提供了降权与提权的快捷通道,因此是使管理员帐户脱离高权限的最好方法。
所以在这里提出一个建议,千万不要轻易关闭你的UAC,除非它真的让你无法忍受或者你有更好防御方案。
与降权相对应的是提权,简单的例子就是右键里的“运行方式”,它可以让你在使用受限用户(Users)登陆系统时,使用其它帐户的权限运行程序,例如Administrator。不过它需要额外的用户名和对应的密码,而且它依赖于服务“Secondary Logon”。
受限用户登陆时,系统服务仍然是处于不受限状态,而且是以System权限运行,真正受限的只是Shell。所以这里就存在利用服务来进行提权的可能。
事实上,“运行方式”的提权原理是利用svchost.exe(服务宿主)创建属于某帐户的令牌,并以该令牌启动程序。因此,运行程序的父进程是svchost。所以严格来说,这还不算是提权,它只是以另一个帐户的身份来执行程序罢了
另外,如果对一个已经在软件限制策略中设定为基本用户的程序使用Runas的话,最终还是会提权失败
另一种提权是为帐户提权。其实,只要通过更改帐户的特权和组的隶属关系,完全可以把一个名为Guest的帐户(来宾用户)提升至具有完全的管理员权限。简单的做法就是通过“用户权利指派”和计算机管理中的“本地用户和组”。
需要指出的是,在正常情况下,无论是降权或者是提权,权限的继承总是存在的,子进程不能超越父进程。
而例外的情况是什么?
有两种:
一是父进程拥有“创建记号对象”特权,这时允许父进程以任何令牌启动子进程
二是程序本地即时提权,而通常的方式是利用系统漏洞或者Hook API、注入系统进程、注册服务等等,这里就不介绍了
最后
以上就是鲜艳超短裙为你收集整理的什么是安全上下文(Security Context)?的全部内容,希望文章能够帮你解决什么是安全上下文(Security Context)?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复