ΠΠ΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° Linux, Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ Seccomp
BPF ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΌΠΎΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΡΠΎΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΆΡΡΠ²ΡΠ²Π° ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡΠ°, Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° ΠΈΠ»ΠΈ Π±ΡΠ·ΠΈΠ½Π°ΡΠ°. ΠΠΎΡΠ°Π΄ΠΈ ΠΎΠ²Π°Π° ΠΏΡΠΈΡΠΈΠ½Π°, ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΡΠΌΠ΅ΡΠ°Π° Π΄Π΅ΠΊΠ° Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π΄Π° ΡΠ° ΠΈΡΠΊΠΎΡΠΈΡΡΠ°Ρ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ Π·Π° Π΄Π° ΡΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Ρ ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π²ΠΎ Seccomp ΡΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΠ»ΡΡΠΈ Seccomp ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ BPF, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΊΠ°ΠΊΠΎ Seccomp BPF. ΠΠΎ ΠΎΠ²Π° ΠΏΠΎΠ³Π»Π°Π²ΡΠ΅ ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΈΠΌΠ΅ ΡΡΠΎ Π΅ Seccomp ΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ. ΠΠΎΡΠΎΠ° ΡΠ΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Seccomp ΡΠΈΠ»ΡΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ°, ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΠΊΡΠΊΠΈ BPF ΠΊΠΎΠΈ ΡΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π·Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΠ½ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° 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 1
capsh (ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π½Π° ΡΠΊΠΎΠ»ΠΊΠ°) Π΅ Π°Π»Π°ΡΠΊΠ° ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠΊΠΎΠ»ΠΊΠ° ΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅Π½ ΡΠ΅Ρ Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎ, Π½Π°ΠΌΠ΅ΡΡΠΎ Π΄Π° Π΄Π°Π²Π°ΡΠ΅ ΡΠ΅Π»ΠΎΡΠ½ΠΈ ΠΏΡΠ°Π²Π° Π·Π° 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 ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π²ΡΡΡΠ½ΠΎΡΡ Π΄Π° Π³ΠΎ ΡΠΌΠ΅Π½ΠΈΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ID ΠΎΠ΄ root to nobody, ΠΈΠΌΠ΅Π½ΠΎ cap_setuid ΠΈ cap_setgid.
- βkeep=1 β ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° Π³ΠΈ Π·Π°Π΄ΡΠΆΠΈΠΌΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΏΡΠ΅ΡΡΠ»Π°ΡΠ΅ ΠΎΠ΄ root ΡΠΌΠ΅ΡΠΊΠ°ΡΠ°.
- βuser=βΠ½ΠΈΠΊΠΎΡβ β ΠΊΡΠ°ΡΠ½ΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΊΠΎΡ ΡΠ° Π²ΠΎΠ΄ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ Π½ΠΈΠΊΠΎΡ.
- βaddamb=cap_net_bind_service β ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ Π±ΡΠΈΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΡΠ΅ΡΡΠ»Π°ΡΠ΅ΡΠΎ ΠΎΠ΄ root ΡΠ΅ΠΆΠΈΠΌΠΎΡ.
- - -c "./capabilities" - ΡΠ°ΠΌΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
ΠΠΎΠ²ΡΠ·Π°Π½ΠΈΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π΅Π½ Π²ΠΈΠ΄ Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ΠΈ ΠΎΠ΄ Π΄Π΅ΡΡΠΊΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΊΠΎΠ³Π° ΡΠ΅ΠΊΠΎΠ²Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° execve(). ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄Π°Ρ ΡΠ°ΠΌΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΡΡΠΎ Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ, ΠΈΠ»ΠΈ ΡΠΎ Π΄ΡΡΠ³ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ°.
ΠΠ΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΡΠ΅ ΠΏΡΠ°ΡΡΠ²Π°ΡΠ΅ ΡΡΠΎ Π·Π½Π°ΡΠΈ +eip ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π²ΠΎ ΠΎΠΏΡΠΈΡΠ°ΡΠ° --caps. ΠΠ²ΠΈΠ΅ Π·Π½Π°ΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° Π΄Π° ΡΠ΅ ΡΡΠ²ΡΠ΄ΠΈ Π΄Π΅ΠΊΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ°:
-ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° (p);
- Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° (Π΄);
-ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΈ ΡΠΎ Π΄Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ (i).
ΠΠΈΠ΄Π΅ΡΡΠΈ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ cap_net_bind_service, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π° ΡΠΎ Π·Π½Π°ΠΌΠ΅ΡΠΎ e. ΠΠΎΡΠΎΠ° ΡΠ΅ ΡΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ ΡΠΊΠΎΠ»ΠΊΠ° Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°. ΠΠ²Π° ΡΠ΅ Π³ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΎ ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΎΠ·Π½Π°ΡΠΈΠΌΠ΅ ΡΠΎ Π·Π½Π°ΠΌΠ΅Π½ΡΠ΅ΡΠΎ i. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠ°ΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½Π° (ΠΎΠ²Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° UID) ΡΠΎ ΡΡΡ. ΠΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ cap_net_bind_service+eip.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ss. ΠΡΠ΄Π΅ ΠΌΠ°Π»ΠΊΡ Π΄Π° Π³ΠΎ ΡΠΊΡΠ°ΡΠΈΠΌΠ΅ ΠΈΠ·Π»Π΅Π·ΠΎΡ Π·Π° Π΄Π° ΡΠ΅ Π²ΠΊΠ»ΠΎΠΏΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, Π½ΠΎ ΡΠ΅ ΡΠ° ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½Π°ΡΠ° ΠΏΠΎΡΡΠ° ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ID ΠΎΡΠ²Π΅Π½ 0, Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ 65:
# 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, ΠΊΠΎΡΠ° ΡΠ° ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° 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, Π½ΠΎ Π΄Π° Π½Π΅ ΠΌΡ Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Π΄Π° ΠΏΡΠΈΡΠ°ΡΠ° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ Π·Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ, Π±Π»ΠΎΠΊΠΈΡΠ°ΡΡΠΈ Π³ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ ΠΏΡΠΈΡΠ°ΡΠ°Ρ ΠΈ ΠΏΡΠΈΡΠ°ΡΠ°Ρ4.
ΠΠ΅ΡΠΎΠ΄ΠΎΡ Π½Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ 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 ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ ΠΊΠ°ΠΊΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π·Π° Π³ΡΠ΅ΡΠΊΠ°. ΠΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°, ΡΠ΅ Π²ΡΠ°ΡΠ°Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠ°. Π‘ΠΏΠΈΡΠΎΠΊΠΎΡ ΡΠΎ Π±ΡΠΎΠ΅Π²ΠΈ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π΅ Π΄Π°Π΄Π΅Π½ Π²ΠΎ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ Π΄Π΅Π».
- SECCOMP_RET_TRACE - Π‘Π΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ°Π³Π°ΡΠΎΡ Π½Π° ptrace ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ - PTRACE_O_TRACESECCOMP Π·Π° ΠΏΡΠ΅ΡΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ Π·Π° Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΠΎΡ ΠΏΡΠΎΡΠ΅Ρ. ΠΠΊΠΎ ΡΡΠ°ΡΠ΅ΡΠΎΡ Π½Π΅ Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½, ΡΠ΅ Π²ΡΠ°ΡΠ° Π³ΡΠ΅ΡΠΊΠ°, errno ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π½Π° -ENOSYS ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°.
- SECCOMP_RET_LOG - ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ Π΅ ΡΠ΅ΡΠ΅Π½ ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°Π½.
- SECCOMP_RET_ALLOW - ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½.
ptrace Π΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π²ΠΎ ΠΏΡΠΎΡΠ΅Ρ Π½Π°ΡΠ΅ΡΠ΅Π½ 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 (Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ) Π·Π° Π΄Π° ΡΠ΅ ΡΡΠ»ΠΈ Π³ΡΠ΅ΡΠΊΠ° Π±ΠΈΠ΄Π΅ΡΡΠΈ Π»Π°ΠΊΠΎΡ Π½Π΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°.
- 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 | (Π³ΡΠ΅ΡΠΊΠ° & 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, ΠΊΠΎΡ Π΅ ΡΠΎΠ΄ΡΠΆΠ°Π½ Π²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° ΠΏΡΠΎΠ³ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ 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. ΠΡΠ΄Π΅ Π΄Π° Π³ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° 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 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
ΠΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ! ΠΠ²Π΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°: ΠΠ΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ° ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΡΠΎ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ° ΡΠ΅ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΏΡΠ² Π°ΡΠ³ΡΠΌΠ΅Π½Ρ:
./filter-write "ls -la"
ΠΠΎΠ³Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°, ΠΎΠ²Π°Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠ²Π° ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΠΏΡΠ°Π·Π΅Π½ ΠΈΠ·Π»Π΅Π·. Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ strace Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°:
strace -f ./filter-write "ls -la"
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠΊΡΠ°ΡΠ΅Π½, Π½ΠΎ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΠΎΡ Π΄Π΅Π» ΠΎΠ΄ Π½Π΅Π³ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°Π½ΠΈ ΡΠΎ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° EPERM - ΠΈΡΡΠ°ΡΠ° ΠΎΠ½Π°Π° ΡΡΠΎ ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π²ΠΌΠ΅. ΠΠ²Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π΅ Π΅ΠΌΠΈΡΡΠ²Π° Π½ΠΈΡΡΠΎ Π±ΠΈΠ΄Π΅ΡΡΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΈ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ Π·Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅:
[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)
Π‘Π΅Π³Π° ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° 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 Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ Π½ΠΈΠ².
ΠΠ° Π°Π²ΡΠΎΡΠΈΡΠ΅
ΠΠ΅ΡΠ²ΠΈΠ΄ ΠΠ°Π»Π°Π²Π΅ΡΠ° Π΅ CTO Π²ΠΎ Netlify. Π’ΠΎΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Π²ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°ΡΠ° Π½Π° Docker ΠΈ ΠΏΡΠΈΠ΄ΠΎΠ½Π΅ΡΠ΅ Π·Π° ΡΠ°Π·Π²ΠΎΡΠΎΡ Π½Π° Π°Π»Π°ΡΠΊΠΈΡΠ΅ Runc, Go ΠΈ BCC, ΠΊΠ°ΠΊΠΎ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΠΎΠ·Π½Π°Ρ ΠΏΠΎ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° Docker ΠΈ ΡΠ°Π·Π²ΠΎΡΠΎΡ Π½Π° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ Docker. ΠΠ΅ΡΠ²ΠΈΠ΄ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΡΡΠ°ΡΡΠ΅Π½ Π·Π° Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ΠΈΡΠ΅ ΡΠΎ ΠΏΠ»Π°ΠΌΠ΅Π½ ΠΈ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π±Π°ΡΠ° Π΄Π° Π³ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅.
ΠΠΎΡΠ΅Π½ΡΠΎ Π€ΠΎΠ½ΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠΈ Π²ΠΎ ΡΠΈΠΌΠΎΡ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π²ΠΎ Sysdig, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ Π΅ ΡΠΎΠΊΡΡΠΈΡΠ°Π½ Π½Π° Falco, ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° Cloud Native Computing Foundation ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΡΡΠ°Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°ΡΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΡΠ° ΠΏΡΠ΅ΠΊΡ ΠΌΠΎΠ΄ΡΠ» Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ ΠΈ eBPF. Π’ΠΎΡ Π΅ ΡΡΡΠ°ΡΡΠ΅Π½ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ, ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΠΈΠ½ΡΠΊΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅.
Β» ΠΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ Π·Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ Π½Π°
Β»
Β»
ΠΠ° Khabrozhiteley 25% ΠΏΠΎΠΏΡΡΡ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΡΠΏΠΎΠ½ - Linux
ΠΠΎ ΡΠΏΠ»Π°ΡΠ° Π½Π° Ρ
Π°ΡΡΠΈΠ΅Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΈΡΠΏΡΠ°ΡΠ΅Π½Π° Π΅Π»Π΅ΠΊΡΡΠΎΠ½ΡΠΊΠ° ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ Π΅-ΠΏΠΎΡΡΠ°.
ΠΠ·Π²ΠΎΡ: www.habr.com