ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΡΠ΄ΡΠ° 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 (ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΎΠΉ) β ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ, Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΡΡ ΠΏΡΠ°Π² 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);
-Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ (Π΅);
-ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ (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 (Bad System Call) ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ Π΅Π³ΠΎ Π·Π°Π΄Π°ΡΠ΅.
β 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 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 β ΡΠΎΠΉ ΡΠ°ΠΌΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΌΡ Π²ΡΠ·ΠΎΠ²Ρ write:
[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 ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
Β» ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Ρ ΠΊΠ½ΠΈΠ³ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Π½Π°
Β»
Β»
ΠΠ»Ρ Π₯Π°Π±ΡΠΎΠΆΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΊΠΈΠ΄ΠΊΠ° 25% ΠΏΠΎ ΠΊΡΠΏΠΎΠ½Ρ β Linux
ΠΠΎ ΡΠ°ΠΊΡΡ ΠΎΠΏΠ»Π°ΡΡ Π±ΡΠΌΠ°ΠΆΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠ½ΠΈΠ³ΠΈ Π½Π° e-mail Π²ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½Π°Ρ ΠΊΠ½ΠΈΠ³Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com