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
$ ./capabilitiesHeoi, 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 1capsh (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:0I 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 1Ka 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 capabilitiesKa 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 1Ko 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 dummyMa 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-writeKa 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
»
»
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
