
सिस्कॉल फ़िल्टरिंग नीतियों को निर्दिष्ट करने के लिए एक भाषा और लाइब्रेरी।
Kafel एक भाषा और लाइब्रेरी है जो syscall फ़िल्टरिंग नीतियों को निर्दिष्ट करने के लिए है। नीतियों को BPF कोड में संकलित किया जाता है जिसका उपयोग seccomp-filter के साथ किया जा सकता है।
यह एक आधिकारिक Google उत्पाद नहीं है।
struct sock_fprog prog;
kafel_ctxt_t ctxt = kafel_ctxt_create();
kafel_set_input_string(ctxt, seccomp_policy);
if (kafel_compile(ctxt, &prog)) {
fprintf(stderr, "policy compilation failed: %s", kafel_error_msg(ctxt));
kafel_ctxt_destroy(&ctxt);
exit(-1);
}
kafel_ctxt_destroy(&ctxt);
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
free(prog.filter);
struct sock_fprog prog;
if (kafel_compile_string(seccomp_policy, &prog)) {
fputs("policy compilation failed", stderr);
exit(-1);
}
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
free(prog.filter);
नीतियों को परिभाषित करने के लिए एक सरल भाषा का उपयोग किया जाता है।
नीति फ़ाइल में कथन होते हैं।
एक कथन हो सकता है:
फ़ाइल स्कोप में रखे गए नीति परिभाषा कथन अंतर्निहित शीर्ष स्तर की नीति में जोड़े जाएंगे। इस शीर्ष स्तर की नीति को संकलित किया जाएगा।
DEFAULT the_action
निर्दिष्ट करता है कि जब कोई नियम मेल नहीं खाता तो कार्रवाई the_action ली जानी चाहिए।
डिफ़ॉल्ट कार्रवाई केवल एक बार निर्दिष्ट की जानी चाहिए।
यदि नीति फ़ाइल कोई डिफ़ॉल्ट कार्रवाई निर्दिष्ट नहीं करती है, तो डिफ़ॉल्ट कार्रवाई KILL होगी
Kafel निम्नलिखित संख्या संकेतन का समर्थन करता है:
420xfa107770b10101अपनी नीतियों को अधिक पढ़ने योग्य बनाने के लिए आप संख्यात्मक स्थिरांक परिभाषित कर सकते हैं। स्थिरांक परिभाषाएँ लगभग कहीं भी नीति फ़ाइल में रखी जा सकती हैं। एक स्थिरांक परिभाषा को नीति परिभाषा के अंदर नहीं रखा जा सकता है। परिभाषित स्थिरांक का उपयोग तब कहीं भी किया जा सकता है जहाँ एक संख्या की अपेक्षा होती है।
#define MYCONST 123
नीति परिभाषा कार्रवाई ब्लॉकों और उपयोग कथनों की एक सूची है जो अल्पविराम द्वारा अलग की गई है।
samples/ में कुछ उदाहरण नीतियाँ हैं जो समर्थित सुविधाओं को प्रदर्शित करती हैं।
एक USE someOtherPolicy ऐसा व्यवहार करता है जैसे someOtherPolicy का बॉडी उसके स्थान पर चिपका दिया गया हो। आप केवल उन नीतियों का उपयोग कर सकते हैं जो उपयोग कथन से पहले परिभाषित की गई हैं।
उपयोग कथनों के साथ आप फ़िल्टरिंग नियमों के सार्थक समूह बना सकते हैं जो बड़ी नीतियों के निर्माण खंड हैं।
कार्रवाई ब्लॉक में एक लक्ष्य और syscall मिलान नियमों की सूची होती है जो अल्पविराम से अलग होती है।
मिलान किए गए पहले नियम का लक्ष्य नीति निर्णय है।
निम्नलिखित तालिका Kafel लक्ष्यों और उनके संबंधित seccomp-filter वापसी मानों को सूचीबद्ध करती है।
एक नियम में syscall नाम और बूलियन अभिव्यक्तियों की एक वैकल्पिक सूची होती है।
बूलियन अभिव्यक्तियों की सूची अल्पविराम द्वारा अलग की गई है। एक अल्पविराम अर्थ || के बराबर है लेकिन इसकी सबसे कम प्राथमिकता है, इसलिए इसे पढ़ना आसान हो सकता है।
सामान्यतः syscalls को Linux कर्नेल में परिभाषित उनके नामों से निर्दिष्ट किया जाता है। हालाँकि, आप कस्टम syscalls को भी फ़िल्टर कर सकते हैं जो मानक syscall सूची में नहीं हैं। आप या तो एक स्थिरांक परिभाषित कर सकते हैं और इसे syscall नाम के स्थान पर उपयोग कर सकते हैं या SYSCALL कीवर्ड का उपयोग कर सकते हैं।
#define mysyscall -1
POLICY my_const {
ALLOW {
mysyscall
}
}
POLICY my_literal {
ALLOW {
SYSCALL[-1]
}
}
आप ON गार्ड का उपयोग करके syscall नियम को आर्किटेक्चर के एक उपसमूह तक सीमित कर सकते हैं। गार्ड या तो एक एकल आर्किटेक्चर नाम या ब्रेसिज़ में लिपटी अल्पविराम से अलग की गई सूची को स्वीकार करता है। नाम kafel_set_target_archs द्वारा पहचाने गए लक्ष्यों के अनुरूप हैं (उदाहरण के लिए x86_64, x86, arm, aarch64, mips64, riscv64, m68k)।
ALLOW {
io_uring_setup ON x86_64,
arm_fadvise64_64 ON arm
}
जब गार्ड के बाहर के आर्किटेक्चर के लिए संकलन किया जाता है, तो syscall नियम को अनदेखा कर दिया जाता है, इसलिए क्रॉस-आर्किटेक्चर नीतियों को syscall उपलब्धता अंतरों के लिए पूरी नीतियों को दोहराने की आवश्यकता नहीं होती है।
बूलियन अभिव्यक्तियों का उपयोग syscalls को उनके तर्कों के आधार पर फ़िल्टर करने के लिए किया जाता है। एक अभिव्यक्ति C भाषा सिंटैक्स जैसी होती है, सिवाय इसके कि कोई अंकगणितीय ऑपरेटर नहीं हैं।
some_syscall(first_arg, my_arg_name) { first_arg == 42 && my_arg_name != 42 }
बिटवाइज़ और (&) और या ('|') ऑपरेटरों का उपयोग फ्लैग्स के परीक्षण के लिए किया जा सकता है।
mmap { (prot & PROT_EXEC) == 0 },
open { flags == O_RDONLY|O_CLOEXEC }
आपको प्रसिद्ध syscalls के लिए तर्क घोषित करने की आवश्यकता नहीं है, बल्कि Linux कर्नेल और man पृष्ठों में निर्दिष्ट उनके सामान्य नामों का उपयोग कर सकते हैं।
write { fd == 1 }
नीतियों के पुन: उपयोग और संरचना को सरल बनाने के लिए, kafel इन्क्लूड सहायता प्रदान करता है।
#include "some_other_file.policy"
Kafel इन्क्लूड की गई फ़ाइलों को केवल उन निर्देशिकाओं में खोजता है जो स्पष्ट रूप से खोज पथों में जोड़ी गई हैं।
kafel_add_include_search_path(ctxt, "includes/path");
includes/path को खोज पथों में जोड़ता है - उदाहरण इन्क्लूड निर्देश तब includes/path/some_other_file.policy का संदर्भ देगा।
इन्क्लूड निर्देश एक न्यूलाइन या अर्धविराम द्वारा समाप्त होता है। एक निर्देश में व्हाइटस्पेस द्वारा अलग की गई कई फ़ाइलें निर्दिष्ट की जा सकती हैं।
#include "first.policy" "second.policy"; #include "third.policy"
जब nsjail के साथ उपयोग किया जाता है, तो निम्नलिखित कमांड आपके शेल के लिए एक काफी सीमित वातावरण बनाने की अनुमति देता है
$ ./nsjail --chroot / --seccomp_string 'POLICY a { ALLOW { write, execve, brk, access, mmap, open, newfstat, close, read, mprotect, arch_prctl, munmap, getuid, getgid, getpid, rt_sigaction, geteuid, getppid, getcwd, getegid, ioctl, fcntl, newstat, clone, wait4, rt_sigreturn, exit_group } } USE a DEFAULT KILL' -- /bin/sh -i
[2017-01-15T21:53:08+0100] Mode: STANDALONE_ONCE
[2017-01-15T21:53:08+0100] Jail parameters: hostname:'NSJAIL', chroot:'/', process:'/bin/sh', bind:[::]:0, max_conns_per_ip:0, uid:(ns:1000, global:1000), gid:(ns:1000, global:1000), time_limit:0, personality:0, daemonize:false, clone_newnet:true, clone_newuser:true, clone_newns:true, clone_newpid:true, clone_newipc:true, clonew_newuts:true, clone_newcgroup:false, keep_caps:false, tmpfs_size:4194304, disable_no_new_privs:false, pivot_root_only:false
[2017-01-15T21:53:08+0100] Mount point: src:'/' dst:'/' type:'' flags:0x5001 options:''
[2017-01-15T21:53:08+0100] Mount point: src:'(null)' dst:'/proc' type:'proc' flags:0x0 options:''
[2017-01-15T21:53:08+0100] PID: 18873 about to execute '/bin/sh' for [STANDALONE_MODE]
/bin/sh: 0: can't access tty; job control turned off
$ set
IFS='
'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='0'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/'
$ id
Bad system call
$ exit
[2017-01-15T21:53:17+0100] PID: 18873 exited with status: 159, (PIDs left: 0)
| Kafel | seccomp-filter |
|---|
ALLOW | SECCOMP_RET_ALLOW |
LOG | SECCOMP_RET_LOG |
KILL, KILL_THREAD, DENY | SECCOMP_RET_KILL |
KILL_PROCESS | SECCOMP_RET_KILL_PROCESS |
USER_NOTIF | SECCOMP_RET_USER_NOTIF |
ERRNO(number) | SECCOMP_RET_ERRNO+number |
TRAP(number) | SECCOMP_RET_TRAP+number |
TRACE(number) | SECCOMP_RET_TRACE+number |