编辑按
crownless:系统安全建设是一个复杂而困难的任务。macOS作为安全性广受好评的操作系统,采用了众多技术,强势占领安全高地。
非虫版主从技术角度的剖析令人印象深刻。安全是一个整体,面对日益增长的高级安全威胁,系统设计者和应用开发者需要时刻紧跟安全趋势,才能永远立于不败之地,守住安全大门。
嘉宾介绍
丰生强 (id:非虫),奇安信安全威胁情报中心安全研究员,专注软件安全领域。《Android软件安全与逆向分析》、《macOS软件安全与逆向分析》、《Android软件安全权威指南》作者。
10多年前,终端安全曾被认为是“安全最后一公里”,经过16年的演绎,这个话题技术已经延展成为成熟型企业的必然选择。经过16年的演绎,这个话题技术延展成为成熟型企业必然要选择的。
然而针对macOS平台产品化思路在国内大会上讨论比较少,本次峰会上丰生强(非虫)带领大家打开macOS平台安全产品的安全思路,并从安全研究与Agent实现的视角,讲解了macOS平台的EDR安全能力建设。
演讲具体内容
以下为速记全文:
我们首先介绍一下什么是EDR、EDR是为了解决什么问题而产生的、EDR系统架构、macOS平台上系统安全机制、系统自带的安全限制,了解这些安全机制之后非常有利于我们在macOS平台上进行安全开发。
后面会介绍macOS终端上的agent实现技术方案,以及开发调试需要注意的点。
关于我,我从事安全有10多年,在2013年、2016年以及2019年这三个时间点出版三本软件安全相关的书籍,目前我就职于奇安信情报中心,它的前身是360情报中心,现在由于与360企业在公司数据与业务层面的分离原因,现在更名为奇安信威胁情报中心。
奇安信是国内非常专业的研究网络威胁情报的一个团队。大家可以关注我们团队的公众号【奇安信威胁情报中心】,每周会定时输出一些高质量的威胁分析与APT溯源相关的高级话题。
一、EDR概述
首先是安全产品,从最初的网络安全需求发展到现在,安全产品的种类已经非常多。大家看一下常见的安全产品有哪些,在早年对于业务安全需求比较多的情况下是WAF这个产品,它突出表现在对业务的API防护,比如说像常见的防注入、入侵检测。
这是主机安全上的IDS和IPS,IDS和IPS是目前讨论得比较多的一个安全产品,因为无论大小企业,都会用到这款产品。HIDS和NIPS最主要的区别是是否在主机端部署agent,agent是用来收集主机上的日志信息,用来后期的数据关联、数据分析。
早年的网络安全需求发展到现在,已经变成了非常大的网络安全市场,EDR也是一个转变的产品、是一个复合型的产品,它在终端上会分为终端的检测与响应,或者基于云安全平台的CWPP这个产品。
在奇安信这边,目前它的EDR产品有天擎EDR,主要方向是终端这一块。ATP产品是在国内比较知名的应该是微软提出的ATP产品,它被用来检测一些高级威胁。
大家看看这个安全能力象限,在企业安全建设过程中,安全能力体现产品开发思路以及产品在企业安全中扮演的角色,安全能力象限-检测、防护、预测、响应,这四个点代替了企业当中经常遇到的网络安全问题。
拿检测来说,检测恶意流量、攻击行为是IDS和SSP安全感知平台这些产品的功能需求,防护产品就是常见的杀软、WAF、防火墙这些产品,带NG这些产品名称是它是下一代的安全产品。
在预测方面,大数据的态势感知和威胁情报的平台可以对威胁进行预测,最后是响应中心。响应一般需要对安全数据进行运维,所以它需要一个安全运维平台和安全日志管理系统。
我们看看EDR的定义,EDR是2013年由Gartner提出的一个概念,它的早期只是一个概念,后面是以EDR的形式出现。EDR强调的是一种能力,我们刚才前面看到的安全象限,在EDR的能力中都会有所体现,它强调的是一种能力,而不仅仅是个工具。
EDR如何工作?它通过在主机端上部署agent,然后由agent采集数据,然后对大量数据进行分类、进行处理,然后对事件进行定义的这样一个过程。
二、EDR架构
这是国内比较知名的深信服公司,提出基于业务层面的一个架构图,它把EDR的架构分成了三部分:最底下是基础平台,主机代理agent是用于部署在客户主机上的,恶意文件分析引擎和web控制台和SOC进行联动。
核心引擎部分,常见的行为引擎是通过对一些规则的静态或动态分析,以及机器学习的算法,然后配合威胁情报以及一些大数据的处理、CEP等引擎。对所有采集到的数据进行处理;功能展现部分,是最终展示给用户或者管理人员的展示台。
我们今天重点讨论的点是主机代理在功能展现上的技术点该如何实现。
三、macOS平台上系统安全机制
我们看看苹果系统的架构,再讲讲它的安全机制,最后讨论它的安全机制。这张图是将苹果系统以组件形式划分为五类,从上到下是应用程序、媒体、核心服务、核心系统和内核这五层。我们重点关注的是第三层的安全层,以及内核这部分。
苹果系统有哪些机制?它在coreServices这个框架中提供了用户认证和代码签名的功能,在内核BSD提供了代码审计以及内核的授权认证。
在mach层提供MACF强制访问控制这个框架,这个框架是苹果非常重要的核心组件,它承载了苹果系统绝大多数的安全检测用途,我们在后面会重点讨论MACF。
最后是内核当中的网络编程NKE网络内核扩展,网络内核扩展是苹果系统提供类似Windows系统内核过滤驱动的组件,可用于对所有苹果电脑的网络流量进行监控、过滤以及修改。
四、macOS系统安全限制
基于这些安全组件,系统提供了一些安全限制。这些安全限制是苹果从用户态软件产品或者软件组件中给大家展示出的苹果的安全特性。
这个Authd的作用是当系统中低权限组件向高权限组件访问申请资源时,它会弹出授权用户的权限申请的对话框,这个对话框在底层是通过XPC向Authd申请这个权限。
这里有一个syspolicyd守护进程,它的作用是当所有应用程序启动安装时,它会用于管理这些用户执行的程序,对其实施一些系统的安全策略,它主要是实现了对gatekeeper以及用户授权的内核扩展的加载、以及APP的公正这三大块对底去的支持。
我们看一下gatekeeper,当新安装的软件从网络上下载后,它会经过gatekeeper向用户展示对话框,展示对话框中提供了APP下载的时间点以及下载的途径,只要用户点击“确定”之后才可以继续打开这个APP。它的实现在底层依赖于gatekeeper机制。
Gatekeeper在底层有quarantine机制,当你从网络上下载APP,这个APP会自带扩展属性,这个扩展属性是由quarantine守护进程来向应用程序写入,写入这个进程会在这当中有一个数据库来保存所有的quarantine,quarantine内核层面是通过内核扩展,然后使用这个框架获可常见的接口。
在syspolicyd这一块将所有的gatekeeper信息写入用户态的一个数据库中。
APP Translocation这个功能是强调在APP进行转移、移动复制这种场景下才会出现的。首先,当一个APP下载完后,它是带有Quarantine属性的,会对gatekeeper进行检测,但这时并不会触发APP Translocation。
APP Translocation是在10.12里引入的新特性,当一个APP通过U盘传到另外一台电脑上时,如果它带了Quarantine属性,它就有可能触发APP Translocation,U盘中直接执行微信程序会弹出一个框,这个框弹出之后我们可以看一下这个APP加载路径是这么一个随机受限制的目录,这就保证了通过U盘这些可移动的媒介去运行这个程序时不会对系统造成破坏。
用户授权的内核扩展是在10.13时引入的一个新特性,这个安全特性的作用是,当新安装的应用程序带着内核扩展,就我们熟悉的内核驱动,这么一个功能在早先的操作系统中是不需要确认就可以直接加载的,但是到了10.13时必须手动在设计页面点击“允许加载”它才会去加载,否则默认是不会被加载的。
在10.13的操作系统中实现这个功能是通过这个类,标红的这几个方法是用于检测加载时的信息,以及用户是否点击了“确认”,所有这些操作完的信息都会最终保存在SystemPolicy这个数据库,这个操作是由syspolicyd守护进程完成的。
这是APP公正,这个功能是在macOS 10.14.5引入,2019年4月7日后,所有开发者签发的APP都必须要加入APP公正这个过程,APP公正是开发者手动向苹果公司提出申请,由苹果公司对这个APP进行审核的过程。在底层这些所有的信息会写入一个数据库当中。
Rootless又称之为SIP,系统管理性防护这个功能,是防止用户获取最高权限的情况下对系统文件进行篡改的这么一个功能。即使在开启了SIP权限下,即使你拥有最高权限,也不能对苹果系统核心受保护的文件进行修改。
Rootless是从10.11引入的功能,所有受SIP防护的文件或目录,会有一个受限制的属性。
SIP是基于文件目录对软件进行防护的,比如说在调试过程中,开启SIP的情况下,对系统的应用程序,比如计算器是无法调试的,但是可以将计算器这个APP复制到不受限制的目录下,然后对它进行调试。
它的底层是由一个内核扩展来实现的,这个内核扩展的底层也是使用AMFI这个框架,挂了MACF的几个常见的回调函数。
我们看看这个沙盒sandbox,同样是在10.11有的功能,可能更早。沙盒是依赖于底层和用户态的这种自定义沙盒语言对系统进行防护的,可以在系统的/Library/Sandbox/Profiles/目录下找到所有和沙盒相关的文件,这些文件是由系统维护升级,用户是没办法进行修改的。沙盒是由sandbox.kext扩展,底层也是Hook了MACF的一些回调实现的。
这是XProtect,是苹果内置的一款可以理解为“杀软”的工具,它的工具实现依赖于一个签名文件,这个文件的路径是在/System/Library/CoreServices/CoreTypes.bundle下面,所有的签名会动态更新。
MRT是苹果到目前为止还在更新的一款软件删除工具,这款工具和XProtect一样类似于“杀软”,MRT是一个二进制,在底层当中没有用签名文件机制,所有的签名是内置在二进制当中。
我们可以手动的去运行这个MRT程序,让它以守护进程的形式去启动。前一段时间火热的苹果系统上的zoom软件出现漏洞,苹果后台推送了更新,静默的删除了其web server,其底层用到的工具就是MRT,采用了比较激进的方式处理了电脑上的恶意/漏洞软件。
终端安全模块是苹果在10.14.5 Catalina里面引入的一个新功能,终端安全模块的用途是为了代替苹果公司早年使用的内核扩展,可能在以后的发展过程中,苹果的内核扩展会被限制或者会被移除,而采用用户态的终端安全模块给安全开发者提供接口。目前它是测试状态,可以看到少量的数据结构。
五、macOS终端agent技术实现方案
终端安全实现的细节分成四部分:第一部分是事件部分,事件是所有数据的基础,event事件代表了每一个API发生时一条数据、一条日志信息。
Incident是一组事件的集合,所有事件加在一块就形成了一个incident。我们看如何去对这些事件进行管理。这是安全架构上,主要讨论自身安全以及对系统加固如何适时。然后是攻击检测和安全防护。
1、事件部分,首先是事件与事件的响应,数据源从哪里来?怎样采集数据源?如何处理这些数据?
2、数据源就是我们要采集系统中哪些数据,哪些数据需要受到我们的监管。这里列出了5张图是开源工具获取的数据,由Facebook开发的一款工具,它对苹果操作系统当中的数据进行了归类,我展示了它的进程、网络、登陆用户以及进程打开文件这5个部分,这只是数据当中很小的一部分。
比较权威的数据源是MITRE这个组织在官网上公开的企业安全的攻击向量,从攻击者视角向开发者提供数据源,非常详细、专业的一份数据源。
3、数据采集。我们采用哪种方式去采集数据?一是是系统调用表的hook,这是比较传统、使用比较多的一种方案,在Windows以及Linux系统上比较常见,在苹果系统上同样有系统调用表这个数据结构。
这个数据结构可以在内核当中通过查找内核当中的前三个系统调用去判断这个是不是sysent这块表,对表里的系统调用指针替换可以达到Hook系统调用表的后果。
二是审计部分早先是实现一个开源技术方案,后来苹果公司也采用了这种方式,这种审计的方式有一个好处是在内核当中、在这个文件中对每条指令都插入了这两条指令。通过用户态praudit访问管道设备可以抓取系统中每条系统调用的日志信息。
三是kauth机制,这个机制是由10.4系统引入的,它和MACF一样提供了回调注册接口,开发人员可以编写一些回调函数,对系统发生的事件进行监控。Kauth分为四部分:常规、进程、VNODE、文件操作,但是kauth提供的接口比较少,在现实当中。
开发人员更倾向于使用MACF框架,它的上层是一串以mac_开头的一组调用的封装,所有资源访问的系统调用都会经过一组预先注册好的回调函数进行预检。可以向系统当中注册一个、一组甚至多个回调。它的底层有一个结构体。当前操作系统中支持所有的回调类型非常详细。
六、安全加固/防护
对操作系统的打补丁、软件补丁、内核加固、自我防护、风险扫描。
1、系统打补丁。苹果公司自带的这个命令可以用来底层静默发现并且更新操作系统的功能,这个功能可以通过APP store手动去点击。
2、软件补丁。APP store或者第三方的mas可以检测这个系统当中安装软件的版本信息。
3、内核加固。当我们发现比较常见的内核漏洞,这些内核漏洞还来不及被苹果公司去打补丁,或者用户没有去升级操作系统的情况下,引入内核加固这个功能非常必要。内核加固可以针对常见的内核漏洞,自己去做一个内核的patch。
4、自我防护。Agent安装在用户主机上之后,首先需要一个自我防护的功能,才能保证稳定的去采集系统上的数据。
我提出两种防护方式,一种是由系统自带的launch daemons和launch agents,前者是守护进程,后者是代理程序,它们都会在电脑启动过程中去启动,类似于Windows平台的自启动技术。前面的launch daemons以入口身份运行的,而launc agents是以用户态的方式运行。
如果keepalive加上设置为true的情况下,这个组件会常驻系统当中,即使用户去关闭这个进程,它的父进程也就是1号进程launchd会对它重启。我们看一下天擎的APP在启动时会有两个进程,launch daemons和launch agents,它们之间可以通过XPC进行通信。
第二种方案是信号,关闭一个程序时会向程序发出信号,我们可以在MACF中注册这个信号检测,在信号里对它进行屏蔽检测,就可以实现内核态的防护功能。
5、风险配置扫描。类似于杀软的首次启动对系统的预检,它需要我们预先配置好,这里有一个开源的方案,这个工具是Linux上比较常用的一款风险配置扫描工具,它在macOS上也是同样支持的。
七、攻击检测
当所有数据采集到以后,经过引擎处理需要实现攻击检测功能。常见攻击检测有以下攻击种类。
1、勒索攻击。对系统磁盘中的文件进行大量读写操作以及进程启动执行的操作,我们可以重点关注这两个事件。
2、挖矿攻击。
3、信息窃取。对用户敏感资源访问以及网络数据中是否有网络数据这么一个规则去检测。
4、权限提升。首先是有进程执行这个动作,它可以是进程的命令执行,执行的过程中我们可以去检查进程的信息,查看它的信息权限是否被提升。
我们重点讲一下安全防护,我这里所有安全防护的功能是采用MACF的方式去实现。
1、文件读写是重点关注vnode的API,vonode类似于Linux的inode,是文件系统对文件抽象的一个数据类型,可以对常见的write、unlink等进行挂钩,检测文件读写信息。
2、文件执行管理。首先是一个进程启动fork,通常一个应用执行是fork和exec两部分组成。可以在fork时检测应用程序启动过程中的证书信息、签名信息以及teamID信息。
启动的第二个阶段我们可以去检测它的权限信息,包括权限、父进程、参数信息。另外一种管理文件执行的方案是挂钩这个函数接口,是应用程序执行后会调用的一个API,我们可以在内核当中获取这个API,对它进行hook操作,同样也是可以实行文件执行管理的功能。
3、网络访问管理。可以通过这一系列API,socket创建、设置socket属性的这么一个API,或者使用NKE的一个接口。NKE需要传入一个信息,这个信息可以包含它的协议,包括TCP、UDP甚至ITV6这些信息。
4、进程管理。进程信息由一组proc_check开头的信息,我们可以挂钩这些接口去实现进程的管理。
5、系统调用审计。系统调用审计可以看一下一个进程执行过程中所有的流程,它最终是调用了这个调用,在底层10.15里引入了这个接口,可以完全对所有的syscall的调用审计。
6、终端隔离。终端隔离主要分为网络访问阻断和进程启动阻断,这两个机制可以通过前面介绍的方式对它进行管控。
7、资产报备。EDR会对用户的信息进行统计。
八、开发调试与注意事项
我们看一下是如何获取内核符号的地址,以及如何去查找内核符号,这是两种方式,一种方式是去从内核启动循序渐进一页页去查找,另一种方式是调用一个函数去进行unslide操作。
模块调试部分也需要对MACF接口进行大量调试,从10.12之后MACF变成了私有框架,苹果不鼓励使用这个框架,如果我们还需要使用这个框架,需要关注每一次系统升级之后接口的变化,我们需要做大量测试,包括对不同版本的操作系统做一个快照,然后进行自动化的措施。
声明:本文来自看雪学院,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。