Hello, residenti Khabro! Il-magna virtwali BPF hija waħda mill-aktar komponenti importanti tal-qalba tal-Linux. L-użu xieraq tiegħu se jippermetti lill-inġiniera tas-sistema jsibu ħsarat u jsolvu anke l-aktar problemi kumplessi. Int ser titgħallem kif tikteb programmi li jimmonitorjaw u jimmodifikaw l-imġieba tal-qalba, kif timplimenta b'mod sikur kodiċi biex tissorvelja l-avvenimenti fil-qalba, u ħafna aktar. David Calavera u Lorenzo Fontana se jgħinuk tiftaħ il-qawwa ta 'BPF. Tespandi l-għarfien tiegħek dwar l-ottimizzazzjoni tal-prestazzjoni, in-netwerking, is-sigurtà. - Uża BPF biex tissorvelja u timmodifika l-imġieba tal-qalba tal-Linux. - Injetta l-kodiċi biex timmonitorja b'mod sigur l-avvenimenti tal-qalba mingħajr ma jkollok għalfejn tikkompila mill-ġdid il-qalba jew terġa 'tibda s-sistema. — Uża eżempji ta’ kodiċi konvenjenti f’C, Go jew Python. - Ħu l-kontroll billi tippossjedi ċ-ċiklu tal-ħajja tal-programm BPF.
Linux Kernel Security, il-Karatteristiċi tiegħu u Seccomp
BPF jipprovdi mod qawwi biex testendi l-qalba mingħajr ma tiġi sagrifikata l-istabbiltà, is-sigurtà jew il-veloċità. Għal din ir-raġuni, l-iżviluppaturi tal-qalba ħasbu li tkun idea tajba li tuża l-versatilità tagħha biex ittejjeb l-iżolament tal-proċess f'Seccomp billi timplimenta filtri Seccomp appoġġjati minn programmi BPF, magħrufa wkoll bħala Seccomp BPF. F'dan il-kapitlu se nispjegaw x'inhu Seccomp u kif jintuża. Imbagħad int titgħallem kif tikteb filtri Seccomp billi tuża programmi BPF. Wara dan, inħarsu lejn il-ganċijiet BPF integrati li huma inklużi fil-qalba għall-moduli tas-sigurtà tal-Linux.
Linux Security Modules (LSM) huma qafas li jipprovdi sett ta 'funzjonijiet li jistgħu jintużaw biex jimplimentaw diversi mudelli ta' sigurtà b'mod standardizzat. LSM jista 'jintuża direttament fis-siġra tas-sors tal-qalba, bħal Apparmor, SELinux u Tomoyo.
Nibdew billi niddiskutu l-kapaċitajiet tal-Linux.
Kapaċitajiet
L-essenza tal-kapaċitajiet tal-Linux hija li għandek bżonn tagħti permess ta 'proċess mhux privileġġjat biex twettaq ċertu kompitu, iżda mingħajr ma tuża suid għal dak il-għan, jew inkella tagħmel il-proċess privileġġjat, tnaqqas il-possibbiltà ta' attakk u tippermetti lill-proċess iwettaq ċerti kompiti. Pereżempju, jekk l-applikazzjoni tiegħek teħtieġ tiftaħ port privileġġjat, ngħidu aħna 80, minflok ma tħaddem il-proċess bħala root, tista 'sempliċement tagħtiha l-kapaċità CAP_NET_BIND_SERVICE.
Ikkunsidra programm Go bl-isem main.go:
package main
import (
"net/http"
"log"
)
func main() {
log.Fatalf("%v", http.ListenAndServe(":80", nil))
}Dan il-programm iservi server HTTP fuq il-port 80 (dan huwa port privileġġjat). Normalment inħaddmuha immedjatament wara l-kumpilazzjoni:
$ go build -o capabilities main.go
$ ./capabilitiesMadankollu, peress li mhux qed nagħtu privileġġi tal-għeruq, dan il-kodiċi se jarmi żball meta jorbot il-port:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1capsh (maniġer tal-qoxra) hija għodda li tmexxi qoxra b'sett speċifiku ta 'kapaċitajiet.
F'dan il-każ, kif diġà ssemma, minflok ma tagħti drittijiet tal-għeruq sħaħ, tista 'tippermetti l-irbit tal-port privileġġjat billi tipprovdi l-kapaċità cap_net_bind_service flimkien ma' kull ħaġa oħra li diġà tinsab fil-programm. Biex nagħmlu dan, nistgħu nehmeż il-programm tagħna f'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"Ejja nifhmu ftit lil dan it-tim.
- capsh - uża capsh bħala qoxra.
- —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - peress li rridu nbiddlu l-utent (ma rridux nibdlu bħala root), aħna ser nispeċifikaw cap_net_bind_service u l-abbiltà li fil-fatt nibdlu l-ID tal-utent minn għerq lil ħadd, jiġifieri cap_setuid u cap_setgid.
- —keep=1 — irridu nżommu l-kapaċitajiet installati meta naqleb mill-kont root.
- —user="nobody" — l-utent finali li jmexxi l-programm se jkun ħadd.
- —addamb=cap_net_bind_service — issettja l-ikklerjar tal-kapaċitajiet relatati wara li taqleb mill-modalità root.
- - -c "./capabilities" - mexxi biss il-programm.
Il-kapaċitajiet marbuta huma tip speċjali ta' kapaċitajiet li jintirtu minn programmi tfal meta l-programm attwali jesegwixxihom bl-użu ta' execve(). Jistgħu jintirtu biss il-kapaċitajiet li jitħallew jiġu assoċjati, jew fi kliem ieħor, bħala kapaċitajiet ambjentali.
Probabbilment qed tistaqsi xi tfisser +eip wara li tispeċifika l-kapaċità fl-għażla --caps. Dawn il-bnadar jintużaw biex jiddeterminaw li l-kapaċità:
-għandu jiġi attivat (p);
- disponibbli għall-użu (e);
-jistgħu jintirtu minn proċessi tfal (i).
Peress li rridu nużaw cap_net_bind_service, irridu nagħmlu dan bil-bandiera e. Imbagħad se nibdew il-qoxra fil-kmand. Dan se jmexxi l-kapaċitajiet binarji u għandna bżonn li jimmarkawh bil-bandiera i. Fl-aħħarnett, irridu li l-karatteristika tkun attivata (għamilna dan mingħajr ma nbiddlu l-UID) b'p. Jidher qisu cap_net_bind_service+eip.
Tista 'tiċċekkja r-riżultat billi tuża ss. Ejja nqassru ftit l-output biex toqgħod fuq il-paġna, iżda se juri l-port assoċjat u l-ID tal-utent minbarra 0, f'dan il-każ 65:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0F'dan l-eżempju użajna capsh, imma tista' tikteb qoxra billi tuża libcap. Għal aktar informazzjoni, ara man 3 libcap.
Meta tikteb programmi, ħafna drabi l-iżviluppatur ma jkunx jaf minn qabel il-karatteristiċi kollha li l-programm jeħtieġ fil-ħin tat-tħaddim; Barra minn hekk, dawn il-karatteristiċi jistgħu jinbidlu f'verżjonijiet ġodda.
Biex nifhmu aħjar il-kapaċitajiet tal-programm tagħna, nistgħu nieħdu l-għodda kapaċi BCC, li tistabbilixxi l-kprobe għall-funzjoni tal-kernel cap_capable:
/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 1Nistgħu niksbu l-istess ħaġa billi nużaw bpftrace b'kprobe b'linja waħda fil-funzjoni tal-qalba cap_capable:
bpftrace -e
'kprobe:cap_capable {
time("%H:%M:%S ");
printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
}'
| grep -i capabilitiesDan joħroġ xi ħaġa bħal dan li ġej jekk il-kapaċitajiet tal-programm tagħna jkunu attivati wara 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 1Il-ħames kolonna hija l-kapaċitajiet li jeħtieġ il-proċess, u peress li dan l-output jinkludi avvenimenti mhux tal-awditjar, naraw il-kontrolli kollha mhux tal-awditjar u finalment il-kapaċità meħtieġa bil-bandiera tal-verifika (l-aħħar fl-output) issettjata għal 1. Kapaċità wieħed li aħna interessati fih huwa CAP_NET_BIND_SERVICE, huwa definit bħala kostanti fil-kodiċi tas-sors tal-kernel fil-fajl include/uapi/linux/ability.h bl-identifikatur 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">Ħafna drabi l-kapaċitajiet huma attivati waqt ir-runtime għal kontenituri bħal runC jew Docker biex jippermettulhom jaħdmu f'modalità mhux privileġġata, iżda huma permessi biss il-kapaċitajiet meħtieġa biex imexxu l-biċċa l-kbira tal-applikazzjonijiet. Meta applikazzjoni teħtieġ ċerti kapaċitajiet, Docker jista’ jipprovdihom billi juża --cap-add:
docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummyDan il-kmand jagħti lill-kontenitur il-kapaċità CAP_NET_ADMIN, li jippermettilu jikkonfigura link tan-netwerk biex iżżid l-interface dummy0.
It-taqsima li jmiss turi kif tuża karatteristiċi bħall-iffiltrar, iżda tuża teknika differenti li tippermettilna nimplimentaw b'mod programmatiku l-filtri tagħna stess.
Seccomp
Seccomp tfisser Secure Computing u huwa saff ta 'sigurtà implimentat fil-kernel Linux li jippermetti lill-iżviluppaturi biex jiffiltraw ċerti sejħiet tas-sistema. Għalkemm Seccomp huwa komparabbli fil-kapaċitajiet għal Linux, il-kapaċità tiegħu li jamministra ċerti sejħiet tas-sistema tagħmilha ħafna aktar flessibbli meta mqabbla magħhom.
Il-karatteristiċi ta' Seccomp u Linux mhumiex esklussivi lil xulxin u ħafna drabi jintużaw flimkien biex jibbenefikaw miż-żewġ approċċi. Pereżempju, tista 'tkun trid tagħti proċess il-kapaċità CAP_NET_ADMIN iżda ma tħallihx jaċċetta konnessjonijiet tas-socket, billi timblokka l-aċċettazzjoni u taċċetta4 sejħiet tas-sistema.
Il-metodu ta 'filtrazzjoni Seccomp huwa bbażat fuq filtri BPF li joperaw fil-mod SECCOMP_MODE_FILTER, u l-iffiltrar tas-sejħiet tas-sistema jitwettaq bl-istess mod bħal għall-pakketti.
Il-filtri Seccomp huma mgħobbija bl-użu ta' prctl permezz tal-operazzjoni PR_SET_SECCOMP. Dawn il-filtri jieħdu l-forma ta' programm BPF li jiġi esegwit għal kull pakkett Seccomp rappreżentat mill-istruttura seccomp_data. Din l-istruttura fiha l-arkitettura ta’ referenza, pointer għall-istruzzjonijiet tal-proċessur fil-ħin tas-sejħa tas-sistema, u massimu ta’ sitt argumenti tas-sejħa tas-sistema, espressi bħala uint64.
Dan huwa kif tidher l-istruttura seccomp_data mill-kodiċi tas-sors tal-kernel fil-fajl linux/seccomp.h:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};Kif tistgħu taraw minn din l-istruttura, nistgħu niffiltraw mis-sejħa tas-sistema, l-argumenti tagħha, jew taħlita tat-tnejn.
Wara li jirċievi kull pakkett Seccomp, il-filtru għandu jwettaq l-ipproċessar biex jieħu deċiżjoni finali u jgħid lill-qalba x'għandu jagħmel wara. Id-deċiżjoni finali hija espressa b'wieħed mill-valuri tar-ritorn (kodiċijiet tal-istatus).
- SECCOMP_RET_KILL_PROCESS - joqtol il-proċess kollu immedjatament wara li jiffiltra sejħa tas-sistema li ma tiġix eżegwita minħabba dan.
- SECCOMP_RET_KILL_THREAD - itemm il-ħajt kurrenti immedjatament wara li tiffiltra sejħa tas-sistema li ma tiġix eżegwita minħabba dan.
— SECCOMP_RET_KILL — alias għal SECCOMP_RET_KILL_THREAD, ħalla għal kompatibilità b'lura.
- SECCOMP_RET_TRAP - is-sistema tas-sejħa hija pprojbita, u s-sinjal SIGSYS (Bad System Call) jintbagħat lill-kompitu li jsejjaħlu.
- SECCOMP_RET_ERRNO - Is-sejħa tas-sistema mhix eżegwita, u parti mill-valur tar-ritorn tal-filtru SECCOMP_RET_DATA tiġi mgħoddija lill-ispazju tal-utent bħala l-valur errno. Skont il-kawża tal-iżball, jiġu rritornati valuri differenti ta 'errno. Lista ta 'numri ta' żball hija pprovduta fit-taqsima li jmiss.
- SECCOMP_RET_TRACE - Użat biex jinnotifika lill-ptrace tracer billi juża - PTRACE_O_TRACESECCOMP biex jinterċetta meta ssir sejħa tas-sistema biex tara u tikkontrolla dak il-proċess. Jekk tracer ma jkunx konness, jiġi rritornat żball, errno jiġi ssettjat għal -ENOSYS, u s-sejħa tas-sistema ma tiġix eżegwita.
- SECCOMP_RET_LOG - is-sejħa tas-sistema tiġi solvuta u illoggjata.
- SECCOMP_RET_ALLOW - is-sejħa tas-sistema hija sempliċement permessa.
ptrace hija sejħa tas-sistema biex timplimenta mekkaniżmi ta 'traċċar fi proċess imsejjaħ tracee, bil-kapaċità li tissorvelja u tikkontrolla l-eżekuzzjoni tal-proċess. Il-programm ta 'traċċa jista' jinfluwenza b'mod effettiv l-eżekuzzjoni u jimmodifika r-reġistri tal-memorja ta 'tracee. Fil-kuntest Seccomp, ptrace jintuża meta attivat mill-kodiċi tal-istatus SECCOMP_RET_TRACE, sabiex it-tracer jista 'jipprevjeni lis-sejħa tas-sistema milli tesegwixxi u timplimenta l-loġika tagħha stess.
Seccomp żbalji
Minn żmien għal żmien, waqt li taħdem ma 'Seccomp, tiltaqa' ma 'diversi żbalji, li huma identifikati b'valur ta' ritorn tat-tip SECCOMP_RET_ERRNO. Biex tirrapporta żball, is-sejħa tas-sistema seccomp se tirritorna -1 minflok 0.
L-iżbalji li ġejjin huma possibbli:
- EACCESS - Min iċempel mhuwiex permess li jagħmel sejħa tas-sistema. Dan is-soltu jiġri minħabba li m'għandux privileġġi CAP_SYS_ADMIN jew no_new_privs ma jkunx issettjat bl-użu ta' prctl (nitkellmu dwar dan aktar tard);
— EFAULT — l-argumenti mgħoddija (args fl-istruttura seccomp_data) m'għandhomx indirizz validu;
— EINVAL — jista' jkun hemm erba' raġunijiet hawn:
-l-operazzjoni mitluba mhix magħrufa jew mhux appoġġjata mill-qalba fil-konfigurazzjoni attwali;
-il-bnadar speċifikati mhumiex validi għall-operazzjoni mitluba;
-operazzjoni tinkludi BPF_ABS, iżda hemm problemi bl-offset speċifikat, li jista 'jaqbeż id-daqs tal-istruttura seccomp_data;
-in-numru ta 'struzzjonijiet mgħoddija lill-filtru jaqbeż il-massimu;
— ENOMEM — mhux biżżejjed memorja biex tesegwixxi l-programm;
- EOPNOTSUPP - l-operazzjoni indikat li b'SECCOMP_GET_ACTION_AVAIL l-azzjoni kienet disponibbli, iżda l-kernel ma jappoġġjax ir-ritorni fl-argumenti;
— ESRCH — seħħet problema meta tiġi sinkronizzata fluss ieħor;
- ENOSYS - M'hemm l-ebda traċċatur imwaħħal mal-azzjoni SECCOMP_RET_TRACE.
prctl hija sejħa tas-sistema li tippermetti programm tal-ispazju tal-utent biex jimmanipula (jistabbilixxi u jikseb) aspetti speċifiċi ta 'proċess, bħal byte endianness, ismijiet tal-ħajt, mod ta' komputazzjoni sigur (Seccomp), privileġġi, avvenimenti Perf, eċċ.
Seccomp jista 'jidher bħala teknoloġija sandbox għalik, iżda mhuwiex. Seccomp hija utilità li tippermetti lill-utenti jiżviluppaw mekkaniżmu ta 'sandbox. Issa ejja nħarsu lejn kif il-programmi ta 'interazzjoni tal-utent huma maħluqa bl-użu ta' filtru msejjaħ direttament mis-sejħa tas-sistema Seccomp.
BPF Seccomp Filter Eżempju
Hawnhekk se nuru kif ngħaqqdu ż-żewġ azzjonijiet diskussi qabel, jiġifieri:
— se niktbu programm Seccomp BPF, li se jintuża bħala filtru b’kodiċijiet ta’ ritorn differenti skont id-deċiżjonijiet meħuda;
— tagħbija l-filtru billi tuża prctl.
L-ewwel għandek bżonn headers mil-librerija standard u l-kernel tal-Linux:
#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>Qabel ma tipprova dan l-eżempju, irridu niżguraw li l-qalba hija kkumpilata b'CONFIG_SECCOMP u CONFIG_SECCOMP_FILTER issettjati għal y. Fuq magna li taħdem tista 'tiċċekkja dan bħal dan:
cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP
Il-bqija tal-kodiċi hija funzjoni install_filter f'żewġ partijiet. L-ewwel parti fiha l-lista tagħna ta 'struzzjonijiet ta' filtrazzjoni 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),
}; L-istruzzjonijiet huma stabbiliti bl-użu tal-macros BPF_STMT u BPF_JUMP definiti fil-fajl linux/filter.h.
Ejja ngħaddu mill-istruzzjonijiet.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - is-sistema tgħabbi u takkumula minn BPF_LD fil-forma tal-kelma BPF_W, id-data tal-pakkett tinsab f'offset fiss BPF_ABS.
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - jiċċekkja bl-użu ta 'BPF_JEQ jekk il-valur tal-arkitettura fil-kostanti tal-akkumulatur BPF_K huwiex ugwali għal arch. Jekk iva, jaqbeż f'offset 0 għall-istruzzjoni li jmiss, inkella jaqbeż f'offset 3 (f'dan il-każ) biex tarmi żball minħabba li l-arch ma jaqbilx.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Tagħbija u takkumula minn BPF_LD fil-forma tal-kelma BPF_W, li hija n-numru tas-sejħa tas-sistema li jinsab fl-offset fiss ta' BPF_ABS.
— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — iqabbel in-numru tas-sejħa tas-sistema mal-valur tal-varjabbli nr. Jekk huma ugwali, jimxi fuq l-istruzzjoni li jmiss u tiddiżattiva s-sejħa tas-sistema, inkella tippermetti s-sejħa tas-sistema b'SECCOMP_RET_ALLOW.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (żball & SECCOMP_RET_DATA)) - itemm il-programm b'BPF_RET u bħala riżultat jipproduċi żball SECCOMP_RET_ERRNO bin-numru mill-varjabbli err.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - itemm il-programm b'BPF_RET u jippermetti li s-sejħa tas-sistema tiġi esegwita bl-użu ta' SECCOMP_RET_ALLOW.
SECCOMP HUWA CBPF
Jista' jkun li qed tistaqsi għaliex tintuża lista ta' struzzjonijiet minflok oġġett ELF ikkumpilat jew programm C ikkumpilat JIT.Hemm żewġ raġunijiet għal dan.
• L-ewwelnett, Seccomp juża cBPF (BPF klassiku) u mhux eBPF, li jfisser: m'għandux reġistri, iżda biss akkumulatur biex jaħżen l-aħħar riżultat tal-kalkolu, kif jidher fl-eżempju.
• It-tieni, Seccomp jaċċetta pointer għal firxa ta 'struzzjonijiet BPF direttament u xejn aktar. Il-macros li użajna sempliċement jgħinu biex jispeċifikaw dawn l-istruzzjonijiet b'mod faċli għall-programmatur.
Jekk għandek bżonn aktar għajnuna biex tifhem dan l-assemblaġġ, ikkunsidra l-psewdocode li jagħmel l-istess ħaġa:
if (arch != AUDIT_ARCH_X86_64) {
return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;Wara li tiddefinixxi l-kodiċi tal-filtru fl-istruttura socket_filter, trid tiddefinixxi sock_fprog li jkun fih il-kodiċi u t-tul ikkalkulat tal-filtru. Din l-istruttura tad-dejta hija meħtieġa bħala argument biex jiġi ddikjarat li l-proċess jitwettaq aktar tard:
struct sock_fprog prog = {
.len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
.filter = filter,
};Fadal biss ħaġa waħda x'tagħmel fil-funzjoni install_filter - tagħbija l-programm innifsu! Biex nagħmlu dan, nużaw prctl, billi nieħdu PR_SET_SECCOMP bħala għażla biex tidħol fil-mod ta 'kompjuters sigur. Imbagħad ngħidu lill-mod biex jgħabbi l-filtru billi juża SECCOMP_MODE_FILTER, li jinsab fil-varjabbli prog tat-tip sock_fprog:
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
perror("prctl(PR_SET_SECCOMP)");
return 1;
}
return 0;
}Fl-aħħarnett, nistgħu nużaw il-funzjoni install_filter tagħna, iżda qabel dan irridu nużaw prctl biex nissettjaw PR_SET_NO_NEW_PRIVS għall-eżekuzzjoni attwali u b'hekk nevitaw is-sitwazzjoni fejn il-proċessi tat-tfal jirċievu aktar privileġġi mill-ġenituri tagħhom. B'dan, nistgħu nagħmlu s-sejħiet prctl li ġejjin fil-funzjoni install_filter mingħajr ma jkollna drittijiet tal-għeruq.
Issa nistgħu nsejħu l-funzjoni install_filter. Ejja nibblukkaw is-sejħiet kollha tas-sistema tal-kitba relatati mal-arkitettura X86-64 u sempliċement nagħtu permess li jimblokka t-tentattivi kollha. Wara l-installazzjoni tal-filtru, inkomplu l-eżekuzzjoni billi tuża l-ewwel argument:
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]);
}Ejja nibdew. Biex niġbru l-programm tagħna nistgħu nużaw jew clang jew gcc, jew il-mod huwa biss jikkompila l-fajl main.c mingħajr għażliet speċjali:
clang main.c -o filter-writeKif innutat, aħna bblokkajna l-entrati kollha fil-programm. Biex tittestja dan għandek bżonn programm li joħroġ xi ħaġa - ls tidher bħala kandidat tajjeb. Dan huwa kif normalment iġib ruħu:
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
Sabiħ! Hawn kif jidher l-użu tal-programm tal-ippakkjar tagħna: Aħna sempliċement ngħaddu l-programm li rridu nittestjaw bħala l-ewwel argument:
./filter-write "ls -la"Meta jiġi esegwit, dan il-programm jipproduċi output kompletament vojt. Madankollu, nistgħu nużaw strace biex naraw x'inhu jiġri:
strace -f ./filter-write "ls -la"Ir-riżultat tax-xogħol huwa mqassar ħafna, iżda l-parti korrispondenti tagħha turi li r-rekords huma mblukkati bl-iżball EPERM - l-istess wieħed li kkonfigurajna. Dan ifisser li l-programm ma joħroġ xejn minħabba li ma jistax jaċċessa s-sejħa tas-sistema tal-kitba:
[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)Issa tifhem kif jaħdem Seccomp BPF u għandek idea tajba ta’ x’tista’ tagħmel biha. Imma ma tixtieqx tikseb l-istess ħaġa b'eBPF minflok b'cBPF biex tisfrutta l-qawwa kollha tagħha?
Meta taħseb dwar programmi eBPF, ħafna nies jaħsbu li sempliċement jiktbuhom u jgħabbuhom bi privileġġi ta 'amministratur. Filwaqt li din id-dikjarazzjoni hija ġeneralment vera, il-kernel jimplimenta sett ta 'mekkaniżmi biex jipproteġi oġġetti eBPF f'diversi livelli. Dawn il-mekkaniżmi jissejħu nases BPF LSM.
nases BPF LSM
Biex jipprovdi monitoraġġ indipendenti mill-arkitettura tal-avvenimenti tas-sistema, LSM jimplimenta l-kunċett tan-nases. Sejħa ganċ hija teknikament simili għal sejħa tas-sistema, iżda hija indipendenti mis-sistema u integrata mal-infrastruttura. LSM jipprovdi kunċett ġdid li fih saff ta' astrazzjoni jista' jgħin biex jiġu evitati problemi li jiltaqgħu magħhom meta jiġu ttrattati sejħiet tas-sistema fuq arkitetturi differenti.
Fiż-żmien tal-kitba, il-qalba għandha seba 'ganċijiet assoċjati ma' programmi BPF, u SELinux huwa l-uniku LSM integrat li jimplimentahom.
Il-kodiċi tas-sors għan-nases jinsab fis-siġra tal-qalba fil-fajl 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);Kull wieħed minnhom se jissejjaħ fi stadji differenti ta 'eżekuzzjoni:
— security_bpf — iwettaq verifika inizjali tas-sejħiet tas-sistema BPF esegwiti;
- security_bpf_map - jiċċekkja meta l-kernel jirritorna deskrittur tal-fajl għall-mappa;
- security_bpf_prog - jiċċekkja meta l-kernel jirritorna deskrittur tal-fajl għall-programm eBPF;
— security_bpf_map_alloc — jiċċekkja jekk il-qasam tas-sigurtà ġewwa l-mapep BPF huwiex inizjalizzat;
- security_bpf_map_free - jiċċekkja jekk il-qasam tas-sigurtà huwiex imneħħi fil-mapep BPF;
— security_bpf_prog_alloc — jiċċekkja jekk il-qasam tas-sigurtà huwiex inizjalizzat fi ħdan programmi BPF;
- security_bpf_prog_free - jiċċekkja jekk il-qasam tas-sigurtà huwiex imneħħi fil-programmi BPF.
Issa, meta naraw dan kollu, nifhmu: l-idea wara l-interċetturi LSM BPF hija li jistgħu jipprovdu protezzjoni għal kull oġġett eBPF, u jiżguraw li dawk biss bil-privileġġi xierqa jistgħu jwettqu operazzjonijiet fuq karti u programmi.
Sommarju
Is-sigurtà mhix xi ħaġa li tista' timplimenta b'mod wieħed għal kulħadd għal dak kollu li trid tipproteġi. Huwa importanti li tkun tista' tipproteġi s-sistemi f'livelli differenti u b'modi differenti. Jemmnu jew le, l-aħjar mod biex tiġi żgurata sistema huwa li jiġu organizzati livelli differenti ta 'protezzjoni minn pożizzjonijiet differenti, sabiex it-tnaqqis tas-sigurtà ta' livell wieħed ma jippermettix aċċess għas-sistema kollha. L-iżviluppaturi ewlenin għamlu xogħol tajjeb biex tawna sett ta 'saffi u touchpoints differenti. Nittamaw li tajnikom fehim tajjeb ta' x'inhuma s-saffi u kif tuża l-programmi BPF biex taħdem magħhom.
Dwar l-awturi
David Calavera huwa s-CTO f'Netlify. Ħadem fl-appoġġ ta’ Docker u kkontribwixxa għall-iżvilupp ta’ għodod Runc, Go u BCC, kif ukoll proġetti oħra ta’ sors miftuħ. Magħruf għax-xogħol tiegħu fuq proġetti Docker u l-iżvilupp tal-ekosistema tal-plugin Docker. David huwa passjonat ħafna dwar il-grafiċi tal-fjammi u dejjem qed ifittex li jottimizza l-prestazzjoni.
Lorenzo Fontana jaħdem fuq it-tim tas-sors miftuħ f'Sysdig, fejn huwa ffokat primarjament fuq Falco, proġett tal-Cloud Native Computing Foundation li jipprovdi sigurtà tal-kontejner runtime u skoperta ta 'anomalija permezz ta' modulu tal-kernel u eBPF. Huwa passjonat dwar is-sistemi distribwiti, in-netwerking definit minn softwer, il-kernel tal-Linux, u l-analiżi tal-prestazzjoni.
» Għal aktar informazzjoni dwar il-ktieb, jekk jogħġbok żur
»
»
Għal Khabrozhiteli 25% skont fuq il-kupun - Linux
Mal-ħlas tal-verżjoni stampata tal-ktieb, jintbagħat ktieb elettroniku lill-email.
Sors: www.habr.com
