Книга "BPF за наблюдСниС на Linux"

Книга "BPF Π·Π° наблюдСниС Π½Π° Linux"Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ ΠΆΠΈΡ‚Π΅Π»ΠΈ Π½Π° Π₯Π°Π±Ρ€ΠΎ! BPF Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° ядрото Π½Π° Linux. ΠŸΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ ΠΌΡƒ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° систСмнитС ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Ρ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ Π΄Π° Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚ Π΄ΠΎΡ€ΠΈ Π½Π°ΠΉ-слоТнитС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π©Π΅ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Π²Π°Ρ‚ ΠΈ промСнят ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ядрото, ΠΊΠ°ΠΊ бСзопасно Π΄Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚Π΅ ΠΊΠΎΠ΄ Π·Π° наблюдСниС Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π² ядрото ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅. Π”Π΅ΠΉΠ²ΠΈΠ΄ ΠšΠ°Π»Π°Π²Π΅Ρ€Π° ΠΈ Π›ΠΎΡ€Π΅Π½Ρ†ΠΎ Π€ΠΎΠ½Ρ‚Π°Π½Π° Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ силата Π½Π° BPF. Π Π°Π·ΡˆΠΈΡ€Π΅Ρ‚Π΅ знанията си Π·Π° оптимизация Π½Π° производитСлността, Ρ€Π°Π±ΠΎΡ‚Π° Π² ΠΌΡ€Π΅ΠΆΠ°, сигурност. - Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ BPF Π·Π° наблюдСниС ΠΈ промяна Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Linux ядрото. - Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π·Π° сигурно наблюдСниС Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡΡ‚Π° Π² ядрото, Π±Π΅Π· Π΄Π° сС Π½Π°Π»Π°Π³Π° Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚Π΅ ядрото ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΈΠ»ΠΈ Π΄Π° рСстартиратС систСмата. β€” Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠ΄ Π² C, Go ΠΈΠ»ΠΈ Python. - ΠŸΠΎΠ΅ΠΌΠ΅Ρ‚Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‚Π΅ΠΆΠ°Π²Π°Ρ‚Π΅ ТизнСния Ρ†ΠΈΠΊΡŠΠ» Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° BPF.

Бигурност Π½Π° ядрото Π½Π° Linux, Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ характСристики ΠΈ Seccomp

BPF прСдоставя ΠΌΠΎΡ‰Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ Π·Π° Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° ядрото, Π±Π΅Π· Π΄Π° сС ΠΆΠ΅Ρ€Ρ‚Π²Π° стабилност, сигурност ΠΈΠ»ΠΈ скорост. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ядрото Ρ€Π΅ΡˆΠΈΡ…Π°, Ρ‡Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€Π° идСя Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚ Π·Π° подобряванС Π½Π° изолацията Π½Π° процСситС Π² Seccomp Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Seccomp Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ ΠΎΡ‚ BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, извСстни ΡΡŠΡ‰ΠΎ ΠΊΠ°Ρ‚ΠΎ Seccomp BPF. Π’ Ρ‚Π°Π·ΠΈ Π³Π»Π°Π²Π° Ρ‰Π΅ обясним ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Seccomp ΠΈ ΠΊΠ°ΠΊ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Seccomp Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈΡ‚Π΅ BPF ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Π² ядрото Π·Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π° сигурност Π½Π° Linux.

ΠœΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π·Π° сигурност Π½Π° Linux (LSM) са Ρ€Π°ΠΌΠΊΠ°, която прСдоставя Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π° сигурност ΠΏΠΎ стандартизиран Π½Π°Ρ‡ΠΈΠ½. LSM ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π° изходния ΠΊΠΎΠ΄ Π½Π° ядрото, ΠΊΠ°Ρ‚ΠΎ Apparmor, SELinux ΠΈ Tomoyo.

НСка Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ с обсъТданС Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Linux.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ

Π‘ΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Linux Π΅, Ρ‡Π΅ трябва Π΄Π° Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ процСс Π·Π° изпълнСниС Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π·Π°Π΄Π°Ρ‡Π°, Π½ΠΎ Π±Π΅Π· Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ suid Π·Π° Ρ‚Π°Π·ΠΈ Ρ†Π΅Π», ΠΈΠ»ΠΈ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ процСса ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½, намалявайки Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° Π°Ρ‚Π°ΠΊΠ° ΠΈ позволявайки Π½Π° процСса Π΄Π° изпълнява ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. НапримСр, Π°ΠΊΠΎ Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ трябва Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΡ€Ρ‚, Π΄Π° Ρ€Π΅Ρ‡Π΅ΠΌ 80, вмСсто Π΄Π° изпълнява процСса ΠΊΠ°Ρ‚ΠΎ root, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅Ρ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° CAP_NET_BIND_SERVICE.

ΠŸΠΎΠΌΠΈΡΠ»Π΅Ρ‚Π΅ Π·Π° Go ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° с ΠΈΠΌΠ΅ main.go:

package main
import (
            "net/http"
            "log"
)
func main() {
     log.Fatalf("%v", http.ListenAndServe(":80", nil))
}

Π’Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° обслуТва HTTP ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° ΠΏΠΎΡ€Ρ‚ 80 (Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΡ€Ρ‚). ОбикновСно Π³ΠΎ стартирамС Π²Π΅Π΄Π½Π°Π³Π° слСд ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ:

$ go build -o capabilities main.go
$ ./capabilities

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½ΠΈΠ΅ Π½Π΅ прСдоставямС root ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ ΠΎΠ±Π²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡ€Ρ‚Π°:

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€