ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅, Π₯Π°Π±ΡΠΎΠΆΠΈΡΠ΅Π»ΠΈ! ΠΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° BPF Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux. ΠΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈ Π΄Π° ΠΎΡΠΊΡΠΈΠ²Π°Ρ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ Π΄Π° ΡΠ΅ΡΠ°Π²Π°Ρ Π΄ΠΎΡΠΈ Π½Π°ΠΉ-ΡΠ»ΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠΈΠ΅ ΡΠ΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅Π΄ΡΡ ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π° Π²Π½Π΅Π΄ΡΡΠ²Π°ΡΠ΅ ΠΊΠΎΠ΄ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠ΅ΠΉΠ²ΠΈΠ΄ ΠΠ°Π»Π°Π²Π΅ΡΠ° ΠΈ ΠΠΎΡΠ΅Π½ΡΠΎ Π€ΠΎΠ½ΡΠ°Π½Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Π΄Π° ΡΠ°Π·ΠΊΡΠΈΠ΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° BPF. Π Π°Π·ΡΠΈΡΠ΅ΡΠ΅ Π·Π½Π°Π½ΠΈΡΡΠ° ΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, ΠΌΡΠ΅ΠΆΠΈ ΠΈ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ. β ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ BPF Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux. β ΠΠ½Π΅Π΄ΡΡΠ²Π°ΠΉΡΠ΅ ΠΊΠΎΠ΄ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΄ΡΠΎΡΠΎ β Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΠΎΠ²ΡΠΎΡΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. β ΠΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π½Π° ΠΊΠΎΠ΄ Π½Π° C, Go ΠΈΠ»ΠΈ Python. β Π£ΠΏΡΠ°Π²Π»ΡΠ²Π°ΠΉΡΠ΅ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ°, Π²Π»Π°Π΄Π΅Π΅ΠΉΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ» Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° BPF.
Π‘ΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ Seccomp
BPF ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΌΠΎΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π±Π΅Π· ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡ Ρ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡ, ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΠΈ Π±ΡΡΠ·ΠΈΠ½Π°. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΏΡΠΈΡΠΈΠ½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΡΠΌΠ΅ΡΠ½Π°Π»ΠΈ, ΡΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΎΡΡΡΠ° ΠΌΡ, Π·Π° Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΡ ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π² Seccomp ΡΡΠ΅Π· ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΠ»ΡΡΠΈ Seccomp, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ BPF, ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΡΡΡΠΎ ΠΊΠ°ΡΠΎ Seccomp BPF. Π ΡΠ°Π·ΠΈ Π³Π»Π°Π²Π° ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Seccomp ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΈΠ»ΡΡΠΈ Seccomp Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ BPF. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΠΊΠ°ΠΏΠ°Π½ΠΈ BPF, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π² ΡΠ΄ΡΠΎΡΠΎ Π·Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° Linux.
ΠΠΎΠ΄ΡΠ»ΠΈΡΠ΅ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° Linux (LSM) ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π·Π° ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ. LSM ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Π΄ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Apparmor, SELinux ΠΈ Tomoyo.
ΠΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ Π΄ΠΈΡΠΊΡΡΠΈΡ Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Linux.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Π‘ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Linux Π΅ Π² ΡΠΎΠ²Π°, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΠΏΡΠΎΡΠ΅Ρ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π·Π°Π΄Π°ΡΠ°, Π½ΠΎ Π±Π΅Π· Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ suid Π·Π° ΡΠ°Π·ΠΈ ΡΠ΅Π» ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½, ΠΊΠ°ΡΠΎ Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π°ΡΠ°ΠΊΠΈ ΠΈ ΠΎΡΠΈΠ³ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π²ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠ²ΠΎΡΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΡΡ, Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ 80, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ° Ρ ΠΏΡΠ°Π²Π° Π½Π° root, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΎΡΠΎ CAP_NET_BIND_SERVICE.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° Go Ρ ΠΈΠΌΠ΅ main.go:
package main
import (
"net/http"
"log"
)
func main() {
log.Fatalf("%v", http.ListenAndServe(":80", nil))
}Π’Π°Π·ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° HTTP ΡΡΡΠ²ΡΡ Π½Π° ΠΏΠΎΡΡ 80 (ΡΠΎΠ²Π° Π΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΡΡ). ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Ρ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ:
$ go build -o capabilities main.go
$ ./capabilitiesΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΌΠ΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π½Π° root, ΡΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΠ·Π΄Π°Π΄Π΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠ°:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1capsh (ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°) Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ ΠΌΠ΅, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΡΠ»Π½ΠΈ ΠΏΡΠ°Π²Π° Π½Π° root, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈ ΠΏΠΎΡΡΠΎΠ²Π΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΉΠΊΠΈ ΠΏΡΠ°Π²ΠΎΡΠΎ cap_net_bind_service, Π½Π°ΡΠ΅Π΄ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π²ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠΈ Π² 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"ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°.
- capsh β ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ capsh ΠΊΠ°ΡΠΎ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°.
- βcaps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' β ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΌΠ΅Π½ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ (Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΡΠ°Π²Π° Π½Π° root), ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈΠΌ cap_net_bind_service ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΎΡ root Π½Π° nobody, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ cap_setuid ΠΈ cap_setgid.
- βkeep=1 β ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΌΡΠ½Π° ΠΎΡ Π°ΠΊΠ°ΡΠ½ΡΠ° Π½Π° root.
- βuser='nobody' β ΠΊΡΠ°ΠΉΠ½ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΠΊΠΎΠΉΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠ΅ Π±ΡΠ΄Π΅ nobody.
- βaddamb=cap_net_bind_service β Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ»Π΅Π΄ ΡΠΌΡΠ½Π° ΠΎΡ ΡΠ΅ΠΆΠΈΠΌ root.
- β -c "./capabilities" β ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
Π‘Π²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ° ΠΎΡΠΎΠ±Π΅Π½ Π²ΠΈΠ΄ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°Ρ ΠΎΡ Π΄ΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π³ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° execve(). ΠΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°Ρ ΡΠ°ΠΌΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈ ΠΊΠ°ΡΠΎ ΡΠ²ΡΡΠ·Π°Π½ΠΈ, ΠΈΠ»ΠΈ, Ρ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΠΊΠ°ΡΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°.
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, Π²ΠΈ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π° +eip ΡΠ»Π΅Π΄ ΡΠΊΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π² ΠΎΠΏΡΠΈΡΡΠ° βcaps. Π’Π΅Π·ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ°:
-ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° (p);
-Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ (e);
-ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΠ»Π΅Π΄Π΅Π½Π° ΠΎΡ Π΄ΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ (i).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ cap_net_bind_service, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Ρ ΡΠ»Π°Π³Π° e. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±ΠΎΠ»ΠΊΠ°ΡΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ°ΠΉΠ» capabilities, ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠΈΠΌ Ρ ΡΠ»Π°Π³Π° i. ΠΠ°ΠΊΡΠ°Ρ, ΠΈΡΠΊΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° (ΠΊΠ°ΠΊΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅, Π±Π΅Π· Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ UID) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° p. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ cap_net_bind_service+eip.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ss. ΠΠ΅ΠΊΠ° ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΡΡΠΊΡΠ°ΡΠΈΠΌ ΠΈΠ·Π²ΠΎΠ΄Π°, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ±Π΅ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, Π½ΠΎ ΡΠΎΠΉ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡ ΠΏΠΎΡΡ ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΎΡ 0, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ 65 534:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ capsh, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΎΠ±ΠΎΠ»ΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° libcap. ΠΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ man 3 libcap.
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π΄ΠΎΡΡΠ° ΡΠ΅ΡΡΠΎ Π½Π΅ Π·Π½Π°Π΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅; ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΡΠΎΠ²Π°, Π² Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ.
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° BCC capable, ΠΊΠΎΠΉΡΠΎ Π·Π°Π΄Π°Π²Π° kprobe Π·Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ 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Π‘ΡΡΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ bpftrace Ρ Π΅Π΄Π½ΠΎΡΠ΅Π΄ΠΎΠ² kprobe Π² ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ 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Π’ΠΎΠ²Π° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ, Π°ΠΊΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΡΠ° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ ΡΠ»Π΅Π΄ 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ΠΠ΅ΡΠΈΡΡ ΡΡΡΠ»Π±Π΅Ρ β ΡΠΎΠ²Π° ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π·ΠΈ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΡΡΠΎ Π½Π΅Π°ΡΠ΄ΠΈΡΠ½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π½Π΅Π°ΡΠ΄ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ, Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°, ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π°ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Ρ ΡΠ»Π°Π³Π° Π·Π° ΠΎΠ΄ΠΈΡ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ Π² ΠΈΠ·Π²ΠΎΠ΄Π°), Π·Π°Π΄Π°Π΄Π΅Π½ Π½Π° 1. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ°, ΠΊΠΎΡΡΠΎ Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°, Π΅ CAP_NET_BIND_SERVICE, ΡΡ Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠ°ΠΉΠ»Π° include/uapi/linux/ability.h Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ 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">ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΊΠ°ΡΠΎ runC ΠΈΠ»ΠΈ Docker, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π² Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΡΠ΅ΠΆΠΈΠΌ, Π½ΠΎ ΠΈΠΌ ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Ρ ΡΠ°ΠΌΠΎ ΠΎΠ½Π΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠ³Π°ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π² Docker ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΡ ΡΡΠ΅Π· βcap-add:
docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummyΠ’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° CAP_NET_ADMIN, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ²Π° Π²ΡΡΠ·ΠΊΠ° Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° dummy0.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠ°ΡΠΎ ΡΠΈΠ»ΡΡΡΠΈΡΠ°Π½Π΅, Π½ΠΎ Ρ Π΄ΡΡΠ³ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΎ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠΈΠ»ΡΡΠΈ.
Seccomp
Seccomp ΠΎΠ·Π½Π°ΡΠ°Π²Π° Secure Computing, ΡΠΎΠ²Π° Π΅ Π½ΠΈΠ²ΠΎ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π΄Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ. ΠΠΎΠΊΠ°ΡΠΎ Seccomp Π΅ ΡΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌ Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Linux, ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° ΠΌΡ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΡΠ²ΠΊΠ°Π² Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΡΡΡ .
Seccomp ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Linux Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎ, ΡΠ΅ΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π°Π΅Π΄Π½ΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΠΏΠΎΠ»Π·ΠΈ ΠΎΡ Π΄Π²Π°ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° CAP_NET_ADMIN, Π½ΠΎ Π΄Π° Π½Π΅ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° Π²ΡΡΠ·ΠΊΠΈ ΡΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ, Π±Π»ΠΎΠΊΠΈΡΠ°ΠΉΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ accept ΠΈ accept4.
ΠΠ΅ΡΠΎΠ΄Π° Π½Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π² Seccomp Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° BPF ΡΠΈΠ»ΡΡΠΈ, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π² ΡΠ΅ΠΆΠΈΠΌ SECCOMP_MODE_FILTER, Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅.
Π€ΠΈΠ»ΡΡΠΈΡΠ΅ Seccomp ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° prctl ΡΡΠ΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ PR_SET_SECCOMP. Π’Π΅Π·ΠΈ ΡΠΈΠ»ΡΡΠΈ ΠΈΠΌΠ°Ρ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ Seccomp ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Ρ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data. Π’Π°Π·ΠΈ ΡΡΡΡΠΊΡΡΡΠ° ΡΡΠ΄ΡΡΠΆΠ° Π±Π°Π·ΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΡΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, ΠΈΠ·ΡΠ°Π·Π΅Π½ΠΈ ΠΊΠ°ΡΠΎ uint64.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠ°ΠΉΠ»Π° linux/seccomp.h:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΎΡ ΡΠ°Π·ΠΈ ΡΡΡΡΠΊΡΡΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΈΠ»ΠΈ ΡΡΡ Π½Π°ΡΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈ Π²ΡΠ΅ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ, Seccomp ΡΠΈΠ»ΡΡΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°, Π·Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΠΈ ΡΠ΄ΡΠΎΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ. ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΡΠ°Π·ΡΠ²Π° Ρ Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΡΠ½Π°ΡΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΡΡΠ°ΡΡΡ).
β SECCOMP_RET_KILL_PROCESS β Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ»Π΅Π΄ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
β SECCOMP_RET_KILL_THREAD β Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊ ΡΠ»Π΅Π΄ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
β SECCOMP_RET_KILL β Π°Π»ΠΈΠ°Ρ Π·Π° SECCOMP_RET_KILL_THREAD, ΠΎΡΡΠ°Π²Π΅Π½ Π·Π° ΠΎΠ±ΡΠ°ΡΠ½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ.
β SECCOMP_RET_TRAP β ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ Π΅ Π·Π°Π±ΡΠ°Π½Π΅Π½ ΠΈ ΡΠΈΠ³Π½Π°Π»ΡΡ SIGSYS (ΠΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ) ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°, ΠΈΠ·Π²ΠΈΠΊΠ°Π»Π° Π³ΠΎ.
β SECCOMP_RET_ERRNO β ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΈ ΡΠ°ΡΡ ΠΎΡ Π²ΡΡΠ½Π°ΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΠΈΠ»ΡΡΡΠ° SECCOMP_RET_DATA ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΊΠ°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡ errno. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°, ΡΠ΅ Π²ΡΡΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ errno. Π‘ΠΏΠΈΡΡΠΊΡΡ Ρ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π».
β SECCOMP_RET_TRACE β ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π·Π° ΡΠ²Π΅Π΄ΠΎΠΌΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ptrace Ρ PTRACE_O_TRACESECCOMP, Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΡ Π²Π°Π½Π΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ, Π·Π° Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ. ΠΠΊΠΎ ΡΡΠ°ΡΠΈΡΠΎΠ²ΡΠΈΠΊΡΡ Π½Π΅ Π΅ ΡΠ²ΡΡΠ·Π°Π½, ΡΠ΅ Π²ΡΡΡΠ° Π³ΡΠ΅ΡΠΊΠ°, errno ΡΠ΅ Π·Π°Π΄Π°Π²Π° Π½Π° -ENOSYS, Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
β SECCOMP_RET_LOG β ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ Π² ΠΆΡΡΠ½Π°Π»Π°.
β SECCOMP_RET_ALLOW β ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ ΠΏΡΠΎΡΡΠΎ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½.
ptrace Π΅ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ Π·Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° Π² ΠΏΡΠΎΡΠ΅Ρ, Π½Π°ΡΠ΅ΡΠ΅Π½ tracee, Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°. ΠΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΡΡΠ°ΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° Π²Π»ΠΈΡΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° tracee. Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Seccomp ptrace ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ΠΊΠΎΠ΄ Π½Π° ΡΡΠ°ΡΡΡ SECCOMP_RET_TRACE, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΡΡΠ°ΡΠΈΡΠΎΠ²ΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ ΠΈ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°.
ΠΡΠ΅ΡΠΊΠΈ Π½Π° Seccomp
ΠΡ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅, ΡΠ°Π±ΠΎΡΠ΅ΠΉΠΊΠΈ Ρ Seccomp, ΡΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°ΡΠ΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΎΡ Π²ΡΡΠ½Π°ΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ ΡΠΈΠΏΠ° SECCOMP_RET_ERRNO. ΠΠ° Π΄Π° Π΄ΠΎΠΊΠ»Π°Π΄Π²Π° Π·Π° Π³ΡΠ΅ΡΠΊΠ°, ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ ΠΏΠΎΠ²ΠΈΠΊ seccomp ΡΠ΅ Π²ΡΡΠ½Π΅ -1 Π²ΠΌΠ΅ΡΡΠΎ 0.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ:
β EACCESS β Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°ΡΠ°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π΅ Ρ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ Π²ΠΈΠΊ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π°, Π·Π°ΡΠΎΡΠΎ Π½ΡΠΌΠ° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ CAP_SYS_ADMIN ΠΈΠ»ΠΈ no_new_privs Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ Ρ prctl (Π·Π° ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ);
β EFAULT β ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ (args Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data) Π½ΡΠΌΠ°Ρ Π²Π°Π»ΠΈΠ΄Π΅Π½ Π°Π΄ΡΠ΅Ρ;
β EINVAL β ΡΡΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅ΡΠΈΡΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ:
- ΠΏΠΎΠΈΡΠΊΠ°Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΈΠ»ΠΈ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ;
- Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΡΠ»Π°Π³ΠΎΠ²Π΅ ΡΠ° Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ Π·Π° ΠΈΡΠΊΠ°Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ;
- ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π²ΠΊΠ»ΡΡΠ²Π° BPF_ABS, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΡΠ²Π°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data;
- Π±ΡΠΎΡΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΡΠΈΠ»ΡΡΡΠ°, Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡ;
β ENOMEM β Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π° ΠΏΠ°ΠΌΠ΅Ρ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°;
β EOPNOTSUPP β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΠΎΡΠΎΡΠΈΠ»Π°, ΡΠ΅ Ρ SECCOMP_GET_ACTION_AVAIL Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π΅ Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ, Π½ΠΎ ΡΠ΄ΡΠΎΡΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΡΡΠ°Π½Π΅ΡΠΎ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅;
β ESRCH β Π²ΡΠ·Π½ΠΈΠΊΠ½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π΄ΡΡΠ³ ΠΏΠΎΡΠΎΠΊ;
β ENOSYS β Π½ΡΠΌΠ° ΡΡΠ°ΡΠΈΡΠΎΠ²Π°Ρ, ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ΅Π½ ΠΊΡΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ SECCOMP_RET_TRACE.
prctl Π΅ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ Π²ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π° (Π·Π°Π΄Π΅Π»Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°) ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ² Π½ΠΎΠΌΠ΅Ρ Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅, ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΡΠΎΡΠΈ, ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ (Seccomp), ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, ΡΡΠ±ΠΈΡΠΈΡ Perf ΠΈ Π΄Ρ.
Seccomp ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π·Π° ΠΏΡΡΡΡΠ½Π° ΠΊΡΡΠΈΡ, Π½ΠΎ Π½Π΅ Π΅ ΡΠ°ΠΊΠ°. Seccomp Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π½Π° ΠΏΡΡΡΡΠ½Π°ΡΠ° ΠΊΡΡΠΈΡ. Π‘Π΅Π³Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΈΠ»ΡΡΡ, ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ Π²ΠΈΠΊ Seccomp.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΈΠ»ΡΡΡ BPF Seccomp
Π’ΡΠΊ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ Π΄Π²Π΅ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ ΠΏΠΎ-ΡΠ°Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:
β ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Seccomp BPF, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΊΠ°ΡΠΎ ΡΠΈΠ»ΡΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²ΡΡΡΠ°Π½Π΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ;
β ΡΠ΅ Π·Π°ΡΠ΅Π΄ΠΈΠΌ ΡΠΈΠ»ΡΡΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ prctl.
ΠΡΡΠ²ΠΎ, Π½ΡΠΆΠ½ΠΈ ΡΠ° Π·Π°Π³Π»Π°Π²ΠΈΡ ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΡΠ΄ΡΠΎΡΠΎ Π½Π° 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>ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΡΠ΄ΡΠΎΡΠΎ Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΎ Ρ CONFIG_SECCOMP ΠΈ CONFIG_SECCOMP_FILTER, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° y. ΠΠ° ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠ°ΠΊΠ°:
cat /proc/config.gz | zcat | grep -i CONFIG_SECCOMP
ΠΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ install_filter, ΡΡΡΡΠΎΡΡΠ° ΡΠ΅ ΠΎΡ Π΄Π²Π΅ ΡΠ°ΡΡΠΈ. ΠΡΡΠ²Π°ΡΠ° ΡΠ°ΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π½Π°ΡΠΈΡ ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ 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),
}; ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ ΡΠ΅ Π·Π°Π΄Π°Π²Π°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈΡΠ΅ BPF_STMT ΠΈ BPF_JUMP, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π² ΡΠ°ΠΉΠ»Π° linux/filter.h.
ΠΠ΅ΠΊΠ° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅.
β BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) β ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π°ΡΠ΅ΠΆΠ΄Π° ΠΈ Π½Π°ΡΡΡΠΏΠ²Π° Ρ BPF_LD ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π΄ΡΠΌΠ° BPF_W, ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Ρ ΡΠΈΠΊΡΠΈΠΌΠΈΡΠ°Π½ΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ BPF_ABS.
β BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° BPF_JEQ, Π΄Π°Π»ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π² ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΈΡ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ BPF_K Π΅ ΡΠ°Π²Π½Π° Π½Π° arch. ΠΠΊΠΎ Π΅ ΡΠ°ΠΊΠ°, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° Ρ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ 0 ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ, Π·Π° Π΄Π° ΠΈΠ·Π΄Π°Π΄Π΅ Π³ΡΠ΅ΡΠΊΠ°, ΡΠΊΠ°ΡΠ° Ρ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ 3 (Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ), ΡΡΠΉ ΠΊΠ°ΡΠΎ arch Π½Π΅ ΡΡΠ²ΠΏΠ°Π΄Π°.
β BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) β Π·Π°ΡΠ΅ΠΆΠ΄Π° ΠΈ Π½Π°ΡΡΡΠΏΠ²Π° Ρ BPF_LD ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π΄ΡΠΌΠ° BPF_W, ΠΊΠΎΡΡΠΎ Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ΅ Π² ΡΠΈΠΊΡΠΈΡΠ°Π½ΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ BPF_ABS.
β BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) β ΡΡΠ°Π²Π½ΡΠ²Π° Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° nr. ΠΠΊΠΎ ΡΠ° ΡΠ°Π²Π½ΠΈ, ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΊΡΠΌ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈ Π·Π°Π±ΡΠ°Π½ΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ Ρ SECCOMP_RET_ALLOW.
β BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)) β ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ BPF_RET ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΈΠ·Π΄Π°Π²Π° Π³ΡΠ΅ΡΠΊΠ° SECCOMP_RET_ERRNO Ρ Π½ΠΎΠΌΠ΅Ρ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° err.
β BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) β ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ BPF_RET ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ Ρ SECCOMP_RET_ALLOW.
SECCOMP β Π’ΠΠΠ Π CBPF
ΠΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° Π·Π°ΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ ΠΎΠ±Π΅ΠΊΡ ELF ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° C, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° Ρ JIT, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ.ΠΠΌΠ° Π΄Π²Π΅ ΠΏΡΠΈΡΠΈΠ½ΠΈ Π·Π° ΡΠΎΠ²Π°.
β’ ΠΡΡΠ²ΠΎ, Seccomp ΠΏΡΠΈΠ»Π°Π³Π° cBPF (ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ BPF), Π° Π½Π΅ eBPF, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°: Π½ΡΠΌΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈ, Π° ΡΠ°ΠΌΠΎ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°.
β’ ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, Seccomp ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π½Π° ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ BPF Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈ Π½ΠΈΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅. ΠΠ°ΠΊΡΠΎΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΌΠ°Π³Π°Ρ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ΅Π·ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΡΠ΄ΠΎΠ±Π½Π° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈΡΠ΅ ΡΠΎΡΠΌΠ°.
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΏΠΎΠΌΠΎΡ, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ°Π·ΠΈ ΡΠ±ΠΎΡΠΊΠ°, ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ°Π²ΠΈ ΡΡΡΠΎΡΠΎ:
if (arch != AUDIT_ARCH_X86_64) {
return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;Π‘Π»Π΅Π΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΡΠΈΠ»ΡΡΡΠ° Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° socket_filter, ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ sock_fprog, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΊΠΎΠ΄Π° ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π°ΡΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΠΈΠ»ΡΡΡΠ°. Π’Π°Π·ΠΈ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΊΠ°ΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π·Π° ΠΎΠ±ΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π² ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½ΠΎ:
struct sock_fprog prog = {
.len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
.filter = filter,
};ΠΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ° install_filter β Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈΠΌ ΡΠ°ΠΌΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°! ΠΠ° ΡΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ prctl, Π²Π·ΠΈΠΌΠ°ΠΉΠΊΠΈ PR_SET_SECCOMP ΠΊΠ°ΡΠΎ ΠΎΠΏΡΠΈΡ, Π·Π° Π΄Π° Π²Π»Π΅Π·Π΅ΠΌ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π΄Π° Π·Π°ΡΠ΅ΠΆΠ΄Π° ΡΠΈΠ»ΡΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° SECCOMP_MODE_FILTER, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° prog ΠΎΡ ΡΠΈΠΏ sock_fprog:
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
perror("prctl(PR_SET_SECCOMP)");
return 1;
}
return 0;
}ΠΠ°ΠΊΡΠ°Ρ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ install_filter, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ prctl, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ PR_SET_NO_NEW_PRIVS Π·Π° ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ°ΠΊΠ° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ΡΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π΄ΡΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΏΠΎ-ΡΠΈΡΠΎΠΊΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΡΠ΅. ΠΡΠΈ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° prctl Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ° install_filter, Π±Π΅Π· Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡΠ°Π²Π° root.
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° install_filter. Π©Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ write, ΡΠ²ΡΡΠ·Π²Π°ΡΠΈ ΡΠ΅ Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° X86-64, ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ Π΄Π°Π΄Π΅ΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π·Π°Π±ΡΠ°Π½ΡΠ²Π°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠΈΡΠΈ. Π‘Π»Π΅Π΄ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½Π° ΡΠΈΠ»ΡΡΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΡΠ²ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ:
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]);
}ΠΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ. ΠΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠ»ΠΈ clang, ΠΈΠ»ΠΈ gcc; Π² ΠΊΠΎΠΉΡΠΎ ΠΈ Π΄Π° Π΅ ΡΠ»ΡΡΠ°ΠΉ, ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»Π° main.c Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΠΎΠΏΡΠΈΠΈ:
clang main.c -o filter-writeΠΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ, Π±Π»ΠΎΠΊΠΈΡΠ°Ρ ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. ΠΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠΎΠ²Π°, Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ Π½Π΅ΡΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° β ls ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ Π΄ΠΎΠ±ΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ. ΠΡΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ Π΄ΡΡΠΆΠΈ:
ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 ΠΠΏΡ 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 ΠΠΏΡ 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 ΠΠΏΡ 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 ΠΠΏΡ 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 ΠΠΏΡ 28 21:08 main.c
Π§ΡΠ΄Π΅ΡΠ½ΠΎ! ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°-ΠΎΠ±ΠΎΠ»ΠΊΠ°: ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅, ΠΊΠ°ΡΠΎ ΠΏΡΡΠ²ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ:
.\/filter-write "ls -la"Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠ°Π·ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π΄Π°Π²Π° Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ°Π·Π΅Π½ ΠΈΠ·Ρ ΠΎΠ΄. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ strace, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°:
strace -f .\/filter-write "ls -la"Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π΅ ΡΠΈΠ»Π½ΠΎ ΡΡΠΊΡΠ°ΡΠ΅Π½, Π½ΠΎ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΠ°ΡΡ ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°Ρ Ρ Π³ΡΠ΅ΡΠΊΠ° EPERM β ΡΡΡΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π½Π°ΡΡΡΠΎΠΈΡ ΠΌΠ΅. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π½ΠΈΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ write:
[pid 25099] write(2, "ls: ", 4) = -1 EPERM (ΠΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π½Π΅ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π°)
[pid 25099] write(2, "Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ Π·Π°ΠΏΠΈΡ", 11) = -1 EPERM (ΠΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π½Π΅ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π°)
[pid 25099] write(2, "n", 1) = -1 EPERM (ΠΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π½Π΅ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π°)Π‘Π΅Π³Π° ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Seccomp BPF ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ Π½Π΅Π³ΠΎ. ΠΠΎ Π½Π΅ Π±ΠΈΡ ΡΠ΅ Π»ΠΈ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΡΡΠΎΡΠΎ Ρ eBPF Π²ΠΌΠ΅ΡΡΠΎ cBPF, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ»Π°ΡΠ° ΠΌΡ ΠΌΠΎΡ?
ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Ρ ΠΎΡΠ° ΠΌΠΈΡΠ»ΡΡ, ΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π³ΠΈ ΠΏΠΈΡΠ°Ρ ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Ρ Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠΈ ΠΏΡΠ°Π²Π°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠΎΠ²Π° ΡΠ²ΡΡΠ΄Π΅Π½ΠΈΠ΅ Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π»ΠΈΠ½ΠΈΠΈ Π²ΡΡΠ½ΠΎ, ΡΠ΄ΡΠΎΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π°Π±ΠΎΡ ΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ eBPF Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²Π°. Π’Π΅Π·ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ ΡΠ΅ Π½Π°ΡΠΈΡΠ°Ρ ΠΊΠ°ΠΏΠ°Π½ΠΈ BPF LSM.
ΠΠ°ΠΏΠ°Π½ΠΈ BPF LSM
ΠΠ° Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ, LSM ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡΠ° Π·Π° ΠΊΠ°ΠΏΠ°Π½ΠΈ. Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΊΡΠΌ ΠΊΠ°ΠΏΠ°Π½ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, Π½ΠΎ Π΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½ΠΎ Ρ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. LSM ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½ΠΎΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π·Π° ΠΈΠ·Π±ΡΠ³Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π²ΡΠ·Π½ΠΈΠΊΠ²Π°ΡΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ.
ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ°, ΡΠ΄ΡΠΎΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ΅Π΄Π΅ΠΌ ΠΊΠ°ΠΏΠ°Π½Π°, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π° SELinux Π±Π΅ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ Π²Π³ΡΠ°Π΄Π΅Π½ LSM, ΠΊΠΎΠΉΡΠΎ Π³ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅.
ΠΠ·Ρ ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° ΠΊΠ°ΠΏΠ°Π½ΠΈΡΠ΅ Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² Π΄ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠ°ΠΉΠ»Π° 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);ΠΡΡΠΊΠ° ΠΎΡ ΡΡΡ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅ΡΠ°ΠΏΠΈ ΠΎΡ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ:
β security_bpf β ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ BPF;
β security_bpf_map β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΄ΡΠΎΡΠΎ Π²ΡΡΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π·Π° ΠΊΠ°ΡΡΠ°ΡΠ°;
β security_bpf_prog β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΄ΡΠΎΡΠΎ Π²ΡΡΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° eBPF;
β security_bpf_map_alloc β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π² BPF ΠΊΠ°ΡΡΠΈΡΠ΅ Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ;
β security_bpf_map_free β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, Π΄Π°Π»ΠΈ ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π² BPF ΠΊΠ°ΡΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°;
β security_bpf_prog_alloc β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π² BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ;
β security_bpf_prog_free β ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅ΡΠΎ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π² BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ΅ ΠΎΡΠΈΡΡΠ²Π°.
Π‘Π΅Π³Π°, Π²ΠΈΠΆΠ΄Π°ΠΉΠΊΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅: ΠΈΠ΄Π΅ΡΡΠ° Π½Π° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΡΠΈΡΠ΅ LSM BPF Π΅, ΡΠ΅ ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΡΠΈΠ³ΡΡΡΡ Π·Π°ΡΠΈΡΠ° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡ eBPF, Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΉΠΊΠΈ, ΡΠ΅ ΡΠ°ΠΌΠΎ ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΊΠ°ΡΡΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅.
Π Π΅Π·ΡΠΌΠ΅
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π΅ Π΅ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΎ Π·Π° Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π·Π°ΡΠΈΡΠΈΡΠ΅. ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° Π΄Π° Π·Π°ΡΠΈΡΠ°Π²Π°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²Π° ΠΈ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ. ΠΡΠΊΠ°ΡΠ΅ Π΄Π° Π²ΡΡΠ²Π°ΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅, Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° Π·Π°ΡΠΈΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΅ Π΄Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²Π° Π½Π° Π·Π°ΡΠΈΡΠ° ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΈΠ²ΠΎ Π΄Π° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ Π° Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°Π±ΠΎΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΉΠΊΠΈ Π½ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ»ΠΎΠ΅Π²Π΅ ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ ΡΠΌΠ΅ Π²ΠΈ Π΄Π°Π»ΠΈ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ° ΡΠ»ΠΎΠ΅Π²Π΅ΡΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΡΡΡ .
ΠΠ° Π°Π²ΡΠΎΡΠΈΡΠ΅
ΠΠ΅ΠΉΠ²ΠΈΠ΄ ΠΠ°Π»Π°Π²Π΅ΡΠ° Π΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ Π² Netlify. Π’ΠΎΠΉ Π΅ ΡΠ°Π±ΠΎΡΠΈΠ» Π² ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Docker ΠΈ Π΅ ΡΡΠ°ΡΡΠ²Π°Π» Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Runc, Go ΠΈ BCC, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΠ·Π²Π΅ΡΡΠ΅Π½ Π΅ ΡΡΡ ΡΠ²ΠΎΡΡΠ° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Docker ΠΈ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΎΡ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ Π½Π° Docker. ΠΠ΅ΠΉΠ²ΠΈΠ΄ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ ΠΎΡ flame graphs ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΡΡΠ΅ΠΌΠΈ ΠΊΡΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
ΠΠΎΡΠ΅Π½ΡΠΎ Π€ΠΎΠ½ΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠΈ Π² Π΅ΠΊΠΈΠΏΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΡΡΡΠ΅Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π² Sysdig, ΠΊΡΠ΄Π΅ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° Ρ Falco β ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° Cloud Native Computing Foundation, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ ΠΎΡΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ ΡΡΠ΅Π· ΠΌΠΎΠ΄ΡΠ» Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ eBPF. Π’ΠΎΠΉ Π΅ Π·Π°ΠΏΠ°Π»Π΅Π½ ΠΏΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΡΠΎΡΡΡΠ΅ΡΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ, ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
Β» ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Π½Π°
Β»
Β»
ΠΠ° Π₯Π°Π±ΡΠΎΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 25% Ρ Π²Π°ΡΡΠ΅ΡΠ° β Linux
Π‘Π»Π΅Π΄ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ»Π°ΡΠ°Π½Π΅ΡΠΎ Π·Π° ΠΏΠ΅ΡΠ°ΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ°, Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½Π° Π½Π° ΠΈΠΌΠ΅ΠΉΠ»Π° Π²ΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
