Π‘ΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° 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 1
capsh (shell manager) Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° shell ΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎ, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΏΡΠ»Π½ΠΈ 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 ΠΊΡΠΌ Π½ΠΈΠΊΠΎΠ³ΠΎ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ cap_setuid ΠΈ cap_setgid.
- βkeep=1 β ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ ΠΎΡ root Π°ΠΊΠ°ΡΠ½ΡΠ°.
- βuser=βnobodyβ β ΠΊΡΠ°ΠΉΠ½ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠ΅ Π±ΡΠ΄Π΅ Π½ΠΈΠΊΠΎΠΉ.
- βaddamb=cap_net_bind_service β Π·Π°Π΄Π°ΠΉΡΠ΅ ΠΈΠ·ΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ»Π΅Π΄ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ ΠΎΡ root ΡΠ΅ΠΆΠΈΠΌ.
- - -c "./capabilities" - ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
Π‘Π²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π²ΠΈΠ΄ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°Ρ ΠΎΡ Π΄ΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π³ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° execve(). Π‘Π°ΠΌΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π°ΡΠΎΡΠΈΠΈΡΠ°Π½ΠΈ, ΠΈΠ»ΠΈ Ρ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΠΊΠ°ΡΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ΠΈ.
ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΡΡΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π° +eip, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π² ΠΎΠΏΡΠΈΡΡΠ° --caps. Π’Π΅Π·ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, Π·Π° Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ, ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ°:
-ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° (p);
-Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ (e);
-ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΡΠ»Π΅Π΄Π΅Π½ΠΈ ΠΎΡ Π΄ΡΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ (i).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ cap_net_bind_service, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Ρ ΡΠ»Π°Π³Π° e. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ Ρ ΡΠ»Π°Π³Π° i. Π Π½Π°ΠΊΡΠ°Ρ, ΠΈΡΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π° (Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΡΠΎΠ²Π°, Π±Π΅Π· Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ UID) Ρ p. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ cap_net_bind_service+eip.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ss. ΠΠ΅ΠΊΠ° ΡΡΠΊΡΠ°ΡΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ·Ρ ΠΎΠ΄Π°, Π·Π° Π΄Π° ΠΏΠ°ΡΠ½Π΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, Π½ΠΎ ΡΠΎΠΉ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡ ΠΏΠΎΡΡ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΎΡ 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, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ shell Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° 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, Π½ΠΎ Π΄Π° Π½Π΅ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° Π²ΡΡΠ·ΠΊΠΈ ΡΡΡ ΡΠΎΠΊΠ΅Ρ, Π±Π»ΠΎΠΊΠΈΡΠ°ΠΉΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ 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 (Bad System Call) ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΊΡΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ Π³ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°.
- SECCOMP_RET_ERRNO - Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΈ ΡΠ°ΡΡ ΠΎΡ Π²ΡΡΠ½Π°ΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΠΈΠ»ΡΡΡΠ° SECCOMP_RET_DATA ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΊΠ°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡ errno. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΡΠ΅ Π²ΡΡΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ errno ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π‘ΠΏΠΈΡΡΠΊ Ρ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π΅ Π΄Π°Π΄Π΅Π½ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π».
- SECCOMP_RET_TRACE - ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π·Π° ΡΠ²Π΅Π΄ΠΎΠΌΡΠ²Π°Π½Π΅ Π½Π° ptrace tracer ΡΡΠ΅Π· - 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 β ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ (Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data) Π½ΡΠΌΠ°Ρ Π²Π°Π»ΠΈΠ΄Π΅Π½ Π°Π΄ΡΠ΅Ρ;
β EINVAL β ΡΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠ΅ΡΠΈΡΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ:
-Π·Π°ΡΠ²Π΅Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΈΠ»ΠΈ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ Π² ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ;
-ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ»Π°Π³ΠΎΠ²Π΅ Π½Π΅ ΡΠ° Π²Π°Π»ΠΈΠ΄Π½ΠΈ Π·Π° Π·Π°ΡΠ²Π΅Π½Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ;
-ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π²ΠΊΠ»ΡΡΠ²Π° BPF_ABS, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎΡΠΎ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° seccomp_data;
-Π±ΡΠΎΡΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΡΠΈΠ»ΡΡΡΠ°, Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ°;
β ENOMEM β Π½ΡΠΌΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΠ°ΠΌΠ΅Ρ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°;
- EOPNOTSUPP - ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ Ρ SECCOMP_GET_ACTION_AVAIL Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ½ΠΎ, Π½ΠΎ ΡΠ΄ΡΠΎΡΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π²ΡΡΡΠ°Π½Π΅ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ;
β ESRCH β Π²ΡΠ·Π½ΠΈΠΊΠ½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΡΡΠ³ ΠΏΠΎΡΠΎΠΊ;
- ENOSYS - ΠΡΠΌΠ° ΡΡΠ°ΡΠΈΡΠ°Π½Π΅, ΠΏΡΠΈΠΊΠ°ΡΠ΅Π½ΠΎ ΠΊΡΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ SECCOMP_RET_TRACE.
prctl Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ° (Π·Π°Π΄Π°Π²Π° ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°) ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π±Π°ΠΉΡΠΎΠ²Π΅, ΠΈΠΌΠ΅Π½Π° Π½Π° Π½ΠΈΡΠΊΠΈ, Π·Π°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ (Seccomp), ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, Perf ΡΡΠ±ΠΈΡΠΈΡ ΠΈ Ρ.Π½.
Seccomp ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ sandbox ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, Π½ΠΎ Π½Π΅ Π΅ ΡΠ°ΠΊΠ°. 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 ΠΎΠ±Π΅ΠΊΡ ΠΈΠ»ΠΈ JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° C ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.ΠΠΌΠ° Π΄Π²Π΅ ΠΏΡΠΈΡΠΈΠ½ΠΈ Π·Π° ΡΠΎΠ²Π°.
β’ ΠΡΡΠ²ΠΎ, 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. ΠΠ΅ΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π·Π° Π·Π°ΠΏΠΈΡ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° 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 -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 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΡΡ .
ΠΠ° Π°Π²ΡΠΎΡΠΈΡΠ΅
ΠΠ΅ΠΉΠ²ΠΈΠ΄ ΠΠ°Π»Π°Π²Π΅ΡΠ° Π΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ Π² Netlify. Π Π°Π±ΠΎΡΠΈΠ» Π΅ Π² ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Docker ΠΈ Π΅ Π΄ΠΎΠΏΡΠΈΠ½Π΅ΡΡΠ» Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Runc, Go ΠΈ BCC, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄. ΠΠ·Π²Π΅ΡΡΠ΅Π½ Ρ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° Docker ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈΡΠ΅ Π½Π° Docker. ΠΠ΅ΠΉΠ²ΠΈΠ΄ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠ°Π»Π΅Π½ ΠΏΠΎ ΠΏΠ»Π°ΠΌΡΡΠ½ΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΡΡΠ΅ΠΌΠΈ Π΄Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
ΠΠΎΡΠ΅Π½ΡΠΎ Π€ΠΎΠ½ΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠΈ Π² Π΅ΠΊΠΈΠΏΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π² Sysdig, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π²ΡΡΡ Ρ Falco, ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° Cloud Native Computing Foundation, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ ΡΡΠ΅Π· ΠΌΠΎΠ΄ΡΠ» Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ eBPF. Π’ΠΎΠΉ Π΅ Π·Π°ΠΏΠ°Π»Π΅Π½ ΠΏΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΡΠΎΡΡΡΠ΅ΡΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ, ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
Β» ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΊΠ½ΠΈΠ³Π°ΡΠ°, ΠΌΠΎΠ»Ρ ΠΏΠΎΡΠ΅ΡΠ΅ΡΠ΅
Β»
Β»
ΠΠ° Khabrozhiteli 25% ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ ΠΊΡΠΏΠΎΠ½Π° - Linux
ΠΡΠΈ Π·Π°ΠΏΠ»Π°ΡΠ°Π½Π΅ Π½Π° Ρ
Π°ΡΡΠΈΠ΅Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ°, Π½Π° Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½Π°ΡΠ° ΠΏΠΎΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π΅Π»Π΅ΠΊΡΡΠΎΠ½Π½Π° ΠΊΠ½ΠΈΠ³Π°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com