Книга «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 (инструмСнт Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°) Π΅ инструмСнт, ΠΊΠΎΠΉΡ‚ΠΎ стартира ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ.

Π’ Ρ‚ΠΎΠ·ΠΈ случай, ΠΊΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ спомСнахмС, вмСсто Π΄Π° прСдоставим пълни ΠΏΡ€Π°Π²Π° Π½Π° root, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅, прСдоставяйки ΠΏΡ€Π°Π²ΠΎΡ‚ΠΎ cap_net_bind_service, Π½Π°Ρ€Π΅Π΄ с всички останали, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ са Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π²ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° си Π² capsh:

# capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' 
   --keep=1 --user="nobody" 
   --addamb=cap_net_bind_service -- -c "./capabilities"

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°.

  • capsh β€” ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ capsh ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°.
  • β€”caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' β€” Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ трябва Π΄Π° смСним потрСбитСля (Π½Π΅ искамС Π΄Π° стартирамС с ΠΏΡ€Π°Π²Π° Π½Π° root), Ρ‰Π΅ посочим cap_net_bind_service ΠΈ способността дСйствитСлно Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° потрСбитСля ΠΎΡ‚ root Π½Π° nobody, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ cap_setuid ΠΈ cap_setgid.
  • β€”keep=1 β€” искамС Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° смяна ΠΎΡ‚ Π°ΠΊΠ°ΡƒΠ½Ρ‚Π° Π½Π° root.
  • β€”user='nobody' β€” крайният ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΊΠΎΠΉΡ‚ΠΎ стартира ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‰Π΅ бъдС nobody.
  • β€”addamb=cap_net_bind_service β€” Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ почистванС Π½Π° ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ слСд смяна ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ root.
  • β€” -c "./capabilities" β€” просто стартирамС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

Π‘Π²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ са особСн Π²ΠΈΠ΄ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС наслСдяват ΠΎΡ‚ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π³ΠΈ изпълнява с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° execve(). ΠœΠΎΠ³Π°Ρ‚ Π΄Π° сС наслСдяват само Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ, ΠΈΠ»ΠΈ, с Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΡƒΠΌΠΈ, ΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π° ΠΎΠΊΠΎΠ»Π½Π°Ρ‚Π° срСда.

ВСроятно, Π²ΠΈ Π΅ интСрСсно ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° +eip слСд ΡƒΠΊΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π² опцията β€”caps. Π’Π΅Π·ΠΈ Ρ„Π»Π°Π³ΠΎΠ²Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° опрСдСлянС Π½Π° Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π°:

-трябва Π΄Π° бъдС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π° (p);

-Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ (e);

-ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС наслСдСна ΠΎΡ‚ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ процСси (i).

Въй ΠΊΠ°Ρ‚ΠΎ искамС Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ cap_net_bind_service, трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π° с Ρ„Π»Π°Π³Π° e. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ стартирамС ΠΎΠ±ΠΎΠ»ΠΊΠ°Ρ‚Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ сС стартира Π±ΠΈΠ½Π°Ρ€Π΅Π½ Ρ„Π°ΠΉΠ» capabilities, ΠΈ трябва Π΄Π° Π³ΠΎ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠΌ с Ρ„Π»Π°Π³Π° i. Накрая, искамС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° бъдС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π° (ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅, Π±Π΅Π· Π΄Π° промСнямС UID) с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° p. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ cap_net_bind_service+eip.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ss. НСка ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΡΡŠΠΊΡ€Π°Ρ‚ΠΈΠΌ ΠΈΠ·Π²ΠΎΠ΄Π°, Π·Π° Π΄Π° сС ΠΏΠΎΠ±Π΅Ρ€Π΅ Π½Π° страницата, Π½ΠΎ Ρ‚ΠΎΠΉ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ ΠΏΠΎΡ€Ρ‚ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° потрСбитСля, Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ 0, Π² Ρ‚ΠΎΠ·ΠΈ случай 65 534:

# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ capsh, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΎΠ±ΠΎΠ»ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° libcap. Π—Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с man 3 libcap.

ΠŸΡ€ΠΈ написванСто Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ доста чСсто Π½Π΅ Π·Π½Π°Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ всички Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС; ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, Π² Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии Ρ‚Π΅Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС промСнят.

Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ инструмСнта BCC capable, ΠΊΠΎΠΉΡ‚ΠΎ Π·Π°Π΄Π°Π²Π° kprobe Π·Π° функцията Π½Π° ядрото cap_capable:

/usr/share/bcc/tools/capable
TIME      UID  PID   TID   COMM               CAP    NAME           AUDIT
10:12:53 0 424     424     systemd-udevd 12 CAP_NET_ADMIN         1
10:12:57 0 1103   1101   timesync        25 CAP_SYS_TIME         1
10:12:57 0 19545 19545 capabilities       10 CAP_NET_BIND_SERVICE 1

Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° постигнСм, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ bpftrace с Π΅Π΄Π½ΠΎΡ€Π΅Π΄ΠΎΠ² kprobe Π² функцията Π½Π° ядрото cap_capable:

bpftrace -e 
   'kprobe:cap_capable {
      time("%H:%M:%S ");
      printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
    }' 
    | grep -i capabilities

Π’ΠΎΠ²Π° Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° слСдното, Π°ΠΊΠΎ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° са Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ слСд kprobe:

12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1

ΠŸΠ΅Ρ‚ΠΈΡΡ‚ ΡΡ‚ΡŠΠ»Π±Π΅Ρ† β€” Ρ‚ΠΎΠ²Π° са Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚, ΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ ΡΡŠΡ‰ΠΎ Π½Π΅Π°ΡƒΠ΄ΠΈΡ‚Π½ΠΈ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ всички Π½Π΅Π°ΡƒΠ΄ΠΈΡ‚Π½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ, Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка, изискваната Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ с Ρ„Π»Π°Π³Π° Π·Π° ΠΎΠ΄ΠΈΡ‚ (послСдният Π² ΠΈΠ·Π²ΠΎΠ΄Π°), Π·Π°Π΄Π°Π΄Π΅Π½ Π½Π° 1. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π°, която Π½ΠΈ интСрСсува, Π΅ CAP_NET_BIND_SERVICE, тя Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°Ρ‚ΠΎ константа Π² изходния ΠΊΠΎΠ΄ Π½Π° ядрото Π² Ρ„Π°ΠΉΠ»Π° include/uapi/linux/ability.h с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 10:

/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ чСсто сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, ΠΊΠ°Ρ‚ΠΎ runC ΠΈΠ»ΠΈ Docker, Π·Π° Π΄Π° работят Π² Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ, Π½ΠΎ ΠΈΠΌ сС Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚ само ΠΎΠ½Π΅Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° стартиранС Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ прилоТСния. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, Π² Docker ΠΌΠΎΠΆΠ΅ Π΄Π° сС осигурят Ρ‡Ρ€Π΅Π· β€”cap-add:

docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummy

Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‰Π΅ прСдостави Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° способността CAP_NET_ADMIN, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΌΡƒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° ΠΌΡ€Π΅ΠΆΠΎΠ²Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π·Π° добавянС Π½Π° интСрфСйса dummy0.

Π’ слСдващия Ρ€Π°Π·Π΄Π΅Π» Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°Ρ‚ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΈΡ€Π°Π½Π΅, Π½ΠΎ с Π΄Ρ€ΡƒΠ³ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½ΠΎ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ собствСни Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ.

Seccomp

Seccomp ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Secure Computing, Ρ‚ΠΎΠ²Π° Π΅ Π½ΠΈΠ²ΠΎ Π½Π° сигурност, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ Π² ядрото Π½Π° Linux, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСмни повиквания. Π”ΠΎΠΊΠ°Ρ‚ΠΎ Seccomp Π΅ ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΠΈΠΌ с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Linux, способността ΠΌΡƒ Π΄Π° управлява ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСмни повиквания Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-гъвкав Π² сравнСниС с тях.

Seccomp ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° Linux Π½Π΅ сС ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎ, чСсто сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ, Π·Π° Π΄Π° сС ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ ΠΏΠΎΠ»Π·ΠΈ ΠΎΡ‚ Π΄Π²Π°Ρ‚Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. НапримСр, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° искатС Π΄Π° прСдоставитС Π½Π° процСса Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° CAP_NET_ADMIN, Π½ΠΎ Π΄Π° Π½Π΅ ΠΌΡƒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π²Ρ€ΡŠΠ·ΠΊΠΈ Ρ‡Ρ€Π΅Π· сокСт, Π±Π»ΠΎΠΊΠΈΡ€Π°ΠΉΠΊΠΈ систСмнитС повиквания accept ΠΈ accept4.

ΠœΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ Π² Seccomp Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° BPF Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ SECCOMP_MODE_FILTER, Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° систСмни повиквания сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅.

Π€ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ Seccomp сС Π·Π°Ρ€Π΅ΠΆΠ΄Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° prctl Ρ‡Ρ€Π΅Π· опСрация PR_SET_SECCOMP. Π’Π΅Π·ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΈΠΌΠ°Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която сС изпълнява Π·Π° всСки Seccomp ΠΏΠ°ΠΊΠ΅Ρ‚, прСдставСн с структурата seccomp_data. Π’Π°Π·ΠΈ структура ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π±Π°Π·ΠΎΠ²Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π½Π° процСсора ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° систСмното ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ максимум ΡˆΠ΅ΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π° систСмното ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, ΠΈΠ·Ρ€Π°Π·Π΅Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ uint64.

Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° структурата seccomp_data ΠΎΡ‚ изходния ΠΊΠΎΠ΄ Π½Π° ядрото Π² Ρ„Π°ΠΉΠ»Π° linux/seccomp.h:

struct seccomp_data {
int nr;
      __u32 arch;
      __u64 instruction_pointer;
      __u64 args[6];
};

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΎΡ‚ Ρ‚Π°Π·ΠΈ структура, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎ систСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΈΠ»ΠΈ тяхната комбинация.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ всСки ΠΏΠ°ΠΊΠ΅Ρ‚, Seccomp Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ΡŠΡ‚ трябва Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π·Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈ ядрото ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сС изразява с Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π²ΡŠΡ€Π½Π°Ρ‚ΠΈΡ‚Π΅ стойности (ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° статус).

β€” SECCOMP_RET_KILL_PROCESS β€” Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ прСкратяванС Π½Π° цСлия процСс слСд Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° Π½Π΅ сС изпълнява.

β€” SECCOMP_RET_KILL_THREAD β€” Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ прСкратяванС Π½Π° тСкущия ΠΏΠΎΡ‚ΠΎΠΊ слСд Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° Π½Π΅ сС изпълнява.

β€” SECCOMP_RET_KILL β€” алиас Π·Π° SECCOMP_RET_KILL_THREAD, оставСн Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚.

β€” SECCOMP_RET_TRAP β€” систСмният ΠΏΠΎΠ²ΠΈΠΊ Π΅ Π·Π°Π±Ρ€Π°Π½Π΅Π½ ΠΈ ΡΠΈΠ³Π½Π°Π»ΡŠΡ‚ SIGSYS (Π›ΠΎΡˆ систСмСн ΠΏΠΎΠ²ΠΈΠΊ) сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°, ΠΈΠ·Π²ΠΈΠΊΠ°Π»Π° Π³ΠΎ.

β€” SECCOMP_RET_ERRNO β€” систСмният ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ сС изпълнява ΠΈ част ΠΎΡ‚ Π²ΡŠΡ€Π½Π°Ρ‚Π°Ρ‚Π° стойност Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° SECCOMP_RET_DATA сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π² потрСбитСлското пространство ΠΊΠ°Ρ‚ΠΎ стойност errno. Π’ зависимост ΠΎΡ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°, сС Π²Ρ€ΡŠΡ‰Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ стойности errno. Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚ с Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π΅ прСдоставСн Π² слСдващия Ρ€Π°Π·Π΄Π΅Π».

β€” SECCOMP_RET_TRACE β€” ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС Π·Π° увСдомяванС Π½Π° трасировчика ptrace с PTRACE_O_TRACESECCOMP, Π·Π° Π΄Π° сС ΠΏΡ€ΠΈΡ…Π²Π°Π½Π΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС изпълнява систСмният ΠΏΠΎΠ²ΠΈΠΊ, Π·Π° Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° Ρ‚ΠΎΠ·ΠΈ процСс. Ако Ρ‚Ρ€Π°ΡΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΡŠΡ‚ Π½Π΅ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½, сС Π²Ρ€ΡŠΡ‰Π° Π³Ρ€Π΅ΡˆΠΊΠ°, errno сС Π·Π°Π΄Π°Π²Π° Π½Π° -ENOSYS, Π° систСмният ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ сС изпълнява.

β€” SECCOMP_RET_LOG β€” систСмният ΠΏΠΎΠ²ΠΈΠΊ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ ΠΈ рСгистриран Π² ΠΆΡƒΡ€Π½Π°Π»Π°.

β€” SECCOMP_RET_ALLOW β€” систСмният ΠΏΠΎΠ²ΠΈΠΊ просто Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½.

ptrace Π΅ систСмСн ΠΏΠΎΠ²ΠΈΠΊ Π·Π° рСализация Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° трасировка Π² процСс, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ tracee, с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° наблюдСниС ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° процСса. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π° трасировка ΠΌΠΎΠΆΠ΅ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° влияС Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° промСня рСгистритС Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π½Π° tracee. Π’ контСкста Π½Π° Seccomp ptrace сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС стартира с ΠΊΠΎΠ΄ Π½Π° статус SECCOMP_RET_TRACE, слСдоватСлно, Ρ‚Ρ€Π°ΡΠΈΡ€ΠΎΠ²Ρ‡ΠΈΠΊΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ ΠΈ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° собствСна Π»ΠΎΠ³ΠΈΠΊΠ°.

Π“Ρ€Π΅ΡˆΠΊΠΈ Π½Π° Seccomp

ΠžΡ‚ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅, Ρ€Π°Π±ΠΎΡ‚Π΅ΠΉΠΊΠΈ с Seccomp, Ρ‰Π΅ сС ΡΠ±Π»ΡŠΡΠΊΠ²Π°Ρ‚Π΅ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚ ΠΎΡ‚ Π²ΡŠΡ€Π½Π°Ρ‚Π°Ρ‚Π° стойност ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° SECCOMP_RET_ERRNO. Π—Π° Π΄Π° Π΄ΠΎΠΊΠ»Π°Π΄Π²Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°, систСмният ΠΏΠΎΠ²ΠΈΠΊ seccomp Ρ‰Π΅ Π²ΡŠΡ€Π½Π΅ -1 вмСсто 0.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈ са слСднитС Π³Ρ€Π΅ΡˆΠΊΠΈ:

β€” EACCESS β€” Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Ρ‰Π°Ρ‚Π° страна Π½Π΅ ѝ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ систСмСн Π²ΠΈΠΊ. ОбикновСно Ρ‚ΠΎΠ²Π° сС случва, Π·Π°Ρ‰ΠΎΡ‚ΠΎ няма ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ CAP_SYS_ADMIN ΠΈΠ»ΠΈ no_new_privs Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ с prctl (Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΠΎ-късно);

β€” EFAULT β€” ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ (args Π² структурата seccomp_data) нямат Π²Π°Π»ΠΈΠ΄Π΅Π½ адрСс;

β€” EINVAL β€” Ρ‚ΡƒΠΊ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ:

- поисканата опСрация Π΅ нСизвСстна ΠΈΠ»ΠΈ Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΎΡ‚ ядрото Π² Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° конфигурация;

- Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Ρ„Π»Π°Π³ΠΎΠ²Π΅ са Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ Π·Π° исканата опСрация;

- опСрацията Π²ΠΊΠ»ΡŽΡ‡Π²Π° BPF_ABS, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с посочСното измСстванС, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° надвишава Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° структурата seccomp_data;

- броят Π½Π° инструкциитС, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°, надвишава максималния;

β€” ENOMEM β€” Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π·Π° изпълнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°;

β€” EOPNOTSUPP β€” опСрацията Π΅ посочила, Ρ‡Π΅ с SECCOMP_GET_ACTION_AVAIL дСйствиСто Π΅ Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΎ, Π½ΠΎ ядрото Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π²Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅;

β€” ESRCH β€” възникна ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ синхронизацията Π½Π° Π΄Ρ€ΡƒΠ³ ΠΏΠΎΡ‚ΠΎΠΊ;

β€” ENOSYS β€” няма трасировач, ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ΅Π½ към дСйствиСто SECCOMP_RET_TRACE.

prctl Π΅ систСмСн Π²ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π² потрСбитСлското пространство Π΄Π° управлява (задСля ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°) ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ аспСкти Π½Π° процСса, ΠΊΠ°Ρ‚ΠΎ порядков Π½ΠΎΠΌΠ΅Ρ€ Π½Π° Π±Π°ΠΉΡ‚ΠΎΠ²Π΅, ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΡ‚ΠΎΡ†ΠΈ, Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΈ изчислСния (Seccomp), ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Perf ΠΈ Π΄Ρ€.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ BPF Seccomp

Π’ΡƒΠΊ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π΄Π²Π΅Ρ‚Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ ΠΏΠΎ-Ρ€Π°Π½ΠΎ дСйствия, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

β€” Ρ‰Π΅ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Seccomp BPF, която Ρ‰Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π° ΠΊΠ°Ρ‚ΠΎ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π² зависимост ΠΎΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ;

β€” Ρ‰Π΅ Π·Π°Ρ€Π΅Π΄ΠΈΠΌ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ prctl.

ΠŸΡŠΡ€Π²ΠΎ, Π½ΡƒΠΆΠ½ΠΈ са заглавия ΠΎΡ‚ стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ ядрото Π½Π° Linux:

#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° изпълним Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, трябва Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ ядрото Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ΠΎ с CONFIG_SECCOMP ΠΈ CONFIG_SECCOMP_FILTER, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° y. На Ρ€Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° машина Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ Ρ‚Π°ΠΊΠ°:

cat /proc/config.gz | zcat | grep -i CONFIG_SECCOMP

ΠžΡΡ‚Π°Π½Π°Π»Π°Ρ‚Π° част ΠΎΡ‚ ΠΊΠΎΠ΄Π° прСдставлява функция install_filter, ΡΡŠΡΡ‚ΠΎΡΡ‰Π° сС ΠΎΡ‚ Π΄Π²Π΅ части. ΠŸΡŠΡ€Π²Π°Ρ‚Π° част ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° нашия списък с инструкции Π·Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ BPF:

static int install_filter(int nr, int arch, int error) {
  struct sock_filter filter[] = {
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
  };

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ сС Π·Π°Π΄Π°Π²Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° макроситС BPF_STMT ΠΈ BPF_JUMP, Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π² Ρ„Π°ΠΉΠ»Π° linux/filter.h.
НСка ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ инструкциитС.

β€” BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) β€” систСмата Π·Π°Ρ€Π΅ΠΆΠ΄Π° ΠΈ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ²Π° с BPF_LD ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π΄ΡƒΠΌΠ° BPF_W, ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ с фиксимирано отмСстванС BPF_ABS.

β€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) β€” провСрява с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° BPF_JEQ, Π΄Π°Π»ΠΈ стойността Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π² константния Π°ΠΊΡƒΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ BPF_K Π΅ Ρ€Π°Π²Π½Π° Π½Π° arch. Ако Π΅ Ρ‚Π°ΠΊΠ°, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° с отмСстванС 0 към слСдващата инструкция, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай, Π·Π° Π΄Π° ΠΈΠ·Π΄Π°Π΄Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°, скача с отмСстванС 3 (Π² Ρ‚ΠΎΠ·ΠΈ случай), Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ arch Π½Π΅ съвпада.

β€” BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) β€” Π·Π°Ρ€Π΅ΠΆΠ΄Π° ΠΈ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ²Π° с BPF_LD ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π΄ΡƒΠΌΠ° BPF_W, която Π΅ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ сС Π² фиксирано отмСстванС BPF_ABS.

β€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) β€” сравнява Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ със стойността Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° nr. Ако са Ρ€Π°Π²Π½ΠΈ, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° към слСдващата инструкция ΠΈ забранява систСмния ΠΏΠΎΠ²ΠΈΠΊ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ с SECCOMP_RET_ALLOW.

β€” BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)) β€” ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° с BPF_RET ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΈΠ·Π΄Π°Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ° SECCOMP_RET_ERRNO с Π½ΠΎΠΌΠ΅Ρ€ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° err.

β€” BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) β€” ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° с BPF_RET ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° систСмния ΠΏΠΎΠ²ΠΈΠΊ с SECCOMP_RET_ALLOW.

SECCOMP β€” Π’ΠžΠ’Π Π• CBPF
МоТС Π΄Π° Π²ΠΈ интСрСсува Π·Π°Ρ‰ΠΎ вмСсто ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ ΠΎΠ±Π΅ΠΊΡ‚ ELF ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° C, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° с JIT, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° списък с инструкции.

Има Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° Ρ‚ΠΎΠ²Π°.

β€’ ΠŸΡŠΡ€Π²ΠΎ, Seccomp ΠΏΡ€ΠΈΠ»Π°Π³Π° cBPF (класичСски BPF), Π° Π½Π΅ eBPF, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°: няма рСгистри, Π° само Π°ΠΊΡƒΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° послСдния Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ изчислСнията, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

β€’ На Π²Ρ‚ΠΎΡ€ΠΎ място, Seccomp ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» Π½Π° масив ΠΎΡ‚ инструкции BPF Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅. ΠœΠ°ΠΊΡ€ΠΎΡΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅, просто ΠΏΠΎΠΌΠ°Π³Π°Ρ‚ Π΄Π° сС опрСдСлят Ρ‚Π΅Π·ΠΈ инструкции Π² ΡƒΠ΄ΠΎΠ±Π½Π° Π·Π° програмиститС Ρ„ΠΎΡ€ΠΌΠ°.

Ако ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΠΏΠΎΠΌΠΎΡ‰, Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Ρ‚Π°Π·ΠΈ сборка, Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ псСвдокода, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π°Π²ΠΈ ΡΡŠΡ‰ΠΎΡ‚ΠΎ:

if (arch != AUDIT_ARCH_X86_64) {
    return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
    return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;

Π‘Π»Π΅Π΄ опрСдСлянСто Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° Π² структурата socket_filter, трябва Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ sock_fprog, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° ΠΊΠΎΠ΄Π° ΠΈ изчислСната дълТина Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°. Π’Π°Π·ΠΈ структура Π΄Π°Π½Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° обявяванС Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° процСса Π² ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎ:

struct sock_fprog prog = {
   .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
   .filter = filter,
};

ΠžΡΡ‚Π°Π²Π° само Π΅Π΄Π½ΠΎ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ във функцията install_filter – Π΄Π° Π·Π°Ρ€Π΅Π΄ΠΈΠΌ самата ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°! Π—Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ prctl, Π²Π·ΠΈΠΌΠ°ΠΉΠΊΠΈ PR_SET_SECCOMP ΠΊΠ°Ρ‚ΠΎ опция, Π·Π° Π΄Π° Π²Π»Π΅Π·Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΈ изчислСния. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Π΄Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° SECCOMP_MODE_FILTER, ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° prog ΠΎΡ‚ Ρ‚ΠΈΠΏ sock_fprog:

  if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
    perror("prctl(PR_SET_SECCOMP)");
    return 1;
  }
  return 0;
}

Накрая, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° функция install_filter, Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° трябва Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΌΠ΅ prctl, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ PR_SET_NO_NEW_PRIVS Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ изпълнСниС ΠΈ Ρ‚Π°ΠΊΠ° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ситуация, Π² която Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡ‚Π΅ процСси ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ ΠΏΠΎ-ΡˆΠΈΡ€ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΎΡ‚ родитСлскитС. ΠŸΡ€ΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ слСднитС повиквания Π½Π° prctl във функцията install_filter, Π±Π΅Π· Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡ€Π°Π²Π° root.

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ функцията install_filter. Π©Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π°ΠΌΠ΅ всички систСмни повиквания write, ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‰ΠΈ сС с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° X86-64, ΠΈ просто Ρ‰Π΅ Π΄Π°Π΄Π΅ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, забраняващо всички ΠΎΠΏΠΈΡ‚ΠΈ. Π‘Π»Π΅Π΄ установка Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡŠΡ€Π²ΠΈΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚:

int main(int argc, char const *argv[]) {
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
   perror("prctl(NO_NEW_PRIVS)");
   return 1;
  }
   install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
  return system(argv[1]);
 }

Π”Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ. Π—Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠ»ΠΈ clang, ΠΈΠ»ΠΈ gcc; Π² ΠΊΠΎΠΉΡ‚ΠΎ ΠΈ Π΄Π° Π΅ случай, Ρ‚ΠΎΠ²Π° Π΅ просто ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ»Π° main.c Π±Π΅Π· спСциални ΠΎΠΏΡ†ΠΈΠΈ:

clang main.c -o filter-write

ΠšΠ°ΠΊΡ‚ΠΎ бСшС посочСно, Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ…ΠΌΠ΅ всички записи Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎΠ²Π°, Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която Π½Π΅Ρ‰ΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° – ls ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±ΡŠΡ€ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС Π΄ΡŠΡ€ΠΆΠΈ:

ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Апр 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Апр 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Апр 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Апр 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Апр 28 21:08 main.c

ЧудСсно! Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°-ΠΎΠ±ΠΎΠ»ΠΊΠ°: просто ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която искамС Π΄Π° тСствамС, ΠΊΠ°Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚:

.\/filter-write "ls -la"

Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π΄Π°Π²Π° напълно ΠΏΡ€Π°Π·Π΅Π½ ΠΈΠ·Ρ…ΠΎΠ΄. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ strace, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ сС случва:

strace -f .\/filter-write "ls -la"

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ силно ΡΡŠΠΊΡ€Π°Ρ‚Π΅Π½, Π½ΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° част ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ записитС сС Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ с Π³Ρ€Π΅ΡˆΠΊΠ° EPERM β€” ΡΡŠΡ‰Π°Ρ‚Π°, която настроихмС. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π½ΠΈΡ‰ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ систСмния ΠΏΠΎΠ²ΠΈΠΊ write:

[pid 25099] write(2, "ls: ", 4) = -1 EPERM (ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π΅ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°)
[pid 25099] write(2, "Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ запис", 11) = -1 EPERM (ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π΅ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°)
[pid 25099] write(2, "n", 1) = -1 EPERM (ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π΅ Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°)

Π‘Π΅Π³Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ Seccomp BPF ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ Π΄ΠΎΠ±Ρ€Π° прСдстава Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ с Π½Π΅Π³ΠΎ. Но Π½Π΅ Π±ΠΈΡ…Ρ‚Π΅ Π»ΠΈ искали Π΄Π° постигнСтС ΡΡŠΡ‰ΠΎΡ‚ΠΎ с eBPF вмСсто cBPF, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ цялата ΠΌΡƒ ΠΌΠΎΡ‰?

ΠšΠΎΠ³Π°Ρ‚ΠΎ става Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° eBPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ Ρ…ΠΎΡ€Π° мислят, Ρ‡Π΅ просто Π³ΠΈ ΠΏΠΈΡˆΠ°Ρ‚ ΠΈ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Ρ‚ с администраторски ΠΏΡ€Π°Π²Π°. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Ρ‚Π²ΡŠΡ€Π΄Π΅Π½ΠΈΠ΅ Π΅ Π² основни Π»ΠΈΠ½ΠΈΠΈ вярно, ядрото Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ eBPF Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π°. Π’Π΅Π·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ сС Π½Π°Ρ€ΠΈΡ‡Π°Ρ‚ ΠΊΠ°ΠΏΠ°Π½ΠΈ BPF LSM.

Капани BPF LSM

Π—Π° Π΄Π° осигури нСзависимо ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° систСмнитС ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, LSM Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° концСпцията Π·Π° ΠΊΠ°ΠΏΠ°Π½ΠΈ. ВСхничСски, ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ към ΠΊΠ°ΠΏΠ°Π½ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° систСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, Π½ΠΎ Π΅ нСзависимо ΠΎΡ‚ систСмата ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½ΠΎ с инфраструктурата. LSM прСдоставя Π½ΠΎΠ²Π° концСпция, Π² която Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° абстракция ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π·Π° избягванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° със систСмни повиквания Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ.

Към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° написванС Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π°, ядрото имашС сСдСм ΠΊΠ°ΠΏΠ°Π½Π°, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, Π° SELinux бСшС СдинствСният Π²Π³Ρ€Π°Π΄Π΅Π½ LSM, ΠΊΠΎΠΉΡ‚ΠΎ Π³ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΡˆΠ΅.

Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΊΠ°ΠΏΠ°Π½ΠΈΡ‚Π΅ Π΅ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π° ядрото Π² Ρ„Π°ΠΉΠ»Π° include/linux/security.h:

extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);

Всяка ΠΎΡ‚ тях Ρ‰Π΅ сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Ρ‚Π°ΠΏΠΈ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ:

β€” security_bpf β€” ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΡ‚Π΅ систСмни повиквания BPF;

β€” security_bpf_map β€” провСрява, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ядрото Π²Ρ€ΡŠΡ‰Π° Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор Π·Π° ΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π°;

β€” security_bpf_prog β€” провСрява, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ядрото Π²Ρ€ΡŠΡ‰Π° Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° eBPF;

β€” security_bpf_map_alloc β€” провСрява, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° бСзопасност Π² BPF ΠΊΠ°Ρ€Ρ‚ΠΈΡ‚Π΅ Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ;

β€” security_bpf_map_free β€” провСрява, Π΄Π°Π»ΠΈ почистванСто Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° бСзопасност Π² BPF ΠΊΠ°Ρ€Ρ‚ΠΈΡ‚Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°;

β€” security_bpf_prog_alloc β€” провСрява, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° бСзопасност Π² BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ;

β€” security_bpf_prog_free β€” провСрява, Π΄Π°Π»ΠΈ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° бСзопасност Π² BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ сС очиства.

Π‘Π΅Π³Π°, Π²ΠΈΠΆΠ΄Π°ΠΉΠΊΠΈ всичко Ρ‚ΠΎΠ²Π°, Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅: идСята Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ LSM BPF Π΅, Ρ‡Π΅ Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° осигурят Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π° всСки ΠΎΠ±Π΅ΠΊΡ‚ eBPF, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°ΠΉΠΊΠΈ, Ρ‡Π΅ само Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠ°Ρ€Ρ‚ΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅.

РСзюмС

БСзопасността Π½Π΅ Π΅ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΡ‚Π΅ унивСрсално Π·Π° всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ искатС Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ способността Π΄Π° Π·Π°Ρ‰ΠΈΡ‚Π°Π²Π°Ρ‚Π΅ систСмитС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π° ΠΈ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ. Π˜ΡΠΊΠ°Ρ‚Π΅ Π΄Π° вярватС ΠΈΠ»ΠΈ Π½Π΅, Π½Π°ΠΉ-добрият Π½Π°Ρ‡ΠΈΠ½ Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ систСмата Π΅ Π΄Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π° Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ намаляванСто Π½Π° бСзопасността Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΈΠ²ΠΎ Π΄Π° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ цялата систСма. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ядрото Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° голяма Ρ€Π°Π±ΠΎΡ‚Π°, прСдоставяйки Π½ΠΈ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ слоСвС ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° взаимодСйствиС. НадявамС сС, Ρ‡Π΅ смС Π²ΠΈ Π΄Π°Π»ΠΈ Π΄ΠΎΠ±Ρ€Π° прСдстава Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ са слоСвСтС ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅, Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с тях.

Π—Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅

Π”Π΅ΠΉΠ²ΠΈΠ΄ ΠšΠ°Π»Π°Π²Π΅Ρ€Π° Π΅ тСхничСски Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ Π² Netlify. Π’ΠΎΠΉ Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈΠ» Π² ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° Docker ΠΈ Π΅ участвал Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° инструмСнти Runc, Go ΠΈ BCC, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄. Π˜Π·Π²Π΅ΡΡ‚Π΅Π½ Π΅ със своята Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ Docker ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ Π½Π° СкосистСмата ΠΎΡ‚ плъгини Π½Π° Docker. Π”Π΅ΠΉΠ²ΠΈΠ΄ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ заинтСрСсован ΠΎΡ‚ flame graphs ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ сС стрСми към оптимизация Π½Π° производитСлността.

Π›ΠΎΡ€Π΅Π½Ρ†ΠΎ Π€ΠΎΠ½Ρ‚Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² Π΅ΠΊΠΈΠΏΠ° Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° софтуСр с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ Π² Sysdig, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ основно сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° с Falco β€” ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Cloud Native Computing Foundation, ΠΊΠΎΠΉΡ‚ΠΎ осигурява сигурността Π½Π° срСдата Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈΠ΅ Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ Ρ‡Ρ€Π΅Π· ΠΌΠΎΠ΄ΡƒΠ» Π½Π° ядрото ΠΈ eBPF. Π’ΠΎΠΉ Π΅ Π·Π°ΠΏΠ°Π»Π΅Π½ ΠΏΠΎ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ‚Π΅ систСми, софтуСрно Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΌΡ€Π΅ΠΆΠΈ, ядрото Π½Π° Linux ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° производитСлността.

Β» По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ с ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Π½Π° сайта Π½Π° издатСля
Β» Π‘ΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅
» Извадка

Π—Π° Π₯Π°Π±Ρ€ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 25% с Π²Π°ΡƒΡ‡Π΅Ρ€Π° β€” Linux

Π‘Π»Π΅Π΄ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΏΠ»Π°Ρ‰Π°Π½Π΅Ρ‚ΠΎ Π·Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π½Π°Ρ‚Π° вСрсия Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π°, Π΅Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π° Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½Π° Π½Π° ΠΈΠΌΠ΅ΠΉΠ»Π° Π²ΠΈ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster