
एक हल्का, बहु-परत वाला Linux सैंडबॉक्स जो namespaces, pivot_root, seccomp-bpf, capability dropping, और एक साक्ष्य-आधारित निर्णय इंजन (Truthimatics Public Version) को जोड़ता है — सुरक्षित, ऑडिट योग्य कोड निष्पादन के लिए।
Linux पर नेटिव कोड निष्पादन के लिए मल्टी-लेयर सैंडबॉक्स।
सात स्वतंत्र रक्षा परतें — कोई बाहरी निर्भरता नहीं, ~73 KiB PIE बाइनरी।
┌──────────────────────────────────────────────────────┐
│ Z-Jail │
├──────────────────────────────────────────────────────┤
│ Truthimatics PV (evidence-based verdict engine) │
│ Namespaces (mount, pid, net, ipc, uts) │
│ pivot_root (chroot on steroids) │
│ Capabilities (drop all, lock securebits) │
│ NO_NEW_PRIVS (no privilege escalation) │
│ seccomp-BPF (whitelist: 15 syscalls only) │
│ Audit (JSON logging + BLAKE2b hashing) │
└──────────────────────────────────────────────────────┘
git clone https://github.com/Division-36/Z-Jail.git
cd Z-Jail
make
sudo ./z_jail --root=/path/to/rootfs --seccomp-enforce -- /bin/ls
--root निर्देशिका में लक्ष्य बाइनरी और उसकी निर्भरताओं के साथ एक न्यूनतम फाइलसिस्टम होना चाहिए (स्टैटिक बाइनरी के लिए, केवल बाइनरी ही पर्याप्त है)।
मौजूदा सैंडबॉक्सिंग समाधान कुछ समझौते करते हैं:
Z-Jail, bwrap (न्यूनतम, डिफ़ॉल्ट रूप से seccomp नहीं) और nsjail (फीचर-संपन्न, भारी निर्भरताएं) के बीच की जगह भरता है। इसे CI पाइपलाइनों, CTF जेल चुनौतियों और हल्के कोड मूल्यांकन के लिए डिज़ाइन किया गया है, जहाँ आपको कंटेनर रनटाइम शामिल किए बिना गहराई में सुरक्षा (defence-in-depth) की आवश्यकता होती है।
flowchart LR
CLI[CLI args] --> P[parse_args]
P --> C{clone namespaces}
C -->|child| CR[child_run]
C -->|parent| W[waitpid]
CR --> RL[setrlimit]
RL --> FD[close fds >= 3]
FD --> DUMP[PR_SET_DUMPABLE=0]
DUMP --> PV[pivot_root]
PV --> NNP[PR_SET_NO_NEW_PRIVS]
NNP --> CAP[drop capabilities]
CAP --> SC[seccomp-BPF]
SC --> SIG[signal parent]
SIG --> EX[execve target]
W --> A[audit JSON]
A --> EXIT[exit]
प्रत्येक परत इस क्रम में व्यवस्थित है कि बाद वाली परत को पहले वाली परत द्वारा पूर्ववत नहीं किया जा सकता:
capset एस्केलेशन नहींsequenceDiagram
participant P as Parent
participant C as Child
P->>C: clone (NEWNS|NEWPID|NEWNET|NEWIPC|NEWUTS)
Note over C: setrlimit(CPU, AS, NOFILE, NPROC)
Note over C: close(all fds > 2)
Note over C: PR_SET_DUMPABLE=0
Note over C: pivot_root → chdir("/") → umount -l
Note over C: PR_SET_NO_NEW_PRIVS
Note over C: capset(all zero) + securebits
Note over C: seccomp(SECCOMP_MODE_FILTER, whitelist)
C->>P: write(pipe, ready=1)
Note over C: execve(target)
P->>P: waitpid
P->>P: write audit JSON
साक्ष्य-आधारित निर्णय इंजन। निष्पादित बाइनरी के बारे में भारित अवलोकन एकत्र करता है और अंतिम निर्णय (DETERMINISTIC, REJECT, या UNCERTAIN) निर्धारित करता है। प्रत्येक अवलोकन का एक भार होता है; कुल के 50% से अधिक भार वाला कोई भी एकल अवलोकन निर्णय तय करता है।
clone() के माध्यम से पाँच नेमस्पेस बनाए जाते हैं:
प्रारंभिक नेमस्पेस में CAP_SYS_ADMIN की आवश्यकता होती है।
माउंट नेमस्पेस रूट को --root निर्देशिका से बदल देता है:
MS_BIND|MS_REC)pivot_root(new_root, put_old) — माउंट ट्री को स्वैप करेंchdir("/") — नए रूट में जाएँumount2("/.pivot_old", MNT_DETACH) — पुराने रूट को अलग करेंrmdir("/.pivot_old") — साफ करेंयह chroot(2) से कड़ाई से अधिक मजबूत है — सैंडबॉक्स की गई प्रक्रिया के लिए होस्ट रूट में वापस भागने का कोई रास्ता नहीं है, यहाँ तक कि सैंडबॉक्स के अंदर से CLONE_NEWNS के साथ भी (जो पहले से seccomp द्वारा अवरुद्ध है)।
सभी क्षमताएं निम्न के माध्यम से हटा दी जाती हैं:
capset(hdr, data) // data = {0, 0, 0}
prctl(SECBIT_KEEP_CAPS_LOCKED | SECBIT_NO_SETUID_FIXUP | ...)
प्रक्रिया capset से पहले setuid/setgid हटा देती है ताकि uid परिवर्तन तब प्रभावी हो जब CAP_SETUID अभी भी धारित हो। capset के बाद, सभी क्षमताएं समाप्त हो जाती हैं और securebits लॉक हो जाते हैं — पुनः सक्षम करना संभव नहीं है।
prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
प्रक्रिया या उसके चाइल्ड को setuid बाइनरी, फ़ाइल क्षमताओं या LSM ट्रांज़िशन के माध्यम से नए विशेषाधिकार प्राप्त करने से रोकता है। अपरिवर्तनीय।
15 सिसकॉलों की अनुमति-सूची — सूची में न होने वाली कोई भी चीज़ SECCOMP_RET_KILL पाती है:
BPF फ़िल्टर गतिशील रूप से उत्पन्न होता है: प्रत्येक व्हाइटलिस्ट प्रविष्टि के लिए एक जंप चेन उत्सर्जित होती है जो या तो अनुमति देती है (यदि सिसकॉल मेल खाता है) या KILL तक गिर जाती है। आर्किटेक्चर की जाँच पहले की जाती है (AUDIT_ARCH_X86_64)।
फ़िल्टर को एक स्वतंत्र स्टैंडअलोन टेस्ट (tests/seccomp_filter_test.c, 8/8 पास) द्वारा स्वतंत्र रूप से सत्यापित किया जाता है, जो रूट की आवश्यकता के बिना वास्तविक prctl(PR_SET_SECCOMP) के विरुद्ध टेस्ट केस को fork+execve करता है।
हर निष्पादन एक JSON ऑडिट रिकॉर्ड उत्पन्न करता है:
{
"schema": "z-jail.audit/v1",
"build_id": "Z-Jail/v1+dev",
"timestamp": 1749000000,
"duration_ns": 8500000,
"executable": "/bin/ls",
"verdict": "DETERMINISTIC",
"exit_code": 0,
"sandbox": {
"seccomp_filter": "whitelist-v1",
"seccomp_whitelist_size": 15,
"seccomp_arg_rules_size": 2,
"namespaces": ["mount","pid","net","ipc","uts"],
"pivot_root": "/var/run/z-jail/roots/default",
"no_new_privs": true,
"capabilities_dropped": true
},
"content_fingerprint": "0e5751c026e543b2e8ab2eb06099daa1..."
}
build/audits/<binary-name>.audit.json में लिखा जाता है। content_fingerprint लक्ष्य बाइनरी का BLAKE2b-256 हैश है, जिसकी गणना चाइल्ड के समाप्त होने के बाद पैरेंट द्वारा की जाती है।
z_jail --root=<dir> [--seccomp-enforce] [--self-hash=<hex>]
[--quiet] [--verbose] -- <program> [args...]
# Run a static binary with all protections
sudo z_jail --root=./roots --seccomp-enforce -- bin/hello_static
# Run with binary integrity verification
sudo z_jail --root=./roots --seccomp-enforce \
--self-hash=$(sha256sum z_jail | cut -c1-64) -- bin/program
# Quiet mode (no audit JSON)
sudo z_jail --root=./roots --quiet -- bin/program
make # build z_jail (~130 KiB PIE binary)
make install # install to /usr/local/bin + man page
make clean # remove build artifacts
make dist # create release tarball
make check # smoke test (--version + --help)
बाइनरी को -fstack-protector-strong, -D_FORTIFY_SOURCE=2, पूर्ण RELRO और -z now के साथ Position Independent Executable के रूप में बनाया गया है।
make CC=clang CFLAGS="-O3 -march=native" # custom compiler/flags
# seccomp filter logic (8 tests)
tests/build/seccomp_filter_test
# BLAKE2b known-answer test
tests/build/blake2b_known
इन्हें रूट की आवश्यकता नहीं होती और ये 100 ms से कम समय में चलते हैं।
make -C tests setup # build payloads + test roots
sudo bash tests/run_tests.sh # 17 scenarios
नेमस्पेस निर्माण के लिए रूट की आवश्यकता होती है। टेस्ट सूट निम्नलिखित को कवर करता है:
WSL2 (कर्नेल 6.18.x-microsoft-standard-WSL2, Kali Linux) पर मापा गया, प्रति टूल 50 नमूने, समान कार्यभार (एक फ्रीस्टैंडिंग स्टैटिक बाइनरी जिसका मुख्य भाग exit_group(0) है), getrusage हार्नेस के साथ समयबद्ध। पद्धति के लिए docs/BENCHMARKS.md देखें।
| मीट्रिक | मान |
|---|---|
| बाइनरी आकार | ~73 KiB अनस्ट्रिप्ड (~28 KiB स्ट्रिप्ड) |
| औसत सैंडबॉक्स विलंबता | 5.85 ± 1.45 ms (95% CI [5.45, 6.25]) |
| पीक RSS | 1.62 MiB |
| कोड की पंक्तियाँ (कोर) |
परीक्षण की गई शर्तों के तहत Z-Jail के पास तीनों प्रोसेस-स्तरीय सैंडबॉक्सों में सबसे छोटा रेजिडेंट सेट है और विलंबता bwrap और nsjail के बीच है। Bubblewrap सबसे तेज़ है लेकिन डिफ़ॉल्ट रूप से कोई seccomp फ़िल्टरिंग नहीं करता, इसलिए वह कम सेटअप कार्य करता है; Z-Jail हर रन पर seccomp व्हाइटलिस्ट स्थापित करता है, क्षमताएं हटाता है और pivot_root करता है। gVisor (runsc) इस WSL2 कर्नेल पर segfault करता है और मापा नहीं जा सका; Firecracker microVM के माध्यम से अलगाव करता है (VM कोल्ड-बूट, एक अलग मीट्रिक) और fork-to-exec तालिका से बाहर रखा गया है। ये एकल-होस्ट संख्याएँ हैं — इन्हें सापेक्ष मानें।
नोट: पुराने दर्ज किए गए आंकड़े (~8 ms, ~4 MiB, ~130 KiB) वर्तमान
makeबिल्ड (~73 KiB, ~5.9 ms) से मेल नहीं खाते और गलत प्रतीत होते हैं; ऊपर दिए गए आंकड़े इसी कोडबेस पर पुनः मापे गए थे। Truthimatics अभी भी कोड का हिस्सा है और उसे हटाया नहीं गया था (पुरानीaxiom_jailरिपोर्टों में केवल एक अलग बाइनरी नाम और हार्नेस का उपयोग किया गया था)। बेंचमार्किंग के दौरान पाया गया एक माउंट-प्रोपेगेशन बगsrc/sandbox.cमें ठीक किया गया था (बाइंड माउंट से पहलेMS_REC|MS_PRIVATE); रिकर्सिव रीमाउंट मापी गई विलंबता का एक हिस्सा योगदान देता है।
chroot, mount, ptrace, socket, process_vm_writev के माध्यम से पलायनRLIMIT_CPU), मेमोरी थकावट (RLIMIT_AS)execve के दौरान फ़ाइल डिस्क्रिप्टर लीकsetuid / डायनामिक लिंकर / LD_PRELOAD एस्केलेशन/proc, /sys माउंट के माध्यम से सह-स्थित VM पलायनCLONE_NEWNET + अवरुद्ध socket प्रदान करता है उससे परेclone(CLONE_NEWNS|CLONE_NEWPID|...) सफल होता है (CAP_SYS_ADMIN की आवश्यकता है)--root में उपलब्ध हैं)--self-hash=<hex> कॉन्फ़िगर किया गया हैMIT — पूरा पाठ LICENSE में देखें।
Z-Jail को WSL2 (Kali Linux, GCC 15.2.0) पर बनाया गया था, जो Linux 5.4+ को लक्षित करता है। Division-36 द्वारा अनुरक्षित। समस्याओं की रिपोर्ट issue tracker पर करें।
| Z-Jail | Firecracker | gVisor | bwrap | nsjail |
|---|
| बाहरी निर्भरताएं | शून्य | libc, seccomp | Go runtime | libc | libc, protobuf |
| बाइनरी आकार | ~73 KiB | 20+ MiB | 40+ MiB | ~70 KiB | ~1 MiB |
| VM अलगाव | नहीं | हाँ (microVM) | नहीं (सैंडबॉक्स) | नहीं | नहीं |
| seccomp व्हाइटलिस्ट | हाँ | नहीं | हाँ | वैकल्पिक | हाँ |
| सामग्री हैशिंग | हाँ | नहीं | नहीं | नहीं | नहीं |
| ऑडिट JSON | हाँ | नहीं | हाँ | नहीं | आंशिक |
| निर्माण जटिलता | एक make | जटिल | जटिल | सरल | मध्यम |
| नेमस्पेस | फ़्लैग | उद्देश्य |
|---|
| Mount | CLONE_NEWNS | पृथक फाइलसिस्टम ट्री |
| PID | CLONE_NEWPID | प्रोसेस आईडी स्पेस (चाइल्ड pid 1 है) |
| Net | CLONE_NEWNET | कोई नेटवर्क इंटरफेस नहीं |
| IPC | CLONE_NEWIPC | कोई साझा मेमोरी / सेमाफोर नहीं |
| UTS | CLONE_NEWUTS | अलग होस्टनाम |
| सिसकॉल | संख्या | टिप्पणियाँ |
|---|
read | 0 | stdin |
write | 1 | stdout/stderr + रिपोर्ट पाइप |
openat | 257 | फ़ाइल एक्सेस (open नहीं) |
close | 3 | — |
lseek | 8 | — |
brk | 12 | हीप प्रबंधन |
mmap | 9 | तर्क-प्रतिबंधित: flags & 4 == 0 (कोई MAP_SHARED नहीं), flags == 0x22 (MAP_PRIVATE|MAP_ANONYMOUS) |
munmap | 11 | — |
execve | 59 | स्टार्टअप पर एकल exec |
exit_group | 231 | स्वच्छ प्रक्रिया निकास |
rt_sigaction | 13 | सिग्नल हैंडलर |
rt_sigprocmask | 14 | सिग्नल मास्किंग |
getrandom | 318 | रैंडम संख्या स्रोत |
clock_gettime | 228 | टाइमिंग |
fstat | 5 | फ़ाइल मेटाडेटा |
| फ़्लैग | विवरण |
|---|
--root=<dir> | सैंडबॉक्स रूट निर्देशिका (आवश्यक) |
--seccomp-enforce | seccomp-BPF सिसकॉल व्हाइटलिस्ट सक्षम करें |
--self-hash=<hex> | सत्यापित करें कि बाइनरी अपेक्षित BLAKE2b-256 हैश से मेल खाती है |
--quiet | ऑडिट आउटपुट दबाएँ |
--verbose | डीबग लॉगिंग सक्षम करें |
--version | बिल्ड आईडी दिखाएँ (Z-Jail/v1+dev) |
--help | उपयोग दिखाएँ और बाहर निकलें |
| कोड | अर्थ |
|---|
| 0 | चाइल्ड सामान्य रूप से बाहर निकला (निर्णय: DETERMINISTIC) |
| 1 | चाइल्ड सिग्नल द्वारा मारा गया (निर्णय: REJECT) |
| 2 | Self-hash: गलत हेक्स स्ट्रिंग या फ़ाइल पठनीय नहीं |
| 3 | Self-hash: मेल नहीं खाता (बाइनरी के साथ छेड़छाड़ की गई है) |
| 101 | चाइल्ड सेटअप त्रुटि (rlimit, आदि) |
| 102 | चाइल्ड seccomp फ़िल्टर स्थापना विफल |
| 103 | चाइल्ड execve विफल (बाइनरी नहीं मिली, exec अनुमति नहीं) |
| 104 | चाइल्ड pivot_root विफल |
| 105 | चाइल्ड क्षमता हटाना विफल |
| 125 | नेमस्पेस निर्माण विफल (रूट के रूप में चला? कर्नेल समर्थन?) |
| # | परिदृश्य | प्रकार | यह क्या परीक्षण करता है |
|---|
| 0 | blake2b_regress | ज्ञात-उत्तर | BLAKE2b कार्यान्वयन की सत्यता |
| 1 | seccomp_filter | स्टैंडअलोन BPF | BPF फ़िल्टर लॉजिक के 8 उप-परीक्षण |
| 2 | hello_static | ठीक | बुनियादी स्टैटिक बाइनरी निष्पादन |
| 3 | hello_dynamic | ठीक | ld-linux + libc के साथ डायनामिक बाइनरी |
| 4 | execve_replacement | ठीक | सैंडबॉक्स में execve (seccomp द्वारा अवरुद्ध) |
| 5 | fd_inherited_read | ठीक | stdin/stdout सही ढंग से इनहेरिट हुआ |
| 6 | mmap_bad_flags | मारा गया | MAP_SHARED के साथ mmap अवरुद्ध |
| 7 | mmap_good_allowed | ठीक | MAP_PRIVATE|ANONYMOUS के साथ mmap अनुमत |
| 8 | mmap_prot_exec | मारा गया | PROT_EXEC के साथ mmap अवरुद्ध |
| 9 | mmap_self_modify | मारा गया | स्व-संशोधित कोड अवरुद्ध |
| 10 | ptrace | मारा गया | ptrace अवरुद्ध |
| 11 | socket | मारा गया | socket निर्माण अवरुद्ध |
| 12 | chroot_escape | मारा गया | chroot सिसकॉल अवरुद्ध |
| 13 | double_chroot | मारा गया | डबल chroot अवरुद्ध |
| 14 | mount_replay | मारा गया | Mount सिसकॉल अवरुद्ध |
| 15 | cpu_exhaust | मारा गया | RLIMIT_NPROC fork बम को अवरुद्ध करता है |
| 16 | signal_parent | मारा गया | पैरेंट को सिग्नल अवरुद्ध |
| 17 | self_hash | ठीक | बाइनरी अखंडता सत्यापन |
| ~900 |
| टूल | विलंबता माध्य ± sd | पीक RSS | डिफ़ॉल्ट seccomp |
|---|
| Z-Jail | 5.85 ± 1.45 ms | 1.62 MiB | हाँ |
| bwrap | 3.56 ± 0.40 ms | 2.19 MiB | नहीं |
| nsjail | 8.98 ± 1.68 ms | 7.91 MiB | हाँ |
| फ़ाइल | विवरण |
|---|
README.md | यह फ़ाइल |
docs/ARCHITECTURE.md | आर्किटेक्चर अवलोकन |
docs/SANDBOX.md | परत-दर-परत सैंडबॉक्स आंतरिक |
docs/SECCOMP.md | seccomp-BPF व्हाइटलिस्ट डिज़ाइन |
docs/AUDIT_SCHEMA.md | ऑडिट JSON स्कीमा संदर्भ |
docs/THREAT_MODEL.md | सुरक्षा मान्यताएँ और दायरा |
docs/BLAKE2B.md | BLAKE2b कार्यान्वयन विवरण |
docs/BENCHMARKS.md | प्रदर्शन बेंचमार्क |
docs/BUILD.md | निर्माण निर्देश |
docs/adr/ | आर्किटेक्चर निर्णय रिकॉर्ड (4 दस्तावेज़) |
man/z_jail.1 | मैन पेज |
SECURITY.md | सुरक्षा नीति और रिपोर्टिंग |
CONTRIBUTING.md | योगदान कैसे करें |
CHANGELOG.md | रिलीज़ इतिहास |
ROADMAP.md | भविष्य की योजनाएँ |
TODO.md | ज्ञात अंतराल और नियोजित कार्य |