Kaabo, awọn olugbe Khabro! Ẹrọ foju BPF jẹ ọkan ninu awọn paati pataki julọ ti ekuro Linux. Lilo rẹ to dara yoo gba awọn onimọ-ẹrọ eto laaye lati wa awọn aṣiṣe ati yanju paapaa awọn iṣoro eka julọ. Iwọ yoo kọ ẹkọ bii o ṣe le kọ awọn eto ti o ṣe atẹle ati yipada ihuwasi ti ekuro, bii o ṣe le ṣe koodu lailewu lati ṣe atẹle awọn iṣẹlẹ ninu ekuro, ati pupọ diẹ sii. David Calavera ati Lorenzo Fontana yoo ran ọ lọwọ lati ṣii agbara ti BPF. Faagun imọ rẹ ti iṣapeye iṣẹ, netiwọki, aabo. - Lo BPF lati ṣe atẹle ati yipada ihuwasi ti ekuro Linux. - koodu abẹrẹ lati ṣe abojuto awọn iṣẹlẹ ekuro ni aabo laisi nini lati ṣajọ ekuro tabi tun atunbere eto naa. - Lo awọn apẹẹrẹ koodu irọrun ni C, Go tabi Python. - Gba iṣakoso nipasẹ nini igbesi aye eto BPF.
Aabo Kernel Linux, Awọn ẹya rẹ ati Seccomp
BPF n pese ọna ti o lagbara lati faagun ekuro laisi rubọ iduroṣinṣin, aabo, tabi iyara. Fun idi eyi, awọn olupilẹṣẹ kernel ro pe yoo jẹ imọran ti o dara lati lo ilopọ rẹ lati mu ilọsiwaju ipinya ilana ni Seccomp nipa imuse awọn asẹ Seccomp ni atilẹyin nipasẹ awọn eto BPF, ti a tun mọ ni Seccomp BPF. Ninu ori yii a yoo ṣe alaye kini Seccomp jẹ ati bii o ṣe nlo. Lẹhinna iwọ yoo kọ ẹkọ bi o ṣe le kọ awọn asẹ Seccomp nipa lilo awọn eto BPF. Lẹhin iyẹn, a yoo wo awọn ìkọ BPF ti a ṣe sinu rẹ ti o wa ninu ekuro fun awọn modulu aabo Linux.
Awọn modulu Aabo Lainos (LSM) jẹ ilana ti o pese eto awọn iṣẹ ti o le ṣee lo lati ṣe ọpọlọpọ awọn awoṣe aabo ni ọna iwọntunwọnsi. LSM le ṣee lo taara ni igi orisun ekuro, gẹgẹbi Apparmor, SELinux ati Tomoyo.
Jẹ ki a bẹrẹ nipa jiroro lori awọn agbara ti Linux.
Awọn agbara
Kokoro ti awọn agbara Linux ni pe o nilo lati funni ni igbanilaaye ilana ti ko ni anfani lati ṣe iṣẹ ṣiṣe kan, ṣugbọn laisi lilo suid fun idi yẹn, tabi bibẹẹkọ ṣe ilana naa ni anfani, dinku iṣeeṣe ikọlu ati gbigba ilana lati ṣe awọn iṣẹ ṣiṣe kan. Fun apẹẹrẹ, ti ohun elo rẹ ba nilo lati ṣii ibudo ti o ni anfani, sọ 80, dipo ṣiṣe ilana naa bi gbongbo, o le nirọrun fun ni agbara CAP_NET_BIND_SERVICE.
Wo eto Go kan ti a npè ni main.go:
package main
import (
"net/http"
"log"
)
func main() {
log.Fatalf("%v", http.ListenAndServe(":80", nil))
}Eto yii n ṣe iranṣẹ olupin HTTP lori ibudo 80 (eyi jẹ ibudo ti o ni anfani). Nigbagbogbo a ṣiṣẹ lẹsẹkẹsẹ lẹhin akopọ:
$ go build -o capabilities main.go
$ ./capabilitiesSibẹsibẹ, niwọn igba ti a ko funni ni awọn anfani gbongbo, koodu yii yoo jabọ aṣiṣe nigbati o ba di ibudo naa:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1capsh (oluṣakoso ikarahun) jẹ ohun elo kan ti o nṣiṣẹ ikarahun kan pẹlu ṣeto awọn agbara kan pato.
Ni ọran yii, bi a ti sọ tẹlẹ, dipo fifun awọn ẹtọ gbongbo ni kikun, o le jẹ ki abuda ibudo anfani ṣiṣẹ nipa ipese agbara cap_net_bind_service pẹlu ohun gbogbo miiran ti o wa tẹlẹ ninu eto naa. Lati ṣe eyi, a le fi eto wa sinu 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"Jẹ ki a ni oye egbe yii diẹ.
- capsh - lo capsh bi ikarahun.
- —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - niwon a nilo lati yi olumulo pada (a ko fẹ ṣiṣẹ bi gbongbo), a yoo pato cap_net_bind_service ati agbara lati yi ID olumulo pada gangan lati root to eniti o, eyun cap_setuid ati cap_setgid.
- -keep=1 - a fẹ lati tọju awọn agbara fifi sori ẹrọ nigbati o ba yipada lati akọọlẹ gbongbo.
- —user=“ko si ẹnikan” — olumulo ipari ti nṣiṣẹ eto naa kii yoo jẹ ẹnikan.
- —addamb=cap_net_bind_service — ṣeto imukuro awọn agbara ti o jọmọ lẹhin yi pada lati ipo gbongbo.
- --c "./awọn agbara" - kan ṣiṣe eto naa.
Awọn agbara ti o ni asopọ jẹ iru awọn agbara pataki ti o jogun nipasẹ awọn eto ọmọ nigbati eto lọwọlọwọ ba ṣiṣẹ wọn nipa lilo execve (). Awọn agbara nikan ti o gba laaye lati ni nkan ṣe, tabi ni awọn ọrọ miiran, bi awọn agbara ayika, ni a le jogun.
O ṣee ṣe ki o ṣe iyalẹnu kini +eip tumọ si lẹhin sisọ agbara ni aṣayan --caps. Awọn asia wọnyi ni a lo lati pinnu pe agbara naa:
- gbọdọ wa ni mu šišẹ (p);
- wa fun lilo (e);
-le ti wa ni jogun nipa ọmọ lakọkọ (i).
Niwọn igba ti a fẹ lo cap_net_bind_service, a nilo lati ṣe eyi pẹlu asia e. Lẹhinna a yoo bẹrẹ ikarahun ni aṣẹ naa. Eyi yoo ṣiṣẹ alakomeji awọn agbara ati pe a nilo lati samisi pẹlu i asia. Lakotan, a fẹ ki ẹya naa ṣiṣẹ (a ṣe eyi laisi iyipada UID) pẹlu p. O dabi cap_net_bind_service+eip.
O le ṣayẹwo abajade nipa lilo ss. Jẹ ki a kuru abajade diẹ lati baamu lori oju-iwe naa, ṣugbọn yoo ṣafihan ibudo ti o somọ ati ID olumulo miiran ju 0, ninu ọran yii 65:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0Ni apẹẹrẹ yii a lo capsh, ṣugbọn o le kọ ikarahun kan nipa lilo libcap. Fun alaye siwaju sii, ri ọkunrin 3 libcap.
Nigbati o ba n kọ awọn eto, igbagbogbo olupilẹṣẹ ko mọ tẹlẹ gbogbo awọn ẹya ti eto naa nilo ni akoko ṣiṣe; Pẹlupẹlu, awọn ẹya wọnyi le yipada ni awọn ẹya tuntun.
Lati ni oye awọn agbara ti eto wa daradara, a le mu ohun elo BCC ti o lagbara, eyiti o ṣeto kprobe fun iṣẹ ekuro 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 1A le ṣaṣeyọri ohun kanna nipa lilo bpftrace pẹlu kprobe kan-ila kan ninu iṣẹ ekuro cap_capable:
bpftrace -e
'kprobe:cap_capable {
time("%H:%M:%S ");
printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
}'
| grep -i capabilitiesEyi yoo ṣejade nkan bii atẹle ti awọn agbara eto wa ba ṣiṣẹ lẹhin 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 1Awọn karun iwe ni awọn agbara ti awọn ilana nilo, ati niwon yi o wu pẹlu ti kii-ayẹwo awọn iṣẹlẹ, ti a ba ri gbogbo awọn ti kii-ayẹwo sọwedowo ati nipari awọn ti a beere agbara pẹlu se ayewo asia (kẹhin ninu awọn wu) ṣeto si 1. Agbara. The ọkan ti a nifẹ si ni CAP_NET_BIND_SERVICE, o jẹ asọye bi igbagbogbo ninu koodu orisun kernel ninu faili pẹlu/uapi/linux/ability.h pẹlu idamo 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">Awọn agbara nigbagbogbo ṣiṣẹ ni akoko asiko fun awọn apoti bii runC tabi Docker lati gba wọn laaye lati ṣiṣẹ ni ipo ti ko ni anfani, ṣugbọn wọn gba laaye nikan awọn agbara ti o nilo lati ṣiṣe awọn ohun elo pupọ julọ. Nigbati ohun elo ba nilo awọn agbara kan, Docker le pese wọn ni lilo --cap- add:
docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummyAṣẹ yii yoo fun eiyan naa ni agbara CAP_NET_ADMIN, gbigba laaye lati tunto ọna asopọ nẹtiwọọki kan lati ṣafikun wiwo dummy0.
Apakan ti o tẹle n fihan bi a ṣe le lo awọn ẹya bii sisẹ, ṣugbọn lilo ilana ti o yatọ ti o fun wa laaye lati ṣe imuse awọn asẹ tiwa ni eto.
Seccomp
Seccomp duro fun Iṣiro Aabo ati pe o jẹ ipele aabo ti a ṣe imuse ninu ekuro Linux ti o fun laaye awọn olupolowo lati ṣe àlẹmọ awọn ipe eto kan. Botilẹjẹpe Seccomp jẹ afiwera ni awọn agbara si Lainos, agbara rẹ lati ṣakoso awọn ipe eto kan jẹ ki o rọ diẹ sii ni akawe si wọn.
Awọn ẹya Seccomp ati Lainos kii ṣe iyasọtọ ti ara ẹni ati pe a lo nigbagbogbo papọ lati ni anfani lati awọn isunmọ mejeeji. Fun apẹẹrẹ, o le fẹ lati fun ilana kan ni agbara CAP_NET_ADMIN ṣugbọn ko gba laaye lati gba awọn asopọ socket, dina gbigba ati gba awọn ipe eto 4.
Ọna sisẹ Seccomp da lori awọn asẹ BPF ti n ṣiṣẹ ni ipo SECCOMP_MODE_FILTER, ati sisẹ ipe eto ni a ṣe ni ọna kanna bi fun awọn apo-iwe.
Awọn asẹ Seccomp ti wa ni ti kojọpọ nipa lilo prctl nipasẹ iṣẹ PR_SET_SECOMP. Awọn asẹ wọnyi gba irisi eto BPF kan ti o ṣe fun apo-iwe Seccomp kọọkan ti o jẹ aṣoju nipasẹ eto seccomp_data. Eto yii ni faaji itọkasi, itọka si awọn ilana ero isise ni akoko ipe eto, ati pe o pọju awọn ariyanjiyan ipe eto mẹfa, ti a fihan bi uint64.
Eyi ni ohun ti eto seccomp_data dabi lati koodu orisun kernel ninu faili linux/seccomp.h:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};Bi o ti le rii lati inu eto yii, a le ṣe àlẹmọ nipasẹ ipe eto, awọn ariyanjiyan rẹ, tabi apapọ awọn mejeeji.
Lẹhin gbigba apo-iwe Seccomp kọọkan, àlẹmọ gbọdọ ṣiṣẹ sisẹ lati ṣe ipinnu ikẹhin ki o sọ fun ekuro kini lati ṣe atẹle. Ipinnu ikẹhin jẹ afihan nipasẹ ọkan ninu awọn iye ipadabọ (awọn koodu ipo).
- SECCOMP_RET_KILL_PROCESS - pa gbogbo ilana lẹsẹkẹsẹ lẹhin sisẹ ipe eto ti ko ṣiṣẹ nitori eyi.
- SECCOMP_RET_KILL_THREAD - fopin si okun lọwọlọwọ lẹsẹkẹsẹ lẹhin sisẹ ipe eto ti ko ṣiṣẹ nitori eyi.
- SECCOMP_RET_KILL - inagijẹ fun SECCOMP_RET_KILL_THREAD, osi fun ibamu sẹhin.
- SECCOMP_RET_TRAP - ipe eto ti ni idinamọ, ati SIGSYS (Bad System Ipe) ifihan agbara ti wa ni rán si awọn iṣẹ-ṣiṣe ti o pe.
- SECCOMP_RET_ERRNO - Eto ipe ko ṣiṣẹ, ati apakan ti SECCOMP_RET_DATA àlẹmọ ipadabọ iye ti kọja si aaye olumulo bi iye errno. Ti o da lori idi ti aṣiṣe naa, awọn iye errno oriṣiriṣi ti pada. A pese atokọ ti awọn nọmba aṣiṣe ni apakan atẹle.
SECCOMP_RET_TRACE - Ti a lo lati fi to olutọpa ptrace leti nipa lilo - PTRACE_O_TRACESECOMP lati ṣe idilọwọ nigbati ipe eto kan ba ṣiṣẹ lati rii ati ṣakoso ilana yẹn. Ti olutọpa kan ko ba sopọ, aṣiṣe yoo pada, errno ti ṣeto si -ENOSYS, ati pe ipe eto ko ṣiṣẹ.
- SECCOMP_RET_LOG - ipe eto jẹ ipinnu ati wọle.
- SECCOMP_RET_ALLOW - ipe eto ti wa ni nìkan laaye.
ptrace jẹ ipe eto lati ṣe awọn ilana wiwa kakiri ni ilana ti a pe ni tracee, pẹlu agbara lati ṣe atẹle ati ṣakoso ipaniyan ilana naa. Eto itọpa naa le ni ipa ni imunadoko ni ipaniyan ati yipada awọn iforukọsilẹ iranti tracee. Ni ipo Seccomp, ptrace ni a lo nigbati o ba fa nipasẹ koodu ipo SECCOMP_RET_TRACE, nitorinaa olutọpa le ṣe idiwọ ipe eto lati ṣiṣẹ ati imuse ọgbọn tirẹ.
Awọn aṣiṣe Seccomp
Lati akoko si akoko, nigba ti ṣiṣẹ pẹlu Seccomp, o yoo ba pade orisirisi awọn aṣiṣe, eyi ti o ti wa ni damo nipa a pada iye ti iru SECCOMP_RET_ERRNO. Lati jabo aṣiṣe kan, ipe eto seccomp yoo pada -1 dipo 0.
Awọn aṣiṣe wọnyi ṣee ṣe:
- EACCESS - Olupe naa ko gba laaye lati ṣe ipe eto kan. Eyi maa n ṣẹlẹ nitori pe ko ni awọn anfani CAP_SYS_ADMIN tabi no_new_privs ko ṣeto nipa lilo prctl (a yoo sọrọ nipa eyi nigbamii);
- EFAULT - awọn ariyanjiyan ti o kọja (args ninu eto seccomp_data) ko ni adirẹsi ti o wulo;
- EINVAL - awọn idi mẹrin le wa nibi:
-iṣẹ ti o beere jẹ aimọ tabi ko ṣe atilẹyin nipasẹ ekuro ninu iṣeto lọwọlọwọ;
-awọn asia ti a ti sọ tẹlẹ ko wulo fun iṣẹ ti o beere;
-isẹ pẹlu BPF_ABS, ṣugbọn awọn iṣoro wa pẹlu awọn pàtó kan aiṣedeede, eyi ti o le koja awọn iwọn ti seccomp_data be;
-nọmba awọn ilana ti o kọja si àlẹmọ ju iwọn lọ;
- ENOMEM - ko to iranti lati ṣiṣẹ eto naa;
- EOPNOTSUPP - isẹ naa fihan pe pẹlu SECCOMP_GET_ACTION_AVAIL iṣẹ naa wa, ṣugbọn ekuro ko ṣe atilẹyin awọn ipadabọ ninu awọn ariyanjiyan;
— ESRCH — iṣoro kan waye nigba mimuuṣiṣẹpọ ṣiṣan omiran;
- ENOSYS - Ko si olutọpa ti o so mọ iṣẹ SECCOMP_RET_TRACE.
prctl jẹ ipe eto ti o ngbanilaaye eto aaye olumulo kan lati ṣe afọwọyi (ṣeto ati gba) awọn abala kan pato ti ilana kan, gẹgẹbi ipari baiti, awọn orukọ okun, ipo iṣiro to ni aabo (Seccomp), awọn anfani, awọn iṣẹlẹ Perf, ati bẹbẹ lọ.
Seccomp le dabi imọ-ẹrọ apoti iyanrin si ọ, ṣugbọn kii ṣe. Seccomp jẹ ohun elo ti o gba awọn olumulo laaye lati ṣe agbekalẹ ẹrọ iyanrin kan. Bayi jẹ ki a wo bii awọn eto ibaraenisepo olumulo ṣe ṣẹda nipa lilo àlẹmọ ti a pe ni taara nipasẹ ipe eto Seccomp.
Apeere Ajọ BPF Seccomp
Nibi a yoo fihan bi a ṣe le ṣajọpọ awọn iṣe meji ti a sọrọ tẹlẹ, eyun:
- a yoo kọ eto Seccomp BPF kan, eyiti yoo ṣee lo bi àlẹmọ pẹlu awọn koodu ipadabọ oriṣiriṣi ti o da lori awọn ipinnu ti a ṣe;
- fifuye àlẹmọ nipa lilo prctl.
Ni akọkọ o nilo awọn akọle lati ile-ikawe boṣewa ati ekuro 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>Ṣaaju ki o to gbiyanju apẹẹrẹ yii, a gbọdọ rii daju pe a ṣe akojọpọ ekuro pẹlu CONFIG_SECOMP ati CONFIG_SECOMP_FILTER ti a ṣeto si y. Lori ẹrọ ti n ṣiṣẹ o le ṣayẹwo eyi:
cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP
Awọn iyokù koodu naa jẹ iṣẹ-iṣẹ install_filter kan-meji. Apa akọkọ ni atokọ wa ti awọn ilana sisẹ 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),
}; Awọn ilana ti wa ni ṣeto nipa lilo BPF_STMT ati BPF_JUMP macros telẹ ni linux/filter.h faili.
Jẹ ká lọ nipasẹ awọn ilana.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - awọn eto èyà ati akojo lati BPF_LD ni awọn fọọmu ti ọrọ BPF_W, soso data ti wa ni be ni kan ti o wa titi aiṣedeede BPF_ABS.
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - sọwedowo lilo BPF_JEQ boya awọn faaji iye ninu awọn BPF_K accumulator ibakan jẹ dogba si arch. Ti o ba jẹ bẹ, fo ni aiṣedeede 0 si itọnisọna atẹle, bibẹẹkọ fo ni aiṣedeede 3 (ninu ọran yii) lati jabọ aṣiṣe nitori arch ko baramu.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr)))) - Awọn ẹru ati ikojọpọ lati BPF_LD ni irisi ọrọ BPF_W, eyiti o jẹ nọmba ipe eto ti o wa ninu aiṣedeede ti o wa titi ti BPF_ABS.
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) - ṣe afiwe nọmba ipe eto pẹlu iye ti oniyipada nr. Ti wọn ba dọgba, lọ siwaju si itọnisọna atẹle ati mu ipe eto ṣiṣẹ, bibẹẹkọ gba eto ipe laaye pẹlu SECCOMP_RET_ALLOW.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (aṣiṣe & SECCOMP_RET_DATA)) - fopin si eto pẹlu BPF_RET ati bi abajade ṣe agbejade aṣiṣe SECCOMP_RET_ERRNO pẹlu nọmba lati oniyipada aṣiṣe.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - fopin si eto pẹlu BPF_RET ati ki o gba ipe eto lati wa ni ṣiṣẹ nipa lilo SECCOMP_RET_ALLOW.
SECCOMP NI CBPF
O le ṣe iyalẹnu idi ti a fi lo atokọ awọn ilana dipo ohun ELF ti a ṣajọ tabi eto C ti a ṣajọ JIT.Awọn idi meji lo wa fun eyi.
• Ni akọkọ, Seccomp nlo cBPF (BPF Ayebaye) kii ṣe eBPF, eyi ti o tumọ si: ko ni awọn iforukọsilẹ, ṣugbọn nikan accumulator lati tọju abajade ikẹhin ti iṣiro, bi a ti le rii ninu apẹẹrẹ.
• Keji, Seccomp gba itọka kan si ọpọlọpọ awọn ilana BPF taara ati nkan miiran. Awọn Makiro ti a ti lo ṣe iranlọwọ ni pato pato awọn itọnisọna wọnyi ni ọna ore-pirogirama.
Ti o ba nilo iranlọwọ diẹ sii ni oye apejọ yii, wo pseudocode ti o ṣe ohun kanna:
if (arch != AUDIT_ARCH_X86_64) {
return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;Lẹhin asọye koodu àlẹmọ ni ọna socket_filter, o nilo lati ṣalaye sock_fprog kan ti o ni koodu ati ipari iṣiro ti àlẹmọ naa. Eto data yii nilo bi ariyanjiyan fun sisọ ilana naa lati ṣiṣẹ nigbamii:
struct sock_fprog prog = {
.len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
.filter = filter,
};Ohun kan ṣoṣo ni o kù lati ṣe ni iṣẹ install_filter - fifuye eto naa funrararẹ! Lati ṣe eyi, a lo prctl, mu PR_SET_SECOMP bi aṣayan lati tẹ ipo iṣiro to ni aabo. Lẹhinna a sọ fun ipo lati ṣajọ àlẹmọ nipa lilo SECCOMP_MODE_FILTER, eyiti o wa ninu oniyipada prog ti iru sock_fprog:
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
perror("prctl(PR_SET_SECCOMP)");
return 1;
}
return 0;
}Nikẹhin, a le lo iṣẹ install_filter wa, ṣugbọn ṣaaju pe a nilo lati lo prctl lati ṣeto PR_SET_NO_NEW_PRIVS fun ipaniyan lọwọlọwọ ati nitorinaa yago fun ipo nibiti awọn ilana ọmọ gba awọn anfani diẹ sii ju awọn obi wọn lọ. Pẹlu eyi, a le ṣe awọn ipe prctl wọnyi ni iṣẹ install_filter laisi nini awọn ẹtọ gbongbo.
Bayi a le pe iṣẹ install_filter. Jẹ ki a ṣe idiwọ gbogbo awọn ipe eto kikọ ti o ni ibatan si faaji X86-64 ati nirọrun fun igbanilaaye ti o ṣe idiwọ gbogbo awọn igbiyanju. Lẹhin fifi àlẹmọ sori ẹrọ, a tẹsiwaju ipaniyan nipa lilo ariyanjiyan akọkọ:
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]);
}Jẹ ká bẹrẹ. Lati ṣajọ eto wa a le lo boya clang tabi gcc, boya ọna o kan n ṣajọ faili main.c laisi awọn aṣayan pataki:
clang main.c -o filter-writeGẹgẹbi a ti ṣe akiyesi, a ti dina gbogbo awọn titẹ sii ninu eto naa. Lati ṣe idanwo eyi o nilo eto kan ti o jade ohun kan - ls dabi ẹni ti o dara. Eyi ni bii o ṣe n huwa nigbagbogbo:
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
Iyanu! Eyi ni ohun ti lilo eto iwe-iṣọ wa dabi: A kan kọja eto ti a fẹ lati ṣe idanwo bi ariyanjiyan akọkọ:
./filter-write "ls -la"Nigbati o ba ṣiṣẹ, eto yii ṣe agbejade iṣelọpọ ofo patapata. Sibẹsibẹ, a le lo strace lati wo ohun ti n ṣẹlẹ:
strace -f ./filter-write "ls -la"Abajade iṣẹ naa ti kuru pupọ, ṣugbọn apakan ti o baamu fihan pe awọn igbasilẹ ti dina pẹlu aṣiṣe EPERM - ọkan kanna ti a tunto. Eyi tumọ si pe eto naa ko jade ohunkohun nitori ko le wọle si ipe eto kikọ:
[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)Bayi o loye bii Seccomp BPF ṣe n ṣiṣẹ ati pe o ni imọran to dara ti kini o le ṣe pẹlu rẹ. Ṣugbọn ṣe iwọ ko fẹ lati ṣaṣeyọri ohun kanna pẹlu eBPF dipo cBPF lati mu agbara rẹ ni kikun bi?
Nigbati o ba n ronu nipa awọn eto eBPF, ọpọlọpọ eniyan ro pe wọn kan kọ wọn nikan ati gbe wọn pẹlu awọn anfani alabojuto. Lakoko ti alaye yii jẹ otitọ ni gbogbogbo, ekuro n ṣe eto awọn ilana lati daabobo awọn nkan eBPF ni awọn ipele oriṣiriṣi. Awọn ọna ṣiṣe wọnyi ni a pe ni awọn ẹgẹ BPF LSM.
BPF LSM ẹgẹ
Lati pese ibojuwo olominira faaji ti awọn iṣẹlẹ eto, LSM ṣe imuse ero ti awọn ẹgẹ. Ipe kio jẹ iru imọ-ẹrọ si ipe eto, ṣugbọn o jẹ ominira eto ati ṣepọ pẹlu awọn amayederun. LSM n pese imọran tuntun ninu eyiti Layer abstraction le ṣe iranlọwọ lati yago fun awọn iṣoro ti o ba pade nigbati o ba n ba awọn ipe eto sori oriṣiriṣi awọn faaji.
Ni akoko kikọ, ekuro ni awọn kio meje ti o ni nkan ṣe pẹlu awọn eto BPF, ati SELinux nikan ni LSM ti a ṣe sinu ti o ṣe wọn.
Koodu orisun fun awọn ẹgẹ wa ninu igi kernel ninu faili pẹlu/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);Ọkọọkan wọn ni yoo pe ni awọn ipele oriṣiriṣi ti ipaniyan:
-security_bpf - ṣe ayẹwo ni ibẹrẹ ti awọn ipe eto BPF ti a pa;
-security_bpf_map - ṣayẹwo nigbati kernel ba da apejuwe faili pada fun maapu naa;
-security_bpf_prog - ṣayẹwo nigbati kernel ba da apejuwe faili pada fun eto eBPF;
- security_bpf_map_alloc - ṣayẹwo boya aaye aabo inu awọn maapu BPF ti wa ni ibẹrẹ;
- security_bpf_map_free - ṣayẹwo boya aaye aabo ti wa ni idasilẹ ninu awọn maapu BPF;
- security_bpf_prog_alloc - ṣayẹwo boya aaye aabo ti wa ni ibẹrẹ inu awọn eto BPF;
-security_bpf_prog_free - ṣayẹwo boya aaye aabo ti parẹ ninu awọn eto BPF.
Bayi, ti o rii gbogbo eyi, a loye: imọran lẹhin LSM BPF interceptors ni pe wọn le pese aabo si gbogbo ohun eBPF, ni idaniloju pe awọn nikan ti o ni awọn anfani ti o yẹ le ṣe awọn iṣẹ lori awọn kaadi ati awọn eto.
Akopọ
Aabo kii ṣe nkan ti o le ṣe ni iwọn-iwọn-gbogbo ọna fun ohun gbogbo ti o fẹ lati daabobo. O ṣe pataki lati ni anfani lati daabobo awọn ọna ṣiṣe ni awọn ipele oriṣiriṣi ati ni awọn ọna oriṣiriṣi. Gbagbọ tabi rara, ọna ti o dara julọ lati ni aabo eto ni lati ṣeto awọn ipele aabo oriṣiriṣi lati awọn ipo oriṣiriṣi, nitorinaa idinku aabo ti ipele kan ko gba aaye si gbogbo eto naa. Awọn olupilẹṣẹ mojuto ti ṣe iṣẹ nla kan ti fifun wa ni ipilẹ ti awọn ipele oriṣiriṣi ati awọn aaye ifọwọkan. A nireti pe a ti fun ọ ni oye ti o dara nipa kini awọn ipele jẹ ati bii o ṣe le lo awọn eto BPF lati ṣiṣẹ pẹlu wọn.
Nipa awọn onkọwe
David Calavera jẹ CTO ni Netlify. O ṣiṣẹ ni atilẹyin Docker ati ṣe alabapin si idagbasoke ti Runc, Go ati awọn irinṣẹ BCC, ati awọn iṣẹ orisun ṣiṣi miiran. Ti a mọ fun iṣẹ rẹ lori awọn iṣẹ akanṣe Docker ati idagbasoke ilolupo ohun itanna Docker. Dafidi ni itara pupọ nipa awọn aworan ina ati nigbagbogbo n wa lati mu iṣẹ ṣiṣe dara si.
Lorenzo Fontana ṣiṣẹ lori ẹgbẹ orisun ṣiṣi ni Sysdig, nibiti o ti dojukọ akọkọ lori Falco, iṣẹ akanṣe Cloud Native Computing Foundation ti o pese aabo asiko asiko eiyan ati wiwa anomaly nipasẹ module ekuro ati eBPF. O ni itara nipa awọn eto pinpin, sọfitiwia asọye Nẹtiwọọki, ekuro Linux, ati itupalẹ iṣẹ.
» Awọn alaye diẹ sii nipa iwe le ṣee ri ni
»
»
Fun Khabrozhiteley 25% ẹdinwo nipa lilo kupọọnu - Linux
Lori isanwo ti ikede iwe ti iwe naa, iwe itanna kan yoo firanṣẹ nipasẹ imeeli.
orisun: www.habr.com
