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.pswp.cn/diannao/13133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13133.shtml
英文地址,請注明出處:http://en.pswp.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;模…