Windows Vista的UAC功能浅析(一)(上)

拿到了MS的Windows Vista Developer Story,正在抽空仔细的看,这里当作记一些笔记吧,顺便把文档作一些翻译和归纳记录一下,免得以后忘记了,呵呵。

Vista UAC和开发相关的新技术主要有下面一些:

  1. ActiveX Installer Service

    ActiveX Installer Service为标准用户(standard users)提供Active控件安装的服务,这项服务保证了常规的运行任务不会被失败的ActiveX空间安装影响。Vista为IT专业人士提供了一些组安全策略,用于定义标准用户可以安装ActiveX控件的URL。ActiveX Installer Service包含一个Windows service、一组管理模板、以及IE的一些改变。这是一个可选的安装组件,只会在安装之后才发挥作用。

  2. Installer Detection

    顾名思义,这个技术提供了对安装程序的识别支持。在UAC环境下,某些传统的安装程序可能无法取得必须的权限执行安装,Windows提供了这样一种技术,使得安装或者升级程序会自动被系统识别,并在运行时自动提示用户以管理员权限运行安装程序。

    Installer Detection只作用于32位可执行程序、程序的Manifest内不包含requestedExecutionLevel元素、UAC环境下的以Standard User运行的交互式进程。

    当32位进程创建后,会根据以下一些属性判断是否是一个安装程序:

  • 文件名包含关键字:"install", "setup","update"等等。
  • 在版本资源的以下字段内包含关键字:厂商(Vendor)、公司名(CompanyName)、产品名(ProductName)、文件说明(File Description)、初始文件名(Original Filename)、内部文件名(Internal Name)、导出名(Export Name)。
  • 在可执行文件的manifest内包含关键字。
  • 在链接到可执行文件的特定StringTable中包含关键字
  • 链接到可执行文件的资源文件数据包含关键属性。
  • 可执行文件包含特定的字节序列。(这一项应该是识别现在的各种安装包格式的特征)

安装程序识别技术默认打开,并且可以在安全管理器或者组管理器里面修改设置。

  1. User Interface Privilege Isolation

    这个不知道该怎么翻译,用户权限隔离?呵呵

    这东西对木马或者病毒还是有些作用的。

    User Interface Privilege Isolation用于将完全管理员权限的进程和同一桌面的其他权限较低的程序进行隔离。UIPI作用于窗口和图形子系统,例如提供窗口和用户界面控件的USER子系统。UIPI阻止低权限的进程通过Windows Message发送输入到高权限进程,而高权限进程可以发送到低权限进程。

    UIPI阻止低权限进程的如下行为:

  • 验证高权限进程的句柄的有效性
  • 调用SendMessage或者PostMessage发送消息到高权限进程。如果这样使用,函数会返回成功,但是发送的消息会被丢弃掉。
  • 使用线程钩子(Threads hooks)附加到高权限进程。
  • 使用日志钩子(Journal hooks)监控高权限进程。
  • 对高权限进程进行dll注入。

在UIPI有效的情况下,进程间的以下资源是可以跨权限访问的:

  • 前台的Desktop window。
  • 桌面堆共享内存
  • 全局的atom table
  • 剪贴板
  1. Virtualization

    Vista之前的系统,程序一般都使用Admin权限运行,所以可以自由的读写系统文件和注册表。但是在UAC下,以标准用户模式运行时,读写这些目标会失败。为了提高应用程序兼容性,Vista提供了一套虚拟访问的机制。

    Virtualization分为文件Virtualization和注册表Virtualization。仅作用于32bit的应用程序对系统文件/目录、注册表的读写。64位程序、非交互式程序、模拟程序(Processes that impersonate)、内核调用者、含有requestedExecutionLevel属性的可执行文件不包含在Virtualization的作用范围内。

    当应用程序在目录或者注册表中枚举资源的时候,Windows Vista会合并虚拟的和全局的文件/注册表键到单个List中,在合并视图中,全局(被保护的)资源也会和虚拟资源一起包含进去。

    MS关于虚拟存储的建议:

    虚拟存储只是为了应用程序兼容性而存在,为Vista创建的应用程序不应该访问系统敏感数据,也不能依赖虚拟存储来纠正程序的不正确行为。当转移代码到Windows Vista时,应确定在运行时,应用程序只能在有ACL被适当设置的用户目录或者%alluserprofile%存储数据。

    当更多的应用程序移植到Vista 之后,MS可能在未来版本的Windows取消对虚拟存储的支持。例如64位应用程序是禁用虚拟存储的。

  • 在适当的情况下为应用程序的Manifest加入requestedExecutionLevel,这样会禁用虚拟存储。
  • 不要使用注册表作为进程间通信的途径,服务和应用程序拥有注册表键的不同视图。
  • 在Vista下测试你的应用程序,确认当运行在标准用户模式下时,不会向系统全局名字空间写入数据。例如%systemroot%。
  • 对于过滤驱动开发者:检查驱动存在的层的范围,确过滤驱动在FSFilter之上。
  • 记住虚拟存储的资源是每个用户都对全局资源有一个Copy。
  1. File Virtualization

    当程序向只允许Admin访问的路径写入的时候,系统会将它重定向到一个用户相关的虚拟目录中,位于%LOCALAPPDATA%\VirtualStore。之后,应用程序再读取这个文件时,就会从虚拟目录中读取。Virtualization使得程序认为自己在读写保护资源,但实际上读写的是虚拟的资源。

    例如一个用户使用的某个程序是在标准用户模式下运行,并且该程序经常读写在\Program files里面的某个文件,那么当用户通过Explorer.exe寻找这个文件时,他在\Program files里面看到的只是一个全局文件,他需要定位到虚拟存储的位置,才能找到保存数据的真实文件。

  2. Registry Virtualization

    注册表的虚拟存储和文件虚拟存储类似,对HKEY_LOCAL_MACHINE\SOFTWARE的读写会被重新定向到HKEY_CLASSES_ROOT\VirtualStore\SOFTWARE。在这个主键下面,每个用户都会有它自己对HKEY_LOCAL_MACHINE\SOFTWARE读写过的数据的复制。

    注册表虚拟存储的概要:

  • 可以被Software hive (程序集?)打开或者关闭。
  • Reg.exe有新的主键级的FLAGS选项,允许递归的启用或者禁用虚拟存储和控制打开访问权限策略(open access right policy)。
  • ZwQueryKey:可编程查询一个键的重定向标志。
  • 虚拟存储发生在WOW64重定向之上。
  • 存在64位和32位注册表视图:

    HKEY_USERS\UserSID_Classes\VirtualStore\Machine\Software 以及

    HKEY_USERS\UserSID_Classes\VirtualStore\Machine\Software\SYSWOW3264

  • 大多数vista出现之前的应用程序都会使用32位视图。
  1. Access Token Changes

    关于Access Token的问题,Vista改变还是不少的,由于以前很少接触到权限相关的东西(很少有人更改安全配置,所以一般程序里面都没有管这些问题),这部分的东西看起来有点头痛,呵呵。

    在以往版本的Windows中,当Logon进程为管理员创建Access token时,这个token包含大多数的Windows特权和大部分的管理员SID(security identifiers)。但是在Vista添加UAC之后,这种方式有了更改。当一个管理员用户登录到Vista系统时,系统可能会创建两个Access token:一个经过过滤的标准用户令牌,一个拥有完全的管理员权限的令牌。登录桌面(Explorer.exe进程)现在使用标准用户令牌,而不是完全管理员令牌,所以Explorer的子进程继承了这个令牌,一般都是以普通用户权限运行的。

    当用户登录到Vista系统时,系统会检查该用户拥有的管理员特权和Relative IDs (RIDs),以决定是否为用户创建两个Access Token。当以下任意一个条件满足时,就会创建两个token:

  • 用户帐户包含下面任意一个RIDs:
    • DOMAIN_GROUP_RID_ADMINS
    • DOMAIN_GROUP_RID_CONTROLLERS
    • DOMAIN_GROUP_RID_CERT_ADMINS
    • DOMAIN_GROUP_RID_SCHEMA_ADMINS
    • DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
    • DOMAIN_GROUP_RID_POLICY_ADMINS
    • DOMAIN_ALIAS_RID_ADMINS
    • DOMAIN_ALIAS_RID_POWER_USERS
    • DOMAIN_ALIAS_RID_ACCOUNT_OPS
    • DOMAIN_ALIAS_RID_SYSTEM_OPS
    • DOMAIN_ALIAS_RID_PRINT_OPS
    • DOMAIN_ALIAS_RID_BACKUP_OPS
    • DOMAIN_ALIAS_RID_RAS_SERVERS
    • DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
    • DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
    • DOMAIN_ALIAS_RID_CRYPTO_OPERATORS
  • 用户帐户包含任何不属于User权限的特权,属于User的权限如下:
    • SeChangeNotifyPrivilege
    • SeShutdownPrivilege
    • SeUndockPrivilege
    • SeIncreaseWorkingSetPrivilege
    • SeTimeZonePrivilege

另外,被过滤的那个Token包含的权限,是由原始的Token是否包含上面的被限制的特权决定的。如果该Token含有这些被限制的特权,除了以下几个之外,都会被移除:

    SeChangeNotifyPrivilege

SeShutdownPrivilege

SeUndockPrivilege

SeReserveProcessorPrivilege

SeTimeZonePrivilege

如果没有包含被限制的特权,则只有以下的Token会被移除:

SeCreateTokenPrivilege

SeTcbPrivilege

SeTakeOwnershipPrivilege

SeBackupPrivilege

SeRestorePrivilege

SeDebugPrivilege

SeImpersonatePrivilege

SeRelabelPrivilege

第一个访问令牌,称为限制访问令牌(filtered access token),拥有标记为USE_FOR_DENY_ONLY的在前面列出的RIDs,而未在前面列出的管理员权限则被移除。当用户启动应用程序时,默认使用限制访问令牌,而未被更改的拥有完全权限的令牌,会附加到限制访问令牌,用于在应用程序要求获得完全权限时。

posted @ 2012-02-29 18:03  陈英俊  阅读(617)  评论(0编辑  收藏  举报