Pukapuka "BPF mo te Aroturuki Linux"

Pukapuka "BPF mo te Aroturuki Linux"Kia ora, e nga kainoho o Khabro! Ko te miihini mariko BPF tetahi o nga waahanga tino nui o te kernel Linux. Ma tana whakamahi tika ka taea e nga miihini punaha te rapu i nga hapa me te whakaoti i nga raru tino uaua. Ka ako koe me pehea te tuhi i nga kaupapa hei aro turuki me te whakarereke i te whanonga o te kernel, me pehea te whakamahi haumaru i te waehere hei aroturuki i nga huihuinga i roto i te kernel, me te maha atu. Ka awhina a David Calavera raua ko Lorenzo Fontana i a koe ki te iriti i te mana o te BPF. Whakanuia to mohiotanga mo te arotautanga mahi, te whatunga, te haumarutanga. - Whakamahia te BPF ki te aro turuki me te whakarereke i te whanonga o te pata Linux. - Werohia te waehere kia mau te aro turuki i nga kaupapa kernel me te kore e whakahiato ano i te pata, whakaara ano ranei i te punaha. — Whakamahia nga tauira waehere watea ki C, Haere, Python ranei. - Whakahaerehia ma te pupuri i te huringa ora o te kaupapa BPF.

Linux Kernel Haumarutanga, ona ahuatanga me te Seccomp

Ka whakaratohia e te BPF he huarahi kaha ki te whakawhānui i te kernel me te kore e patu i te pumau, te haumaru, te tere ranei. Mo konei, i whakaaro nga kaiwhakawhanake kernel he mea pai ki te whakamahi i tona whaikorero ki te whakapai ake i te mahi wehe i Seccomp ma te whakatinana i nga whiriwhiringa Seccomp e tautokohia ana e nga kaupapa BPF, e mohiotia ana ko Seccomp BPF. I tenei upoko ka whakamarama he aha te Seccom me pehea te whakamahi. Na ka ako koe me pehea te tuhi i nga whiriwhiringa Seccom ma te whakamahi i nga kaupapa BPF. I muri i tera, ka titiro tatou ki nga matau BPF kua whakauruhia ki roto i te kernel mo nga waahanga haumaru Linux.

Ko nga Tauira Haumarutanga Linux (LSM) he anga e whakarato ana i te huinga o nga mahi ka taea te whakamahi ki te whakatinana i nga momo tauira haumarutanga i roto i te tikanga paerewa. Ka taea te whakamahi tika i te LSM ki te rakau puna kernel, penei i a Apparmor, SELinux me Tomoyo.

Me timata ma te korero mo nga kaha o Linux.

Ngā āhuatanga

Ko te ngako o te kaha o te Linux me tuku whakaaetanga ki te mahi i tetahi mahi, engari me te kore e whakamahi suid mo tera kaupapa, ki te kore ranei e whai mana te tukanga, ka whakaiti i te tupono ki te whakaeke me te tuku i te mahi ki te mahi i etahi mahi. Hei tauira, ki te hiahia to tono ki te whakatuwhera i tetahi tauranga whaimana, me kii ko 80, hei utu mo te whakahaere i te tukanga hei pakiaka, ka taea noa e koe te tuku i te kaha CAP_NET_BIND_SERVICE.

Whakaarohia he kaupapa Haere ko main.go te ingoa:

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

Ka tukuna e tenei papatono he tūmau HTTP i te tauranga 80 (he tauranga whaimana tenei). I te nuinga o te wa ka whakahaerehia e matou i muri tonu i te whakahiato:

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

Heoi, i te mea kaore matou e tuku i nga mana pakiaka, ka puta he hapa tenei waehere ina herea te tauranga:

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

capsh (kaiwhakahaere anga) he taputapu e whakahaere ana i te anga me te huinga o nga kaha.

I roto i tenei take, pera i te korero kua korerohia, hei utu mo te tuku motika putake katoa, ka taea e koe te here i te tauranga whaimana ma te whakarato i te kaha cap_net_bind_service me nga mea katoa kei roto i te kaupapa. Ki te mahi i tenei, ka taea e taatau te whakauru i ta maatau kaupapa ki te 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"

Kia mohio tatou ki tenei kapa.

  • capsh - whakamahi capsh hei anga.
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - na te mea me huri tatou i te kaiwhakamahi (kaore matou e pai ki te rere hei pakiaka), ka tohua te cap_net_bind_service me te kaha ki te whakarereke i te ID kaiwhakamahi mai i pakiaka ki tetahi, ara cap_setuid me cap_setgid.
  • —keep=1 — kei te pirangi matou ki te pupuri i nga kaha kua whakauruhia ina huri mai i te putea pakiaka.
  • —user=“nobody” — ko te kaiwhakamahi mutunga e whakahaere ana i te kaupapa kare he tangata.
  • —addamb=cap_net_bind_service — whakaritea te whakawāteatanga o ngā āheinga whai pānga i muri i te hurihanga mai i te aratau pakiaka.
  • - -c "./capabilities" - whakahaere noa i te kaupapa.

Ko nga kaha hono he momo mana motuhake ka riro mai i nga kaupapa tamariki ina mahia e te hotaka o naianei ma te whakamahi execve(). Ko nga kaha anake e whakaaetia ana ki te hono, ki etahi atu kupu, hei kaha taiao, ka taea te tuku iho.

Kei te miharo pea koe he aha te tikanga o +eip i muri i te whakawhāiti i te kaha ki te kōwhiringa --caps. Ka whakamahia enei haki ki te whakatau ko te kaha:

-me whakahohe (p);

- e wātea ana hei whakamahi (e);

-ka taea te tuku iho i nga tukanga tamariki (i).

I te mea e hiahia ana matou ki te whakamahi cap_net_bind_service, me mahi tenei me te haki e. Na ka timata tatou i te anga i roto i te whakahau. Ma tenei ka whakahaere i nga kaha-rua, me tohu ki te haki i. Ka mutu, e hiahia ana matou kia taea te ahuatanga (i mahia e matou me te kore e huri i te UID) me te p. He rite ki te cap_net_bind_service+eip.

Ka taea e koe te tirotiro i te hua ma te whakamahi ss. Me whakapotohia te putanga kia uru ki te wharangi, engari ka whakaatu te tauranga me te ID kaiwhakamahi i tua atu i te 0, i tenei keehi 65:

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

I tenei tauira i whakamahia e matou te capsh, engari ka taea e koe te tuhi anga ma te whakamahi i te libcap. Mo etahi atu korero, tirohia te man 3 libcap.

I te wa e tuhi ana i nga kaupapa, he maha nga wa kaore te kaiwhakawhanake i te mohio i mua i nga ahuatanga katoa e hiahiatia ana e te papatono i te wa e whakahaere ana; I tua atu, ka huri pea enei ahuatanga ki nga putanga hou.

Kia pai ake te mohio ki nga kaha o ta maatau kaupapa, ka taea e taatau te tango i te taputapu kaha BCC, e whakatakoto ana i te kprobe mo te mahi 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 1

Ka taea e tatou te whakatutuki i te mea ano ma te whakamahi i te bpftrace me te kprobe kotahi i roto i te mahi kernel 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

Ka puta mai he penei e whai ake nei mena ka whakahoehia nga kaha o ta maatau kaupapa i muri i te 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

Ko te rarangi tuarima ko nga kaha e hiahiatia ana e te tukanga, a, i te mea kei roto i tenei putanga nga huihuinga kore-taritari, ka kite matou i nga arowhai-kore-arotake katoa me te mutunga ko te kaha e hiahiatia ana me te haki arotake (i te mutunga o te putanga) kua whakaritea ki te 1. Capability. Ko tetahi e pai ana ki a matou ko te CAP_NET_BIND_SERVICE, kua tautuhia he pumau i roto i te waehere puna kernel i roto i te konae ko/uapi/linux/ability.h me te tautohu 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">

He maha nga wa ka taea te kaha i te wa whakahaere mo nga ipu penei i te runC, i te Docker ranei hei tuku i a raatau ki te whakahaere i roto i te aratau kore, engari ka whakaaetia anake nga kaha e hiahiatia ana hei whakahaere i te nuinga o nga tono. Ina hiahia ana tetahi tono ki etahi kaha, ka taea e Docker te whakarato ma te whakamahi --cap-add:

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

Ma tenei tono ka hoatu ki te ipu te kaha CAP_NET_ADMIN, ka taea e ia te whirihora i tetahi hononga whatunga ki te taapiri i te atanga dummy0.

Ko te waahanga e whai ake nei e whakaatu ana me pehea te whakamahi i nga ahuatanga penei i te tātari, engari ma te whakamahi i tetahi tikanga rereke e taea ai e tatou te whakatinana i a tatou ake whiriwhiringa.

Seccomp

Ko te Seccomp e tu ana mo te Rorohiko Haumaru, he paparanga haumarutanga kua whakatinanahia i roto i te pata Linux e taea ai e nga kaiwhakawhanake te tarai i etahi waea punaha. Ahakoa he rite ki a Seccomp te kaha ki te Linux, na tona kaha ki te whakahaere i etahi waea punaha ka tino ngawari ake ki a raatau.

Ko nga ahuatanga Seccom me Linux ehara i te mea motuhake, he maha nga wa ka whakamahia tahi hei painga mai i nga huarahi e rua. Hei tauira, ka hiahia koe ki te tuku i tetahi tukanga te kaha CAP_NET_ADMIN engari kaua e whakaae ki te whakaae ki nga hononga turanga, ka aukati i te whakaae me te whakaae ki nga waea punaha.

Ko te tikanga tātari Seccomp i runga i nga whiriwhiringa BPF e mahi ana i roto i te aratau SECCOMP_MODE_FILTER, me te tātari waea punaha he rite tonu te mahi mo nga paatete.

Ka utaina nga whiriwhiringa Seccomp ma te whakamahi i te prctl ma te mahi PR_SET_SECCOMP. Ko enei whiriwhiringa te ahua o te kaupapa BPF ka mahia mo ia kete Seccom e tohuhia ana e te hanganga seccomp_data. Kei roto i tenei hanganga te hoahoanga tohutoro, he atatohu ki nga tohutohu tukatuka i te wa o te waea punaha, me te nui rawa o nga tohenga waea waea punaha e ono, e kiia ana hei uint64.

Koinei te ahua o te hanganga seccomp_data mai i te waehere puna kernel i te konae linux/seccomp.h:

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

Ka taea e koe te kite mai i tenei hanganga, ka taea e taatau te tarai ma te waea punaha, ona tohenga, he huinga ranei o nga mea e rua.

Whai muri i te whiwhinga i ia paakete Seccomp, me mahi te tātari ki te whakatau whakatau mutunga me te korero ki te pata he aha te mahi ka whai ake. Ko te whakatau whakamutunga ka whakaatuhia e tetahi o nga uara whakahoki (waehere mana).

- SECCOMP_RET_KILL_PROCESS - ka patua te tukanga katoa i muri tonu i te tātari i te waea punaha kaore i mahia na tenei.

- SECCOMP_RET_KILL_THREAD - ka whakamutua te miro onāianei i muri tonu i te tātari i te waea punaha kaore i mahia na tenei.

— SECCOMP_RET_KILL — ingoa ingoa mo SECCOMP_RET_KILL_THREAD, maui mo te hototahi whakamuri.

- SECCOMP_RET_TRAP - ka whakakorehia te waea punaha, ka tukuna te tohu SIGSYS (Karanga Pūnaha Kino) ki te mahi e karanga ana.

- SECCOMP_RET_ERRNO - Ko te waea punaha kaore i mahia, ka tukuna tetahi waahanga o te uara whakahoki tātari SECCOMP_RET_DATA ki te waahi kaiwhakamahi hei uara errno. I runga i te take o te hapa, ka hoki mai nga uara errno rereke. Ka whakaratohia he rarangi o nga nama hapa i te waahanga e whai ake nei.

- SECCOMP_RET_TRACE - Ka whakamahia hei whakamohio i te kaiwhai ptrace ma te whakamahi - PTRACE_O_TRACESECCOMP ki te haukoti i te wa ka mahia he waea punaha ki te kite me te whakahaere i taua mahi. Ki te kore e hono te kaiwhai, ka whakahokia he hapa, ka tautuhia te errno ki te -ENOSYS, karekau te waea i mahia.

- SECCOMP_RET_LOG - kua whakatauhia te waea a te punaha me te takiuru.

- SECCOMP_RET_ALLOW - ka whakaaetia noa te waea punaha.

Ko te ptrace he waea punaha ki te whakatinana i nga tikanga whaiwhai i roto i te tukanga e kiia nei ko te tracee, me te kaha ki te aroturuki me te whakahaere i te mahinga o te tukanga. Ka taea e te hotaka tohu te whakaawe i te mahi me te whakarereke i nga rehita mahara a tracee. I roto i te horopaki Seccomp, ka whakamahia te ptrace i te wa e whakaohohia ana e te waehere mana SECCOMP_RET_TRACE, na reira ka taea e te kaiwhaiwhai te aukati i te waea punaha mai i te mahi me te whakatinana i tana ake arorau.

Nga hapa Seccomp

Mai i ia wa, i a koe e mahi tahi ana me Seccomp, ka raru koe i nga momo hapa, ka kitea e te uara whakahoki o te momo SECCOMP_RET_ERRNO. Hei whakaatu i tetahi hapa, ka hoki mai te waea punaha seccomp -1 hei utu mo te 0.

Ko nga hapa e whai ake nei ka taea:

- EACCESS - Kaore e whakaaetia te kaiwaea ki te waea punaha. Ka tupu tenei na te mea karekau he mana CAP_SYS_ADMIN, karekau ranei he_new_privs i tautuhia ma te whakamahi i te prctl (ka korerohia e matou a muri ake nei);

— EFAULT — ko nga tohenga kua paahitia (nga tautohenga kei te hanganga seccomp_data) kaore he wahitau whaimana;

— EINVAL — e wha nga take i konei:

-kaore i te mohiotia te mahi i tonoa, kaore ranei i te tautokohia e te kernel i roto i te whirihoranga o naianei;

-Ko nga haki kua tohua kaore e tika mo te mahi i tonohia;

-Kei roto ko te BPF_ABS te whakahaere, engari he raruraru kei te waahi kua tohua, ka nui ake pea te rahi o te hanganga seccomp_data;

-ko te maha o nga tohutohu i tukuna ki te tātari ka nui ake i te morahi;

— ENOMEM — he iti rawa te mahara ki te whakahaere i te hotaka;

- EOPNOTSUPP - i tohu te mahi me SECCOMP_GET_ACTION_AVAIL i waatea te mahi, engari kaore te kernel e tautoko i te whakahoki mai i roto i nga tautohetohe;

— ESRCH — i puta he raru i te wa e tukutahi ana i tetahi atu awa;

- ENOSYS - Karekau he kaiwhai i piri ki te mahi SECCOMP_RET_TRACE.

Ko te prctl he waea punaha ka taea e te hotaka mokowā-kaiwhakamahi te whakahaere (whakatakoto me te tiki) i nga waahanga motuhake o te mahi, penei i te paita endianness, nga ingoa miro, te aratau rorohiko haumaru (Seccomp), nga painga, nga huihuinga Perf, etc.

Ko te ahua o Seccom he hangarau pouaka kirikiri ki a koe, engari ehara. He whaipainga a Seccom e taea ai e nga kaiwhakamahi te whakawhanake i tetahi miihini pouaka kirikiri. Inaianei me titiro tatou me pehea te hanga i nga kaupapa taunekeneke a nga kaiwhakamahi ma te whakamahi i te tātari e kiia ana e te waea punaha Seccomp.

Tauira Tātari BPF Seccom

I konei ka whakaatu me pehea te whakakotahi i nga mahi e rua i korerohia i mua ake nei, ara:

— ka tuhia e matou he kaupapa Seccom BPF, ka whakamahia hei tātari me nga waehere whakahoki rereke i runga i nga whakatau i mahia;

— utaina te tātari ma te whakamahi i te prctl.

Tuatahi ka hiahia koe ki nga pane mai i te whare pukapuka paerewa me te kernel 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>

I mua i te whakamatau i tenei tauira, me whakarite kia whakahiato te pata me te CONFIG_SECCOMP me te CONFIG_SECCOMP_FILTER kua tautuhia ki te y. I runga i te miihini mahi ka taea e koe te tirotiro penei:

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

Ko te toenga o te waehere he mahi install_filter e rua nga waahanga. Kei roto i te waahanga tuatahi ta maatau rarangi o nga tohutohu tātari 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),
  };

Kua tautuhia nga tohutohu ma te whakamahi i nga tonotono BPF_STMT me BPF_JUMP kua tautuhia ki te konae linux/filter.h.
Kia haere tatou i roto i nga tohutohu.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - ka utaina te punaha me te whakaemi mai i te BPF_LD i te ahua o te kupu BPF_W, ko nga raraunga paatete kei te BPF_ABS kua whakaritea.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - ka tirohia ma te whakamahi i te BPF_JEQ mena he rite te uara hoahoanga o te BPF_K accumulator tamau ki te kikorangi. Ki te pera, ka peke atu i te wehenga 0 ki te ako e whai ake nei, ki te kore ka peke i te wehenga 3 (i tenei keehi) ki te maka he hapa na te mea karekau te kikorangi i te taurite.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Ka utaina, ka whakaemi mai i te BPF_LD i te ahua o te kupu BPF_W, ko te nama waea punaha kei roto i te taapiri o te BPF_ABS.

— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — ka whakataurite i te tau waea punaha me te uara o te taurangi nr. Mēnā he ōrite, neke ki te tohutohu e whai ake nei ka monohia te waea pūnaha, ki te kore ka taea te waea waea me SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (hapa & SECCOMP_RET_DATA)) - ka whakamutua te hotaka me te BPF_RET ka puta he hapa SECCOMP_RET_ERRNO me te tau mai i te taurangi hapa.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - ka whakamutua te hotaka me te BPF_RET me te tuku i te waea punaha kia mahia ma te whakamahi SECCOMP_RET_ALLOW.

SECCOMP KO CBPF
Kei te whakaaro koe he aha i whakamahia ai he rarangi tohutohu hei utu mo te ahanoa ELF kua whakahiato, he kaupapa C kua whakahiatohia ranei e JIT.

E rua nga take mo tenei.

• Tuatahi, ka whakamahi a Seccomp i te cBPF (BPF matarohia) ehara i te eBPF, ko te tikanga: karekau he rehita, engari he kaikohikohiko hei penapena i te hua tatauranga whakamutunga, ka kitea i te tauira.

• Tuarua, ka whakaae a Seccomp i tetahi tohutoro ki te rarangi o nga tohutohu BPF, kaore he mea ke atu. Ko nga tonotono i whakamahia e matou ka awhina noa ki te tautuhi i enei tohutohu i runga i te ahua pai ki te kaihōtaka.

Mena ka hiahia awhina koe ki te mohio ki tenei huihuinga, whakaarohia te pseudocode e mahi ana i te mea ano:

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

I muri i te tautuhi i te waehere tātari i roto i te hanganga socket_filter, me tautuhi he sock_fprog kei roto te waehere me te roa tatau o te tātari. Ko tenei hanganga raraunga e hiahiatia ana hei tohenga mo te whakapuaki i te tukanga kia haere a muri ake nei:

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

Kotahi noa te mea hei mahi i roto i te mahi install_filter - utaina te kaupapa ake! Hei mahi i tenei, ka whakamahi matou i te prctl, me te tango i te PR_SET_SECCOMP hei whiringa ki te whakauru i te aratau rorohiko haumaru. Na ka korero matou ki te aratau ki te utaina te tātari ma te whakamahi SECCOMP_MODE_FILTER, kei roto i te taurangi prog o te momo sock_fprog:

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

Ka mutu, ka taea e taatau te whakamahi i ta maatau mahi install_filter, engari i mua i tera me whakamahi prctl ki te whakarite PR_SET_NO_NEW_PRIVS mo te mahi o naianei, na reira ka karo i te ahuatanga ka nui ake nga painga o nga mahi a nga tamariki i o ratau maatua. Ma tenei, ka taea e taatau te hanga i nga piiraa prctl e whai ake nei i roto i te mahi install_filter me te kore e whai mana pakiaka.

Inaianei ka taea e taatau te karanga i te mahi install_filter. Me aukati nga waea punaha tuhi katoa e pa ana ki te hoahoanga X86-64 me te tuku whakaaetanga ka aukati i nga nganatanga katoa. Whai muri i te whakaurunga o te tātari, ka haere tonu te mahi ma te whakamahi i te tohenga tuatahi:

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

Kia timata tatou. Hei whakahiato i ta maatau kaupapa ka taea e taatau te whakamahi i te clang, i te gcc ranei, ahakoa ko te kohi noa i te konae main.c kaore he whiringa motuhake:

clang main.c -o filter-write

Ka rite ki te korero, kua aukatihia e matou nga whakaurunga katoa i roto i te kaupapa. Hei whakamatautau i tenei ka hiahia koe ki tetahi kaupapa e whakaputa ana i tetahi mea - he ahua pai a ls. Koinei te tikanga o tana whanonga:

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

Whakamiharo! Anei te ahua o te whakamahi i ta maatau kaupapa takai: Ka tukuna noa e matou te papatono e hiahia ana matou ki te whakamatautau hei tohenga tuatahi:

./filter-write "ls -la"

Ka mahia ana, ka puta nga huanga korekore. Heoi, ka taea e tatou te whakamahi strace ki te kite he aha kei te haere:

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

Ko te hua o te mahi ka tino poroa, engari ko te waahanga e rite ana e whakaatu ana kua aukatihia nga rekoata me te hapa EPERM - ko te mea ano i whirihorahia e matou. Ko te tikanga kaore te papatono e whakaputa i tetahi mea na te mea kaore e taea te uru atu ki te waea punaha tuhi:

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

Inaianei kua mohio koe me pehea te mahi a Seccom BPF me te whai whakaaro pai mo nga mahi ka taea e koe. Engari kaore koe e pai ki te whakatutuki i taua mea me te eBPF hei utu mo te cBPF hei whakamahi i tona mana katoa?

I te wa e whakaaro ana mo nga kaupapa eBPF, ko te nuinga o nga tangata ka whakaaro ka tuhi noa ratou ka utaina ki nga mana whakahaere. Ahakoa he pono tenei korero, ka whakatinanahia e te pata he huinga tikanga hei tiaki i nga taonga eBPF i nga taumata rereke. Ko enei tikanga ka kiia ko BPF LSM mahanga.

BPF LSM mahanga

Hei whakarato hoahoanga-motuhake te aroturuki i nga huihuinga punaha, ka whakatinanahia e LSM te ariā o nga mahanga. He rite tonu te waea matau ki te waea punaha, engari he punaha motuhake me te whakauru ki nga hanganga. Ka whakarato a LSM i tetahi ariā hou e taea ai e te paparanga tangohanga te karo i nga raru ka pa ki nga waea punaha ki nga hoahoanga rereke.

I te wa e tuhi ana, e whitu nga matau o te kernel e hono ana ki nga kaupapa BPF, a ko SELinux anake te LSM i hangaia hei whakamahi.

Ko te waehere puna mo nga mahanga kei roto i te rakau kernel i roto i te konae ko/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);

Ka karangahia ia o ratou i nga waahanga rereke o te mahi:

— security_bpf — ka mahia he tirotiro tuatahi mo nga waea punaha BPF kua mahia;

- security_bpf_map - ka taki i te wa e whakahokia mai ai e te kernel he kaiwhakaahua konae mo te mapi;

- security_bpf_prog - ka taki i te wa e whakahokia mai ai e te pata he kaiwhakaahua konae mo te kaupapa eBPF;

— security_bpf_map_alloc — ka taki mena kua arawhiti te mara haumarutanga i roto i nga mapi BPF;

- security_bpf_map_free - ka taki mena kua whakawāteahia te āpure haumaru i roto i ngā mahere BPF;

— security_bpf_prog_alloc — ka taki mena kua arawhiti te mara haumarutanga i roto i nga kaupapa BPF;

- security_bpf_prog_free - ka taki mena kua whakawāteahia te āpure haumarutanga i roto i ngā kaupapa BPF.

Inaianei, ka kite i enei mea katoa, ka mohio matou: ko te whakaaro kei muri i nga kaiwawao a LSM BPF ka taea e ratou te tiaki i nga mea katoa eBPF, me te whakarite ko te hunga anake e whai mana tika ana ka taea te mahi i runga i nga kaari me nga kaupapa.

Whakarāpopoto

Ko te haumarutanga ehara i te mea ka taea e koe te whakatinana i roto i te huarahi kotahi-nui mo nga mea katoa e hiahia ana koe ki te tiaki. He mea nui kia kaha ki te tiaki i nga punaha i nga taumata rereke me nga huarahi rereke. Te whakapono, kaore ranei, ko te huarahi pai ki te whakapumau i tetahi punaha ko te whakarite i nga taumata whakamarumaru rereke mai i nga waahi rereke, kia kore ai te whakaiti i te haumarutanga o te taumata kotahi e kore e uru ki te punaha katoa. He pai te mahi a nga kaiwhakawhanake matua ki te hoatu ki a matou he huinga paparanga rereke me nga waahi pa. Ko te tumanako kua hoatu e matou he mohiotanga pai ki a koe he aha nga paparanga me pehea te whakamahi i nga kaupapa BPF hei mahi tahi me ratou.

Mo nga kaituhi

Rawiri Calavera Ko te CTO i Netlify. I mahi ia i roto i te tautoko a Docker me te whai waahi ki te whakawhanaketanga o nga taputapu Runc, Go me BCC, me etahi atu kaupapa puna tuwhera. I mohiotia mo ana mahi i runga i nga kaupapa Docker me te whanaketanga o te Docker mono ecosystem. He tino ngakau nui a Rawiri ki nga kauwhata mura, me te titiro tonu ki te arotau i nga mahi.

Lorenzo Fontana kei te mahi i runga i te roopu puna tuwhera i Sysdig, i reira e aro nui ana ia ki a Falco, he kaupapa Cloud Native Computing Foundation e whakarato ana i te haumarutanga o te waa whakahaere ipu me te kitenga anomaly na roto i te waahanga kernel me te eBPF. He kaingākau ia ki nga punaha tohatoha, whatunga kua tautuhia e te rorohiko, te pata Linux, me te tātari mahi.

» Ka kitea etahi atu korero mo te pukapuka i paetukutuku a te kaiwhakaputa
» Ripanga o nga ihirangi
» Panui

Mo Khabrozhiteley 25% hekenga ma te whakamahi coupon - Linux

Ina utua te putanga pepa o te pukapuka, ka tukuna he pukapuka hiko ma te imeera.

Source: will.com

Tāpiri i te kōrero