Phau ntawv "BPF rau Linux Saib Xyuas"

Phau ntawv "BPF rau Linux Saib Xyuas"Nyob zoo, cov neeg nyob hauv Khabro! BPF lub tshuab virtual yog ib qho tseem ceeb tshaj plaws ntawm Linux kernel. Nws txoj kev siv kom raug yuav tso cai rau cov engineers los nrhiav qhov tsis raug thiab daws cov teeb meem nyuaj tshaj plaws. Koj yuav kawm paub yuav ua li cas sau cov kev pab cuam uas saib xyuas thiab hloov tus cwj pwm ntawm cov ntsiav, yuav ua li cas kom muaj kev nyab xeeb siv cov cai los saib xyuas cov xwm txheej hauv kernel, thiab ntau ntxiv. David Calavera thiab Lorenzo Fontana yuav pab koj qhib lub zog ntawm BPF. Nthuav koj txoj kev paub txog kev ua tau zoo, kev sib txuas lus, kev ruaj ntseg. - Siv BPF los saib xyuas thiab hloov kho tus cwj pwm ntawm Linux kernel. - Txhaj code kom ruaj ntseg saib xyuas cov xwm txheej tsis tas yuav rov ua dua cov ntsiav lossis rov pib lub kaw lus. - Siv cov qauv code yooj yim hauv C, Mus lossis Python. - Tswj los ntawm tus tswv ntawm BPF qhov kev pab cuam lub neej.

Linux Kernel Security, Nws Cov Nta thiab Seccomp

BPF muab txoj hauv kev muaj zog los txuas ntxiv cov ntsiav yam tsis muaj kev cuam tshuam kev ruaj ntseg, kev ruaj ntseg, lossis ceev. Vim li no, cov neeg tsim khoom lag luam xav tias nws yuav yog ib lub tswv yim zoo los siv nws txoj kev siv ntau yam los txhim kho cov txheej txheem kev sib cais hauv Seccomp los ntawm kev siv Seccomp cov ntxaij lim dej txhawb nqa los ntawm BPF cov kev pab cuam, tseem hu ua Seccomp BPF. Hauv tshooj no peb yuav piav qhia seb Seccomp yog dab tsi thiab nws siv li cas. Tom qab ntawd koj yuav kawm paub sau Seccomp lim siv BPF cov kev pab cuam. Tom qab ntawd, peb mam li saib cov hooks built-in BPF uas suav nrog hauv cov ntsiav rau Linux kev ruaj ntseg modules.

Linux Security Modules (LSM) yog lub moj khaum uas muab cov haujlwm ua haujlwm uas tuaj yeem siv los siv ntau yam qauv kev nyab xeeb raws li tus qauv. LSM tuaj yeem siv ncaj qha rau hauv cov ntoo ntoo, xws li Apparmor, SELinux thiab Tomoyo.

Cia peb pib los ntawm kev sib tham txog lub peev xwm ntawm Linux.

Nta

Lub ntsiab lus ntawm Linux lub peev xwm yog tias koj yuav tsum tau tso cai rau cov txheej txheem tsis tsim nyog tso cai los ua ib txoj haujlwm, tab sis tsis siv suid rau lub hom phiaj ntawd, lossis ua kom cov txheej txheem tsim nyog, txo qhov muaj peev xwm tawm tsam thiab tso cai rau cov txheej txheem ua qee yam haujlwm. Piv txwv li, yog tias koj daim ntawv thov yuav tsum qhib qhov chaw nres nkoj muaj cai, hais 80, es tsis txhob khiav cov txheej txheem hauv paus, koj tuaj yeem muab nws lub peev xwm CAP_NET_BIND_SERVICE.

Xav txog Go program npe main.go:

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

Qhov kev pabcuam no ua haujlwm rau HTTP server ntawm chaw nres nkoj 80 (qhov no yog qhov chaw nres nkoj muaj cai). Feem ntau peb khiav nws tam sim ntawd tom qab muab tso ua ke:

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

Txawm li cas los xij, txij li thaum peb tsis tau muab cov cai hauv paus, cov cai no yuav cuam tshuam qhov yuam kev thaum khi qhov chaw nres nkoj:

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

capsh (plhaub tus thawj tswj hwm) yog ib lub cuab yeej uas khiav lub plhaub nrog cov txheej txheem tshwj xeeb.

Nyob rau hauv cov ntaub ntawv no, raws li twb tau hais lawm, es tsis txhob muab tag nrho cov cai hauv paus, koj muaj peev xwm ua kom muaj cai chaw nres nkoj khi los ntawm kev muab lub peev xwm cap_net_bind_service nrog rau txhua yam uas twb muaj nyob rau hauv qhov kev pab cuam. Txhawm rau ua qhov no, peb tuaj yeem kaw peb qhov program hauv 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"

Cia peb nkag siab pab neeg no me ntsis.

  • capsh - siv capsh ua lub plhaub.
  • -caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - txij li thaum peb yuav tsum hloov tus neeg siv (peb tsis xav khiav raws li hauv paus), peb mam li qhia cap_net_bind_service thiab muaj peev xwm hloov tau tus neeg siv ID los ntawm hauv paus rau tsis muaj leej twg, uas yog cap_setuid thiab cap_setgid.
  • -keep = 1 - peb xav khaws lub peev xwm nruab thaum hloov los ntawm tus lej hauv paus.
  • -user = "tsis muaj leej twg" - tus neeg siv kawg khiav qhov program yuav tsis muaj leej twg.
  • -addamb=cap_net_bind_service - teeb tsa kev tshem tawm ntawm cov peev xwm cuam tshuam tom qab hloov los ntawm hom hauv paus.
  • - -c "./capabilities" - tsuas yog khiav qhov program.

Kev muaj peev xwm txuas tau yog ib hom kev muaj peev xwm tshwj xeeb uas tau txais los ntawm cov kev pab cuam me nyuam thaum qhov kev pab cuam tam sim no ua rau lawv siv execve(). Tsuas yog muaj peev xwm uas tau tso cai los koom nrog, lossis hauv lwm lo lus, raws li kev muaj peev xwm ib puag ncig, tuaj yeem tau txais txiaj ntsig.

Tej zaum koj yuav xav tsis thoob tias + eip txhais tau li cas tom qab qhia lub peev xwm hauv qhov kev xaiv --caps. Cov chij no yog siv los txiav txim siab tias muaj peev xwm:

- yuav tsum tau qhib (p);

- muaj rau siv (e);

- tuaj yeem tau txais los ntawm cov txheej txheem menyuam yaus (i).

Txij li thaum peb xav siv cap_net_bind_service, peb yuav tsum ua qhov no nrog tus chij e. Tom qab ntawd peb yuav pib lub plhaub hauv cov lus txib. Qhov no yuav khiav lub peev xwm binary thiab peb yuav tsum tau kos nws nrog tus chij. Thaum kawg, peb xav kom lub feature tau enabled (peb ua qhov no yam tsis tau hloov lub UID) nrog p. Nws zoo li cap_net_bind_service+eip.

Koj tuaj yeem tshawb xyuas qhov tshwm sim siv ss. Cia peb luv cov zis me ntsis kom haum rau ntawm nplooj ntawv, tab sis nws yuav qhia qhov chaw nres nkoj thiab tus neeg siv ID uas tsis yog 0, qhov no 65:

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

Hauv qhov piv txwv no peb siv capsh, tab sis koj tuaj yeem sau lub plhaub siv libcap. Yog xav paub ntxiv, saib txiv neej 3 libcap.

Thaum sau cov kev pab cuam, feem ntau tus tsim tawm tsis paub ua ntej tag nrho cov yam ntxwv uas qhov kev pab cuam xav tau thaum lub sij hawm khiav; Ntxiv mus, cov yam ntxwv no tuaj yeem hloov pauv hauv cov ntawv tshiab.

Txhawm rau kom nkag siab zoo dua cov peev txheej ntawm peb qhov kev pab cuam, peb tuaj yeem nqa BCC peev txheej, uas teeb tsa kprobe rau cap_capable kernel muaj nuj nqi:

/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

Peb tuaj yeem ua tiav tib yam los ntawm kev siv bpftrace nrog ib-liner kprobe hauv cap_capable kernel muaj nuj nqi:

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

Qhov no yuav tso tawm ib yam dab tsi zoo li hauv qab no yog tias peb qhov kev pab cuam lub peev xwm tau qhib tom qab 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

Sab thib tsib yog lub peev xwm uas cov txheej txheem xav tau, thiab txij li cov khoom tso tawm no suav nrog cov xwm txheej tsis yog kev tshuaj xyuas, peb pom tag nrho cov kev kuaj xyuas tsis raug thiab thaum kawg yuav tsum muaj peev xwm nrog tus chij audit (kawg nyob rau hauv cov zis) teem rau 1. Muaj peev xwm. ib qho uas peb txaus siab rau yog CAP_NET_BIND_SERVICE, nws txhais tau tias yog qhov tsis tu ncua ntawm cov kab lis kev cai hauv cov ntaub ntawv suav nrog /uapi/linux/ability.h nrog tus lej 10:

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

Kev muaj peev xwm feem ntau tau ua haujlwm ntawm lub sijhawm ua haujlwm rau cov ntim xws li runC lossis Docker kom tso cai rau lawv khiav hauv hom tsis muaj cai, tab sis lawv tsuas yog tso cai rau lub peev xwm xav tau los khiav feem ntau cov ntawv thov. Thaum ib daim ntawv thov xav tau qee lub peev xwm, Docker tuaj yeem muab rau lawv siv --cap-ntxiv:

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

Cov lus txib no yuav muab lub thawv rau CAP_NET_ADMIN muaj peev xwm, tso cai rau nws los teeb tsa lub network txuas ntxiv rau dummy0 interface.

Tshooj tom ntej no qhia txog kev siv cov yam ntxwv xws li kev lim dej, tab sis siv cov txheej txheem sib txawv uas tso cai rau peb siv peb tus kheej cov ntxaij lim dej.

Seccomp

Seccomp stands rau Secure Computing thiab yog txheej txheej kev ruaj ntseg siv hauv Linux ntsiav uas tso cai rau cov neeg tsim khoom lim qee qhov kev hu xov tooj. Txawm hais tias Seccomp muaj peev xwm sib piv rau Linux, nws lub peev xwm los tswj qee qhov kev hu xov tooj ua rau nws hloov pauv ntau dua piv rau lawv.

Seccomp thiab Linux nta tsis yog sib koom ua ke thiab feem ntau siv ua ke kom tau txais txiaj ntsig los ntawm ob txoj hauv kev. Piv txwv li, tej zaum koj yuav xav muab cov txheej txheem CAP_NET_ADMIN muaj peev xwm tab sis tsis tso cai rau nws lees txais kev sib txuas ntawm lub qhov (socket), thaiv qhov lees txais thiab lees txais 4 qhov kev hu xov tooj.

Txoj kev Seccomp filtering yog raws li BPF cov ntxaij lim dej ua haujlwm hauv SECOMP_MODE_FILTER hom, thiab kev hu xovtooj lim tau ua tib yam li rau pob ntawv.

Seccomp cov ntxaij lim dej tau thauj khoom siv prctl los ntawm kev ua haujlwm PR_SET_SECOMP. Cov lim dej no siv daim ntawv ntawm BPF qhov kev pab cuam uas raug tua rau txhua pob Seccomp uas sawv cev los ntawm cov qauv seccomp_data. Cov qauv no muaj cov qauv siv siv, tus taw tes rau cov lus qhia ua haujlwm thaum lub sijhawm hu xov tooj, thiab qhov siab tshaj plaws ntawm rau qhov kev sib cav hu xov tooj, qhia tias uint64.

Qhov no yog dab tsi tus qauv seccomp_data zoo li los ntawm cov kab lus hauv kab hauv linux/seccomp.h cov ntaub ntawv:

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

Raws li koj tuaj yeem pom los ntawm cov qauv no, peb tuaj yeem lim los ntawm kev hu xov tooj, nws cov lus sib cav, lossis kev sib txuas ntawm ob qho tib si.

Tom qab tau txais txhua pob Seccomp, lub lim yuav tsum ua cov txheej txheem los txiav txim siab zaum kawg thiab qhia lub kernel yuav ua li cas ntxiv. Qhov kev txiav txim zaum kawg yog qhia los ntawm ib qho ntawm cov txiaj ntsig rov qab (cov lej xwm txheej).

- SECOMP_RET_KILL_PROCESS - tua tag nrho cov txheej txheem tam sim ntawd tom qab lim lub kaw lus hu uas tsis raug tua vim qhov no.

- SECOMP_RET_KILL_THREAD - txiav tawm cov xov tam sim no tam sim tom qab lim lub kaw lus hu uas tsis raug tua vim qhov no.

β€” SECOMP_RET_KILL β€” alias rau SECOMP_RET_KILL_THREAD, sab laug rau rov qab compatibility.

- SECOMP_RET_TRAP - kev hu xov tooj raug txwv, thiab SIGSYS (Bad System Call) teeb liab raug xa mus rau txoj haujlwm uas hu nws.

- SECOMP_RET_ERRNO - Lub kaw lus hu tsis raug tua, thiab ib feem ntawm SECOMP_RET_DATA lim rov qab tus nqi raug xa mus rau cov neeg siv qhov chaw raws li tus nqi errno. Nyob ntawm qhov ua rau ntawm qhov yuam kev, qhov sib txawv errno qhov tseem ceeb raug xa rov qab. Ib daim ntawv teev cov lej yuam kev tau muab rau hauv ntu tom ntej.

- SECCOMP_RET_TRACE - Siv ceeb toom rau ptrace tracer siv - PTRACE_O_TRACESECCOMP los cuam tshuam thaum lub kaw lus hu raug tua kom pom thiab tswj cov txheej txheem ntawd. Yog tias tus neeg taug qab tsis txuas nrog, qhov yuam kev raug xa rov qab, errno tau teeb tsa rau -ENOSYS, thiab kev hu xov tooj tsis raug tua.

- SECOMP_RET_LOG - lub kaw lus hu tau raug daws thiab nkag mus.

- SECOMP_RET_ALLOW - lub kaw lus hu tau yooj yim tso cai.

ptrace yog lub kaw lus hu rau kev siv cov txheej txheem tracing hauv cov txheej txheem hu ua tracee, nrog lub peev xwm los saib xyuas thiab tswj kev ua tiav ntawm cov txheej txheem. Txoj haujlwm taug qab tuaj yeem cuam tshuam rau kev ua tiav thiab hloov kho cov ntawv sau npe nco. Nyob rau hauv Seccomp cov ntsiab lus, ptrace yog siv thaum tshwm sim los ntawm SECOMP_RET_TRACE raws li txoj cai code, yog li tus tracer tuaj yeem tiv thaiv kev hu xov tooj los ntawm kev ua thiab siv nws tus kheej logic.

Seccomp yuam kev

Qee lub sij hawm, thaum ua haujlwm nrog Seccomp, koj yuav ntsib ntau yam yuam kev, uas tau txheeb xyuas los ntawm tus nqi rov qab ntawm hom SECOMP_RET_ERRNO. Txhawm rau tshaj tawm qhov yuam kev, kev hu xov tooj seccomp yuav rov qab -1 tsis yog 0.

Cov teeb meem hauv qab no tuaj yeem ua tau:

- EACCESS - Tus neeg hu xov tooj tsis raug tso cai hu xov tooj. Qhov no feem ntau tshwm sim vim nws tsis muaj CAP_SYS_ADMIN cov cai lossis no_new_privs tsis tau teeb tsa siv prctl (peb mam li tham txog qhov no tom qab);

- EFAULT - cov lus sib cav dhau los (args hauv cov qauv seccomp_data) tsis muaj qhov chaw nyob;

- EINVAL - tuaj yeem muaj plaub qhov laj thawj ntawm no:

-Qhov kev thov ua haujlwm tsis paub lossis tsis tau txais kev txhawb nqa los ntawm cov ntsiav hauv kev teeb tsa tam sim no;

- cov cim chij tsis siv tau rau kev thov ua haujlwm;

-kev khiav hauj lwm suav nrog BPF_ABS, tab sis muaj teeb meem nrog cov kev teev tseg offset, uas yuav dhau qhov loj ntawm cov qauv seccomp_data;

- tus naj npawb ntawm cov lus qhia dhau mus rau lub lim tshaj qhov siab tshaj plaws;

- ENOMEM - tsis muaj lub cim xeeb txaus los ua tiav qhov program;

- EOPNOTSUPP - kev ua haujlwm tau qhia tias nrog SECCOMP_GET_ACTION_AVAIL qhov kev txiav txim muaj, tab sis cov ntsiav tsis txhawb nqa rov qab los ntawm kev sib cav;

- ESRCH - ib qho teeb meem tshwm sim thaum synchronizing lwm kwj;

- ENOSYS - Tsis muaj tus neeg taug qab txuas nrog SECOMP_RET_TRACE qhov kev txiav txim.

prctl yog ib qho kev hu xov tooj uas tso cai rau tus neeg siv qhov chaw ua haujlwm los tswj (teeb thiab tau txais) qhov tshwj xeeb ntawm cov txheej txheem, xws li byte endianness, xov npe, kev nyab xeeb kev suav hom (Seccomp), cov cai, Perf txheej xwm, thiab lwm yam.

Seccomp yuav zoo li lub tshuab sandbox rau koj, tab sis nws tsis yog. Seccomp yog ib qho khoom siv uas tso cai rau cov neeg siv los tsim lub tshuab sandbox. Tam sim no cia saib yuav ua li cas cov neeg siv kev sib cuam tshuam cov kev pab cuam raug tsim siv lub lim hu ncaj qha los ntawm Seccomp system hu.

BPF Seccomp Filter Piv txwv

Ntawm no peb yuav qhia yuav ua li cas los ua ke ob qho kev nqis tes ua tau tham ua ntej, uas yog:

- peb yuav sau Seccomp BPF qhov kev pab cuam, uas yuav siv los ua cov lim dej nrog cov lej xa rov qab sib txawv nyob ntawm kev txiav txim siab;

- thauj cov lim siv prctl.

Ua ntej koj xav tau headers los ntawm cov qauv tsev qiv ntawv thiab Linux ntsiav:

#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>

Ua ntej sim ua piv txwv no, peb yuav tsum xyuas kom meej tias cov ntsiav tau suav nrog CONFIG_SECCOMP thiab CONFIG_SECOMP_FILTER teeb rau y. Ntawm lub tshuab ua haujlwm koj tuaj yeem tshawb xyuas qhov no:

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

Tus so ntawm cov cai yog ob feem install_filter muaj nuj nqi. Thawj ntu muaj peb cov npe ntawm BPF lim cov lus qhia:

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),
  };

Cov lus qhia tau teeb tsa siv BPF_STMT thiab BPF_JUMP macros tau teev tseg hauv cov ntaub ntawv linux/filter.h.
Cia peb mus dhau cov lus qhia.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - lub kaw lus loads thiab accumulates los ntawm BPF_LD nyob rau hauv daim ntawv ntawm lo lus BPF_W, pob ntawv cov ntaub ntawv nyob rau ntawm ib tug ruaj offset BPF_ABS.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - xyuas siv BPF_JEQ seb tus nqi architecture hauv BPF_K accumulator tas li yog sib npaug rau arch. Yog tias ua tau, dhia ntawm offset 0 mus rau cov lus qhia tom ntej, txwv tsis pub dhia ntawm offset 3 (hauv qhov no) pov qhov yuam kev vim koov tsis phim.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Loads thiab accumulates los ntawm BPF_LD nyob rau hauv daim ntawv ntawm lo lus BPF_W, uas yog lub kaw lus hu xov tooj muaj nyob rau hauv tas li offset ntawm BPF_ABS.

β€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) β€” sib piv cov xov tooj hu xov tooj nrog tus nqi ntawm qhov sib txawv. Yog tias lawv sib npaug, txav mus rau cov lus qhia tom ntej thiab kaw lub kaw lus hu, txwv tsis pub lub kaw lus hu nrog SECOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (yuam & SECOMP_RET_DATA)) - xaus qhov kev pab cuam nrog BPF_RET thiab vim li ntawd ua rau muaj qhov yuam kev SECOMP_RET_ERRNO nrog tus lej los ntawm qhov hloov pauv hloov pauv.

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - txiav tawm qhov kev pab cuam nrog BPF_RET thiab tso cai rau lub kaw lus hu ua haujlwm siv SECCOMP_RET_ALLOW.

SECOMP yog CBPF
Tej zaum koj yuav xav tsis thoob yog vim li cas ib daim ntawv teev cov lus qhia siv es tsis txhob muab tso ua ke ELF cov khoom los yog JIT compiled C program.

Muaj ob qho laj thawj rau qhov no.

β€’ Ua ntej, Seccomp siv cBPF (classic BPF) thiab tsis yog eBPF, uas txhais tau tias: nws tsis muaj npe, tab sis tsuas yog ib qho accumulator los khaws cov txiaj ntsig kawg ntawm kev suav, raws li pom hauv qhov piv txwv.

β€’ Thib ob, Seccomp lees txais tus taw tes rau ib qho ntawm BPF cov lus qhia ncaj qha thiab tsis muaj dab tsi ntxiv. Cov macros peb tau siv yooj yim pab qhia cov lus qhia no hauv txoj kev programmer-phooj ywg.

Yog tias koj xav tau kev pab ntxiv kom nkag siab txog qhov sib dhos no, xav txog pseudocode uas ua tib yam:

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

Tom qab txheeb xyuas cov cai lim hauv cov qauv socket_filter, koj yuav tsum tau txhais lub sock_fprog uas muaj cov cai thiab qhov ntev ntawm cov lim. Cov qauv ntaub ntawv no yog xav tau los ua ib qho kev sib cav rau kev tshaj tawm cov txheej txheem los khiav tom qab:

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

Muaj tsuas yog ib qho tseem tshuav ua nyob rau hauv lub install_filter muaj nuj nqi - thauj cov kev pab cuam nws tus kheej! Txhawm rau ua qhov no, peb siv prctl, noj PR_SET_SECOMP ua ib qho kev xaiv nkag mus rau kev ruaj ntseg hauv computer. Tom qab ntawd peb qhia hom kom thauj cov lim siv SECOMP_MODE_FILTER, uas muaj nyob rau hauv prog sib txawv ntawm hom sock_fprog:

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

Thaum kawg, peb tuaj yeem siv peb qhov kev ua haujlwm install_filter, tab sis ua ntej peb yuav tsum siv prctl los teeb PR_SET_NO_NEW_PRIVS rau kev ua tiav tam sim no thiab yog li zam qhov xwm txheej uas cov txheej txheem me nyuam tau txais txiaj ntsig ntau dua li cov niam txiv. Nrog rau qhov no, peb tuaj yeem ua cov hu prctl hauv qab no hauv kev ua haujlwm install_filter yam tsis muaj cov cai hauv paus.

Tam sim no peb tuaj yeem hu rau install_filter muaj nuj nqi. Cia peb thaiv txhua qhov kev sau npe hu rau X86-64 architecture thiab tsuas yog muab kev tso cai uas thaiv txhua qhov kev sim. Tom qab txhim kho lub lim, peb txuas ntxiv ua tiav siv thawj qhov kev sib cav:

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]);
 }

Cia peb pib. Txhawm rau suav peb qhov kev pab cuam peb tuaj yeem siv clang lossis gcc, ob txoj hauv kev nws tsuas yog sau cov ntaub ntawv main.c yam tsis muaj kev xaiv tshwj xeeb:

clang main.c -o filter-write

Raws li tau hais tseg, peb tau thaiv txhua qhov kev nkag hauv qhov program. Txhawm rau kuaj qhov no koj xav tau ib qho kev pab cuam uas tso tawm ib yam dab tsi - ls zoo li tus neeg sib tw zoo. Nov yog qhov nws feem ntau coj tus cwj pwm:

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

Zoo kawg! Nov yog qhov uas siv peb qhov kev pab cuam wrapper zoo li: Peb tsuas dhau qhov kev pab cuam peb xav sim ua thawj qhov kev sib cav:

./filter-write "ls -la"

Thaum ua tiav, qhov kev pab cuam no tsim tawm tag nrho cov zis. Txawm li cas los xij, peb tuaj yeem siv txoj hlua kom pom tias muaj dab tsi tshwm sim:

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

Qhov tshwm sim ntawm kev ua haujlwm yog luv heev, tab sis qhov sib thooj ntawm nws qhia tau hais tias cov ntaub ntawv raug thaiv nrog EPERM yuam kev - tib yam uas peb tau teeb tsa. Qhov no txhais tau hais tias qhov kev zov me nyuam tsis tso tawm dab tsi vim nws tsis tuaj yeem nkag mus rau kev sau npe hu:

[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)

Tam sim no koj nkag siab tias Seccomp BPF ua haujlwm li cas thiab muaj lub tswv yim zoo ntawm qhov koj tuaj yeem ua nrog nws. Tab sis koj puas xav kom ua tiav ib yam nrog eBPF es tsis txhob cBPF los siv nws lub zog tag nrho?

Thaum xav txog eBPF cov kev pab cuam, cov neeg feem coob xav tias lawv tsuas yog sau lawv thiab thauj lawv nrog cov cai tswj hwm. Thaum cov lus no feem ntau muaj tseeb, cov ntsiav siv cov txheej txheem los tiv thaiv eBPF cov khoom ntawm ntau qib. Cov txheej txheem no hu ua BPF LSM ntxiab.

BPF LSM cuab

Txhawm rau muab cov qauv kev ywj pheej saib xyuas ntawm cov txheej xwm txheej txheem, LSM siv lub tswv yim ntawm cov cuab yeej. Kev hu xov tooj yog technically zoo ib yam li kev hu xov tooj, tab sis yog kev ywj pheej thiab kev koom ua ke nrog cov txheej txheem. LSM muab lub tswv yim tshiab uas cov txheej txheem abstraction tuaj yeem pab kom tsis txhob muaj teeb meem tshwm sim thaum cuam tshuam nrog kev hu xov tooj ntawm cov qauv sib txawv.

Thaum lub sij hawm sau ntawv, cov ntsiav muaj xya hooks txuam nrog BPF cov kev pab cuam, thiab SELinux tsuas yog built-in LSM uas siv lawv.

Lub hauv paus code rau cov ntxiab yog nyob rau hauv cov ntoo kernel hauv cov ntaub ntawv suav nrog /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);

Txhua tus ntawm lawv yuav raug hu ua ntau theem ntawm kev ua tiav:

- security_bpf - ua qhov kev kuaj thawj zaug ntawm kev ua tiav BPF system hu;

- security_bpf_map - xyuas thaum lub kernel rov qab cov ntaub ntawv piav qhia rau daim ntawv qhia;

- security_bpf_prog - tshawb xyuas thaum lub kernel rov qab cov ntaub ntawv piav qhia rau eBPF program;

- security_bpf_map_alloc - xyuas seb qhov chaw ruaj ntseg hauv BPF daim ntawv qhia puas tau pib;

- security_bpf_map_free - xyuas seb qhov chaw ruaj ntseg puas raug tshem tawm hauv BPF daim ntawv qhia;

- security_bpf_prog_alloc - xyuas seb qhov chaw ruaj ntseg puas tau pib hauv BPF cov kev pab cuam;

- security_bpf_prog_free - xyuas seb qhov chaw ruaj ntseg puas raug tshem tawm hauv BPF cov kev pab cuam.

Tam sim no, pom tag nrho cov no, peb nkag siab: lub tswv yim tom qab LSM BPF cuam tshuam yog tias lawv tuaj yeem muab kev tiv thaiv rau txhua qhov khoom eBPF, kom ntseeg tau tias tsuas yog cov uas muaj cai tsim nyog tuaj yeem ua haujlwm ntawm daim npav thiab cov haujlwm.

Txoj kev xaus

Kev ruaj ntseg tsis yog ib yam uas koj tuaj yeem siv tau rau hauv ib qho loj-haum-txhua txoj hauv kev rau txhua yam koj xav tiv thaiv. Nws yog ib qho tseem ceeb kom muaj peev xwm tiv thaiv kab ke ntawm ntau qib thiab ntau txoj hauv kev. Ntseeg nws los tsis yog, txoj hauv kev zoo tshaj plaws kom muaj kev ruaj ntseg yog txhawm rau txhim kho qib sib txawv ntawm kev tiv thaiv los ntawm ntau txoj haujlwm, kom txo qis kev ruaj ntseg ntawm ib theem tsis pub nkag mus rau tag nrho cov kab ke. Cov neeg tsim khoom tseem ceeb tau ua txoj haujlwm zoo los muab peb cov txheej txheem sib txawv thiab cov ntsiab lus sib txawv. Peb vam tias peb tau muab rau koj kom nkag siab zoo txog cov txheej txheem dab tsi thiab yuav siv BPF cov kev pab cuam los ua haujlwm nrog lawv li cas.

Hais txog cov neeg sau ntawv

David Calavera yog CTO ntawm Netlify. Nws tau ua haujlwm hauv Docker txhawb thiab pab txhawb rau kev txhim kho Runc, Go thiab BCC cov cuab yeej, nrog rau lwm cov haujlwm qhib. Paub txog nws txoj haujlwm ntawm Docker cov haujlwm thiab kev txhim kho ntawm Docker plugin ecosystem. David yog tus mob siab rau ntawm cov nplaim hluav taws xob thiab ib txwm nrhiav kev ua kom zoo dua.

Lorenzo Fontana ua haujlwm ntawm pab pawg qhib ntawm Sysdig, qhov uas nws feem ntau tsom mus rau Falco, Cloud Native Computing Foundation qhov project uas muab cov thawv runtime kev ruaj ntseg thiab kev kuaj pom tsis zoo los ntawm cov kernel module thiab eBPF. Nws mob siab rau kev faib cov tshuab, software txhais kev sib txuas lus, Linux ntsiav, thiab kev txheeb xyuas kev ua haujlwm.

Β» Xav paub ntau ntxiv txog phau ntawv tuaj yeem nrhiav tau ntawm tus tshaj tawm lub vev xaib
Β» Cov txheej txheem
Β» Tshaj tawm

Rau Khabrozhiteley 25% luv nqi siv daim coupon - Linux

Thaum them nyiaj ntawm daim ntawv version ntawm phau ntawv, ib phau ntawv hluav taws xob yuav raug xa los ntawm e-mail.

Tau qhov twg los: www.hab.com

Ntxiv ib saib