Linux上执行内存中的脚本和程序

在Linux中可以不需要有脚本或者二进制程序的文件在文件系统上实际存在,只需要有对应的数据在内存中,就有办法执行这些脚本和程序。

原理其实很简单,Linux里有办法把某块内存映射成文件描述符,对于每一个文件描述符,Linux会在/proc/self/fd/<文件描述符>这个路径上创建一个对应描述符的实体,这个路径可以当成普通的文件来用,能正常从中读出数据,因此只要有可执行权限,就可以加载后运行。

其中第一步是创建内存到文件描述符的映射,这一步可以靠memfd_create这个系统调用实现。这个系统调用会返回一个文件描述符,关联到一块内存上,默认大小是0,大多数对普通文件描述符可行的操作对这个描述符也都可用,比如read,write,ftruncate,close。write数据进去的时候系统会自动分配合适长度的内存。当所有引用这块内存的fd被close之后,这块内存会被自动释放。

总之memfd_create提供了像操作文件一样操作内存的能力,是一切皆文件理念的体现之一。

而且memfd_create创建的页面默认有可执行权限,在proc底下的对应的描述符文件也有可执行权限。

所以我们只要把脚本或者二进制程序的数据写进memfd_create返回的描述符就已经做完前两步了。其中对于脚本有一些要求,需要带有Shebang(类似#!/usr/bin/env python3这种)。

有一点需要注意,虽然/proc/self/fd/<文件描述符>有描述符文件存在,但实际上这就是个软链接,而我们的数据全在内存里。

写入成功后可以利用execve执行proc下的描述符文件,也可以通过fexecve系统调用直接调用文件描述符。golang没提供fexecve,所以示例用exec.Cmd

例子:

package mainimport ("fmt""os""os/exec""golang.org/x/sys/unix"
)func main() {// 名字其实无所谓,传空字符传也许,名字只是方便debug没有其他影响fd, err := unix.MemfdCreate("memexec", unix.MFD_CLOEXEC)if err != nil {panic(err)}file := os.NewFile(uintptr(fd), "memexec")defer func() {if err := file.Close(); err != nil {panic(err)}}()_, err = file.Write([]byte("#!/usr/bin/env python\nimport math\nprint('Hello, world!')\n"))if err != nil {panic(err)}_, err = file.Write([]byte("print(f'{math.sqrt(2)=}')\n"))if err != nil {panic(err)}// 因为设置了CLOEXEC,子进程里execve之后看不到这个描述符,会导致调用失败// 所以只能用父进程的cmd := exec.Command(fmt.Sprintf("/proc/%d/fd/%d", os.Getpid(), fd))data, err := cmd.Output()fmt.Println("output:", string(data))if err != nil {panic(err)}
}

golang的话还以配合embed把二进制程序的数据提前嵌入程序内,这样写入的时候会比较方便。

安全性:memfd_create创建的东西默认有可执行权限,同时默认也是可写的,很可能会被恶意程序利用,所以目前内核也在推进解决这个问题已经添加了flag可以让不添加可执行权限,这里建议是遵守权限最小化的原则。

memfd原本的用途:用来在内存中创建文件(比如不想在存储器上创建文件时可以用这个),并可以在父子进程间传递(最好配合file sealing api使用,防止数据被意外修改);或者干脆当匿名共享内存用。执行内存中的程序是附带效果。

文章转载自:apocelipes

原文链接:https://www.cnblogs.com/apocelipes/p/18190394

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一线互联网大数据面试题核心知识库(100万字)

本面试宝典涵盖大数据面试高频的所有技术栈&#xff0c;包括Liunx&Shell基础&#xff0c;Hadoop&#xff0c;Zookpeer&#xff0c;Flume&#xff0c;Kafka&#xff0c;Hive&#xff0c;Datax&#xff0c;Maxwell&#xff0c;DolphinScheduler&#xff0c;Spark Core&SQ…

光伏行业该如何起步?

随着全球对可再生能源的需求日益增长&#xff0c;光伏行业作为其中的佼佼者&#xff0c;正迎来前所未有的发展机遇。然而&#xff0c;对于新进入者或希望在这一领域有所建树的企业来说&#xff0c;如何起步并稳健发展是一个值得深思的问题。以下是一些关于光伏行业起步的建议。…

MySQL-事务篇

文章目录 何为事务&#xff1f;什么是事务的ACID特性&#xff1f;并发事务带来了哪些问题&#xff1f;不可重复读和幻读有什么区别&#xff1f;并发事务的控制方式有哪些&#xff1f;SQL标准定义了哪些事务隔离级别&#xff1f;MYSQL的隔离级别是基于锁实现的吗&#xff1f; 何…

微服务- protobuf 安装

这里写自定义目录标题 1&#xff1a;下载链接2 &#xff1a;下载对应的包3&#xff1a;解压到目录4&#xff1a;设置环境变量5: 查看版本 1&#xff1a;下载链接 https://github.com/protocolbuffers/protobuf/releases 2 &#xff1a;下载对应的包 3&#xff1a;解压到目录 4&…

从RTTR谈Reflection机制

虽然C11引入了RTTI、Metaprogramming 等技术&#xff0c;但C在Reflection编程方面依旧功能有限。在社区上&#xff0c;RTTR则提供了一套C编写的反射库&#xff0c;补充了C在Reflection方面的缺陷。 零、环境 操作系统Windows 11Visual StudioVisual Studio Community 2022 CMa…

git 命令 - rebase

简介 git rebase 是一个用于重新应用一系列提交到另一个基础的 Git 命令。 它可以用来整合来自不同分支的更改&#xff0c;同时保持项目历史的整洁。 操作流程 开始变基&#xff1a; 要开始一个变基操作&#xff0c;你需要指定一个基础分支。通常&#xff0c;这个基础分支是…

2024.05.14 Diffusion 代码学习笔记

配环境 我个人用的是Geowizard的环境&#xff1a;https://github.com/fuxiao0719/GeoWizard。 出于方便考虑&#xff0c;用的pytorch官方的docker容器&#xff0c;因此python版本&#xff08;3.10&#xff09;和原作者&#xff08;3.9&#xff09;不同&#xff0c;其余都是一…

一文说通用户故事点数是什么?

一文说通用户故事点数是什么&#xff1f; 第26期&#xff1a;一文说通用户故事点数是什么&#xff1f; 用户故事点数是一种采用相对估算法进行估算的一种工具&#xff0c;一般采用斐波那契数列表征用户故事里说的大小&#xff0c;采用0 1 2 3 5 8 13这样的一些数字来表征用户…

【漏洞复现】Secnet-智能路由系统 actpt_5g.data信息泄露

0x01 产品简介 Secnet安网智能AC管理系统是广州安网通信技术有限公司(简称“安网通信”)的无线AP管理系统 0x02 漏洞描述 Secnet智能路由系统 acipt 5g.data 接口存在信息泄露漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞获取系统账户名密码等重要凭据&#xff…

全流程TOUGH系列软件实践技术应用

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

永磁同步电机的脉振高频注入无速度传感器simulink仿真模型

整理了永磁同步电机的脉振高频注入无速度传感器simulink仿真模型&#xff0c;该模型高频注入仿真pmsm&#xff0c;无感控制&#xff0c;解决0速转矩输出问题&#xff0c;插入式永磁同步电机&#xff0c;凸极&#xff0c;高频注入。MATLAB/simulink仿真&#xff0c;适合研究学习…

腾讯开源混元DiT文生图模型,消费级单卡可推理

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

第七十八章 IIS 技术说明

文章目录 第七十八章 IIS 技术说明IIS 应用程序池和Web Gardens应用程序池Web Gardens 应用程序池、Web花园和CSP 第七十八章 IIS 技术说明 对于那些有兴趣使用 IIS 的人&#xff0c;此页面介绍了应用程序池、网络花园和位数。 IIS 应用程序池和Web Gardens 应用程序池 应用…

【AI+漫画】程序员小李解决疑难杂症BUG的日常

周末花了点时间制作的AI漫画。 感慨一句&#xff0c;程序人生, 相伴随行。 原文链接&#xff1a;【AI漫画】程序员小李解决疑难杂症BUG的日常

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日&#xff0c;由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦&#xff01;一经上线就吸引了大量用户注册和参与&#xff0c;可以说取得了非常成功的市场反馈&#xff0c;那究竟是一个什么样的小程序&#xff0c;竟然有这么大的吸引力呢&#xff1f; 介绍小程序之…

武汉星起航:中国卖家借力亚马逊跨境电商平台,拓展全球销售市场

随着互联网技术的飞速发展&#xff0c;跨境电商已成为连接全球消费者与卖家的重要桥梁。作为全球领先的跨境电商平台&#xff0c;亚马逊凭借其强大的品牌影响力、丰富的商品资源和高效的物流体系&#xff0c;为全球消费者提供了一个便捷、安全的购物环境。在这个平台上&#xf…

连锁收银系统如何助力实体门店私域运营

作为实体门店&#xff0c;私域运营是提升客户黏性和增加复购率的重要策略之一。而连锁收银系统在私域运营中扮演了关键的角色&#xff0c;它不仅可以帮助门店管理客户信息和消费记录&#xff0c;还能够通过数据分析和营销功能提供个性化的服务和推广活动。下面看看连锁收银系统…

能源能耗管理系统

随着全球对绿色、低碳、可持续发展理念的深入认识&#xff0c;企业对于能源的管理和节能降耗的需求日益迫切。在这一背景下&#xff0c;HiWoo Cloud平台凭借其先进的能源能耗管理系统&#xff0c;为企业提供了一套高效、智能的解决方案&#xff0c;助力企业实现绿色节能&#x…

InfiniGate自研网关实现五

17.核心通信组件管理和处理服务映射 引入模块api-gateway-core 到 api-gateway-assist 中进行创建和使用&#xff0c;并拉取自注册中心的映射信息注册到本地的网关通信组件中。 第17节是在第15节的基础上继续完善服务发现的相关功能&#xff0c;把从注册中心拉取的网关映射信…

GPT3.5与GPT4.0的差别对比

随着人工智能技术的飞速发展&#xff0c;GPT系列模型已成为自然语言处理&#xff08;NLP&#xff09;领域的翘楚。GPT3.5和GPT4.0作为这一系列的最新成员&#xff0c;各自在性能和应用上都有所突破。 GPT4.0预计将拥有数千亿个参数&#xff0c;与前代GPT3.5相比&#xff0c;模…