去年冬天,提权漏洞一个做安全研究的提权漏洞朋友给我发了条消息:“又挖到一个本地提权,Windows的提权漏洞,稳定复现。提权漏洞”他语气平淡,提权漏洞像是提权漏洞说今天中午吃了碗面。我问他细节,提权漏洞他说就是提权漏洞一个服务进程的权限校验写漏了,普通用户能通过命名管道把SYSTEM令牌复制出来。提权漏洞整个过程不需要内存破坏,提权漏洞不需要绕过什么缓解机制,提权漏洞纯粹是提权漏洞逻辑漏洞。
提权漏洞这东西,提权漏洞说白了就是提权漏洞“你本来不该有这个权限,但系统让你有了”。提权漏洞它分两种:纵向和横向。纵向是从低权限爬到高权限,比如普通用户变成管理员;横向是从一个普通用户跳到另一个普通用户,权限级别没变,但访问范围变了。大多数人聊提权,默认说的是纵向。
为什么提权漏洞这么受攻击者欢迎?因为它是链条里最舒服的一环。你钓鱼拿到一个低权限shell,能做的事很有限——读不了敏感文件,装不了服务,改不了配置。但一旦提权成功,整台机器就是你的了。更关键的是,提权漏洞往往比远程代码执行漏洞更容易利用。RCE要处理ASLR、DEP、CFG一堆东西,提权有时候只需要调用一个没做权限检查的API。
Windows上经典的提权手法我见过不少。比如服务二进制路径没加引号,
C:\Program Files\Some Service\service.exe,系统按空格切分路径,依次找C:\Program.exe、C:\Program Files\Some.exe。如果你能在C:\下写文件,直接放个同名exe,服务重启时就以SYSTEM权限跑你的代码了。这个漏洞微软2001年就发过公告,但直到2018年还有人在实际环境里挖到。Linux这边也不干净。SUID程序是重灾区。一个SUID root的二进制如果调用了
system()或者popen(),而环境变量PATH又可控,那基本就是白送。更隐蔽的是SUID程序依赖的共享库被劫持,或者它读取的配置文件放在用户可写目录里。我见过一个备份工具,SUID root,会读取当前目录下的.backuprc,里面可以指定要执行的脚本。这设计简直是把钥匙插在门上还贴了张纸条。提权漏洞的根源通常不是内存安全问题,而是权限边界设计失误。开发者写代码时假设“这个接口只有管理员会调”,但没在代码里验证调用者身份。或者假设“这个目录普通用户写不了”,但实际权限配置是777。这类漏洞靠模糊测试很难发现,得靠人工审计权限模型。
修复提权漏洞比修复内存漏洞麻烦。栈溢出你加个边界检查就完了,提权漏洞往往涉及整个权限体系的重新设计。比如一个服务以SYSTEM运行,它创建的命名管道默认安全描述符允许Everyone读写,你要改成只允许Administrators,但改完之后依赖这个管道的其他组件可能就挂了。安全性和功能性的拉扯在提权漏洞修复里特别明显。
普通用户能做什么?别用管理员账户日常上网,这能挡掉大部分提权攻击的最终目标。及时打补丁,尤其是那些“本地权限提升”的补丁,很多人觉得本地漏洞无所谓,但攻击者拿到低权限shell之后,本地提权就是下一步。还有,别随便装来路不明的软件,很多提权漏洞就是第三方软件的服务或驱动引入的。
提权漏洞不会消失。只要系统还有权限分层,只要代码还有权限检查,就一定会有人写漏。攻防双方在这条战线上拉锯了二十多年,以后还会继续拉下去。
顶: 648踩: 992






评论专区