Libro nga "BPF para sa Linux Monitoring"

Libro nga "BPF para sa Linux Monitoring"Kumusta, mga residente sa Khabro! Ang BPF virtual machine kay usa sa pinaka importante nga component sa Linux kernel. Ang husto nga paggamit niini magtugot sa mga inhenyero sa sistema sa pagpangita sa mga sayup ug pagsulbad bisan sa labing komplikado nga mga problema. Mahibal-an nimo kung giunsa pagsulat ang mga programa nga nag-monitor ug nagbag-o sa pamatasan sa kernel, kung giunsa ang luwas nga pagpatuman sa code aron ma-monitor ang mga panghitabo sa kernel, ug daghan pa. Si David Calavera ug Lorenzo Fontana motabang kanimo sa pag-abli sa gahum sa BPF. Pagpalapad sa imong kahibalo sa pag-optimize sa performance, networking, seguridad. - Gamita ang BPF sa pagmonitor ug pag-usab sa kinaiya sa Linux kernel. - Pag-inject sa code aron luwas nga ma-monitor ang mga panghitabo sa kernel nga dili kinahanglan nga i-compile ang kernel o i-reboot ang sistema. — Paggamit kombenyente nga mga pananglitan sa code sa C, Go o Python. - Kontrola pinaagi sa pagpanag-iya sa siklo sa kinabuhi sa programa sa BPF.

Linux Kernel Security, Ang mga Feature niini ug Seccom

Ang BPF naghatag usa ka kusgan nga paagi aron mapalawig ang kernel nga wala isakripisyo ang kalig-on, seguridad, o katulin. Tungod niini nga rason, ang mga kernel developers naghunahuna nga kini usa ka maayong ideya sa paggamit sa iyang versatility aron sa pagpalambo sa proseso sa pagkahimulag sa Seccomp pinaagi sa pagpatuman sa Seccomp filters nga gisuportahan sa BPF nga mga programa, nailhan usab nga Seccomp BPF. Niini nga kapitulo atong ipasabut kung unsa ang Seccom ug kung giunsa kini gigamit. Unya makakat-on ka kung giunsa pagsulat ang mga filter sa Seccom gamit ang mga programa sa BPF. Human niana, atong tan-awon ang built-in nga BPF hooks nga gilakip sa kernel alang sa Linux security modules.

Ang Linux Security Modules (LSM) usa ka balangkas nga naghatag usa ka hugpong sa mga gimbuhaton nga magamit sa pagpatuman sa lainlaing mga modelo sa seguridad sa usa ka estandard nga paagi. Ang LSM mahimong magamit direkta sa punoan sa gigikanan sa kernel, sama sa Apparmor, SELinux ug Tomoyo.

Magsugod kita pinaagi sa paghisgot sa mga kapabilidad sa Linux.

Mga Feature

Ang esensya sa mga kapabilidad sa Linux mao nga kinahanglan nimo nga hatagan ang usa ka dili pribilihiyo nga pagtugot sa proseso aron mahimo ang usa ka piho nga buluhaton, apan nga wala gigamit ang suid alang sa kana nga katuyoan, o kung dili himuon nga pribilihiyo ang proseso, pagkunhod sa posibilidad sa pag-atake ug pagtugot sa proseso sa paghimo sa pipila nga mga buluhaton. Pananglitan, kung ang imong aplikasyon kinahanglan nga magbukas sa usa ka pribilihiyo nga pantalan, ingna ang 80, imbes nga ipadagan ang proseso ingon gamut, mahimo nimong hatagan kini nga kapabilidad sa CAP_NET_BIND_SERVICE.

Hunahunaa ang usa ka programa sa Go nga ginganlag main.go:

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

Kini nga programa nag-alagad sa usa ka HTTP server sa port 80 (kini usa ka pribilehiyo nga pantalan). Kasagaran among gipadagan kini dayon pagkahuman sa pag-compile:

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

Bisan pa, tungod kay wala kami naghatag mga pribilehiyo sa gamut, kini nga code magbutang usa ka sayup kung gigapos ang pantalan:

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

Ang capsh (shell manager) usa ka himan nga nagpadagan sa usa ka kabhang nga adunay piho nga hugpong sa mga kapabilidad.

Sa kini nga kaso, sama sa nahisgotan na, imbis nga hatagan ang hingpit nga mga katungod sa gamut, mahimo nimong palihokon ang pribilihiyo nga pagbugkos sa pantalan pinaagi sa paghatag sa kapabilidad sa cap_net_bind_service kauban ang tanan nga naa na sa programa. Aron mahimo kini, mahimo natong ilakip ang atong programa sa 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"

Sabton ta gamay ani nga team.

  • capsh - gamita ang capsh isip kabhang.
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - tungod kay kinahanglan namong usbon ang user (dili namo gusto nga modagan isip gamut), among ipiho ang cap_net_bind_service ug ang abilidad sa aktuwal nga pag-usab sa user ID gikan sa gamut sa walay bisan kinsa, nga mao ang cap_setuid ug cap_setgid.
  • —keep=1 — gusto namong itago ang mga na-install nga kapabilidad kung mubalhin gikan sa root account.
  • —user=“nobody” — ang end user nga nagpadagan sa programa dili bisan kinsa.
  • —addamb=cap_net_bind_service — itakda ang paghawan sa mga may kalabutan nga kapabilidad human sa pagbalhin gikan sa root mode.
  • - -c "./capabilities" - pagdagan lang ang programa.

Ang nalambigit nga mga kapabilidad usa ka espesyal nga matang sa kapabilidad nga napanunod sa mga programa sa bata kung ang kasamtangan nga programa nagpatuman niini gamit ang execve(). Ang mga kapabilidad lamang nga gitugotan nga ma-associate, o sa laing pagkasulti, isip kapabilidad sa palibot, ang mahimong mapanunod.

Tingali nahibulong ka kung unsa ang gipasabut sa +eip pagkahuman ipiho ang kapabilidad sa --caps nga kapilian. Kini nga mga bandila gigamit aron mahibal-an nga ang kapabilidad:

-kinahanglan nga activate (p);

- magamit alang sa paggamit (e);

-mahimong mapanunod sa mga proseso sa bata (i).

Tungod kay gusto namong gamiton ang cap_net_bind_service, kinahanglan namong buhaton kini sa e flag. Dayon atong sugdan ang kabhang sa sugo. Kini modagan sa mga kapabilidad binary ug kinahanglan natong markahan kini sa i flag. Sa katapusan, gusto namon nga ma-enable ang feature (gibuhat namo kini nga walay pagbag-o sa UID) nga adunay p. Morag cap_net_bind_service+eip.

Mahimo nimong susihon ang resulta gamit ang ss. Atong mub-an ang output aron mohaum sa panid, apan kini magpakita sa kaubang pantalan ug user ID gawas sa 0, sa kini nga kaso 65:

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

Sa kini nga pananglitan gigamit namon ang capsh, apan mahimo nimong isulat ang usa ka kabhang gamit ang libcap. Para sa dugang nga impormasyon, tan-awa ang man 3 libcap.

Sa pagsulat sa mga programa, kasagaran ang developer wala mahibalo daan sa tanan nga mga bahin nga gikinahanglan sa programa sa panahon sa pagdagan; Dugang pa, kini nga mga bahin mahimong mabag-o sa mga bag-ong bersyon.

Aron mas masabtan ang mga kapabilidad sa among programa, mahimo namong kuhaon ang himan nga makahimo sa BCC, nga nagtakda sa kprobe alang sa cap_capable kernel function:

/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

Makab-ot namon ang parehas nga butang pinaagi sa paggamit sa bpftrace nga adunay usa ka liner nga kprobe sa cap_capable kernel function:

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

Magpagawas kini og usa ka butang sama sa mosunod kung ang mga kapabilidad sa atong programa ma-enable human sa 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

Ang ikalima nga kolum mao ang mga kapabilidad nga gikinahanglan sa proseso, ug tungod kay kini nga output naglakip sa non-audit nga mga panghitabo, atong makita ang tanan nga non-audit checks ug sa katapusan ang gikinahanglan nga kapabilidad uban sa audit flag (katapusan sa output) gibutang sa 1. Capability. usa nga interesado kami mao ang CAP_NET_BIND_SERVICE, kini gihubit ingon usa ka kanunay sa kernel source code sa file naglakip sa/uapi/linux/ability.h nga adunay identifier 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">

Ang mga kapabilidad kanunay nga gipagana sa runtime alang sa mga sudlanan sama sa runC o Docker aron tugutan sila nga modagan sa dili pribilihiyo nga mode, apan gitugotan lamang sila sa mga kapabilidad nga gikinahanglan sa pagpadagan sa kadaghanan nga mga aplikasyon. Kung ang usa ka aplikasyon nanginahanglan pipila nga mga kapabilidad, ang Docker makahatag kanila gamit ang --cap-add:

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

Kini nga sugo maghatag sa sudlanan sa kapabilidad sa CAP_NET_ADMIN, nga magtugot niini sa pag-configure sa usa ka link sa network aron idugang ang dummy0 interface.

Ang sunod nga seksyon nagpakita kung giunsa paggamit ang mga bahin sama sa pagsala, apan ang paggamit sa usa ka lahi nga teknik nga nagtugot kanamo nga maprograma ang pagpatuman sa among kaugalingon nga mga pagsala.

Si Seccom

Ang Seccom nagbarug alang sa Secure Computing ug usa ka layer sa seguridad nga gipatuman sa Linux kernel nga nagtugot sa mga developer sa pagsala sa pipila ka mga tawag sa sistema. Bisan kung ang Seccomp ikatandi sa mga kapabilidad sa Linux, ang abilidad niini sa pagdumala sa pipila nga mga tawag sa sistema naghimo niini nga labi ka dali kung itandi sa kanila.

Ang mga bahin sa Seccom ug Linux dili managsama sa usag usa ug sagad gigamit nga magkauban aron makabenepisyo gikan sa duha nga mga pamaagi. Pananglitan, mahimo nimong hatagan ang usa ka proseso sa kapabilidad sa CAP_NET_ADMIN apan dili kini tugutan nga modawat mga koneksyon sa socket, nga gibabagan ang pagdawat ug pagdawat sa mga tawag sa sistema.

Ang pamaagi sa pagsala sa Seccomp gibase sa mga filter sa BPF nga naglihok sa SECCOMP_MODE_FILTER mode, ug ang pagsala sa tawag sa sistema gihimo sa parehas nga paagi sama sa mga pakete.

Ang mga filter sa Seccomp gikarga gamit ang prctl pinaagi sa PR_SET_SECCOMP nga operasyon. Kini nga mga filter adunay porma sa usa ka BPF nga programa nga gipatuman alang sa matag Seccom packet nga girepresentahan sa seccomp_data structure. Kini nga istruktura naglangkob sa reference nga arkitektura, usa ka pointer sa mga instruksyon sa processor sa panahon sa tawag sa sistema, ug labing taas nga unom ka argumento sa tawag sa sistema, nga gipahayag ingon uint64.

Mao kini ang hitsura sa seccomp_data structure gikan sa kernel source code sa linux/seccomp.h file:

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

Sama sa imong makita gikan sa kini nga istruktura, mahimo naton masala pinaagi sa tawag sa sistema, mga argumento niini, o kombinasyon sa duha.

Human madawat ang matag pakete sa Seccomp, ang filter kinahanglan nga mohimo sa pagproseso aron makahimo og katapusang desisyon ug isulti sa kernel kung unsa ang sunod nga buhaton. Ang katapusang desisyon gipahayag sa usa sa mga kantidad sa pagbalik (status code).

- SECCOMP_RET_KILL_PROCESS - gipatay ang tibuok proseso diha-diha dayon human sa pagsala sa usa ka tawag sa sistema nga wala gipatuman tungod niini.

- SECCOMP_RET_KILL_THREAD - tapuson ang kasamtangan nga hilo diha-diha dayon human sa pagsala sa usa ka tawag sa sistema nga wala gipatuman tungod niini.

— SECCOMP_RET_KILL — alyas para sa SECCOMP_RET_KILL_THREAD, gibilin para sa atraso nga pagkaangay.

- SECCOMP_RET_TRAP - gidili ang tawag sa sistema, ug ang signal sa SIGSYS (Bad System Call) gipadala sa buluhaton nga nagtawag niini.

- SECCOMP_RET_ERRNO - Ang sistema sa tawag wala gipatuman, ug ang bahin sa SECCOMP_RET_DATA filter return value gipasa ngadto sa user space isip errno value. Depende sa hinungdan sa sayup, lainlain nga mga kantidad sa errno ang gibalik. Ang usa ka lista sa mga numero sa sayup gihatag sa sunod nga seksyon.

- SECCOMP_RET_TRACE - Gigamit sa pagpahibalo sa ptrace tracer gamit ang - PTRACE_O_TRACESECCOMP aron intercept kung ang usa ka tawag sa sistema gipatuman aron makita ug makontrol ang proseso. Kung ang usa ka tracer dili konektado, usa ka sayup ang ibalik, ang errno gitakda sa -ENOSYS, ug ang tawag sa sistema wala gipatuman.

- SECCOMP_RET_LOG - ang tawag sa sistema nasulbad ug gi-log.

- SECCOMP_RET_ALLOW - ang tawag sa sistema gitugutan lang.

Ang ptrace usa ka tawag sa sistema aron ipatuman ang mga mekanismo sa pagsubay sa usa ka proseso nga gitawag ug tracee, nga adunay katakus sa pagmonitor ug pagkontrol sa pagpatuman sa proseso. Ang programa sa pagsubay mahimong epektibo nga makaimpluwensya sa pagpatuman ug magbag-o sa mga rehistro sa panumduman sa tracee. Sa konteksto sa Seccomp, ang ptrace gigamit kung gi-trigger sa SECCOMP_RET_TRACE status code, aron ang tracer makapugong sa tawag sa sistema gikan sa pagpatuman ug pagpatuman sa kaugalingon nga lohika.

Mga kasaypanan sa Seccom

Matag karon ug unya, samtang nagtrabaho uban sa Seccomp, makasugat ka og lain-laing mga kasaypanan, nga giila pinaagi sa usa ka pagbalik nga bili sa matang SECCOMP_RET_ERRNO. Aron i-report ang usa ka sayup, ang tawag sa sistema sa seccom mobalik -1 imbes nga 0.

Posible ang mosunod nga mga sayop:

- EACCESS - Ang nanawag dili tugutan nga maghimo usa ka tawag sa sistema. Kini kasagaran mahitabo tungod kay kini walay CAP_SYS_ADMIN nga mga pribilehiyo o walay_new_privs wala gibutang gamit ang prctl (atong hisgotan kini sa ulahi);

— EFAULT — ang gipasa nga mga argumento (args sa seccomp_data structure) walay balido nga adres;

— EINVAL — mahimong adunay upat ka rason dinhi:

-Ang gihangyo nga operasyon wala mahibal-an o wala gisuportahan sa kernel sa karon nga pagsumpo;

-ang gipiho nga mga bandera dili balido alang sa gihangyo nga operasyon;

-Ang operasyon naglakip sa BPF_ABS, apan adunay mga problema sa gitakda nga offset, nga mahimong molapas sa gidak-on sa istruktura sa seccomp_data;

-ang gidaghanon sa mga instruksyon nga gipasa ngadto sa filter milapas sa maximum;

— ENOMEM — dili igo nga memorya aron ipatuman ang programa;

- EOPNOTSUPP - ang operasyon nagpakita nga sa SECCOMP_GET_ACTION_AVAIL ang aksyon anaa, apan ang kernel dili mosuporta sa pagbalik sa mga argumento;

- ESRCH - usa ka problema ang nahitabo sa dihang nag-synchronize sa laing sapa;

- ENOSYS - Walay tracer nga gilakip sa SECCOMP_RET_TRACE nga aksyon.

Ang prctl usa ka sistema nga tawag nga nagtugot sa usa ka user-space nga programa sa pagmaniobra (pagbutang ug pagkuha) sa piho nga mga aspeto sa usa ka proseso, sama sa byte endianness, thread names, secure computation mode (Seccomp), privileges, Perf events, etc.

Ang Seccom ingon og usa ka teknolohiya sa sandbox alang kanimo, apan dili. Ang Seccom usa ka utility nga nagtugot sa mga tiggamit sa paghimo og mekanismo sa sandbox. Karon atong tan-awon kung giunsa paghimo ang mga programa sa interaksyon sa gumagamit gamit ang usa ka filter nga gitawag direkta sa tawag sa sistema sa Seccomp.

Pananglitan sa BPF Seccom Filter

Dinhi among ipakita kung giunsa paghiusa ang duha nga mga aksyon nga gihisgutan sa sayo pa, nga mao:

— magsulat kami og programa sa Seccom BPF, nga gamiton isip filter nga adunay lain-laing mga return code depende sa mga desisyon nga gihimo;

- load ang filter gamit ang prctl.

Una kinahanglan nimo ang mga ulohan gikan sa standard nga librarya ug ang 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>

Sa dili pa sulayan kini nga pananglitan, kinahanglan natong sigurohon nga ang kernel gihugpong sa CONFIG_SECCOMP ug CONFIG_SECCOMP_FILTER nga gibutang sa y. Sa usa ka nagtrabaho nga makina mahimo nimong susihon kini sama niini:

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

Ang nahabilin sa code usa ka duha ka bahin nga install_filter function. Ang una nga bahin naglangkob sa among lista sa mga panudlo sa pagsala sa 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),
  };

Ang mga instruksyon gitakda gamit ang BPF_STMT ug BPF_JUMP macros nga gihubit sa linux/filter.h file.
Atong susihon ang mga panudlo.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - ang sistema nagkarga ug natigom gikan sa BPF_LD sa porma sa pulong BPF_W, ang packet data nahimutang sa fixed offset BPF_ABS.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arko, 0, 3) - nagsusi gamit ang BPF_JEQ kung ang bili sa arkitektura sa BPF_K accumulator constant parehas sa arch. Kon mao, molukso sa offset 0 ngadto sa sunod nga instruksiyon, kon dili molukso sa offset 3 (sa kini nga kaso) aron molabay og sayop tungod kay ang arko dili motakdo.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Load ug accumulates gikan sa BPF_LD sa porma sa pulong BPF_W, nga mao ang system call number nga anaa sa fixed offset sa BPF_ABS.

— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — nagtandi sa numero sa tawag sa sistema sa kantidad sa nr variable. Kung managsama sila, magpadayon sa sunod nga panudlo ug i-disable ang tawag sa sistema, kung dili itugot ang tawag sa sistema nga adunay SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (sayup & SECCOMP_RET_DATA)) - gitapos ang programa gamit ang BPF_RET ug isip resulta nagpatunghag sayop nga SECCOMP_RET_ERRNO nga adunay numero gikan sa err variable.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - tapuson ang programa gamit ang BPF_RET ug tugotan ang sistema nga tawag nga ipatuman gamit ang SECCOMP_RET_ALLOW.

SECCOMP ANG CBPF
Tingali nahibulong ka kung nganong gigamit ang usa ka lista sa mga instruksyon imbes nga usa ka gihugpong nga ELF nga butang o usa ka JIT nga gihugpong nga C nga programa.

Adunay duha ka hinungdan niini.

• Una, ang Seccomp naggamit sa cBPF (classic BPF) ug dili eBPF, nga nagpasabot: kini walay mga rehistro, apan usa lamang ka accumulator aron tipigan ang katapusang resulta sa kalkulasyon, ingon sa makita sa pananglitan.

• Ikaduha, gidawat sa Seccom ang usa ka pointer sa usa ka han-ay sa mga panudlo sa BPF direkta ug wala nay lain pa. Ang mga macro nga among gigamit yano nga makatabang sa pagtino niini nga mga panudlo sa usa ka paagi nga mahigalaon sa programmer.

Kung kinahanglan nimo ang dugang nga tabang sa pagsabut niini nga asembliya, hunahunaa ang pseudocode nga nagbuhat sa parehas nga butang:

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

Human sa pagtino sa filter code sa socket_filter structure, kinahanglan nimo nga ipasabot ang usa ka sock_fprog nga adunay sulod nga code ug ang kalkulado nga gitas-on sa filter. Kini nga istruktura sa datos gikinahanglan isip argumento sa pagdeklarar sa proseso nga modagan sa ulahi:

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

Adunay usa ra ka butang nga nahabilin nga buhaton sa install_filter function - i-load ang programa mismo! Aron mahimo kini, among gigamit ang prctl, nga nagkuha sa PR_SET_SECCOMP ingon usa ka kapilian sa pagsulod sa luwas nga mode sa kompyuter. Dayon gisultihan namo ang mode nga i-load ang filter gamit ang SECCOMP_MODE_FILTER, nga anaa sa prog variable sa tipo nga sock_fprog:

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

Sa katapusan, mahimo namong gamiton ang among function sa pag-install_filter, apan sa wala pa kana kinahanglan namon nga gamiton ang prctl aron itakda ang PR_SET_NO_NEW_PRIVS alang sa karon nga pagpatuman ug sa ingon malikayan ang sitwasyon diin ang mga proseso sa bata makadawat og daghang mga pribilehiyo kaysa sa ilang mga ginikanan. Uban niini, mahimo namon ang mga musunod nga prctl nga tawag sa function sa install_filter nga wala’y mga katungod sa gamut.

Karon mahimo namong tawagan ang function nga install_filter. Atong babagan ang tanan nga pagsulat sa mga tawag sa sistema nga may kalabotan sa X86-64 nga arkitektura ug hatagan ra ang pagtugot nga nagbabag sa tanan nga pagsulay. Human ma-install ang filter, nagpadayon kami sa pagpatuman gamit ang unang argumento:

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

Magsugod na ta. Sa pag-compile sa among programa mahimo namong gamiton ang clang o gcc, bisan asa nga paagi kini nag-compile lang sa main.c file nga walay espesyal nga mga kapilian:

clang main.c -o filter-write

Ingon sa nahibal-an, gibabagan namon ang tanan nga mga entry sa programa. Aron masulayan kini kinahanglan nimo ang usa ka programa nga nagpagawas sa usa ka butang - ingon og usa ka maayong kandidato. Mao kini ang kasagaran niyang kinaiya:

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

Nindot! Mao kini ang hitsura sa paggamit sa among programa sa wrapper: Gipasa lang namo ang programa nga gusto namong sulayan isip unang argumento:

./filter-write "ls -la"

Kung gipatuman, kini nga programa nagpatunghag bug-os nga walay sulod nga output. Bisan pa, magamit namon ang strace aron makita kung unsa ang nahitabo:

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

Ang resulta sa trabaho gipamub-an pag-ayo, apan ang katugbang nga bahin niini nagpakita nga ang mga rekord gibabagan sa EPERM error - ang sama nga among gi-configure. Kini nagpasabot nga ang programa wala magpagawas ug bisan unsa tungod kay dili kini maka-access sa write system call:

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

Karon nahibal-an nimo kung giunsa ang Seccom BPF nagtrabaho ug adunay maayong ideya kung unsa ang imong mahimo niini. Apan dili ba nimo gusto nga makab-ot ang parehas nga butang sa eBPF imbes sa cBPF aron magamit ang tibuuk nga gahum niini?

Kung naghunahuna bahin sa mga programa sa eBPF, kadaghanan sa mga tawo naghunahuna nga gisulat ra nila kini ug gikarga kini sa mga pribilehiyo sa tagdumala. Samtang kini nga pahayag kasagaran tinuod, ang kernel nagpatuman sa usa ka hugpong sa mga mekanismo aron mapanalipdan ang mga butang sa eBPF sa lainlaing lebel. Kini nga mga mekanismo gitawag nga BPF LSM traps.

BPF LSM lit-ag

Aron mahatagan ang pag-monitor nga independente sa arkitektura sa mga panghitabo sa sistema, gipatuman sa LSM ang konsepto sa mga lit-ag. Ang tawag sa kaw-it kay teknikal nga susama sa usa ka tawag sa sistema, apan independente sa sistema ug gisagol sa imprastraktura. Naghatag ang LSM og bag-ong konsepto diin ang abstraction layer makatabang sa paglikay sa mga problema nga masugatan kung mag-atubang sa mga tawag sa sistema sa lainlaing mga arkitektura.

Sa panahon sa pagsulat, ang kernel adunay pito ka kaw-it nga nakig-uban sa mga programa sa BPF, ug ang SELinux mao lamang ang built-in nga LSM nga nagpatuman niini.

Ang source code alang sa mga lit-ag nahimutang sa kernel tree sa file naglakip sa/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);

Ang matag usa kanila pagatawgon sa lain-laing mga yugto sa pagpatuman:

- security_bpf - naghimo sa usa ka inisyal nga pagsusi sa gipatuman nga mga tawag sa sistema sa BPF;

- security_bpf_map - nagsusi kung ang kernel nagbalik sa usa ka file descriptor alang sa mapa;

- security_bpf_prog - nagsusi kung ang kernel nagbalik sa usa ka file descriptor alang sa eBPF nga programa;

— security_bpf_map_alloc — nagsusi kung ang natad sa seguridad sa sulod sa mga mapa sa BPF gisugdan;

- security_bpf_map_free - susiha kung ang natad sa seguridad hawanan sa sulod sa mga mapa sa BPF;

— security_bpf_prog_alloc — nagsusi kung ang natad sa seguridad gisugdan sa sulod sa mga programa sa BPF;

- security_bpf_prog_free - susiha kung ang natad sa seguridad hawanan sa sulod sa mga programa sa BPF.

Karon, sa pagkakita niining tanan, among nasabtan: ang ideya luyo sa LSM BPF interceptors mao nga sila makahatag og proteksyon sa matag eBPF nga butang, pagsiguro nga kadto lamang adunay angay nga mga pribilehiyo ang makahimo sa mga operasyon sa mga kard ug mga programa.

Sumaryo

Ang seguridad dili usa ka butang nga mahimo nimong ipatuman sa usa ka gidak-on nga mohaum sa tanan nga paagi alang sa tanan nga gusto nimong panalipdan. Importante nga makahimo sa pagpanalipod sa mga sistema sa lain-laing ang-ang ug sa lain-laing mga paagi. Tuohi kini o dili, ang labing maayo nga paagi aron masiguro ang usa ka sistema mao ang pag-organisar sa lainlaing lebel sa proteksyon gikan sa lainlaing mga posisyon, aron ang pagkunhod sa seguridad sa usa ka lebel dili magtugot sa pag-access sa tibuuk nga sistema. Ang kinauyokan nga mga developer nakahimo og maayo nga trabaho sa paghatag kanamo og usa ka set sa lain-laing mga layer ug touchpoints. Nanghinaut kami nga nahatagan ka namo og maayong pagsabot kon unsa ang mga lut-od ug unsaon paggamit ang mga programa sa BPF sa pagtrabaho uban niini.

Mahitungod sa mga tagsulat

David Calavera mao ang CTO sa Netlify. Nagtrabaho siya sa suporta sa Docker ug nakatampo sa pagpalambo sa Runc, Go ug BCC nga mga himan, ingon man sa uban pang open source nga mga proyekto. Nailhan tungod sa iyang trabaho sa mga proyekto sa Docker ug pagpalambo sa ekosistema sa Docker plugin. Si David ganahan kaayo sa mga flame graph ug kanunay nga nangita aron ma-optimize ang performance.

Lorenzo Fontana nagtrabaho sa open source team sa Sysdig, diin siya nag-una nga naka-focus sa Falco, usa ka Cloud Native Computing Foundation nga proyekto nga naghatag og container runtime security ug anomaly detection pinaagi sa kernel module ug eBPF. Mahilig siya sa mga gipang-apod-apod nga sistema, software nga gipiho nga networking, ang Linux kernel, ug pagtuki sa pasundayag.

» Para sa dugang nga impormasyon bahin sa libro, palihog bisitaha website sa magmamantala
» Mga sulud sa sulud
» Kinutlo

Alang sa Khabrozhiteli 25% nga diskwento sa kupon - Linux

Sa pagbayad sa papel nga bersyon sa libro, usa ka e-libro ang ipadala sa e-mail.

Source: www.habr.com

Idugang sa usa ka comment