作者:启明星辰ADLab
2018年8月27日,安全研究人员在Twitter上披露了Windows 10系统中的一个0day漏洞。该漏洞是一个本地提权漏洞,存在于Windows的任务调度服务中,允许攻击者从USER权限提权到SYSTEM权限。微软官方目前还没有提供相应的补丁。
Windows 10
Windows Server 2016
Microsoft Windows系统的任务调度服务中高级本地过程调用(ALPC)接口存在本地提权漏洞,该漏洞存在于schedsvc.dll
模块中的SchRpcSetSecurity
函数,SchRpcSetSecurity
函数定义如下,函数功能是设置安全描述符。
HRESULT SchRpcSetSecurity( [in, string] const wchar_t* path, [in, string] const wchar_t* sddl, [in] DWORD flags );
SchRpcSetSecurity
第一个参数为路径path,第二个参数为安全描述符定义语言 (SDDL) 字符串sddl,该函数内部调用了SetSecurity::RpcServer
函数。
SetSecurity::RpcServer
函数首先调用ConvertStringSecurityDescriptorToSecurityDescriptor
将SchRpcSetSecurity
函数传入的sddl字符串转换为安全描述符SecurityDescriptor
。并调用TaskPathCanonicalize
函数对传入path参数路径规范化为Dst。
然后获取Dst路径的JobSecurity安全描述符pSecurityDescriptor
,继而调用JobSecurity::Update
函数,传入SecurityDescriptor
参数,更新pSecurityDescriptor
。
最后,调用JobSecurity::AddRemovePrincipalAce
函数设置DACL。
那么如何修改指定目标文件的DACL属性呢?首先,使用ZwSetInformationFile
函数为目标文件创建硬链接。然后,调用_SchRpcSetSecurity
函数设置硬链接文件的DACL,等同于修改目标文件的DACL。通过设置SchRpcSetSecurity的第3个参数,可以为用户Administrators(BA)、Authenticated Users(AU)添加对硬链接文件的写入权限。
以PrintConfig.dll
文件为例,调用SchRpcSetSecurity
函数前,文件访问权限如下,此时Administrators不具有对文件的写入权限。
调用SchRpcSetSecurity
函数后,文件的权限如下,此时Administrators和Authenticated Users都拥有对文件写入权限。
由于SchRpcSetSecurity
函数存在安全验证缺陷,使得当前用户可修改只读文件的DACL,添加写入权限。成功利用该漏洞的结果如下图。
启明星辰积极防御实验室(ADLab)
ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员。截止目前,ADLab通过CVE发布Windows、Linux、Unix等操作系统安全或软件漏洞近400个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。