Liv "BPF pou siveyans Linux"

Liv "BPF pou siveyans Linux"Bonjou, rezidan Khabro! BPF machin vityèl la se youn nan eleman ki pi enpòtan nan nwayo Linux la. Bon itilizasyon li yo pral pèmèt enjenyè sistèm yo jwenn defo ak rezoud menm pwoblèm ki pi konplèks yo. Ou pral aprann kijan pou ekri pwogram ki kontwole ak modifye konpòtman nwayo a, kijan pou aplike kòd san danje pou kontwole evènman nan nwayo a, ak plis ankò. David Calavera ak Lorenzo Fontana pral ede w déblotché pouvwa BPF. Elaji konesans ou nan optimize pèfòmans, rezo, sekirite. - Sèvi ak BPF pou kontwole ak modifye konpòtman nwayo Linux la. - Enjekte kòd pou kontwole evènman nwayo an sekirite san yo pa bezwen rekonpile nwayo a oswa rdemare sistèm lan. — Sèvi ak egzanp kòd pratik nan C, Go oswa Python. - Pran kontwòl lè w posede sik lavi pwogram BPF.

Sekirite Kernel Linux, Karakteristik li yo ak Seccomp

BPF bay yon fason pwisan pou pwolonje nwayo a san sakrifye estabilite, sekirite, oswa vitès. Pou rezon sa a, devlopè nwayo yo te panse li ta yon bon lide yo sèvi ak adaptabilite li yo amelyore izolasyon pwosesis nan Seccomp lè yo aplike filtè Seccomp sipòte pa pwogram BPF, ke yo rele tou Seccomp BPF. Nan chapit sa a nou pral eksplike kisa Seccomp ye ak kijan li itilize. Lè sa a, ou pral aprann ki jan yo ekri filtè Seccop lè l sèvi avèk pwogram BPF. Apre sa, nou pral gade nan kwòk BPF entegre ki enkli nan nwayo a pou modil sekirite Linux.

Modil Sekirite Linux (LSM) se yon kad ki bay yon seri fonksyon ki ka itilize pou aplike plizyè modèl sekirite nan yon fason ofisyèl. LSM ka itilize dirèkteman nan pyebwa sous nwayo a, tankou Apparmor, SELinux ak Tomoyo.

Ann kòmanse pa diskite sou kapasite Linux.

Kapasite

Sans nan kapasite Linux la se ke ou bezwen bay yon pèmisyon pwosesis san privilèj pou fè yon sèten travay, men san yo pa itilize suid pou objektif sa a, oswa otreman fè pwosesis la privilejye, diminye posiblite pou atak ak pèmèt pwosesis la fè sèten travay. Pou egzanp, si aplikasyon w lan bezwen louvri yon pò privilejye, di 80, olye pou yo kouri pwosesis la kòm rasin, ou ka tou senpleman ba li kapasite nan CAP_NET_BIND_SERVICE.

Konsidere yon pwogram Go ki rele main.go:

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

Pwogram sa a sèvi yon sèvè HTTP sou pò 80 (sa a se yon pò privilejye). Anjeneral nou kouri li imedyatman apre konpilasyon:

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

Sepandan, kòm nou pa akòde privilèj rasin, kòd sa a pral voye yon erè lè li mare pò a:

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

capsh (manadjè koki) se yon zouti ki kouri yon koki ak yon seri kapasite espesifik.

Nan ka sa a, kòm deja mansyone, olye pou yo akòde tout dwa rasin, ou ka pèmèt privilejye pò obligatwa lè w bay kapasite cap_net_bind_service ansanm ak tout lòt bagay ki deja nan pwogram nan. Pou fè sa, nou ka mete pwogram nou an nan 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"

Ann konprann ekip sa a yon ti kras.

  • capsh - itilize capsh kòm yon kokiy.
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - depi nou bezwen chanje itilizatè a (nou pa vle kouri kòm rasin), nou pral presize cap_net_bind_service ak kapasite pou aktyèlman chanje ID itilizatè a soti nan rasin nan pèsonn, sètadi cap_setuid ak cap_setgid.
  • —keep=1 — nou vle kenbe kapasite yo enstale lè nou chanje soti nan kont rasin lan.
  • —user=“nobody” — itilizatè final kap kouri pwogram nan p ap pèsonn.
  • —addamb=cap_net_bind_service — mete netwayaj kapasite ki gen rapò ak apre chanje soti nan mòd rasin.
  • - -c "./kapasite" - jis kouri pwogram nan.

Kapasite lye yo se yon kalite espesyal kapasite ke pwogram timoun yo eritye lè pwogram aktyèl la egzekite yo lè l sèvi avèk execve(). Se sèlman kapasite ki gen dwa asosye, oswa nan lòt mo, kòm kapasite anviwònman, ka eritye.

Pwobableman w ap mande kisa +eip vle di apre w fin espesifye kapasite nan opsyon --caps la. Drapo sa yo yo itilize pou detèmine kapasite a:

-dwe aktive (p);

-disponib pou itilize (e);

-kapab eritye pa pwosesis timoun (i).

Depi nou vle itilize cap_net_bind_service, nou bezwen fè sa ak drapo e la. Lè sa a, nou pral kòmanse koki a nan lòd la. Sa a pral kouri binè kapasite yo epi nou bezwen make li ak drapo a i. Finalman, nou vle aktive fonksyon an (nou te fè sa san nou pa chanje UID) ak p. Li sanble tankou cap_net_bind_service+eip.

Ou ka tcheke rezilta a lè l sèvi avèk ss. Ann diminye pwodiksyon an yon ti jan pou anfòm sou paj la, men li pral montre pò ki asosye ak ID itilizatè lòt pase 0, nan ka sa a 65:

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

Nan egzanp sa a nou te itilize capsh, men ou ka ekri yon kokiy lè l sèvi avèk libcap. Pou plis enfòmasyon, gade man 3 libcap.

Lè w ap ekri pwogram yo, byen souvan pwomotè a pa konnen davans tout karakteristik pwogram nan bezwen nan tan kouri; Anplis, karakteristik sa yo ka chanje nan nouvo vèsyon.

Pou pi byen konprann kapasite pwogram nou an, nou ka pran zouti ki kapab BCC, ki mete kprobe pou fonksyon nwayo cap_capable la:

/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

Nou ka reyalize menm bagay la lè nou itilize bpftrace ak yon kprobe yon sèl-liner nan fonksyon nwayo cap_capable:

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

Sa a pral bay yon bagay tankou sa ki annapre yo si kapasite pwogram nou an yo aktive apre 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

Senkyèm kolòn nan se kapasite yo ke pwosesis la bezwen, epi depi pwodiksyon sa a gen ladan evènman ki pa odit, nou wè tout chèk ki pa odit epi finalman kapasite obligatwa a ak drapo odit la (dènye nan pwodiksyon an) mete nan 1. Kapasite. youn nan nou enterese se CAP_NET_BIND_SERVICE, li defini kòm yon konstan nan kòd sous nwayo a nan fichye include/uapi/linux/ability.h ak idantifyan 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">

Kapasite yo souvan pèmèt nan ègzekutabl pou veso tankou runC oswa Docker pou pèmèt yo kouri nan mòd san privilèj, men yo sèlman pèmèt kapasite ki nesesè yo kouri pifò aplikasyon yo. Lè yon aplikasyon mande sèten kapasite, Docker ka bay yo lè l sèvi avèk --cap-add:

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

Kòmand sa a pral bay veso a kapasite CAP_NET_ADMIN, sa ki pèmèt li konfigirasyon yon lyen rezo pou ajoute koòdone dummy0 la.

Seksyon kap vini an montre kijan pou itilize karakteristik tankou filtraj, men lè l sèvi avèk yon teknik diferan ki pèmèt nou aplike pwòp filtè pa nou.

Seccomp

Seccomp vle di Secure Computing epi li se yon kouch sekirite ki aplike nan nwayo Linux ki pèmèt devlopè yo filtre sèten apèl sistèm. Malgre ke Seccomp se konparab nan kapasite ak Linux, kapasite li nan jere sèten apèl sistèm fè li pi fleksib konpare ak yo.

Seccomp ak karakteristik Linux yo pa mityèlman eksklizif epi yo souvan itilize ansanm pou benefisye de tou de apwòch. Pou egzanp, ou ta ka vle bay yon pwosesis kapasite nan CAP_NET_ADMIN men pa pèmèt li aksepte koneksyon priz, bloke aksepte ak aksepte apèl sistèm yo.

Metòd filtraj Seccomp a baze sou filtè BPF ki fonksyone nan mòd SECCOMP_MODE_FILTER, epi filtraj apèl sistèm fèt menm jan ak pakè yo.

Filtè Seccomp yo chaje lè l sèvi avèk prctl atravè operasyon PR_SET_SECCOP. Filtè sa yo pran fòm yon pwogram BPF ki egzekite pou chak pake Seccop reprezante pa estrikti seccomp_data. Estrikti sa a gen achitekti referans, yon konsèy sou enstriksyon processeur nan moman apèl sistèm lan, ak yon maksimòm sis agiman apèl sistèm, eksprime kòm uint64.

Men sa estrikti seccomp_data sanble nan kòd sous nwayo a nan dosye linux/seccomp.h:

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

Kòm ou ka wè nan estrikti sa a, nou ka filtre pa apèl la sistèm, agiman li yo, oswa yon konbinezon de tou de.

Apre li fin resevwa chak pake Seccop, filtè a dwe fè pwosesis pou pran yon desizyon final epi di nwayo a sa pou l fè apre. Desizyon final la eksprime pa youn nan valè retounen yo (kòd estati).

- SECCOMP_RET_KILL_PROCESS - touye tout pwosesis la imedyatman apre filtre yon apèl sistèm ki pa egzekite poutèt sa.

- SECCOMP_RET_KILL_THREAD - mete fen nan fil aktyèl la imedyatman apre yo fin filtre yon apèl sistèm ki pa egzekite poutèt sa.

— SECCOMP_RET_KILL — alyas pou SECCOMP_RET_KILL_THREAD, kite pou konpatibilite bak.

- SECCOMP_RET_TRAP - apèl sistèm lan entèdi, epi siyal SIGSYS (Bad System Call) voye bay travay ki rele l.

- SECCOMP_RET_ERRNO - Apèl sistèm lan pa egzekite, epi yon pati nan valè retounen filtè SECCOMP_RET_DATA yo pase nan espas itilizatè kòm valè errno. Tou depan de kòz erè a, diferan valè errno yo retounen. Yon lis nimewo erè yo bay nan pwochen seksyon an.

- SECCOMP_RET_TRACE - Yo itilize pou notifye ptrace tracer lè l sèvi avèk - PTRACE_O_TRACESECCOMP pou entèsepte lè yo egzekite yon apèl sistèm pou wè ak kontwole pwosesis sa a. Si yon traser pa konekte, yo retounen yon erè, errno mete sou -ENOSYS, epi apèl sistèm lan pa egzekite.

- SECCOMP_RET_LOG - apèl sistèm lan rezoud epi konekte.

- SECCOMP_RET_ALLOW - apèl sistèm lan tou senpleman pèmèt.

ptrace se yon apèl sistèm pou aplike mekanis tras nan yon pwosesis ki rele tracee, ak kapasite pou kontwole ak kontwole ekzekisyon pwosesis la. Pwogram tras la ka efektivman enfliyanse ekzekisyon an epi modifye rejis memwa tracee a. Nan kontèks Seccomp, ptrace yo itilize lè kòd estati SECCOMP_RET_TRACE la deklanche, kidonk tracer la ka anpeche apèl sistèm lan egzekite epi aplike pwòp lojik li.

Seccomp erè

De tan zan tan, pandan w ap travay ak Seccomp, w ap rankontre divès erè, ki idantifye pa yon valè retounen nan kalite SECCOMP_RET_ERRNO. Pou rapòte yon erè, apèl sistèm seccomp la ap retounen -1 olye de 0.

Erè sa yo posib:

- EACCESS - Moun kap rele a pa gen dwa fè yon apèl sistèm. Anjeneral sa rive paske li pa gen privilèj CAP_SYS_ADMIN oswa no_new_privs pa tabli lè l sèvi avèk prctl (nou pral pale sou sa pita);

— EFAULT — agiman yo pase (arg nan estrikti seccomp_data) pa gen yon adrès valab;

— EINVAL — ka gen kat rezon isit la:

-operasyon an mande se enkoni oswa pa sipòte pa nwayo a nan konfigirasyon aktyèl la;

-drapo espesifye yo pa valab pou operasyon yo mande a;

-operasyon gen ladan BPF_ABS, men gen pwoblèm ak konpanse a espesifye, ki ka depase gwosè a nan estrikti nan seccomp_data;

-kantite enstriksyon yo pase nan filtè a depase maksimòm la;

— ENOMEM — pa ase memwa pou egzekite pwogram nan;

- EOPNOTSUPP - operasyon an endike ke ak SECCOMP_GET_ACTION_AVAIL aksyon an te disponib, men nwayo a pa sipòte retounen nan agiman;

— ESRCH — yon pwoblèm ki te fèt lè senkronize yon lòt kouran;

- ENOSYS - Pa gen okenn traser ki tache ak aksyon SECCOMP_RET_TRACE.

prctl se yon apèl sistèm ki pèmèt yon pwogram espas itilizatè manipile (mete epi jwenn) aspè espesifik nan yon pwosesis, tankou byte endianness, non fil, mòd kalkil sekirite (Seccomp), privilèj, evènman Perf, elatriye.

Seccomp ka sanble yon teknoloji sandbox pou ou, men li pa. Seccomp se yon sèvis piblik ki pèmèt itilizatè yo devlope yon mekanis sandbox. Koulye a, kite a gade nan ki jan pwogram entèraksyon itilizatè yo kreye lè l sèvi avèk yon filtè ki rele dirèkteman pa apèl nan sistèm Seccomp.

BPF Seccomp Filter Egzanp

Isit la nou pral montre ki jan yo konbine de aksyon yo te diskite pi bonè, sètadi:

— nou pral ekri yon pwogram Seccop BPF, ki pral itilize kòm yon filtè ak kòd retounen diferan selon desizyon yo pran;

— chaje filtè a lè l sèvi avèk prctl.

Premyèman, ou bezwen headers nan bibliyotèk estanda a ak nwayo Linux la:

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

Anvan eseye egzanp sa a, nou dwe asire ke nwayo a konpile ak CONFIG_SECCOMP ak CONFIG_SECCOMP_FILTER mete sou y. Sou yon machin k ap travay ou ka tcheke sa a tankou sa a:

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

Rès kòd la se yon fonksyon install_filter ki gen de pati. Premye pati a gen lis nou an nan enstriksyon filtraj 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),
  };

Enstriksyon yo mete lè l sèvi avèk makro BPF_STMT ak BPF_JUMP ki defini nan fichye linux/filter.h.
Ann ale nan enstriksyon yo.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - sistèm nan chaje ak akimile soti nan BPF_LD nan fòm lan nan mo BPF_W, done pake yo sitiye nan yon konpanse fiks BPF_ABS.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - tcheke lè l sèvi avèk BPF_JEQ si valè achitekti nan konstan akimilatè BPF_K la egal ak ark. Si se konsa, sote nan konpanse 0 nan pwochen enstriksyon an, otreman sote nan konpanse 3 (nan ka sa a) pou voye yon erè paske ark pa matche.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Chaje ak akimile soti nan BPF_LD nan fòm lan nan mo BPF_W, ki se nimewo apèl sistèm ki genyen nan konpanse a fiks nan BPF_ABS.

— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — konpare nimewo apèl sistèm lan ak valè varyab nr a. Si yo egal, ale nan pwochen enstriksyon an epi enfim apèl sistèm lan, otreman pèmèt apèl sistèm lan ak SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (erè & SECCOMP_RET_DATA)) - mete fen nan pwogram nan ak BPF_RET epi kòm yon rezilta pwodui yon erè SECCOMP_RET_ERRNO ak nimewo ki soti nan varyab erè a.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - mete fen nan pwogram nan ak BPF_RET epi pèmèt apèl sistèm lan dwe egzekite lè l sèvi avèk SECCOMP_RET_ALLOW.

SECCOMP SE CBPF
Ou ka mande poukisa yo itilize yon lis enstriksyon olye de yon objè ELF konpile oswa yon pwogram C konpile JIT.

Gen de rezon pou sa.

• Premyèman, Seccomp itilize cBPF (BPF klasik) epi li pa eBPF, ki vle di: li pa gen okenn rejis, men se sèlman yon akimilatè pou konsève dènye rezilta kalkil la, jan yo ka wè nan egzanp lan.

• Dezyèmman, Seccomp aksepte yon konsèy sou yon seri enstriksyon BPF dirèkteman e pa gen anyen lòt bagay. Makro yo nou te itilize tou senpleman ede presize enstriksyon sa yo nan yon fason pwogramè-zanmitay.

Si ou bezwen plis èd pou konprann asanble sa a, konsidere pseudocode ki fè menm bagay la:

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

Apre ou fin defini kòd filtre a nan estrikti socket_filter la, ou bezwen defini yon sock_fprog ki gen kòd la ak longè kalkile filtè a. Estrikti done sa a nesesè kòm yon agiman pou deklare pwosesis la kouri pita:

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

Gen yon sèl bagay ki rete pou fè nan fonksyon install_filter - chaje pwogram nan tèt li! Pou fè sa, nou itilize prctl, pran PR_SET_SECCOMP kòm yon opsyon pou antre nan mòd informatique an sekirite. Lè sa a, nou di mòd nan chaje filtè a lè l sèvi avèk SECCOMP_MODE_FILTER, ki genyen nan varyab la prog nan kalite sock_fprog:

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

Finalman, nou ka itilize fonksyon install_filter nou an, men anvan sa nou bezwen sèvi ak prctl pou mete PR_SET_NO_NEW_PRIVS pou ekzekisyon aktyèl la epi kidonk evite sitiyasyon kote pwosesis timoun yo resevwa plis privilèj pase paran yo. Avèk sa a, nou ka fè apèl prctl sa yo nan fonksyon install_filter san yo pa gen dwa rasin.

Koulye a, nou ka rele fonksyon install_filter la. Ann bloke tout apèl sistèm ekri ki gen rapò ak achitekti X86-64 la epi tou senpleman bay yon pèmisyon ki bloke tout tantativ. Apre enstale filtè a, nou kontinye egzekisyon lè l sèvi avèk premye agiman an:

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

An n kòmanse. Pou konpile pwogram nou an nou ka itilize swa clang oswa gcc, nenpòt fason li jis konpile fichye main.c la san opsyon espesyal:

clang main.c -o filter-write

Kòm te note, nou bloke tout antre nan pwogram nan. Pou teste sa a ou bezwen yon pwogram ki soti yon bagay - ls sanble tankou yon bon kandida. Men ki jan li konn konpòte l:

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

Bèl bagay! Men sa w ap itilize pwogram wrapper nou an sanble: Nou senpleman pase pwogram nou vle teste a kòm premye agiman an:

./filter-write "ls -la"

Lè egzekite, pwogram sa a pwodui pwodiksyon konplètman vid. Sepandan, nou ka itilize strace pou wè sa k ap pase:

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

Rezilta travay la vin pi kout anpil, men pati ki koresponn nan li montre ke dosye yo bloke ak erè EPERM la - menm youn nan ke nou konfigirasyon. Sa vle di ke pwogram nan pa bay anyen paske li pa ka jwenn aksè nan apèl sistèm ekri:

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

Koulye a, ou konprann ki jan Seccop BPF travay epi ou gen yon bon lide sou sa ou ka fè ak li. Men, èske w pa ta renmen reyalize menm bagay ak eBPF olye de cBPF pou exploiter tout pouvwa li?

Lè w ap panse sou pwogram eBPF, pifò moun panse ke yo senpleman ekri yo epi chaje yo ak privilèj administratè. Pandan ke deklarasyon sa a se jeneralman vre, nwayo a aplike yon seri mekanis pou pwoteje objè eBPF nan divès nivo. Yo rele mekanis sa yo pyèj BPF LSM.

BPF LSM pyèj

Pou bay siveyans achitekti-endepandan evènman sistèm, LSM aplike konsèp nan pyèj. Yon apèl zen se teknikman menm jan ak yon apèl sistèm, men se sistèm endepandan epi entegre ak enfrastrikti a. LSM bay yon nouvo konsèp kote yon kouch abstraksyon ka ede evite pwoblèm yo rankontre lè w ap fè fas ak apèl sistèm sou diferan achitekti.

Nan moman sa a nan ekri a, nwayo a gen sèt kwòk ki asosye ak pwogram BPF, ak SELinux se sèlman bati-an LSM ki aplike yo.

Kòd sous la pou pyèj yo sitiye nan pye bwa nwayo a nan dosye a 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);

Chak nan yo pral rele nan diferan etap nan ekzekisyon:

— security_bpf — fè yon premye chèk nan apèl sistèm BPF egzekite;

- security_bpf_map - tcheke lè nwayo a retounen yon deskriptè fichye pou kat la;

- security_bpf_prog - tcheke lè nwayo a retounen yon deskriptè dosye pou pwogram eBPF la;

— security_bpf_map_alloc — tcheke si jaden sekirite anndan kat BPF yo inisyalize;

- security_bpf_map_free - tcheke si jaden sekirite a netwaye andedan kat BPF;

— security_bpf_prog_alloc — tcheke si jaden sekirite a inisyalize andedan pwogram BPF;

- security_bpf_prog_free - tcheke si jaden sekirite a otorize andedan pwogram BPF yo.

Koulye a, wè tout bagay sa yo, nou konprann: lide ki dèyè LSM BPF entèsèpteur se yo ke yo ka bay pwoteksyon nan chak objè eBPF, asire ke sèlman moun ki gen privilèj apwopriye yo ka fè operasyon sou kat ak pwogram.

Rezime

Sekirite se pa yon bagay ou ka aplike nan yon sèl-gwosè-adapte-tout fason pou tout bagay ou vle pwoteje. Li enpòtan pou kapab pwoteje sistèm nan diferan nivo ak nan diferan fason. Kwè li oswa ou pa, pi bon fason pou sekirize yon sistèm se òganize diferan nivo pwoteksyon nan diferan pozisyon, pou diminye sekirite a nan yon nivo pa pèmèt aksè nan tout sistèm nan. Devlopè debaz yo te fè yon gwo travay pou ban nou yon seri diferan kouch ak pwen kontak. Nou espere ke nou te ba ou yon bon konpreyansyon sou sa kouch yo ye ak kijan pou itilize pwogram BPF pou travay avèk yo.

Konsènan otè yo

David Calavera se CTO nan Netlify. Li te travay nan sipò Docker ak kontribye nan devlopman Runc, Go ak BCC zouti, osi byen ke lòt pwojè sous louvri. Li te ye pou travay li sou pwojè Docker ak devlopman nan ekosistèm plugin Docker. David trè pasyone sou graf flanm dife epi li toujou ap chèche optimize pèfòmans.

Lorenzo Fontana ap travay sou ekip sous louvri nan Sysdig, kote li konsantre prensipalman sou Falco, yon pwojè Cloud Native Computing Foundation ki bay sekirite nan egzekisyon veso ak deteksyon anomali atravè yon modil nwayo ak eBPF. Li pasyone sou sistèm distribiye, rezo defini lojisyèl, nwayo Linux, ak analiz pèfòmans.

» Ou ka jwenn plis detay sou liv la nan sit entènèt piblikatè a
» Table of Contents
» Ekstrè

Pou Khabrozhiteley 25% rabè lè l sèvi avèk koupon - Linux

Lè w peye vèsyon papye liv la, yo pral voye yon liv elektwonik pa imel.

Sous: www.habr.com

Add nouvo kòmantè