Linux内核之Tracepoint机制
引入tracepoint的背景
当需要获取内核的debug信息时,通常你通过printk的钩源方式打印信息。然而,码内这种做法存在一些缺点。核钩直接使用tracepoint可以解决这一问题,源码它能更有效地抓取日志信息。内核手游帐号交易 源码
内核解决方案
内核采用“插桩”的钩源方法,即tracepoint,码内来抓取log。核钩tracepoint是源码Linux内核预先定义的静态探测点,遍布于内核的内核各个子系统中。它由name、钩源enable开关、码内桩函数、核钩注册桩函数的源码函数以及卸载桩函数的函数组成。桩函数类似于printk,但不会打印到console,而是输出到内核的ring buffer(环形缓冲区)。用户可以通过debugfs查看这些信息,或使用perf工具来查看。每个tracepoint提供一个钩子来调用probe函数,probe函数可以被开发者编写内核module来实现,以获取调试所需的信息并导出到用户态。
直接使用tracepoint可能较为困难,因此内核提供了event trace功能。event trace依赖于tracepoint机制,内核提前帮我们实现了钩子函数并挂载到tracepoint上。当使能一个event trace时,它会将输出内容到ftrace ringbuffer中,这样就能获取到内核运行时的信息了。如果event trace不符合需要,开发者可能需要自己编写module来实现特定需求。
查看tracepoint
可以通过debugfs查看系统中定义的tracepoint。例如,查看block子系统的tracepoint。还可以通过perf工具查看。
Tracepoint数据格式
每个tracepoint会按照自己的格式输出信息,用户可以在用户态查看tracepoint记录的内容格式。格式信息可用于解析二进制的trace流数据,或利用filter功能指定过滤条件后,只看到过滤后的事件数据。格式信息包括两部分:一部分用于解析数据,另一部分用于过滤条件。
如何使用Tracepoint
tracepoint复用了ftrace的ringbuffer,使能tracepoint后,php源码 有赚可通过cat /sys/kernel/debug/tracing/trace查看输出。此外,可以通过设置filter来过滤特定事件。例如,过滤所有openat事件,指定过滤所有打开flags为0的事件。清除过滤条件只需写入0到指定的filter即可。跟踪特定的tracepoint点,如设置过滤条件prev_pid和next_pid都为1的进程。
perf中使用tracepoint
借助perf工具,可跟踪tracepoint事件。例如,跟踪网络驱动收发包情况。记录秒后,使用特定命令查看记录信息。
添加Tracepoint
定义tracepoint时,内核通过#define DECLARE_TRACE(name, proto, args)来实现,其中包含函数原型、外部trace point变量声明以及一些公共函数。trace point机制简单,就是将用于debug的函数指针组织在一个struct trace point变量中,然后依次执行各个函数指针。使用trace point时,需要通过register_trace_##name将桩函数添加到trace point中,这通常需要开发者通过module或修改内核代码实现。
TRACE_EVENT() 宏的剖析
TRACE_EVENT() 宏分为六个组件,对应宏的参数:name, proto, args, struct, assign, print。举例,使用sched_switch跟踪点定义来描述每个部分。宏参数包括名称、原型、参数、结构布局、数据保存方式以及打印字段的格式。头文件中的TRACE_EVENT()宏必须遵循特定格式,通常位于include/trace/events目录。包含此宏的头文件需定义跟踪系统,并且在文件底部包含define_trace.h文件以创建跟踪事件所需函数。
实际使用
使用tracepoint时,需要包含跟踪头文件并在代码中使用跟踪点。如果跟踪点未被使用,定义它将无意义。跟踪点定义后,可以在代码中调用它以获取调试信息。时钟 app源码通过这些步骤,你可以更有效地抓取和分析内核运行时的信息。
浏览器技术揭秘:安全浏览器是否真的安全
中国的互联网公司做事情的浮躁已是众所周知。在浏览器行业,各种加壳浏览器在Webkit和Trident上套个马甲,再加点组件,动辄就冠之以"最快"、"最安全"来装点自己。你别说,人家还不脸红。我一个在Chrome开发团队的哥们告诉我,Chrome %的开发资源只用来做3件事:快、安全、稳定。
这就是差距。
本文要吐槽的是"安全浏览器"。说实话,浏览器+安全的概念不错,虽然内核是人家的,自己还是能折腾出点花样的。但这几天看到某知名厂商随时把"最安全"挂在嘴边,我愤青的内心就被撩动了。
大家也许已经猜到了是哪家厂商,欢迎对号入座。其实,是哪家厂商、哪款浏览器真的不重要。重要的是,用户自己要做到心中有数,别中了人家阴招还在说感谢。
举例来说,当你网购时,有"经验"的卖家会"好心"向你推荐某知名安全浏览器,主打安全,你还心存感激。所以当他发你一个链接,该浏览器没报任何风险,你就放心大胆支付消费了。结果呢?这是一个钓鱼陷阱,你的资金早已直接捐给了骗子。安全浏览器真的安全吗?
纯粹技术分析太过于抽象,我选择安全浏览器、猎豹浏览器和谷歌Chrome作为分析对象。为什么选这三款呢?安全浏览器和猎豹浏览器都出身于国内主流安全厂商,谷歌7.0源码体现了国内最高的安全实力,目前也均卖力主打安全牌;Chrome则是国际上公认最安全的产品之一,包括Firefox也采用了Chrome的一些安全技术。IE呢?就不用提了吧。
浏览器安全应该需要什么指标?
有同学可能会说,安全应该是杀毒软件的工作职责呀。是的,完全正确。杀病毒、拦钓鱼确实是杀毒软件的份内事。但如果只能依靠杀毒软件,所谓安全的浏览器就只能称之为坑爹货!既然取名安全或者主打安全牌,就要拿出点干货来!
那么,安全的浏览器需要什么干货呢?顾名思义,就是你在浏览器内进行的任何操作都应该是受到保护和避开风险的。通俗地说,你访问色情网站,它要保证你不中毒;你网上购物,它要保证你不被盗;你登录微博,它要保证你的隐私不会泄露……
从技术角度来讲,安全的浏览器需要拦截别有用心的人一切可能的浏览攻击行为,至少要包括以下几个部分:
钓鱼网址访问拦截
挂马网站访问拦截
下载文件安全检测
防止键盘敲击遭记录
木马程序执行拦截
系统内核保护
网购支付页面防篡改
……
这些标准是不是过于严格?安全无小事。恰恰相反,以上这些是最最基本的,缺任何一项都存在风险。比如,如果没有木马拦截,对方发给你一张"宝贝细节图",你就可能已经中招,支付后才发现没转到支付宝上,钱款彻底无影踪。你要没中过招,问问身边的人,就知道网络有多危险了。
你的安全浏览器挂了几个钩?
哪款浏览器能实现上述功能?我采用了一个工具进行分析,可通过查看它挂了什么"钩子"(Hook)来判断它在哪些地方做了安全监控,再通过代码逆向的方式查看它具体设计了哪些功能?
"钩子",程序设计中的一个专业名词。Windows系统中存在一些重要的系统关键点,在这些关键点上"挂钩子",如下图,就可以在Windows原生程序流程的魔方 flash 源码基础上运行额外的程序,实现特定的功能。如果要做安全防护,同样可以在一些关键处挂上安全监控的钩子。
图注:钩子(Hook)可以在Windows原生程序流程上增加关键点,运行额外的程序功能。
一般来说,系统中最关键的位置往往是内核,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,是一个操作系统的核心。任何程序包括恶意程序从启动到关闭的整个过程,都离不开内核的管理。因此,几乎所有安全软件都会在内核上挂钩子--内核钩子
形象地来说,安全软件所挂的内核钩子,就像在机场内登机必经的路口设置安检处,验证为安全的人和包裹(程序)就放行,验证为风险的就拦截并及时处理掉。因为所有登机的人和包裹均是经过安全检查的,所以保证了飞机的飞行安全和乘客安全。如下图。
图注:安全软件所挂的内核钩子,就相当于在机场中的必经之处设置安检一样。
我使用圈里人爱用的一个Anti-Rootkit(简称ARK)工具XueTr.exe查看,Chrome和浏览器都没有挂内核钩子,而猎豹浏览器则挂了2个内核钩子,如下图,挂钩位置均是其驱动文件KNBDrv.sys。这个文件也可在猎豹浏览器的安装目录中查看到,/liebao/LBBrowser/Module/security/。
图注:猎豹浏览器在驱动文件KNBDrv.sys中挂了2个内核钩子,可进行系统安全检查。
图注:安全浏览器并没有挂内核钩子,无法进行系统安全拦截。
没挂内核钩子意味着什么?正如上面所说,系统内核已经失守,无法保证没有风险。如果有一个程序启动,你无法验证这是一个正常程序还是一个木马病毒程序;如果有一个程序被关闭,你仍然无法得知是正常关闭还是你的安全防御程序被恶意关闭……风险程度可想而知。
从这个角度来说,安全浏览器和Chrome并不具备系统安全防护能力。套用网购欺诈者常用的手段,在你使用这两款浏览器在网上购物时,对方通过即时通讯工具如QQ等发送"宝贝细节图"文件给你,实为网购木马病毒文件,双击打开后,木马启动运行,乃至篡改账号劫持交易,这两款浏览器因为没有监控而会一直无动于衷。
代码逆向查验本质
有2个内核钩子的猎豹浏览器能否防住?这需要更深入地对它进行研究。我用逆向工程代码破解工具IDA Pro对它的KNBDrv.sys进行了反汇编,如下图。
图注:用IDA Pro逆向猎豹浏览器的文件knbdrv.sys,查看它有什么函数,具备什么功能。
逆向代码之后,可以看到猎豹浏览器设置了如下拦截点:创建线程、创建进程、挂起进程、保护虚拟内存、终止进程、写入虚拟内存等,如下图红框中。表示什么意思呢?就是此钩子可以对系统中上述任何一个动作进行安全验证。
图注:猎豹浏览器设置了众多拦截点,系统中出现任何此类动作都可及时获知。
更直观地来说,系统中任何进程的启动或关闭,猎豹浏览器凭借这些钩子函数均要检查,利用金山固有的云安全平台,即可判定此程序(进程)是黑是白。正常文件当然OK,如果是木马病毒在启动,当然就会进行拦截。
再?录妇?br /看了上面的分析其实大家都明白了的,但还是忍不住再多说几句,下个结论。
凭借的云安全平台,安全浏览器实现钓鱼拦截、下载文件鉴定不成问题,但这还远不能保证浏览安全和网购安全。对恶意程序的启动拦截,浏览器还不能独立进行,需要严重依赖安全卫士或者杀毒。就这,如果说自己是"安全浏览器",还马马虎虎过得去,但如果动辄当"最"字辈,就只两个字形容:坑爹。
Chrome呢?口碑很安全,但没抓到内核钩子,我分析是由于Chrome采用了沙盒技术。它只要保证自己的程序不被恶意程序攻破即可,系统防护它可以不予考虑。关于沙盒技术,已有不少介绍,不再详述。
猎豹浏览器还真的让我有点意外,他们家包装了个BIPS概念,说实话,我没兴趣。但是猎豹确实把毒霸的K+和云安全都植入到了内核里,要不我们在逆向的时候也看不到内核钩子了。当然,到底这一套玩意能不能经得起实战,需要做大量专业测试。我没测试,就不多说了。单从程序的逻辑分析来看,猎豹浏览器具有内核钩子、逆向出来的函数覆盖全面,再结合云安全技术,猎豹浏览器做到上述防御是完全可行的。
再再?录妇?br /1、做安全也好,做浏览器安全也好。其实拼的还是实力和积累。买来的引擎用在杀毒上尚可,但要植入到浏览器,终究会现原形。
2、国产浏览器如果真的做到了安全,喝水别忘挖井人,保持对Chrome、Firefox甚至IE的敬畏和感激是起码的。动辄吹嘘自己"最安全",你让肯花几千美金买个漏洞Chrome情何以堪?
3、本文纯技术分析,你可以对号入座,但谢绝口水,谢绝脑残粉丝价值观灌输。本人不吃这一套。
Linux下使用Netfilter框架编写内核模块
上篇文章我们从内核源码的角度分析Linux Netfilter框架下,hook钩子是如何被执行的,这次我们将通过一个示例代码,详细讲解如何利用Netfilter框架编写内核模块。
为了更好地理解,我绘制了一张图,通过源码中的具体实例,展示了自定义的钩子函数在内核中的位置。在内核中,有一个全局变量net_namespace_list链表,系统中所有的网络命名空间都挂载在这个链表上。系统默认的网络命名空间是init_net,内核启动时,会在初始化网络命名空间net_ns_init中调用setup_net将init_net挂在net_namespace_list链表上。当我们新增hook钩子时,通常都是将其挂载在net_namespace_list链表对应的网络命名空间上。
接下来,我们将开始编写一个基于netfilter框架的简单内核模块。首先,我们需要声明一个hook函数,然后定义一个nf_hook_ops。
①我们在IP层(网络层)对网络包进行处理,这里.pf = NFPROTO_INET;
②hook点在PREROUTING链上,这里.hooknum = NF_INET_PRE_ROUTING;
③hook函数在此链上执行的优先级设置为最高,即.priority = NF_IP_PRI_FIRST;
④设置hook函数为我们前面自定义的函数,即.hook = (nf_hookfn *)packet_filter。
然后,我们需要在内核模块的init函数中注册该nf_hook_ops。
接下来是自定义的hook函数的具体实现。在hook函数中,我们只需简单地打印出源、目的IP和端口信息。
最后,我们需要注销自定义的hook钩子,并在内核模块退出时完成这一操作。
在编写Makefile、所需的头文件、编译并插入模块之后,我们可以在系统日志中看到相关输出。
在测试完成后,别忘了卸载内核模块,以完成整个操作。
至此,我们的内核模块编写任务就完成了。
Linux超能力BPF技术介绍及学习分享
近年来,BPF技术已经成为热门技术,众多大会如KubeCon Europe和China的分享显示了其在网络安全优化、系统追踪等领域的广泛应用。国内IT巨头如阿里巴巴、腾讯和字节跳动也对BPF技术产生了浓厚兴趣。本文旨在详细介绍BPF技术,包括其基本概念、发展历史、核心能力以及在实际场景中的应用。BPF技术详解
BPF,源于Berkeley Packet Filter,最初由Steven McCanne和Van Jacobson于年提出,其高效的数据包过滤能力使得tcpdump等工具得以优化。随着技术演进,eBPF成为了一种通用执行引擎,能够在内核空间执行安全代码,适用于网络分析、性能追踪等领域。BPF的超能力
BPF的超能力主要体现在其BPF Hooks(内核钩子)、BPF Map(数据存储)和BPF Helper Functions(辅助函数)上。它们提供了在内核中无缝集成代码的能力,解决了传统Linux内核开发的难题,如性能优化、安全控制等。应用场景
Cilium:作为Kubernetes CNI插件,Cilium利用BPF在大规模容器环境中实现高效安全的网络隔离和性能优化。
Falco:Sysdig的开源项目,通过BPF实现实时应用监控,提供云原生运行时安全保护。
Kubectl-trace:利用bpftrace追踪K8S应用运行,帮助用户排查问题。
社区与学习路径
BPF社区和相关代码仓库是学习资源的关键,如LWN.net社区和GitHub上的开源项目。通过阅读英文资料、实践项目和分享经验,逐步掌握BPF技术。个人学习经历
作者从Cilium的案例开始,逐步深入学习BPF,经历了从理论到实践的过程,包括理解BPF Hooks、Map和Helper Functions的工作原理,以及如何通过编写和调试代码来解决问题。Linux网络环境的实现钩子函数作用linux网络钩子
Linux是一款优秀的开源操作系统,在网络环境的实现中,钩子函数发挥着至关重要的角色。钩子函数也叫钩子程序,是管理一个更大的,更复杂的程序中某些小程序的特殊程序段。它有助于实现Linux网络环境,从而为用户提供网络服务。
钩子函数主要由网络协议层触发,用于实现Linux网络环境。典型的钩子函数如下:
1. ARP钩子函数:这是一个内核钩子函数,用于处理ARP请求;
2. netfilter钩子函数:netfilter是网络数据包过滤机制,它使用netfilter钩子函数,用于过滤一切网络数据包;
3. 邮件传输钩子函数:用于处理邮件传输相关事务,如服务器发送或接收邮件,添加头部信息和其他处理;
4. 路由表钩子:指定路由条件时,用于动态更新路由表;
5. 系统日志钩子:可以将系统日志写入数据库或指定文件中。
此外,Linux的网络环境还包括静态路由设置、防火墙设置和网络配置等内容。通过对钩子函数的设置和监控,用户可以更好地控制网络的实现状况,也可以更好地利用网络资源。
下面是一个示例,这是使用netfilter钩子函数来配置Linux网络防火墙的示例代码,用于禁止外部访问本机:
//iptables 配置防火墙
iptables -I INPUT -p tcp –dport -j DROP
iptables -I INPUT -p tcp –dport -j DROP
//设置netfiilter选项
/sbin/iptables -A INPUT -i eth0 -p tcp –dport -j NFQUEUE –queue-num 1
/sbin/iptables -A INPUT -i eth0 -p tcp –dport -j NFQUEUE –queue-num 2
在上面的代码中,”-I INPUT” 表示插入一个输入规则;”–dport ″ 表示指定端口;”-j NFQUEUE –queue-num?” 表示将规则插入netfilter的等待队列,后面接着的数字是设置的排序。通过配置netfilter,Linux网络环境便可以完成功能。
以上就是Linux网络环境实现中钩子函数的作用,钩子函数使用户能够自定义和管理更复杂的Linux网络环境,从而更好地控制网络的实现情况和使用情况。最后,要明确的是,在实现Linux的网络环境时,应该结合具体的网络情况进行处理,这对用户来说是非常重要的。
2024-12-24 01:05
2024-12-24 00:51
2024-12-23 23:08
2024-12-23 23:04
2024-12-23 23:00