Podman rootless कंटेनर और Copy Fail exploit
(garrido.io)- CVE-2026-31431 Copy Fail लोकल non-privileged यूज़र को
rootshell दिला सकता है, और Podman rootless container के अंदर भी container के भीतरrootprivilege escalation संभव है - Podman rootless container user namespace, UID isolation, और Linux capabilities के संयोजन से container के भीतर के
rootको host के non-privileged यूज़र से map करता है और host permissions को सीमित करता है - टेस्ट में rootless non-root container के
fooयूज़र ने Copy Fail चलाने के बाद container के भीतरrootबनना तो संभव किया, लेकिन उसकी permissions host के non-privileged यूज़रbarकी सीमा तक ही रहीं, और वह host केrootस्वामित्व वाली files नहीं पढ़ सका --security-opt=no-new-privilegesया--cap-drop=allलागू करने पर Copy Fail चलने के बाद भी shellfooऔर capabilitiesnoneस्थिति में बना रहा, जिससे तुरंतrootshell हासिल करना और capability escalation रोका जा सकता है- Copy Fail का प्रभाव container lifecycle से आगे भी बना रह सकता है, इसलिए kernel patch और reboot ज़रूरी हैं, और read-only root filesystem, cgroups resource limits, thin runtime images, firewall जैसे defense in depth उपाय भी साथ में लागू करने चाहिए
Copy Fail और Podman rootless container की exposure range
- CVE-2026-31431 29 अप्रैल को copy.fail पर सार्वजनिक किया गया था, और प्रकाशित Python script चलाने पर लोकल non-privileged यूज़र
rootshell प्राप्त कर सकता है - Copy Fail का दुरुपयोग Linux container के भीतर भी किया जा सकता है, और Podman rootless container में भी container के भीतर
rootshell हासिल किया जा सकता है - टेस्ट में container का
root, host स्तर पर container चलाने वाले non-privileged यूज़रbarकी permission सीमा तक सीमित रहा - Podman का rootless implementation user namespace, UID isolation, और Linux capabilities के संयोजन से container process की host permissions को सीमित करता है
- Copy Fail दिखाता है कि rootless container भी vulnerability से पूरी तरह immune नहीं हैं, लेकिन Podman configuration के जरिए compromise के बाद attack surface को कम किया जा सकता है
Rootless container कैसे काम करते हैं
-
बुनियादी उदाहरण: non-privileged यूज़र
barद्वारा HTTP server चलाना- उदाहरण environment में UID
1001वाला non-privileged यूज़रbar, Podman सेubuntu:latestआधारित image build करता है औरpython3 -m http.serverचलाता है - Host पर
psसे देखने परpython3process, यूज़रbarके स्वामित्व में चलता दिखता है - Podman fork/exec model का उपयोग करता है, इसलिए container process,
podman runprocess की descendant बनती है, और सामान्य UID isolation के जरिए container process को hostrootया अन्य यूज़र्स से अलग किया जा सकता है - सामान्य Docker configuration में non-privileged यूज़र
docker runचलाए तब भी Docker client, root-privileged daemon से बात करता है, और daemon ही अंततः container process बनाता है, इसलिए host पर container processrootके रूप में दिख सकती है
- उदाहरण environment में UID
-
Rootless rootful
- अगर container image में स्पष्ट
USERdirective या--userflag न हो, तो आमतौर पर container command भीतर केrootके रूप में चलती है podman topoutput में HTTP server process host user1001से map होती है, लेकिन container के भीतर user के रूप मेंrootसे चलती है- यह configuration host पर non-privileged यूज़र के रूप में चलती है, लेकिन container के भीतर
rootहोती है, यानी rootless rootful स्थिति
- अगर container image में स्पष्ट
-
User namespace
- Podman rootless container, user namespace का उपयोग करके container के भीतर और बाहर UID/GID को अलग-अलग map करता है
- उदाहरण में container के भीतर UID
0वालाroot, host के UID1001वालेbarसे map होता है /etc/subuidमेंbar:165536:65536setting,barके namespace process को आवंटित किए जा सकने वाले UID range को तय करती है- उदाहरण में
barके UID1001के अलावा165536से231072तक के UID,barprocess को आवंटित किए जा सकते हैं - Container के भीतर user
www-dataके रूप मेंsleepचलाने पर, भीतर वहwww-dataरहता है लेकिन host पर165568के रूप में दिखता है podman unshareसे user namespace में जाने पर, host परbar:barस्वामित्व वाली home directory, namespace के भीतरroot:rootके रूप में दिखती है- Docker भी user namespace को support करता है, लेकिन उसके लिए अलग configuration चाहिए और केवल एक user namespace की अनुमति होती है, जबकि Podman प्रत्येक UNIX user के rootless container को उसी user namespace में चलाता है
-
Privileged operations और Linux capabilities
- Podman, Linux capabilities का उपयोग करके container process को granular root permissions देता है
- Image build के दौरान
apt installजैसे काम,chown,dac_override,fowner,setgid,setuid,net_bind_service,sys_chrootजैसी capability के संयोजन से संभव होते हैं podman build --cap-drop=allसे सभी capabilities हटाने परapt,setgroups,setegid,seteuid,chownआदि में fail हो जाता है और image build असफल हो जाती है- केवल ज़रूरी capabilities जोड़ने का तरीका भी संभव है, और उदाहरण में
CAP_SETUID,CAP_SETGID,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNERजोड़कर package install किया गया - डिफॉल्ट runtime state में HTTP server, container के भीतर
rootके रूप में चलता है औरCHOWN,DAC_OVERRIDE,FOWNER,FSETID,KILL,NET_BIND_SERVICE,SETFCAP,SETGID,SETPCAP,SETUID,SYS_CHROOTजैसी कई effective capabilities रखता है - HTTP server को इन permissions की ज़रूरत नहीं होती, इसलिए
podman run --cap-drop=allसे सभी capabilities हटाई जा सकती हैं, और इस स्थिति मेंpodman topमें effective capabilitiesnoneके रूप में दिखती हैं
-
Rootless non-root
- अगर container के भीतर भी HTTP server को non-privileged यूज़र के रूप में चलाना हो, तो मौजूदा
/etc/passwdके user, जैसेwww-data, का उपयोग किया जा सकता है या image build के दौरान dedicated user बनाया जा सकता है - उदाहरण में UID
1002वालाfoouser और group बनाया गया,/var/www/htmlपर read permission दी गई, और फिरUSER foo:fooसेट किया गया - इस image को
--cap-drop=allके साथ चलाने पर process, container के भीतरfoo, host UID166537, और effective capabilitiesnoneस्थिति में होती है - Container process को न्यूनतम आवश्यक permissions के साथ चलना चाहिए; उदाहरण के लिए अगर
fooको privileged port80पर bind करना हो, तो--cap-add=CAP_NET_BIND_SERVICEजोड़ना होगा - Container execution modes को चार भागों में बाँटा जा सकता है
roothost user + containerroot: root rootfulroothost user + container non-privileged user: root non-root- non-privileged host user + container
root: rootless rootful - non-privileged host user + container non-privileged user: rootless non-root
- Podman, rootless rootful container चलाना आसान बनाता है, और अगर container process को non-privileged यूज़र के रूप में चलाया जा सके, तो rootless non-root configuration भी अपेक्षाकृत आसानी से बनाई जा सकती है
- अगर container के भीतर भी HTTP server को non-privileged यूज़र के रूप में चलाना हो, तो मौजूदा
bind mount और UID isolation
- होस्ट directory को container में mount करने पर, होस्ट
root, होस्टbar, और namespacefooके स्वामित्व वाली फाइलों तक पहुंच UID mapping के अनुसार बदलती है - उदाहरण में
/var/lib/bar/testdirectory में होस्टrootकीroot.txtऔर होस्टbarकीbar.txtबनाई जाती हैं, और इन्हें container में/testपर read/write mount किया जाता है - container को
fooके रूप में चलाने पर, होस्टbarकी फाइल container के अंदरroot:rootके रूप में दिखती है, जबकि होस्टrootकी फाइल namespace में map नहीं होने के कारणnobody:nogroupके रूप में दिखती है - container के अंदर
foo,bar.txtऔरroot.txtको पढ़ नहीं सकता, और rootless non-root, rootless rootful की तुलना में अतिरिक्त isolation देता है - mount की गई directory में
fooद्वारा बनाई गईfoo.txtहोस्ट पर UID166537के स्वामित्व वाली दिखती है, और होस्ट userbarउसकी सामग्री पढ़ नहीं सकता - container को अंदरूनी
rootके रूप में चलाने पर namespaceroot, होस्टbarकी फाइल औरfooकी फाइल पढ़ सकता है, लेकिन होस्टrootकी फाइल नहीं पढ़ सकता - अंदरूनी
rootके रूप में चलाते समय--cap-drop=allलागू करने परfooकी फाइल भी नहीं पढ़ी जा सकती, और केवल होस्टbarकी फाइल पढ़ी जा सकती है
Copy Fail टेस्ट
-
टेस्ट शर्तें
- Copy Fail टेस्ट में मूल रूप से सार्वजनिक किए गए commit
8e918b5के exploit version का उपयोग किया गया - उदाहरण container image मौजूदा HTTP server image में
curlजोड़कर बनाई गई है ताकि container के अंदर exploit script डाउनलोड की जा सके - image का नाम
copyfailबनाकर build किया गया - टेस्ट kernel Debian का
6.12.74+deb13+1-amd64है, और Debian के मानक के अनुसार हाल के versions में6.12.85से कम version को अभी तक patch न किए गए kernel के रूप में उपयोग योग्य माना गया - सामान्य तौर पर non-privileged user
fooयदिsuचलाता है, तोrootpassword मांगा जाता है - हर टेस्ट में container user
/tmpमें Copy Fail script डाउनलोड कर उसे चलाता है, औरrootshell मिल जाने परsleepचलाता है - Copy Fail container lifecycle के बाद भी बना रहता है, इसलिए हर टेस्ट से पहले VM को reboot किया जाता है
- Copy Fail टेस्ट में मूल रूप से सार्वजनिक किए गए commit
-
rootless rootful में परिणाम
--user=rootके साथ container चलाने पर container के अंदर process पहले से हीrootहोता है- इस स्थिति में Copy Fail script चलाकर
suकॉल करने परuid=0(root)shell मिलता है, लेकिनrootuser मूल रूप से भी बिना password केsuसे दूसरा root shell खोल सकता है, इसलिए Copy Fail व्यावहारिक रूप से कुछ अतिरिक्त नहीं देता podman topमें/bin/bash,python3 copy_fail_exp.py,su,sleepसभी container के अंदरrootऔर होस्ट user1001के रूप में दिखते हैं- वही capability set बना रहता है, और
CHOWN,DAC_OVERRIDE,FOWNER,FSETID,KILL,NET_BIND_SERVICE,SETFCAP,SETGID,SETPCAP,SETUID,SYS_CHROOTदिखाई देते हैं - अंदरूनी
root, mounted/testमेंbar.txtऔरfoo.txtपढ़ सकता है, लेकिन होस्टrootकीroot.txtनहीं पढ़ सकता
-
rootless non-root में परिणाम
- container को
fooके रूप में चलाने के बाद Copy Fail script चलाकरsuकॉल करने पर container के अंदरrootतक privilege escalation हो जाता है - परिणाम shell का
iduid=0(root) gid=1002(foo) groups=1002(foo)के रूप में दिखता है podman topमें शुरुआती/bin/bash, exploit चलाने वाली process, औरsuकॉल होस्ट UID166537, container userfoo, और capabilitiesnoneकी स्थिति में दिखते हैं- privilege escalation के बाद
[sh]औरsleepहोस्ट user1001और container userrootके रूप में दिखते हैं, और rootless rootful जैसा ही capability set मिल जाता है - privilege escalation के बाद का container
rootभी होस्टrootकीroot.txtनहीं पढ़ सकता - इस स्थिति में container compromise हो चुका है, लेकिन attack surface container और होस्ट के non-privileged user
barकी संभावित पहुंच तक सीमित रहती है
- container को
-
no-new-privilegesलागू करने पर परिणाम- Podman
--security-opt=no-new-privilegesके जरिए container process को startup समय से अधिक privileges हासिल करने से रोक सकता है - rootless non-root container पर यह option लागू करके Copy Fail चलाने पर shell खुलता है, लेकिन वह अब भी
uid=1002(foo)की स्थिति में रहता है podman topमें भी सभी process होस्ट UID166537, container userfoo, और capabilitiesnoneपर बने रहते हैं- mounted
/testमें भीfooकेवल अपनी फाइल पढ़ सकता है औरbar.txtवroot.txtनहीं पढ़ सकता - container compromise हुआ है, लेकिन यह अंदरूनी non-privileged user
fooऔर बिना capability वाली स्थिति तक सीमित रहता है
- Podman
-
--cap-drop=allलागू करने पर परिणाम- rootless non-root container को
--cap-drop=allके साथ चलाने पर भीfooके पास मूल रूप से कोई capability नहीं होती - इस स्थिति में Copy Fail चलाकर
suकॉल करने पर खुला हुआ shelluid=1002(foo)पर बना रहता है podman topमें भी/bin/bash, exploit execution,su, shell, औरsleepसभीfooऔर capabilitiesnoneकी स्थिति में दिखते हैं- exploit
rootshell हासिल करने में विफल रहता है, औरfoo/testमें केवल अपनी फाइल पढ़ सकता है - यह परिणाम
no-new-privilegesटेस्ट जैसा है, और दोनों उपायों को साथ में इस्तेमाल करके capability exposure को प्रभावी रूप से कम किया जा सकता है
- rootless non-root container को
-
exploit की persistence
- तुरंत
rootshell और capability हासिल करनाno-new-privilegesया--cap-drop=allसे रोका जा सका, लेकिन exploit का प्रभाव खुद बना रहता है - बाद में यदि capability restriction के बिना नया container चलाया जाए, तो non-privileged container user
fooकेवलsuकॉल करके भी containerrootबन सकता है - इसलिए kernel patch और reboot अब भी आवश्यक हैं
- तुरंत
रक्षा-में-गहराई रणनीति
-
केवल-पढ़ने योग्य इमेज
podman runमें--read-onlyजोड़ने पर कंटेनर root filesystem केवल-पढ़ने योग्य रूप में mount होता है- Podman डिफ़ॉल्ट रूप से
/tmp,/run,/var/tmpजैसी कुछ directories को writable mount करता है, इसलिए इसे पूरी तरह केवल-पढ़ने योग्य बनाने के लिए--read-only-tmpfs=falseभी जोड़ना होगा - यदि केवल-पढ़ने योग्य कंटेनर से समझौता हो जाए, तो सिस्टम पर write operations की अनुमति नहीं होगी, जिससे exploit के बाद कुछ हमलों को सीमित किया जा सकता है
- हालांकि
curlके output कोpython3में pipe किया जा सकता है, इसलिए केवल-पढ़ने योग्य सेटिंग अकेले exploit के execution को नहीं रोकती - उदाहरण में
python3HTTP server को filesystem write की आवश्यकता नहीं है, इसलिए यह option सुरक्षित रूप से इस्तेमाल किया जा सकता है - कई pre-built images कुछ खास directories में write access को मानकर चलती हैं, इसलिए वे केवल-पढ़ने योग्य root filesystem पर सही से काम नहीं कर सकतीं
- केवल-पढ़ने योग्य root filesystem कंटेनर से जुड़े writable volumes से स्वतंत्र होता है, और compromise होने पर उन mount directories में अब भी लिखा जा सकता है
-
संसाधन सीमाएं
- Docker और Podman cgroups का उपयोग करके कंटेनर को दिए जाने वाले resources को सीमित कर सकते हैं
- कंटेनर को unlimited memory, CPU, या PID की ज़रूरत नहीं होती
podman statsसे कंटेनर resource usage देखकर उसके अनुसार limits लागू की जा सकती हैं
-
उपलब्ध binaries को सीमित करना
- उदाहरण में सरलता के लिए
ubuntuimage का उपयोग किया गया है, लेकिनubuntuimage में कई binaries शामिल होती हैं जिनका उपयोग compromise होने पर attacker कर सकता है - HTTP server चलाने के लिए इन binaries में से अधिकांश की आवश्यकता नहीं होती
- runtime image को यथासंभव lean रखना बेहतर है
- multi-stage build का उपयोग करके build-time environment और runtime environment को अलग किया जा सकता है
- python3 जैसी purpose-built images, Debian के
-slimvariants, याalpineजैसी छोटी distributions को base के रूप में इस्तेमाल किया जा सकता है - यदि कंटेनर process के साथ compatible हो, तो distroless images या
scratchका उपयोग करके shell, package manager, और system utilities के बिना runtime बनाया जा सकता है
- उदाहरण में सरलता के लिए
-
फ़ायरवॉल
iptablesयाnftablesका उपयोग करके कंटेनर process को फ़ायरवॉल से सीमित किया जा सकता है- कंटेनर process के लिए केवल वही inbound और outbound connections अनुमति देनी चाहिए जो वास्तव में आवश्यक हों
- HTTP server उदाहरण में DNS या local/remote server से connection की आवश्यकता नहीं है, इसलिए इसे इस तरह सीमित किया जा सकता है कि केवल स्थापित inbound connections से आने वाले
tcppackets ही अनुमत हों
परिचालन संबंधी अर्थ
- मानक Podman rootless कंटेनर डिफ़ॉल्ट रूप से मानक Docker कंटेनर configuration की तुलना में बेहतर isolation प्रदान करते हैं
- Docker में भी rootless execution और unprivileged user namespaces का उपयोग संभव है, लेकिन इसके लिए Podman की तुलना में अधिक configuration effort चाहिए और architectural differences भी असर डालते हैं
- Docker अब भी व्यापक रूप से इस्तेमाल होता है, और Dokku, Kamal, Coolify, Dokploy जैसे self-hosting tools भी डिफ़ॉल्ट रूप से Docker का उपयोग करते हैं
- यदि Docker Hub images को पर्याप्त रूप से review किए बिना चलाया जाए या lockdown measures लागू न किए जाएं, तो service आवश्यकता से बड़े attack surface के साथ चल सकती है
- कंटेनर image की implementation details को समझना ज़रूरी है
- यह समझना चाहिए कि कंटेनर process किस user या किन users के रूप में चलती है
- यह जानना चाहिए कि कंटेनर process root filesystem की किन directories पर निर्भर करती है
- आवश्यक Linux capabilities और अनावश्यक capabilities में अंतर करना चाहिए
- Podman और कंटेनर द्वारा उपलब्ध विभिन्न mechanisms को मिलाकर कंटेनर को harden किया जा सकता है और compromise होने पर blast radius को कम किया जा सकता है
- workload के आधार पर कंटेनर को अकेली security boundary नहीं मानना चाहिए
- कंटेनर और अलग physical या virtual machines को साथ में उपयोग करने से प्रभावी isolation मिल सकता है
- Podman एक ही host के भीतर भी हर workload को अलग unprivileged user और उसके अपने user namespace में चलाकर isolate करने का तरीका देता है
1 टिप्पणियां
Lobste.rs की राय
प्रकाशित exploit से ज़्यादा उस मूल behavior पर ध्यान देना चाहिए जिसे यह vulnerability संभव बनाती है
यह vulnerability read-only होने या न होने से अलग, page cache में लिखने देती है, इसलिए एक malicious container overlayfs की base image files से जुड़े pages को बदल सकता है, और container deployment के तरीके के हिसाब से इसका असर दूसरे containers तक भी जा सकता है
यहाँ rootless configuration में, host system पर उसी user के रूप में चल रहे दूसरे containers target बनते हैं
exploit का एक दूसरा तरीका यह हो सकता है कि किसी ऐसे base image पर आधारित container को चलाया जाए या खोजा जाए जिसके इस्तेमाल में होने की जानकारी हो, फिर उसके अंदर page cache में बदलाव किया जाए, और उसके बाद वही runtime और overlayfs data साझा करने वाले दूसरे containers उस code को चलाएँ
rootless और user namespaces महत्वपूर्ण हैं, लेकिन यहाँ ज़्यादा मददगार नहीं हैं; और जैसा copy.fail साइट कहती है, containers में seccomp के ज़रिए
socket(AF_ALG, ...)system call को block करने पर विचार करना चाहिए“container deployment के तरीके के हिसाब से” से आपका मतलब ठीक-ठीक क्या है, इस पर थोड़ा और स्पष्टीकरण अच्छा रहेगा
rootless Podman का एक फायदा यह है कि workload के अनुसार host पर उसी user से containers चलाना ज़रूरी नहीं होता
अगर आप उस स्थिति की बात कर रहे हैं जहाँ मुख्य workstation user के रूप में कई rootless containers चलाए जाते हैं, तो मैं सहमत हूँ; लेकिन servers पर हर container को अलग user के तहत isolate किया जा सकता है, और वही container image अलग-अलग unprivileged users के रूप में भी चलाई जा सकती है
यह Docker के default से काफ़ी अलग है, जहाँ ज़्यादातर चीज़ें
rootके रूप में चलती हैं, लेकिन मैंने लेख के अंत में यह भी लिखा था कि यह कोई अंतिम security boundary नहीं है, और rootless containers को कई unprivileged users में बाँटना सही है या नहीं, यह use case पर निर्भर करता हैकुछ खास workloads को मैं VM में अलग करके चलाता हूँ
मैं जानना चाहता हूँ कि rootless और user namespaces यहाँ मददगार नहीं हैं, इससे आपका मतलब exploit को रोकने से है या नहीं
seccomp के लिए मैंने अभी तक containers पर explicit policy नहीं लिखी है, इसलिए इसे कवर नहीं किया, लेकिन यह आगे देखने लायक अच्छा संकेत है
मुझे Podman और rootless containers पसंद हैं, लेकिन CopyFail देखने के बाद मैं sibling comment जैसी ही निष्कर्ष पर पहुँचा
podman+rootlessके अतिरिक्त access control फायदों के बावजूद, आखिरकार वही पुरानी सलाह फिर सही साबित हुई कि container कोई security boundary नहीं है, और एक kernel exploit सब कुछ तोड़ सकता हैमैं सिर्फ़ शौकिया तौर पर systems manage करता हूँ, लेकिन इस क्षेत्र की नई दिशा के रूप में मैंने libkrun backend for crun with podman देखा
दावा यह है कि यह अधिकांश containerized workloads को वैसे ही संभालता है, लेकिन अंदर से उन्हें एक अलग guest kernel वाले MicroVM में चलाता है; हालाँकि इसकी maturity, production validation, और security audit level के बारे में मुझे पता नहीं, और कुछ चीज़ें काफ़ी cutting-edge लगती हैं
LLM coding tools में MicroVM को तेज़ी से अपनाया जा रहा है, इसलिए हो सकता है यह स्थिति ज़्यादा समय न रहे
podman machineभी काफ़ी promising लगा, लेकिन अफ़सोस कि वह सिर्फ़ developer workstation use case को ध्यान में रखकर बना है, और हर host system पर container execution के लिए सिर्फ़ एक VM रखने वाला मॉडल हैफिर भी, मुझे लगता है “container कोई security boundary नहीं है” कहना कुछ ज़्यादा ही सरल कर देना है। container निश्चित रूप से एक security boundary है, बस उतनी मज़बूत नहीं जितनी हम मानना चाहते हैं
local deployment में यह रेखा थोड़ी धुंधली हो जाती है
hardware के नज़रिए से VM, process की तुलना में मूल रूप से ज़्यादा सुरक्षित नहीं है, लेकिन तीन कारणों से उसकी boundary को ज़्यादा अच्छी तरह defend किया जा सकता है
VM escape system calls की तुलना में कम आम है, इसलिए performance को नुकसान पहुँचाए बिना ज़्यादा side-channel mitigations लागू करने की गुंजाइश रहती है
VM का host interface काफ़ी सरल होता है। block device में block-level read/write interface होता है, और network device frames भेजते और प्राप्त करते हैं
Linux या *BSD में socket पर मिलने वाला
setsockoptcall, ज़्यादातर emulation या paravirtualized drivers की तुलना में कहीं बड़ा attack surface है, और वह भी पूरे kernel attack surface का केवल एक बहुत छोटा हिस्सा हैVM interface में state भी बहुत कम होती है। request-response model वाले ring में in-flight transactions होते हैं, लेकिन उसके अलावा लगभग कुछ नहीं
credentials, UID, GID, file descriptor tables जैसी चीज़ें kernel में stateful complexity जोड़ती हैं, और bug होने पर process उनका फ़ायदा उठा सकता है
workstation variant की मुश्किल यह है कि वह यह complexity फिर से वापस ले आता है
उदाहरण के लिए, container base layer को immutable filesystem वाले block device के रूप में expose किया जा सकता है, लेकिन volumes और shared folders शायद 9pfs या VirtIO-FS, यानी VirtIO के ऊपर 9p या FUSE के रूप में mount होंगे
इससे attack surface फिर बढ़ जाता है
अगर किस्मत अच्छी हो, तो exploit chain की ज़रूरत पड़ेगी
मैं FreeBSD पक्ष से ज़्यादा परिचित हूँ; वहाँ आम तौर पर paravirtualized या emulated devices देने वाले components को Capsicum से sandbox किया जाता है, इसलिए पहले host process पर कब्ज़ा करना पड़ता है, और फिर VM जिन चीज़ों तक पहुँच नहीं रखता था, उन तक पहुँचने के लिए kernel को भी तोड़ना पड़ता है
लेकिन अगर यह अतिरिक्त sandboxing न हो, तो container escape फिर उसी दुनिया में लौट आता है जहाँ user जो कुछ कर सकता है, वह सब संभव हो जाता है, और desktop पर root compromise होने से यह बहुत बेहतर नहीं रह जाता
व्यक्तिगत रूप से मैं gVisor को ज़्यादा पसंद करता हूँ। यह VMM runtime नहीं है, लेकिन कई सालों से मौजूद है, Tencent जैसी कंपनियाँ भी इसे इस्तेमाल करती हैं, और मेरे setup में जहाँ सारे containers पहले से Proxmox VM के अंदर चलते हैं, यह अच्छा फिट बैठता है
एक और चीज़ जिसे मैं test कर रहा हूँ, वह है syd-oci, जिसे शायद MicroVM या gVisor जैसी default recommendations की तुलना में थोड़ा कम ध्यान मिला है
libkrun संदर्भ के लिए धन्यवाद, यह एक promising संभावना लगती है
security audit तक पहुँचने की संभावना भी काफ़ी लगती है