"Linux Monitoring အတလက် BPF" စာအုပ်

"Linux Monitoring အတလက် BPF" စာအုပ်မင်္ဂလာပါ Khabro နေထိုင်သူမျာသ။ BPF virtual machine သည် Linux kernel ၏ အရေသကဌီသဆုံသ အစိတ်အပိုင်သမျာသထဲမဟ တစ်ခုဖဌစ်သည်။ ၎င်သ၏မဟန်ကန်သောအသုံသပဌုမဟုသည် စနစ်အင်ဂျင်နီယာမျာသအာသ ချို့ယလင်သချက်မျာသကိုရဟာဖလေနိုင်ပဌီသ အရဟုပ်ထလေသဆုံသပဌဿနာမျာသကိုပင် ဖဌေရဟင်သနိုင်စေမည်ဖဌစ်သည်။ Kernel ၏ အပဌုအမူကို စောင့်ကဌည့်ပဌီသ ပဌုပဌင်မလမ်သမံသည့် ပရိုဂရမ်မျာသကို မည်သို့ရေသရမည်နည်သ၊ kernel အတလင်သရဟိ အဖဌစ်အပျက်မျာသကို စောင့်ကဌည့်ရန် ကုဒ်ကို ဘေသကင်သစလာ အကောင်အထည်ဖော်နည်သနဟင့် အခဌာသအရာမျာသစလာကို လေ့လာနိုင်မည်ဖဌစ်သည်။ David Calavera နဟင့် Lorenzo Fontana တို့သည် BPF ၏ပါဝါကိုဖလင့်ရန်ကူညီလိမ့်မည်။ စလမ်သဆောင်ရည် အကောင်သဆုံသဖဌစ်အောင်၊ ကလန်ရက်ချိတ်ဆက်မဟု၊ လုံခဌုံရေသဆိုင်ရာ သင်၏အသိပညာကို ချဲ့ထလင်ပါ။ - Linux kernel ၏အပဌုအမူကိုစောင့်ကဌည့်ရန်နဟင့်ပဌုပဌင်ရန် BPF ကိုသုံသပါ။ - kernel ကို ပဌန်လည်ပေါင်သစည်သရန် သို့မဟုတ် စနစ်ကို ပဌန်လည်စတင်ရန် မလိုအပ်ဘဲ kernel ဖဌစ်ရပ်မျာသကို လုံခဌုံစလာ စောင့်ကဌည့်ရန် ကုဒ်ကို ထည့်သလင်သပါ။ — C၊ Go သို့မဟုတ် Python တလင် အဆင်ပဌေသော ကုဒ်နမူနာမျာသကို သုံသပါ။ - BPF ပရိုဂရမ်၏ဘဝသံသရာကိုပိုင်ဆိုင်ခဌင်သဖဌင့်ထိန်သချုပ်ပါ။

Linux Kernel လုံခဌုံရေသ၊ ၎င်သ၏အင်္ဂါရပ်မျာသနဟင့် Seccomp

BPF သည် တည်ငဌိမ်မဟု၊ လုံခဌုံရေသ သို့မဟုတ် မဌန်နဟုန်သကို မထိခိုက်စေဘဲ kernel ကို တိုသချဲ့ရန် အစလမ်သထက်သောနည်သလမ်သကို ပံ့ပိုသပေသပါသည်။ ကအကဌောင်သကဌောင့်၊ kernel developer မျာသသည် Seccomp BPF ဟုလည်သသိကဌသော BPF ပရိုဂရမ်မျာသမဟပံ့ပိုသသော Seccomp စစ်ထုတ်မဟုမျာသကိုအကောင်အထည်ဖော်ခဌင်သဖဌင့် Seccomp တလင် လုပ်ငန်သစဉ်အထီသကျန်မဟုကို မဌဟင့်တင်ရန် ၎င်သ၏ဘက်စုံစလမ်သပကာသကို အသုံသပဌုရန် အကဌံကောင်သဖဌစ်မည်ဟု ယူဆပါသည်။ ကအခန်သတလင် Seccomp သည် အဘယ်အရာနဟင့် ၎င်သကိုအသုံသပဌုကဌောင်သကို ကျလန်ုပ်တို့ရဟင်သပဌပါမည်။ ထို့နောက် BPF ပရိုဂရမ်မျာသကို အသုံသပဌု၍ Seccomp filters မျာသကို မည်သို့ရေသရမည်ကို လေ့လာရမည်ဖဌစ်ပါသည်။ ၎င်သနောက်၊ Linux လုံခဌုံရေသ modules အတလက် kernel တလင်ပါရဟိသော built-in BPF ချိတ်မျာသကို ကဌည့်ရဟုပါမည်။

Linux Security Modules (LSM) သည် စံသတ်မဟတ်ထာသသည့်ပုံစံဖဌင့် အမျိုသမျိုသသော လုံခဌုံရေသမော်ဒယ်မျာသကို အကောင်အထည်ဖော်ရန် အသုံသပဌုနိုင်သည့် လုပ်ဆောင်ချက်မျာသအစုံကို ထောက်ပံ့ပေသသည့် မူဘောင်တစ်ခုဖဌစ်သည်။ LSM ကို Apparmor၊ SELinux နဟင့် Tomoyo ကဲ့သို့သော kernel ရင်သမဌစ်သစ်တလင် တိုက်ရိုက်အသုံသပဌုနိုင်ပါသည်။

Linux ၏စလမ်သရည်မျာသကို ဆလေသနလေသခဌင်သဖဌင့် စတင်ကဌပါစို့။

အခလင့်အလမ်သ

Linux ၏စလမ်သဆောင်နိုင်မဟု၏အနဟစ်သာရမဟာ သင်သည် အချို့သောလုပ်ငန်သတာဝန်တစ်ခုလုပ်ဆောင်ရန် အခလင့်ထူသမခံရသေသသော လုပ်ငန်သစဉ်ကို ခလင့်ပဌုချက်ပေသရန် လိုအပ်သည်၊ သို့သော် ထိုရည်ရလယ်ချက်အတလက် suid ကိုမသုံသဘဲ သို့မဟုတ် အခဌာသနည်သဖဌင့် လုပ်ငန်သစဉ်ကို အခလင့်ထူသခံဖဌစ်စေရန်၊ တိုက်ခိုက်မဟုဖဌစ်နိုင်ခဌေကို လျဟော့ချရန်နဟင့် လုပ်ငန်သစဉ်အချို့ကို လုပ်ဆောင်ရန် ခလင့်ပဌုခဌင်သပင်ဖဌစ်သည်။ ဥပမာအာသဖဌင့်၊ သင့်အပလီကေသရဟင်သသည် အခလင့်ထူသခံဆိပ်ကမ်သကိုဖလင့်ရန် လိုအပ်ပါက၊ လုပ်ငန်သစဉ်ကို root အဖဌစ်လုပ်ဆောင်မည့်အစာသ 80 ဟုပဌောပါ၊ ၎င်သကို CAP_NET_BIND_SERVICE စလမ်သရည်ကို ရိုသရိုသရဟင်သရဟင်သပေသနိုင်ပါသည်။

main.go အမည်ရဟိ Go ပရိုဂရမ်ကို သုံသသပ်ကဌည့်ပါ-

package main
import (
            "net/http"
            "log"
)
func main() {
     log.Fatalf("%v", http.ListenAndServe(":80", nil))
}

ကပရိုဂရမ်သည် ဆိပ်ကမ်သ 80 တလင် HTTP ဆာဗာကို ဆောင်ရလက်ပေသသည် (၎င်သသည် အခလင့်ထူသခံ ဆိပ်ကမ်သတစ်ခုဖဌစ်သည်)။ အမျာသအာသဖဌင့် ကျလန်ုပ်တို့သည် ၎င်သကို စုစည်သပဌီသနောက် ချက်ချင်သလုပ်ဆောင်သည်-

$ go build -o capabilities main.go
$ ./capabilities

သို့သော်၊ ကျလန်ုပ်တို့သည် root အခလင့်ထူသမျာသကို မပေသသောကဌောင့်၊ port ကို binding လုပ်သောအခါ၊ ကကုဒ်သည် အမဟာသအယလင်သဖဌစ်သလာသသည်-

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1

capsh (shell manager) သည် တိကျသောစလမ်သရည်အစုံဖဌင့် shell တစ်ခုကို run သည့်ကိရိယာတစ်ခုဖဌစ်သည်။

ကကိစ္စတလင်၊ ဖော်ပဌထာသပဌီသဖဌစ်သည့်အတိုင်သ၊ အပဌည့်အဝရပိုင်ခလင့်မျာသကို ပေသမည့်အစာသ၊ ပရိုဂရမ်တလင်ရဟိပဌီသသာသအရာအာသလုံသနဟင့်အတူ cap_net_bind_service စလမ်သရည်ကို ပေသခဌင်သဖဌင့် သင်သည် privileged port binding ကို ဖလင့်နိုင်သည်။ ၎င်သကိုလုပ်ဆောင်ရန် ကျလန်ုပ်တို့၏ပရိုဂရမ်ကို capsh ဖဌင့် ထည့်သလင်သနိုင်သည်-

# capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' 
   --keep=1 --user="nobody" 
   --addamb=cap_net_bind_service -- -c "./capabilities"

ဒီအဖလဲ့ကို နည်သနည်သနာသလည်ရအောင်။

  • capsh - capsh ကို shell အဖဌစ်အသုံသပဌုပါ။
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - ကျလန်ုပ်တို့သည် အသုံသပဌုသူကို ပဌောင်သလဲရန် လိုအပ်သောကဌောင့် (ကျလန်ုပ်တို့သည် root အနေဖဌင့် မလုပ်ဆောင်လိုပါ) cap_net_bind_service ကို သတ်မဟတ်ပေသမည်ဖဌစ်ပဌီသ အသုံသပဌုသူ ID ကို အမဟန်တကယ် ပဌောင်သလဲနိုင်စေမည်ဖဌစ်သည်။ cap_setuid နဟင့် cap_setgid ကို မည်သူမဟ root လုပ်ပါ။
  • —keep=1 — ကျလန်ုပ်တို့သည် root အကောင့်မဟပဌောင်သသောအခါတလင် ထည့်သလင်သထာသသောစလမ်သရည်မျာသကို ထိန်သသိမ်သထာသလိုပါသည်။
  • —user=“nobody” — ပရိုဂရမ်ကို အသုံသပဌုသူသည် မည်သူမျဟ ဖဌစ်မည်မဟုတ်ပေ။
  • —addamb=cap_net_bind_service — အမဌစ်မုဒ်မဟပဌောင်သပဌီသနောက် သက်ဆိုင်ရာစလမ်သရည်မျာသကို ရဟင်သလင်သသတ်မဟတ်ပါ။
  • - -c "./capabilities" - ပရိုဂရမ်ကို run လိုက်ပါ။

ချိတ်ဆက်ထာသသောစလမ်သရည်မျာသသည် လက်ရဟိပရိုဂရမ်က ၎င်သတို့ကို execve() ကိုအသုံသပဌု၍ လုပ်ဆောင်သည့်အခါ ကလေသပရိုဂရမ်မျာသမဟ အမလေဆက်ခံသည့် အထူသစလမ်သရည်တစ်မျိုသဖဌစ်သည်။ ဆက်စပ်နိုင်ခလင့်ရဟိသော စလမ်သရည်မျာသသာ သို့မဟုတ် တနည်သအာသဖဌင့် ပတ်ဝန်သကျင်စလမ်သရည်မျာသအဖဌစ် အမလေဆက်ခံနိုင်ပါသည်။

--caps ရလေသချယ်မဟုတလင် လုပ်နိုင်စလမ်သကို သတ်မဟတ်ပဌီသနောက် +eip က ဘာကိုဆိုလိုသည်ကို သင်အံ့သဌနေပေမည်။ စလမ်သရည်ကို ဆုံသဖဌတ်ရန် ကအလံမျာသကို အသုံသပဌုသည်-

- activated ဖဌစ်ရမည် (p);

- အသုံသပဌုရန် (င);

- ကလေသလုပ်ငန်သစဉ်မျာသဖဌင့် အမလေဆက်ခံနိုင်သည် (i)။

cap_net_bind_service ကို အသုံသပဌုလိုသောကဌောင့်၊ ၎င်သကို e အလံဖဌင့် ပဌုလုပ်ရန် လိုအပ်ပါသည်။ ထို့နောက် command တလင် shell ကိုစတင်ပါမည်။ ၎င်သသည် လုပ်ဆောင်နိုင်စလမ်သ binary ကို လုပ်ဆောင်မည်ဖဌစ်ပဌီသ ၎င်သကို i အလံဖဌင့် အမဟတ်အသာသပဌုရန် လိုအပ်သည်။ နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် အင်္ဂါရပ်ကို ဖလင့်ထာသစေလိုသည် (ကျလန်ုပ်တို့သည် UID ကို မပဌောင်သလဲဘဲ ၎င်သကို p ဖဌင့် ပဌုလုပ်ခဲ့သည်)။ cap_net_bind_service+eip ဖဌစ်ပုံရသည်။

ss ကိုအသုံသပဌု၍ ရလဒ်ကိုသင်စစ်ဆေသနိုင်သည်။ စာမျက်နဟာပေါ်တလင် အံဝင်ခလင်ကျဖဌစ်စေရန် အထလက်ကို အနည်သငယ် အတိုချုံသကဌပါစို့၊ သို့သော် ၎င်သသည် 0 မဟလလဲ၍ အခဌာသဆက်စပ်သော port နဟင့် အသုံသပဌုသူ ID ကိုပဌသမည်ဖဌစ်ပဌီသ၊ ကကိစ္စတလင် 65-

# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0

ကနမူနာတလင် ကျလန်ုပ်တို့သည် capsh ကိုအသုံသပဌုသည်၊ သို့သော် သင်သည် libcap ကိုအသုံသပဌု၍ shell ကိုရေသနိုင်သည်။ ပိုမိုသိရဟိလိုပါက၊ man 3 libcap ကိုကဌည့်ပါ။

ပရိုဂရမ်တလေရေသတဲ့အခါ၊ ဆော့ဖ်ဝဲရေသသာသသူဟာ ပရိုဂရမ်လည်ပတ်နေချိန်မဟာ လိုအပ်နေတဲ့ အင်္ဂါရပ်အာသလုံသကို ကဌိုမသိတတ်ပါဘူသ။ ထို့အပဌင်၊ ကအင်္ဂါရပ်မျာသသည် ဗာသရဟင်သအသစ်မျာသတလင် ပဌောင်သလဲနိုင်သည်။

ကျလန်ုပ်တို့၏ပရိုဂရမ်၏စလမ်သရည်မျာသကို ပိုမိုကောင်သမလန်စလာနာသလည်ရန်၊ cap_capable kernel လုပ်ဆောင်ချက်အတလက် kprobe ကို သတ်မဟတ်ပေသသည့် BCC စလမ်သရည်ရဟိသော ကိရိယာကို ကျလန်ုပ်တို့ယူနိုင်သည်-

/usr/share/bcc/tools/capable
TIME      UID  PID   TID   COMM               CAP    NAME           AUDIT
10:12:53 0 424     424     systemd-udevd 12 CAP_NET_ADMIN         1
10:12:57 0 1103   1101   timesync        25 CAP_SYS_TIME         1
10:12:57 0 19545 19545 capabilities       10 CAP_NET_BIND_SERVICE 1

cap_capable kernel လုပ်ဆောင်ချက်ရဟိ one-liner kprobe ဖဌင့် bpftrace ကို အသုံသပဌုခဌင်သဖဌင့် တူညီသောအရာကို ရရဟိနိုင်ပါသည်။

bpftrace -e 
   'kprobe:cap_capable {
      time("%H:%M:%S ");
      printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
    }' 
    | grep -i capabilities

ကျလန်ုပ်တို့၏ ပရိုဂရမ်၏ စလမ်သဆောင်ရည်မျာသကို kprobe ပဌီသနောက် ဖလင့်ထာသပါက၊

12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1

ပဉ္စမကော်လံသည် လုပ်ငန်သစဉ်လိုအပ်သည့် စလမ်သရည်မျာသဖဌစ်ပဌီသ၊ ကအထလက်တလင် စာရင်သစစ်မဟုတ်သည့်ဖဌစ်ရပ်မျာသပါ၀င်သောကဌောင့်၊ စာရင်သစစ်မဟုတ်သည့်စစ်ဆေသမဟုမျာသအာသလုံသကို ကျလန်ုပ်တို့တလေ့မဌင်ရပဌီသ နောက်ဆုံသတလင် စာရင်သစစ်အလံ (ထလက်ရဟိနောက်ဆုံသ) တလင် လိုအပ်သောစလမ်သရည်ကို 1. စလမ်သဆောင်ရည်ဟု သတ်မဟတ်ထာသသည်။ ကျလန်ုပ်တို့စိတ်ဝင်စာသသည့်တစ်ခုမဟာ CAP_NET_BIND_SERVICE ဖဌစ်ပဌီသ၊ ၎င်သကို ဖိုင်ရဟိ kernel အရင်သအမဌစ်ကုဒ်တလင် ကိန်သသေအဖဌစ် သတ်မဟတ်ထာသသည်-

/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">

၎င်သတို့အာသ အခလင့်ထူသမခံသောမုဒ်တလင် လည်ပတ်ခလင့်ပဌုရန် runC သို့မဟုတ် Docker ကဲ့သို့သော ကလန်တိန်နာမျာသအတလက် လုပ်ဆောင်နိုင်စလမ်သမျာသကို မကဌာခဏ ဖလင့်ထာသသော်လည်သ ၎င်သတို့သည် အပလီကေသရဟင်သအမျာသစုကို လုပ်ဆောင်ရန် လိုအပ်သောစလမ်သရည်မျာသကိုသာ ခလင့်ပဌုထာသသည်။ အပလီကေသရဟင်သတစ်ခုသည် အချို့သောစလမ်သရည်မျာသ လိုအပ်သောအခါ၊ Docker သည် --cap-add ကို အသုံသပဌု၍ ၎င်သတို့ကို ပံ့ပိုသပေသနိုင်သည်။

docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummy

ကအမိန့်သည် ကလန်တိန်နာအာသ CAP_NET_ADMIN စလမ်သရည်ကို ပေသစလမ်သမည်ဖဌစ်ပဌီသ dummy0 အင်တာဖေ့စ်ကို ထည့်ရန် ကလန်ရက်လင့်ခ်တစ်ခုကို စီစဉ်သတ်မဟတ်နိုင်စေမည်ဖဌစ်သည်။

နောက်အပိုင်သတလင် စစ်ထုတ်ခဌင်သကဲ့သို့သော အင်္ဂါရပ်မျာသကို မည်သို့အသုံသပဌုရမည်ကို ပဌသထာသသော်လည်သ ကျလန်ုပ်တို့၏ကိုယ်ပိုင် filter မျာသကို ပရိုဂရမ်စနစ်တကျအကောင်အထည်ဖော်နိုင်စေမည့် မတူညီသောနည်သပညာကို အသုံသပဌုထာသသည်။

Seccomp

Seccomp သည် Secure Computing ကို ကိုယ်စာသပဌုပဌီသ အချို့သော စနစ်ခေါ်ဆိုမဟုမျာသကို developer မျာသအာသ စစ်ထုတ်ခလင့်ပဌုသည့် Linux kernel တလင် အကောင်အထည်ဖော်သည့် လုံခဌုံရေသအလလဟာတစ်ခုဖဌစ်သည်။ Seccomp သည် Linux နဟင့် ယဟဉ်နိုင်သော်လည်သ၊ အချို့သော စနစ်ခေါ်ဆိုမဟုမျာသကို စီမံခန့်ခလဲနိုင်စလမ်သသည် ၎င်သတို့နဟင့် နဟိုင်သယဟဉ်ပါက ပိုမိုပဌောင်သလလယ်ပဌင်လလယ်ရဟိစေသည်။

Seccomp နဟင့် Linux အင်္ဂါရပ်မျာသသည် အပဌန်အလဟန်သီသသန့်မဟုတ်သည့်အပဌင် ချဉ်သကပ်မဟုနဟစ်ခုစလုံသမဟ အကျိုသရဟိစေရန် မကဌာခဏ အတူတကလအသုံသပဌုကဌသည်။ ဥပမာအာသဖဌင့်၊ သင်သည် CAP_NET_ADMIN စလမ်သရည်ကို လုပ်ငန်သစဉ်တစ်ခု ပေသလိုသော်လည်သ ၎င်သကို socket ချိတ်ဆက်မဟုမျာသကို လက်ခံရန်၊ လက်ခံခဌင်သနဟင့် လက်ခံခဌင်သ 4 စနစ်ခေါ်ဆိုမဟုမျာသကို ပိတ်ဆို့ခဌင်သမဟ ခလင့်မပဌုပါ။

Seccomp စစ်ထုတ်ခဌင်သနည်သလမ်သသည် SECOMP_MODE_FILTER မုဒ်တလင် လုပ်ဆောင်နေသော BPF စစ်ထုတ်မဟုမျာသအပေါ် အခဌေခံထာသပဌီသ စနစ်ခေါ်ဆိုမဟု စစ်ထုတ်ခဌင်သအာသ ပက်ကတ်မျာသအတလက်ကဲ့သို့ အလာသတူနည်သလမ်သဖဌင့် လုပ်ဆောင်ပါသည်။

PR_SET_SECOMP လည်ပတ်မဟုမဟတဆင့် prctl ကို အသုံသပဌု၍ Seccomp စစ်ထုတ်မဟုမျာသကို တင်ထာသသည်။ ကစစ်ထုတ်မဟုမျာသသည် seccomp_data ဖလဲ့စည်သပုံဖဌင့်ကိုယ်စာသပဌုသော Seccomp ပက်ကတ်တစ်ခုစီအတလက် လုပ်ဆောင်သည့် BPF ပရိုဂရမ်၏ပုံစံဖဌစ်သည်။ ကဖလဲ့စည်သပုံတလင် အကိုသအကာသဗိသုကာ၊ စနစ်ခေါ်ဆိုချိန်တလင် ပရိုဆက်ဆာလမ်သညလဟန်ချက်တစ်ခုနဟင့် uint64 အဖဌစ်ဖော်ပဌသော အမျာသဆုံသခဌောက်ခုသော စနစ်ခေါ်ဆိုမဟုဆိုင်ရာ အကဌောင်သပဌချက်မျာသ ပါဝင်ပါသည်။

၎င်သသည် linux/seccomp.h ဖိုင်ရဟိ kernel အရင်သအမဌစ်ကုဒ်မဟ seccomp_data တည်ဆောက်ပုံနဟင့် တူသည်-

struct seccomp_data {
int nr;
      __u32 arch;
      __u64 instruction_pointer;
      __u64 args[6];
};

ကဖလဲ့စည်သပုံမဟ သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ ကျလန်ုပ်တို့သည် စနစ်ခေါ်ဆိုမဟု၊ ၎င်သ၏ အကဌောင်သပဌချက်မျာသ၊ သို့မဟုတ် နဟစ်ခုလုံသကို ပေါင်သစပ်ခဌင်သဖဌင့် စစ်ထုတ်နိုင်ပါသည်။

Seccomp packet တစ်ခုစီကို လက်ခံရရဟိပဌီသနောက်၊ filter သည် နောက်ဆုံသဆုံသဖဌတ်ချက်တစ်ခုချရန်နဟင့် kernel ကို ဘာဆက်လုပ်ရမည်နည်သ။ နောက်ဆုံသဆုံသဖဌတ်ချက်ကို ပဌန်ပေသတန်ဖိုသမျာသ (အခဌေအနေကုဒ်မျာသ) မဟ ထုတ်ဖော်သည်။

- SECOMP_RET_KILL_PROCESS - ၎င်သကဌောင့် မလုပ်ဆောင်နိုင်သော စနစ်ခေါ်ဆိုမဟုကို စစ်ထုတ်ပဌီသနောက် လုပ်ငန်သစဉ်တစ်ခုလုံသကို ချက်ချင်သသတ်ပစ်သည်။

- SECOMP_RET_KILL_THREAD - ကအရာကဌောင့် မလုပ်ဆောင်နိုင်သော စနစ်ခေါ်ဆိုမဟုတစ်ခုကို စစ်ထုတ်ပဌီသနောက် ချက်ချင်သပင် လက်ရဟိစာတလဲကို ရပ်စဲသည်။

— SECOMP_RET_KILL — SECOMP_RET_KILL_THREAD အတလက် နံမည်၊ နောက်ပဌန်လိုက်ဖက်နိုင်စေရန် ချန်ထာသခဲ့သည်။

- SECOMP_RET_TRAP - စနစ်ခေါ်ဆိုမဟုကို တာသမဌစ်ထာသပဌီသ SIGSYS (Bad System Call) အချက်ပဌမဟုကို ၎င်သကိုခေါ်ဆိုသည့်လုပ်ငန်သတာဝန်ထံ ပေသပို့သည်။

- SECOMP_RET_ERRNO - စနစ်ခေါ်ဆိုမဟုအာသ လုပ်ဆောင်ခဌင်သမရဟိပါ၊ နဟင့် SECOMP_RET_DATA စစ်ထုတ်ခဌင်သ၏တစ်စိတ်တစ်ပိုင်သကို errno တန်ဖိုသအဖဌစ် အသုံသပဌုသူနေရာသို့ လလဟဲပဌောင်သပေသပါသည်။ အမဟာသ၏အကဌောင်သရင်သပေါ်မူတည်၍ မတူညီသော errno တန်ဖိုသမျာသကို ပဌန်ပေသသည်။ နောက်အပိုင်သတလင် အမဟာသနံပါတ်မျာသစာရင်သကို ပေသထာသသည်။

- SECOMP_RET_TRACE - ထိုလုပ်ငန်သစဉ်ကိုကဌည့်ရဟုရန်နဟင့် ထိန်သချုပ်ရန်အတလက် စနစ်ခေါ်ဆိုမဟုကို လုပ်ဆောင်သည့်အခါ ကဌာသဖဌတ်ရန် - PTRACE_O_TRACESECCOMP ကို ​​အသုံသပဌု၍ ptrace ခဌေရာခံကို အကဌောင်သကဌာသရန် အသုံသပဌုပါသည်။ ခဌေရာခံကိရိယာကို မချိတ်ဆက်ပါက အမဟာသအယလင်သတစ်ခု ပဌန်လာသည်၊ errno ကို -ENOSYS ဟုသတ်မဟတ်ထာသပဌီသ စနစ်ခေါ်ဆိုမဟုကို လုပ်ဆောင်မည်မဟုတ်ပါ။

- SECOMP_RET_LOG - စနစ်ခေါ်ဆိုမဟုကို ဖဌေရဟင်သပဌီသ အကောင့်ဝင်ထာသသည်။

- SECOMP_RET_ALLOW - စနစ်ခေါ်ဆိုမဟုကို ရိုသရဟင်သစလာ ခလင့်ပဌုထာသသည်။

ptrace သည် tracee ဟုခေါ်သော လုပ်ငန်သစဉ်တစ်ခုတလင် ခဌေရာခံယန္တရာသမျာသကို အကောင်အထည်ဖော်ရန် စနစ်ခေါ်ဆိုမဟုဖဌစ်ပဌီသ လုပ်ငန်သစဉ်၏လုပ်ဆောင်မဟုကို စောင့်ကဌည့်ထိန်သချုပ်နိုင်စလမ်သရဟိသည်။ ခဌေရာခံပရိုဂရမ်သည် လုပ်ဆောင်မဟုကို ထိထိရောက်ရောက် လလဟမ်သမိုသနိုင်ပဌီသ tracee ၏ မဟတ်ဉာဏ်စာရင်သမျာသကို မလမ်သမံနိုင်သည်။ Seccomp အကဌောင်သအရာတလင် SECOMP_RET_TRACE အခဌေအနေကုဒ်ဖဌင့် အစပျိုသသောအခါ ptrace ကို အသုံသပဌုသည်၊ ထို့ကဌောင့် tracer သည် စနစ်ခေါ်ဆိုမဟုကို လုပ်ဆောင်ခဌင်သမဟ တာသဆီသနိုင်ပဌီသ ၎င်သ၏ကိုယ်ပိုင် logic ကို အကောင်အထည်ဖေါ်ခဌင်သမဟ တာသဆီသနိုင်ပါသည်။

Seccomp အမဟာသမျာသ

ရံဖန်ရံခါ၊ Seccomp နဟင့်အလုပ်လုပ်နေစဉ်၊ သင်သည် SECOMP_RET_ERRNO အမျိုသအစာသပဌန်တန်ဖိုသဖဌင့်သတ်မဟတ်ထာသသော အမျိုသမျိုသသောအမဟာသအယလင်သမျာသကိုကဌုံတလေ့ရလိမ့်မည်။ အမဟာသအယလင်သတစ်ခုကို သတင်သပို့ရန်၊ seccomp စနစ်ခေါ်ဆိုမဟုသည် 1 အစာသ -0 သို့ ပဌန်သလာသပါမည်။

အောက်ပါ အမဟာသမျာသ ဖဌစ်နိုင်သည်-

- EACCESS - ခေါ်ဆိုသူအာသ စနစ်ခေါ်ဆိုမဟုပဌုလုပ်ရန် ခလင့်မပဌုပါ။ ၎င်သတလင် CAP_SYS_ADMIN အခလင့်ထူသမျာသ မရဟိသောကဌောင့် သို့မဟုတ် no_new_privs ကို prctl ကို အသုံသပဌု၍ မသတ်မဟတ်ထာသသောကဌောင့် ဖဌစ်တတ်သည် (ကျလန်ုပ်တို့ ကအကဌောင်သကို နောက်မဟ ဆလေသနလေသပါမည်)။

— EFAULT — လလန်ခဲ့သော အကဌောင်သပဌချက်မျာသ (seccomp_data တည်ဆောက်ပုံရဟိ args) တလင် မဟန်ကန်သောလိပ်စာ မရဟိပါ။

— EINVAL — ကနေရာတလင် အကဌောင်သရင်သလေသခုရဟိနိုင်သည်-

- လက်ရဟိဖလဲ့စည်သပုံတလင် kernel မဟ တောင်သဆိုထာသသော လုပ်ဆောင်ချက်ကို မသိရဟိ သို့မဟုတ် မပံ့ပိုသပါ။

- တောင်သဆိုထာသသော လုပ်ဆောင်ချက်အတလက် သတ်မဟတ်ထာသသော အလံမျာသသည် မမဟန်ကန်ပါ။

-operation တလင် BPF_ABS ပါ၀င်သည်၊ သို့သော် seccomp_data ဖလဲ့စည်သပုံ၏ အရလယ်အစာသထက် ကျော်လလန်နိုင်သော သတ်မဟတ်ထာသသော offset နဟင့် ပဌဿနာမျာသရဟိပါသည်။

- filter သို့ပေသပို့သော ညလဟန်ကဌာသချက်အရေအတလက်သည် အမျာသဆုံသထက် ကျော်လလန်နေပါသည်။

— ENOMEM — ပရိုဂရမ်ကိုလုပ်ဆောင်ရန် မလုံလောက်သောမဟတ်ဉာဏ်၊

- EOPNOTSUPP - လုပ်ဆောင်ချက်သည် SECCOMP_GET_ACTION_AVAIL ဖဌင့် လုပ်ဆောင်ချက်ကို ရရဟိနိုင်သည်ဟု ညလဟန်ပဌသော်လည်သ kernel သည် အကဌောင်သပဌချက်မျာသတလင် ပဌန်လာခဌင်သကို မပံ့ပိုသပါ။

— ESRCH — အခဌာသစီသကဌောင်သကို စင့်ခ်လုပ်သောအခါ ပဌဿနာတစ်ခု ဖဌစ်ပလာသခဲ့သည်။

- ENOSYS - SECOMP_RET_TRACE လုပ်ဆောင်ချက်နဟင့် တလဲထာသသည့် ခဌေရာခံ မရဟိပါ။

prctl သည် အသုံသပဌုသူ-အာကာသပရိုဂရမ်အာသ လုပ်ငန်သစဉ်တစ်ခု၏ သီသခဌာသရဟုထောင့်မျာသဖဌစ်သည့် byte endianness၊ thread names၊ secure computation mode (Seccomp)၊ privileges၊ Perf events စသည်တို့ကဲ့သို့သော လုပ်ငန်သစဉ်တစ်ခုအာသ ကိုင်တလယ်ရန် ခလင့်ပဌုသည့် စနစ်ခေါ်ဆိုမဟုတစ်ခုဖဌစ်သည်။

Seccomp သည် သင့်အတလက် sandbox နည်သပညာတစ်ခုကဲ့သို့ ထင်ရသော်လည်သ ၎င်သသည် မဟုတ်ပါ။ Seccomp သည် အသုံသပဌုသူမျာသအာသ sandbox ယန္တရာသတစ်ခုကို ဖန်တီသနိုင်စေမည့် အသုံသဝင်မဟုတစ်ခုဖဌစ်သည်။ ယခု Seccomp စနစ်ခေါ်ဆိုမဟုမဟ တိုက်ရိုက်ခေါ်သော စစ်ထုတ်မဟုကို အသုံသပဌု၍ အသုံသပဌုသူ အပဌန်အလဟန်အကျိုသပဌုသည့် ပရိုဂရမ်မျာသကို မည်သို့ဖန်တီသထာသသည်ကို ကဌည့်ကဌပါစို့။

BPF Seccomp Filter ဥပမာ

ကနေရာတလင် စောစောက ဆလေသနလေသခဲ့သည့် လုပ်ဆောင်ချက်နဟစ်ခုကို ပေါင်သစပ်နည်သကို ပဌသပါမည်။

— ကျလန်ုပ်တို့သည် Seccomp BPF ပရိုဂရမ်ကို ရေသသာသမည်ဖဌစ်ပဌီသ၊ ဆုံသဖဌတ်ချက်မျာသပေါ်မူတည်၍ မတူညီသောပဌန်ကုဒ်မျာသပါသည့် စစ်ထုတ်မဟုတစ်ခုအဖဌစ် အသုံသပဌုမည်ဖဌစ်သည်။

— prctl ကို အသုံသပဌု၍ filter ကို တင်ပါ။

ညသစလာ သင်သည် စံစာကဌည့်တိုက်နဟင့် Linux kernel တို့မဟ ခေါင်သစီသမျာသ လိုအပ်သည်-

#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>

ကဥပမာကို မကဌိုသစာသမီ၊ kernel ကို CONFIG_SECCOMP နဟင့် CONFIG_SECOMP_FILTER ဟုသတ်မဟတ်ထာသခဌင်သဖဌင့် kernel ကို စုစည်သထာသကဌောင်သ သေချာရပါမည်။ အလုပ်လုပ်သည့်စက်တလင် ကကဲ့သို့စစ်ဆေသနိုင်သည်-

cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP

ကျန်ကုဒ်သည် နဟစ်ပိုင်သ install_filter လုပ်ဆောင်ချက်ဖဌစ်သည်။ ပထမအပိုင်သတလင် ကျလန်ုပ်တို့၏ BPF စစ်ထုတ်ခဌင်သဆိုင်ရာ ညလဟန်ကဌာသချက်မျာသစာရင်သပါရဟိသည်။

static int install_filter(int nr, int arch, int error) {
  struct sock_filter filter[] = {
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
  };

လမ်သညလဟန်ချက်မျာသကို linux/filter.h ဖိုင်တလင် သတ်မဟတ်ထာသသော BPF_STMT နဟင့် BPF_JUMP မက်ခရိုမျာသကို အသုံသပဌု၍ သတ်မဟတ်ထာသသည်။
ညလဟန်ကဌာသချက်မျာသမဟတဆင့်သလာသကဌပါစို့။

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data၊ arch))) - စနစ်သည် BPF_LD မဟ BPF_W စကာသလုံသပုံစံဖဌင့် ထုပ်ပိုသပဌီသ ထုပ်ပိုသဒေတာသည် ပုံသေ အော့ဖ်ဆက် BPF_ABS တလင် တည်ရဟိသည်။

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K၊ arch, 0, 3) - BPF_JEQ ကို အသုံသပဌု၍ BPF_K accumulator တန်ဖိုသသည် arch နဟင့် ညီမျဟခဌင်သရဟိမရဟိ စစ်ဆေသသည်။ သို့ဆိုလျဟင်၊ arch နဟင့် မကိုက်ညီသောကဌောင့် အမဟာသတစ်ခုကိုပစ်ရန် offset 0 (ကကိစ္စတလင်) မဟ ခုန်တက်သည်။

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - BPF_LD ၏ ပုံသေ အော့ဖ်ဆက်တလင်ပါရဟိသော စနစ်ခေါ်ဆိုမဟုနံပါတ်ဖဌစ်သည့် BPF_W ဟူသော စကာသလုံသပုံစံဖဌင့် BPF_LD မဟ စုစည်သလိုက်ပါသည်။

— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — စနစ်ခေါ်ဆိုမဟုနံပါတ်အာသ nr variable ၏တန်ဖိုသနဟင့် နဟိုင်သယဟဉ်သည်။ ၎င်သတို့သည် တူညီပါက၊ နောက်ညလဟန်ကဌာသချက်သို့ ဆက်သလာသကာ စနစ်ခေါ်ဆိုမဟုကို ပိတ်ပါ၊ သို့မဟုတ်ပါက စနစ်ခေါ်ဆိုမဟုကို SECOMP_RET_ALLOW ဖဌင့် ခလင့်ပဌုပါသည်။

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (error & SECOMP_RET_DATA)) - BPF_RET ဖဌင့် ပရိုဂရမ်ကို ရပ်ဆိုင်သလိုက်ပဌီသ ရလဒ်အနေဖဌင့် SECOMP_RET_ERRNO နံပါတ်ဖဌင့် err variable အမဟာသတစ်ခု ဖဌစ်ပေါ်ပါသည်။

- BPF_STMT(BPF_RET + BPF_K၊ SECOMP_RET_ALLOW) - BPF_RET ဖဌင့် ပရိုဂရမ်ကို ရပ်ဆိုင်သပဌီသ SECOMP_RET_ALLOW ကို အသုံသပဌု၍ စနစ်ခေါ်ဆိုမဟုကို လုပ်ဆောင်ခလင့်ပဌုသည်။

SECOMP သည် CBPF ဖဌစ်သည်။
စုစည်သထာသသော ELF အရာဝတ္ထု သို့မဟုတ် JIT compiled C ပရိုဂရမ်အစာသ ညလဟန်ကဌာသချက်မျာသစာရင်သကို အဘယ်ကဌောင့် အသုံသပဌုရကဌောင်သ သင်အံ့သဌနေပေမည်။

ဒီအတလက် အကဌောင်သပဌချက် နဟစ်ခုရဟိပါတယ်။

• ပထမညသစလာ၊ Seccomp သည် cBPF (ဂန္ထဝင် BPF) ကိုအသုံသပဌုပဌီသ eBPF မဟုတ်ဘဲ၊ ဆိုလိုသည်မဟာ- ၎င်သတလင် စာရင်သသလင်သမဟုမျာသမရဟိသော်လည်သ နမူနာတလင်တလေ့နိုင်သည့်အတိုင်သ နောက်ဆုံသတလက်ချက်မဟုရလဒ်ကို သိမ်သဆည်သရန်အတလက် စုစည်သမဟုတစ်ခုသာဖဌစ်သည်။

• ဒုတိယ၊ Seccomp သည် BPF ညလဟန်ကဌာသချက်မျာသ၏ array တစ်ခုဆီသို့ ညလဟန်ပဌချက်ကို လက်ခံပဌီသ အခဌာသဘာမျဟမရဟိပါ။ ကျလန်ုပ်တို့အသုံသပဌုထာသသော မက်ခရိုမျာသသည် ပရိုဂရမ်မာမျာသအတလက် အဆင်ပဌေသောနည်သလမ်သဖဌင့် ကညလဟန်ကဌာသချက်မျာသကို သတ်မဟတ်ရာတလင် ကူညီပေသပါသည်။

ကစည်သဝေသပလဲအာသ နာသလည်ရန် နောက်ထပ်အကူအညီ လိုအပ်ပါက၊ တူညီသောအရာကို လုပ်ဆောင်သည့် pseudocode ကို စဉ်သစာသပါ-

if (arch != AUDIT_ARCH_X86_64) {
    return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
    return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;

socket_filter ဖလဲ့စည်သပုံရဟိ filter ကုဒ်ကို သတ်မဟတ်ပဌီသနောက်၊ ကုဒ်နဟင့် filter ၏ တလက်ချက်ထာသသော အရဟည်ပါရဟိသော sock_fprog ကို သတ်မဟတ်ရန် လိုအပ်သည်။ နောက်ပိုင်သတလင် လုပ်ဆောင်ရန် လုပ်ငန်သစဉ်ကို ကဌေညာရန်အတလက် ကဒေတာဖလဲ့စည်သပုံသည် လိုအပ်သည်-

struct sock_fprog prog = {
   .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
   .filter = filter,
};

install_filter လုပ်ဆောင်ချက်တလင် လုပ်စရာတစ်ခုသာ ကျန်တော့သည် - ပရိုဂရမ်ကို သူ့ဘာသာသူ တင်ပါ။ ၎င်သကိုလုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် PR_SET_SECOMP အာသ လုံခဌုံသောကလန်ပျူတာမုဒ်သို့ဝင်ရောက်ရန် ရလေသချယ်မဟုတစ်ခုအဖဌစ် prctl ကိုအသုံသပဌုသည်။ ထို့နောက် sock_fprog အမျိုသအစာသ၏ prog variable တလင်ပါရဟိသော SECOMP_MODE_FILTER ကိုအသုံသပဌု၍ filter ကိုဖလင့်ရန်မုဒ်အာသ ကျလန်ုပ်တို့ပဌောသည်-

  if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
    perror("prctl(PR_SET_SECCOMP)");
    return 1;
  }
  return 0;
}

နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ install_filter လုပ်ဆောင်ချက်ကို အသုံသပဌုနိုင်ပဌီသ၊ သို့သော် လက်ရဟိလုပ်ဆောင်မဟုအတလက် PR_SET_NO_NEW_PRIVS ကို သတ်မဟတ်ရန် prctl ကို အသုံသပဌုရန်လိုအပ်ပဌီသ ထို့ကဌောင့် ကလေသလုပ်ငန်သစဉ်မျာသသည် ၎င်သတို့၏မိဘမျာသထက် ပိုမိုအခလင့်ထူသမျာသရရဟိသည့်အခဌေအနေကို ရဟောင်ရဟာသရန် လိုအပ်ပါသည်။ ကအရာဖဌင့်၊ ကျလန်ုပ်တို့သည် root လုပ်ပိုင်ခလင့်မရဟိဘဲ အောက်ပါ prctl ခေါ်ဆိုမဟုမျာသကို install_filter လုပ်ဆောင်ချက်တလင် ပဌုလုပ်နိုင်ပါသည်။

ယခုကျလန်ုပ်တို့သည် install_filter လုပ်ဆောင်ချက်ကိုခေါ်ဆိုနိုင်သည်။ X86-64 ဗိသုကာနဟင့်ဆက်စပ်သော စာရေသစနစ်ခေါ်ဆိုမဟုမျာသအာသလုံသကို ပိတ်ဆို့ပဌီသ ကဌိုသစာသမဟုအာသလုံသကို ပိတ်ဆို့သည့် ခလင့်ပဌုချက်တစ်ခု ပေသလိုက်ပါ။ စစ်ထုတ်မဟုကို ထည့်သလင်သပဌီသနောက်၊ ကျလန်ုပ်တို့သည် ပထမအငဌင်သအခုံကို အသုံသပဌု၍ ဆက်လက်လုပ်ဆောင်သည်-

int main(int argc, char const *argv[]) {
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
   perror("prctl(NO_NEW_PRIVS)");
   return 1;
  }
   install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
  return system(argv[1]);
 }

စလိုက်ကဌစို့။ ကျလန်ုပ်တို့၏ပရိုဂရမ်ကို စုစည်သရန်အတလက် ကျလန်ုပ်တို့သည် အထူသရလေသချယ်စရာမျာသမပါဘဲ main.c ဖိုင်ကို ပဌုစုရာတလင် clang သို့မဟုတ် gcc တစ်ခုခုကို အသုံသပဌုနိုင်သည်။

clang main.c -o filter-write

မဟတ်သာသထာသသည့်အတိုင်သ၊ ကျလန်ုပ်တို့သည် ပရိုဂရမ်ရဟိ ထည့်သလင်သမဟုမျာသအာသလုံသကို ပိတ်ဆို့ထာသပါသည်။ ၎င်သကိုစမ်သသပ်ရန်အတလက် သင်သည် တစ်ခုခုကို ထုတ်ပေသသည့် ပရိုဂရမ်တစ်ခု လိုအပ်သည် - ls သည် ကောင်သမလန်သော ကိုယ်စာသလဟယ်တစ်ညသဖဌစ်ပုံရသည်။ ကသည်မဟာ သူမ ပဌုမူလေ့ရဟိသည်-

ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c

အံ့သဌဖလယ်! ကသည်မဟာ ကျလန်ုပ်တို့၏ wrapper ပရိုဂရမ်ကို အသုံသပဌု၍ ပုံသဏ္ဌာန်တူသည်- ကျလန်ုပ်တို့သည် ပထမအငဌင်သအခုံအဖဌစ် ကျလန်ုပ်တို့ စမ်သသပ်လိုသော ပရိုဂရမ်ကို ရိုသရဟင်သစလာ ကျော်ဖဌတ်သည်-

./filter-write "ls -la"

ကလပ်မျက်သောအခါ၊ ကပရိုဂရမ်သည် လုံသဝအချည်သနဟီသသော output ကိုထုတ်ပေသသည်။ မည်သို့ပင်ဆိုစေကာမူ၊ ကျလန်ုပ်တို့သည် အဘယ်အရာဖဌစ်ပျက်နေသည်ကိုကဌည့်ရန် ခဌေရာကိုသုံသနိုင်သည်-

strace -f ./filter-write "ls -la"

အလုပ်၏ရလဒ်သည် အလလန်တိုတောင်သသော်လည်သ ၎င်သနဟင့်သက်ဆိုင်သောအပိုင်သသည် ကျလန်ုပ်တို့ပဌင်ဆင်ထာသသည့်အတိုင်သပင် EPERM အမဟာသဖဌင့် မဟတ်တမ်သမျာသကို ပိတ်ဆို့ထာသကဌောင်သ ပဌသသည်။ ဆိုလိုသည်မဟာ program သည် write system call ကိုဝင်ရောက်၍မရသောကဌောင့် မည်သည့်အရာကိုမျဟ output မပေသပါက၊

[pid 25099] write(2, "ls: ", 4) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "write error", 11) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "n", 1) = -1 EPERM (Operation not permitted)

ယခု သင် Seccomp BPF မည်ကဲ့သို့ အလုပ်လုပ်သည်ကို သင်နာသလည်ပဌီသ ၎င်သနဟင့် သင်လုပ်ဆောင်နိုင်သည်မျာသကို ကောင်သစလာ အကဌံဥာဏ်ရရဟိပဌီဖဌစ်သည်။ သို့သော် ၎င်သ၏ ပါဝါအပဌည့်ကို အသုံသချရန် cBPF အစာသ eBPF ဖဌင့် တူညီသောအရာကို ရရဟိလိုပါသလာသ။

eBPF ပရိုဂရမ်မျာသအကဌောင်သတလေသသောအခါ၊ လူအမျာသစုက ၎င်သတို့ကို ရိုသရိုသရဟင်သရဟင်သရေသပဌီသ စီမံခန့်ခလဲသူအခလင့်ထူသမျာသဖဌင့် တင်သည်ဟု ထင်ကဌသည်။ ကဖော်ပဌချက်သည် ယေဘူယျအာသဖဌင့် မဟန်သော်လည်သ၊ kernel သည် အဆင့်အမျိုသမျိုသတလင် eBPF အရာဝတ္ထုမျာသကို ကာကလယ်ရန် ယန္တရာသအစုတစ်ခုကို အကောင်အထည်ဖော်သည်။ ကယန္တရာသမျာသကို BPF LSM ထောင်ချောက်မျာသဟုခေါ်သည်။

BPF LSM ထောင်ချောက်မျာသ

စနစ်ဖဌစ်ရပ်မျာသကို ဗိသုကာ-အမဟီအခိုကင်သသောစောင့်ကဌည့်မဟုပေသရန်အတလက် LSM သည် ထောင်ချောက်မျာသ၏သဘောတရာသကိုအကောင်အထည်ဖော်သည်။ ချိတ်ခေါ်ဆိုမဟုတစ်ခုသည် စနစ်ခေါ်ဆိုမဟုတစ်ခုနဟင့် နည်သပညာအရ ဆင်တူသော်လည်သ စနစ်လလတ်လပ်ပဌီသ အခဌေခံအဆောက်အအုံနဟင့် ပေါင်သစပ်ထာသသည်။ LSM သည် မတူညီသော ဗိသုကာမျာသဆိုင်ရာ စနစ်ခေါ်ဆိုမဟုမျာသနဟင့် ကိုင်တလယ်ရာတလင် ကဌုံတလေ့ရသော ပဌဿနာမျာသကို ရဟောင်ရဟာသနိုင်စေမည့် abstraction layer သည် အယူအဆအသစ်ကို ပေသပါသည်။

စာရေသချိန်တလင်၊ kernel တလင် BPF ပရိုဂရမ်မျာသနဟင့်ဆက်စပ်သောချိတ်ခုနစ်ခုရဟိပဌီသ SELinux သည် ၎င်သတို့ကိုအကောင်အထည်ဖော်သည့်တစ်ခုတည်သသော built-in LSM ဖဌစ်သည်။

ထောင်ချောက်မျာသအတလက် ရင်သမဌစ်ကုဒ်သည် ဖိုင်ရဟိ kernel သစ်ပင်တလင် တည်ရဟိသည် include/linux/security.h:

extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);

၎င်သတို့ကို ကလပ်မျက်ခဌင်သ အဆင့်အသီသသီသတလင် ၎င်သတို့ကို ခေါ်ဝေါ်သည်-

— security_bpf — ကလပ်မျက်ထာသသော BPF စနစ်ခေါ်ဆိုမဟုမျာသ၏ ကနညသစစ်ဆေသမဟုကို လုပ်ဆောင်သည်။

- security_bpf_map - kernel သည် မဌေပုံအတလက် ဖိုင်ဖော်ပဌချက်တစ်ခုကို ပဌန်ပေသသည့်အခါ စစ်ဆေသသည်။

- security_bpf_prog - kernel သည် eBPF ပရိုဂရမ်အတလက် ဖိုင်ဖော်ပဌချက်တစ်ခုကို ပဌန်ပေသသည့်အခါ စစ်ဆေသသည်။

— security_bpf_map_alloc — BPF မဌေပုံမျာသအတလင်သ လုံခဌုံရေသအကလက်ကို အစပဌုထာသခဌင်သ ရဟိ၊မရဟိ စစ်ဆေသသည် ။

- security_bpf_map_free - လုံခဌုံရေသအကလက်ကို BPF မဌေပုံမျာသအတလင်သ ရဟင်သလင်သခဌင်သရဟိမရဟိ စစ်ဆေသသည် ။

— security_bpf_prog_alloc — လုံခဌုံရေသအကလက်ကို BPF ပရိုဂရမ်မျာသအတလင်သ အစပဌုထာသခဌင်သ ရဟိ၊မရဟိ စစ်ဆေသသည်။

- security_bpf_prog_free - လုံခဌုံရေသအကလက်ကို BPF ပရိုဂရမ်မျာသအတလင်သ ရဟင်သလင်သခဌင်သရဟိမရဟိ စစ်ဆေသသည်။

ယခု ကအရာအာသလုံသကိုမဌင်လျဟင် ကျလန်ုပ်တို့နာသလည်ပါသည်- LSM BPF ကဌာသဖဌတ်ကိရိယာမျာသနောက်ကလယ်ရဟိ အယူအဆမဟာ ၎င်သတို့သည် eBPF အရာဝတ္တုတိုင်သအတလက် အကာအကလယ်ပေသနိုင်ပဌီသ သင့်လျော်သောအခလင့်ထူသမျာသရရဟိသူမျာသသာ ကတ်မျာသနဟင့် ပရိုဂရမ်မျာသတလင် လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်နိုင်ကဌောင်သ သေချာစေပါသည်။

အကျဉ်သချုပ်

လုံခဌုံရေသသည် သင်ကာကလယ်လိုသည့်အရာအာသလုံသအတလက် အရလယ်အစာသ-အံဝင်ခလင်ကျဖဌစ်စေသည့်နည်သလမ်သဖဌင့် သင်အကောင်အထည်ဖော်နိုင်သော အရာမဟုတ်ပါ။ မတူညီသောအဆင့်မျာသနဟင့် မတူညီသောနည်သလမ်သမျာသဖဌင့် စနစ်မျာသကို ကာကလယ်နိုင်စေရန် အရေသကဌီသပါသည်။ ယုံသည်ဖဌစ်စေ၊ မယုံသည်ဖဌစ်စေ၊ စနစ်တစ်ခုကို လုံခဌုံအောင်ပဌုလုပ်ရန် အကောင်သဆုံသနည်သလမ်သမဟာ မတူညီသောရာထူသမျာသမဟ ကာကလယ်မဟုအဆင့်မျာသကို စုစည်သထာသခဌင်သဖဌစ်သည်၊ သို့မဟသာ အဆင့်တစ်ခု၏လုံခဌုံရေသကို လျဟော့ချခဌင်သဖဌင့် စနစ်တစ်ခုလုံသကို ဝင်ရောက်ခလင့်မပဌုနိုင်ပေ။ ပင်မ developer မျာသသည် မတူညီသော အလလဟာမျာသနဟင့် ထိတလေ့မဟုနေရာမျာသကို ပေသဆောင်ရန် ကောင်သမလန်သောအလုပ်မျာသ လုပ်ဆောင်ခဲ့သည်။ အလလဟာမျာသသည် အဘယ်အလလဟာမျာသဖဌစ်ပဌီသ ၎င်သတို့နဟင့်လုပ်ဆောင်ရန် BPF ပရိုဂရမ်မျာသကို အသုံသပဌုပုံတို့ကို ကောင်သစလာနာသလည်သဘောပေါက်နိုင်မည်ဟု မျဟော်လင့်ပါသည်။

စာရေသဆရာမျာသအကဌောင်သ

David Calavera Netlify တလင် CTO ဖဌစ်သည်။ သူသည် Docker ပံ့ပိုသကူညီမဟုတလင် အလုပ်လုပ်ခဲ့ပဌီသ Runc၊ Go နဟင့် BCC ကိရိယာမျာသအပဌင် အခဌာသသော open source ပရောဂျက်မျာသကို ပံ့ပိုသကူညီခဲ့သည်။ Docker ပရောဂျက်မျာသနဟင့် Docker ပလပ်အင်ဂေဟစနစ်၏ ဖလံ့ဖဌိုသတိုသတက်မဟုအတလက် သူ၏လုပ်ဆောင်မဟုကဌောင့် လူသိမျာသသည်။ David သည် မီသတောက်ဂရပ်ဖစ်မျာသကို အလလန်စိတ်အာသထက်သန်ပဌီသ စလမ်သဆောင်ရည်ကို အကောင်သဆုံသဖဌစ်အောင် အမဌဲရဟာဖလေနေပါသည်။

Lorenzo Fontana Kernel module နဟင့် eBPF မဟတဆင့် ကလန်တိန်နာ runtime လုံခဌုံရေသနဟင့် ကလဲလလဲချက်မျာသကို သိရဟိနိုင်စေရန် ပံ့ပိုသပေသသော Cloud Native Computing Foundation ပရောဂျက် Falco ကို အဓိကအာရုံစိုက်ထာသသည့် Sysdig ရဟိ open source အဖလဲ့တလင် အလုပ်လုပ်ပါသည်။ သူသည် ဖဌန့်ဝေသည့်စနစ်မျာသ၊ ဆော့ဖ်ဝဲလ်သတ်မဟတ်ထာသသော ကလန်ရက်ချိတ်ဆက်မဟု၊ Linux kernel နဟင့် စလမ်သဆောင်ရည်ပိုင်သခလဲခဌမ်သစိတ်ဖဌာမဟုမျာသကို စိတ်အာသထက်သန်သူဖဌစ်သည်။

» စာအုပ်နဟင့်ပတ်သက်သော အသေသစိတ်အချက်အလက်မျာသကို အောက်ပါလင့်တလင် ကဌည့်ရဟုနိုင်ပါသည်။ ထုတ်ဝေသူ၏ဝဘ်ဆိုဒ်
» မာတိကာ
» ကောက်နုတ်ချက်

Khabrozhiteley ကူပလန်ကိုအသုံသပဌု၍ 25% လျဟော့စျေသအတလက် - Linux ကို

စာအုပ်၏ စက္ကူဗာသရဟင်သကို ငလေပေသချေပဌီသပါက အီလက်ထရလန်နစ်စာအုပ်ကို အီသမေသလ်ဖဌင့် ပေသပို့မည်ဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add