从上图可以得出结论,在不考虑其他因素的情况下,如果Kata Containers内部的攻击者想要逃逸到宿主机上,他必须至少经过两次逃逸——「容器逃逸」和「虚拟机逃逸」,才能达到目的。 它让我们意识到,即使是采用了独立内核的“安全容器”,也存在逃逸风险。换句话说,安全没有银弹。 本文将对该议题中的逃逸过程(Container-to-Host)及相关的三个漏洞进行详解和复现。 漏洞分析 如「简介」部分所述,从容器到宿主机的逃逸涉及三个漏洞的使用,由「容器逃逸」和「虚拟机逃逸」两部分组成。 detail/CVE-2020-2026 [15] https://github.com/teawater/documentation/blob/4eee7346655d9c954ab595c05e9f5dad0f5efeda /linux/man-pages/man2/mknod.2.html [24] https://github.com/moby/moby/blob/a24a71c50f34d53710cccaa4d5e5f62169c5e1dc
【Java基础】This逃逸( This引用逃逸详解)1、This逃逸中的关键词This引用逃逸对象在还没有构造完成时,This引用已经发布出。发布对象发布是指一个对象在作用域范围之外被使用。 ,但是不一定发生,而线程B发生this逃逸这是因为:由于JVM的指令重排序存在,实例变量i的初始化被安排到构造器外(final可见性保证是final变量规定在构造器中完成的)类似于this逃逸,线程A中构造器构造还未完全完成 3、什么情况下会This逃逸发生This逃逸一般会有两种情况:在构造器中启动线程:启动的线程任务是内部类,在内部类中 xxx.this 访问了外部类实例,就会发生访问到还未初始化完成的变量在构造器中注册事件 onEvent(Event e) { doSomething(e); } } ); var = 10; }5、 总结This逃逸一般发生在多线程中,引起This逃逸的问题是在多线程滥用引用。
大家好,我是冰河~~ 在JVM的实现中,为了提高JVM的性能和节省内存空间,JVM提供了一种叫做 “逃逸分析” 的特性,而且对于“逃逸分析” 这种特性,也是近年来大厂面试常问的知识点。 今天,我们就一起来聊聊什么是逃逸分析 逃逸分析的概念 先以官方的形式来说下什么是逃逸分析。逃逸分析就是:一种确定指针动态范围的静态分析,它可以分析在程序的哪些地方可以访问到指针。 在JVM的即时编译语境下,逃逸分析将判断新建的对象是否逃逸。即时编译判断对象是否逃逸的依据:一种是对象是否被存入堆中(静态字段或者堆中对象的实例字段),另一种就是对象是否被传入未知代码。 对象逃逸示例 一种典型的对象逃逸就是:对象被复制给成员变量或者静态变量,可能被外部使用,此时变量就发生了逃逸。 我们可以用下面的代码来表示这个现象。 还没完,我们继续看下逃逸分析的优点,以便于小伙伴们能够更好的理解逃逸分析。 逃逸分析的优点 逃逸分析的优点总体上来说可以分为三个:对象可能分配在栈上、分离对象或标量替换、消除同步锁。
“肿瘤免疫编辑”假说是当前被认可的肿瘤免疫逃逸理论。 肿瘤免疫逃逸由多个因素共同介导,其机制包括:肿瘤细胞通过低表达、遮盖抗原或抗原变异等方式直接逃逸免疫监控;肿瘤组织微环境募集或扩增多种抑制性免疫细胞来诱导肿瘤免疫抑制等。 (四)肿瘤细胞低表达MHC分子MHCI类分子提呈功能的缺乏常常是导致肿瘤免疫逃逸的主要原因之一。 3.趋化因子 趋化因子及其受体家族在肿瘤免疫中的作用主要有以下几点:①募集免疫细胞进入肿瘤组织调控机体免疫功能,如C2、 CCL5能募集髓系细胞,CXCL9、CXCL10能够趋化T细胞,CCL19、CCL20 炎症反应与肿瘤发生的关系体现为外因和内因两个方面:外因是指炎症反应可增加肿瘤发生的风险,例如幽门螺杆菌与胃癌,慢性病毒性肝炎与肝癌,炎症性肠病与肠癌的发生;内因是指驱动肿瘤发生的基因改变会影响组织中的炎症反应
Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log。 以下资料来自互联网,有错误之处,请一定告之。 如果指针存储在全局变量或者其它数据结构中,它们也可能发生逃逸,这种情况是当前程序中的指针逃逸。 逃逸分析需要确定指针所有可以存储的地方,保证指针的生命周期只在当前进程或线程中。 go消除了堆和栈的区别 go在一定程度消除了堆和栈的区别,因为go在编译的时候进行逃逸分析,来决定一个对象放栈上还是放堆上,不逃逸的对象放栈上,可能逃逸的放堆上。 Example5: package main type S struct { M *int } func main() { var x S var i int ref ,而i却逃逸了,这是因为go的逃逸分析不知道z和i的关系,逃逸分析不知道参数y是z的一个成员,所以只能把它分配给堆。
逃逸思路1.因配置特权模式逃逸(--privileged,--cap-add与SYS_ADMIN结合)2.docker.sock通信传输逃逸(容器A新建一个容器B,再使用容器B进行逃逸)3.结合linux 内核提权漏洞逃逸(脏牛dirty cow)4.docker中的/proc传输,/fd传输逃逸(CVE-2019-5736)Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点。 14.04 /bin/bash2.查看磁盘文件:fdisk -limage.png3.此时查看/dev/路径会发现很多设备文件:ls /devimage.png4.新建目录以备挂载:mkdir /abc5. 因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。 //host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash可以看见@符号后的Docker ID已经发生变化:image.png5.
type User struct { UserName string PassWord string Age int } func escapeDemo5() { u := &User to s") printHeader(&s) s = append(s, 4) println("add 4 to s") printHeader(&s) s = append(s, 5) println("add 5 to s") printHeader(&s) } func escapeDemo10() *[]int { var s = make([]int, 0, 4) 当向里面append第5个元素后,输出数据地址变了,此时为0xc0000ac000,可知分配的数据地址发生了变化。 /escape2.go:5:2: moved to heap: v .
逃逸分析是怎么完成的 Go逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸。 任何时候,一个值被分享到函数栈帧范围之外,它都会在堆上被重新分配。 https://www.do1618.com/archives/1328/go-%E5%86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB%86%E5%88% 简单来说,编译器会根据变量是否被外部引用来决定是否逃逸。 对于Go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags '-m'命令来观察变量逃逸情况就行了。 但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。 最后,尽量写出少一些逃逸的代码,提升程序的运行效率。
分析前,先回顾一下场景设计的一些要点: 场景的基础是实际运维工作,要用“连接、数据、赋能”的数字化思维重塑场景 按“人、事、时间、协同、环境”5要素梳理场景 场景强调多角色“组织”高效协同,是对线下流程的在线化 ,平台赋能场景生产力 再看看风险感知场景的要点: 在线感知风险状况,即时健康质检 赋能专家主动构建、调优风险感知模型 “数据指标+算法策略”(点)=》编排组装主题(面、兼顾非知风险) 建立风险识别(感知 )、决策、执行闭环 以下从“人、事、时间、协同、环境”5要素看看场景。 【归类】可以梳理哪些主题的运行风险感知? 【闭环】运行风险识别后,如何确保风险得到处置? 5.环境 环境包括显性环境与隐性环境。
Linux 进程,而容器逃逸的过程我们完全可以将其理解... 前言: 我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解为在一个受限进程中进行一些操作来获取未受限的完整权限 CGroup 信息中,不仅可以判断我们是否在容器内,也能很方便判断出当前的容器是否在 Kubernetes 的编排环境中 没使用 Kubernetes 的 docker 容器,其 cgroup 信息长这样 5: ,容器逃逸的利用手段会比大部分情况下的命令执行漏洞利用要灵活。 需要注意的是,使用该端口需要确保防火墙设置正确,以避免潜在的安全风险。
02 查看对象是否发生逃逸 Go 语言工具链提供了查看对象是否逃逸的方法,我们在执行 go build 时,配合使用参数 -gcflags 开启编译器支持的额外功能,例如: go build -gcflasg /main.go:8:2: moved to heap: res 阅读上面这段代码,我们发现 sum 函数中的变量 res 逃逸到堆,也就是说 Go 编译器通过逃逸分析,决定将变量 res 分配到堆空间 03 逃逸分析的作用 Go 语言编译器通过逃逸分析优化,将对象合理分配到栈空间和堆空间。 因为栈内存分配比堆内存分配更快,所以 Go 语言在编译时通过逃逸分析优化将不会发生逃逸的对象优先分配到栈空间。 因此,不仅降低堆空间内存分配的开销,同时,也可以降低垃圾回收占用的系统资源。 所以,我们在实际项目开发中,可以借助 Go 工具链分析对象是否会发生逃逸,尽量避免一些不必要的对象逃逸。 推荐阅读: Go 语言怎么使用对称加密?
一个对象本应该分配在栈上,结果分配在了堆上,这就是内存逃逸。 若出现 xxx escapes to heap,则xxx变量是发生了内存逃逸,需要尽量避免内存逃逸,因为栈内存的回收效率比堆内存高很多。 逃逸分析输出:. 当栈内单个对象大小超过64KB,则会发生内存逃逸,channel空间不足也会发生逃逸。 局部变量name因为匿名函数返回出去后,编译器认为应该分配在堆上,也发生了逃逸。取消逃逸分析编译器默认会进行逃逸分析,会通过规则判定一个变量是分配到堆上还是栈上。一些函数虽然逃逸分析将其存放到堆上。
逃逸分析,看着一个非常高大上的名词,很多人第一次听到它的感觉会觉得它好厉害的样子,其实说到底它很好理解,并不复杂。之前一直没有写也是有原因的,因为其实在实际中,我真的很难用上它。 而确定对象在栈上还是堆上的过程就是我们今天的主角 —— 逃逸分析 逃逸分析 定义 其实刚才我们就已经知道了,逃逸分析就是帮我们确定,我们所使用的对象应该放在栈上还是堆上。 首先我们必须要有工具来进行逃逸分析,当让 go 提供了这个工具 go build -gcflags '-m -l' main.go 其中的 -m 就是会打印出逃逸分析的优化策略,可以多加 m 来查看更加详细的信息 逃逸分析本身并不神奇,神奇的是 go 去实现逃逸分析的代码 cmd/compile/internal/gc/escape. go 最后重点来了:请你暂时忘记它吧,其实大部分的业务场景都用不到它,因为绝大多数的 OOM 并不会简简单单因为你的变量逃逸而出现问题;大部分的 GC 时间长也并非因为逃逸导致;所以请先分析瓶颈,找到关键瓶颈后再进行优化,不要一上来就逃逸分析半天,结果发现加个索引就好了。
Docker逃逸漏洞复现(CVE-2019-5736) ? 因为Docker所使用的是隔离技术,就导致了容器内的进程无法看到外面的进程,但外面的进程可以看到里面,所以如果一个容器可以访问到外面的资源,甚至是获得了宿主主机的权限,这就叫做“Docker逃逸”。
逃逸分析 什么是内存逃逸? 内存逃逸(Memory Escape)是指Go语言中变量被分配到堆(Heap),而非栈(Stack)上的现象。 什么是逃逸分析? Go 编译器怎么知道某个变量需要分配在栈上,还是堆上呢?编译器决定内存分配位置的方式,就称之为逃逸分析(escape analysis)。逃逸分析由编译器完成,作用于编译阶段。 (*File).close .this does not escape 内存逃逸的例子 指针逃逸 func createPointer() *int { x := 10 return & 内存逃逸的影响 性能开销: 堆分配速度慢:相比栈分配,堆分配需要更复杂的内存管理(如分配、碎片化处理)。 GC压力增加:堆上分配的变量需要垃圾回收,频繁逃逸可能导致GC频繁运行,影响程序性能。 潜在内存泄漏: 如果逃逸到堆的变量未被正确释放(如循环引用),可能导致内存泄漏。
Example5: package main type S struct { M *int } func main() { var x S var i int ref ** Profiling Go Programs https://github.com/mushroomsir/blog/blob/master/Go%E4%B8%ADstring%E8%BD%AC%5B %5Dbyte%E7%9A%84%E9%99%B7%E9%98%B1.md the-go-programming-language-report https://golang.org/doc/faq 年终盘点 之垃圾回收 https://cloud.tencent.com/developer/article/1165660 https://www.do1618.com/archives/1328/go-%E5% 86%85%E5%AD%98%E9%80%83%E9%80%B8%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90/
发生逃逸的几种情况 在某个函数中new或字面量创建出的变量,将其指针作为函数返回值,则该变量一定发生逃逸(构造函数返回的指针变量一定逃逸); 被已经逃逸的变量引用的指针,一定发生逃逸; 被指针类型的slice 必然不会逃逸 指针被未发生逃逸的变量引用; 仅仅在函数内对变量做取址操作,而未将指针传出; 可能发生逃逸,也可能不会发生逃逸: 将指针作为入参传给别的函数;这里还是要看指针在被传入的函数中的处理过程,如果发生了上边的三种情况 ,从来没有超过 main()函数的调用栈 例5 package main type S struct{ M *int } func main() { var x S var i int ref chan里面的元素是指针的时候,也会发生逃逸 map的value是指针的时候,也会发生逃逸 在interface类型上调用方法,也会发生逃逸 当给一个slice分配一个动态的空间容量时,也会发生逃逸 函数或闭包外声明指针,在函数或闭包内分配,也会发生逃逸 函数外初始化变量,函数内使用变量,然后返回函数,也会发生逃逸 被已经逃逸的指针引用的指针,也会发生逃逸 逃逸分析在编译阶段完成的 注意 go run
逃逸分析及其优化 逃逸分析是JIT编译器中的一个高级特性,它分析对象的生命周期和作用域,判断对象是否“逃逸”出其创建的方法或线程,以此来决定是否可以采取进一步的优化措施。 逃逸的两种情况包括: 方法逃逸:对象被作为参数传递给其他方法,其引用超出创建方法的范畴。 线程逃逸:对象被赋予了全局变量或类变量,有可能被其他线程访问。 当分析得知对象未发生逃逸时,可以执行以下优化: 同步消除:如果确定一个对象不会被多线程访问,那么针对该对象的同步操作(如加锁解锁)可以安全地被消除,减少不必要的性能开销。 栈上分配:对于生命周期短且未逃逸的对象,直接在栈上分配内存,而非堆上,栈的分配速度快于堆,且对象生命周期结束时自动释放内存,减少了GC负担。 分层编译和逃逸分析在1.8中是默认是开启的 编译阈值与OSR编译解析 在即时编译(JIT)的背景下,编译阈值是一个关键参数,它决定了代码从解释执行过渡到编译执行的时机。
,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解...前言:我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法 限制权限的进程获取更多权限,当清晰的理解了这一点,接下来的容器逃逸学习将会易如反掌容器逃逸环境搭建作者这里选择的是Ubuntu-18.04和Ubuntu22.04,推荐使用Ubuntu18.04首先安装 CGroup 信息中,不仅可以判断我们是否在容器内,也能很方便判断出当前的容器是否在 Kubernetes 的编排环境中没使用 Kubernetes 的 docker 容器,其 cgroup 信息长这样5: privileged 特权容器的权限其实有很多,所以也有很多不同的逃逸方式,挂载设备读写宿主机文件是特权容器最常见的逃逸方式之一如何判断当前容器是以Privileged 特权模式启动的呢? 需要注意的是,使用该端口需要确保防火墙设置正确,以避免潜在的安全风险。
kalloc.16池中的分配(aioliocontext的大小)再次使用与aioliocontext相同的分配; 4.在分配的第二个双字值中写入零(来进行liocontext->ioissued == 0); 5. 实际上,由于alloc (kalloc16)的大小,空闲chunk最终总是会中毒(in zfree()),所以如果不重用分配,则在步骤5中liocontext->ioissued不能为零。 在步骤5之后,如果未保持分配,并且内核尝试释放它,则系统将发生混乱。 /* might have to play with those a bit */ #if MACOS_BUILD #define NB_LIO_LISTIO 1 #define NB_RACER 5