Книга за слСдСњС на BPF за Linux

Книга Π·Π° слСдСњС Π½Π° BPF Π·Π° LinuxΠ—Π΄Ρ€Π°Π²ΠΎ, ΠΆΠΈΡ‚Π΅Π»ΠΈ Π½Π° Π₯Π°Π±Ρ€ΠΎ! Π’ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° машина BPF Π΅ Π΅Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Линукс. НСговата ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° ќС ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π° систСмскитС ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈ Π΄Π° Π½Π°Ρ˜Π΄Π°Ρ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ Π΄Π° Π³ΠΈ Ρ€Π΅ΡˆΠ°Ρ‚ Π΄ΡƒΡ€ΠΈ ΠΈ Π½Π°Ρ˜ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. ЌС Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΡˆΡ‚ΠΎ Π³ΠΎ слСдат ΠΈ ΠΌΠ΅Π½ΡƒΠ²Π°Π°Ρ‚ ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚, ΠΊΠ°ΠΊΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ΄ Π·Π° слСдСњС Π½Π° настани Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ повСќС. Π”Π΅Ρ˜Π²ΠΈΠ΄ ΠšΠ°Π»Π°Π²Π΅Ρ€Π° ΠΈ Π›ΠΎΡ€Π΅Π½Ρ†ΠΎ Π€ΠΎΠ½Ρ‚Π°Π½Π° ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° ја ΠΎΡ‚ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΌΠΎΡœΡ‚Π° Π½Π° BPF. ΠŸΡ€ΠΎΡˆΠΈΡ€Π΅Ρ‚Π΅ Π³ΠΎ Π²Π°ΡˆΠ΅Ρ‚ΠΎ знаСњС Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° пСрформанси, Π²ΠΌΡ€Π΅ΠΆΡƒΠ²Π°ΡšΠ΅, бСзбСдност. - ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ‚Π΅ BPF Π·Π° слСдСњС ΠΈ ΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Линукс. - Π˜Π½Ρ˜Π΅ΠΊΡ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΊΠΎΠ΄ Π·Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ слСдСњС Π½Π° настанитС Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π±Π΅Π· Π΄Π° ΠΌΠΎΡ€Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΎ рСстартиратС систСмот. β€” ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΊΠΎΠ΄ Π²ΠΎ C, Go ΠΈΠ»ΠΈ Python. - ΠŸΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ја ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° со ΠΏΠΎΡΠ΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈΠΎΡ‚ циклус Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° BPF.

БСзбСдност Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Linux, Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ карактСристики ΠΈ Seccomp

BPF ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° моќСн Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΏΡ€ΠΎΡˆΠΈΡ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π±Π΅Π· Π΄Π° сС ΠΆΡ€Ρ‚Π²ΡƒΠ²Π° стабилноста, бСзбСдноста ΠΈΠ»ΠΈ Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π°. ΠŸΠΎΡ€Π°Π΄ΠΈ ΠΎΠ²Π°Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΈΡ‚Π΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ смСтаа Π΄Π΅ΠΊΠ° Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€Π° идСја Π΄Π° ја искористат Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° разновидност Π·Π° Π΄Π° ја ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ ΠΈΠ·ΠΎΠ»Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° процСситС Π²ΠΎ Seccomp со ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Seccomp ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ BPF, исто Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΊΠ°ΠΊΠΎ Seccomp BPF. Π’ΠΎ ΠΎΠ²Π° поглавјС ќС објаснимС ΡˆΡ‚ΠΎ Π΅ Seccomp ΠΈ ΠΊΠ°ΠΊΠΎ сС користи. ΠŸΠΎΡ‚ΠΎΠ° ќС Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ Seccomp Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. ПослС Ρ‚ΠΎΠ°, ќС Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈΡ‚Π΅ ΠΊΡƒΠΊΠΈ BPF ΠΊΠΎΠΈ сС Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ΠΈ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π·Π° бСзбСдноснитС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° Linux.

Линукс бСзбСдноснитС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ (LSM) сС Ρ€Π°ΠΌΠΊΠ° која ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° Π·Π±ΠΈΡ€ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС користат Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ бСзбСдносни ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° стандардизиран Π½Π°Ρ‡ΠΈΠ½. LSM ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ Π΄Ρ€Π²ΠΎΡ‚ΠΎ Π½Π° ΠΈΠ·Π²ΠΎΡ€ΠΎΡ‚ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС Apparmor, SELinux ΠΈ Tomoyo.

Π”Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ со Π΄ΠΈΡΠΊΡƒΡΠΈΡ˜Π° Π·Π° моТноститС Π½Π° Linux.

Бпособности

Π‘ΡƒΡˆΡ‚ΠΈΠ½Π°Ρ‚Π° Π½Π° моТноститС Π½Π° Linux Π΅ Π΄Π΅ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅Ρ‚Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π° Π½Π° Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½ процСс Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° Π·Π°Π΄Π°Ρ‡Π°, Π½ΠΎ Π±Π΅Π· ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° suid Π·Π° Ρ‚Π°Π° Ρ†Π΅Π», ΠΈΠ»ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ процСсот ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½, Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°Ρ˜ΡœΠΈ ја моТноста Π·Π° Π½Π°ΠΏΠ°Π΄ ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΌΡƒ Π½Π° процСсот Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ Π²Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½Π° ΠΏΠΎΡ€Ρ‚Π°, Π΄Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ 80, намСсто Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° процСсот ΠΊΠ°ΠΊΠΎ root, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Сдноставно Π΄Π° ΠΈ ја Π΄Π°Π΄Π΅Ρ‚Π΅ способноста CAP_NET_BIND_SERVICE.

РазмислСтС Π·Π° Go ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° со ΠΈΠΌΠ΅ main.go:

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

Оваа ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° опслуТува HTTP сСрвСр Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 80 (ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½Π° ΠΏΠΎΡ€Ρ‚Π°). ΠžΠ±ΠΈΡ‡Π½ΠΎ Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ вСднаш ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°:

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

ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, бидСјќи Π½Π΅ Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡ€Π°Π²Π° Π·Π° root, овој ΠΊΠΎΠ΄ ќС Ρ„Ρ€Π»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π°:

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1

capsh (ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ Π½Π° школка) Π΅ Π°Π»Π°Ρ‚ΠΊΠ° која Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° школка со спСцифичСн сСт Π½Π° способности.

Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ вСќС бСшС спомСнато, намСсто Π΄Π° Π΄Π°Π²Π°Ρ‚Π΅ цСлосни ΠΏΡ€Π°Π²Π° Π·Π° root, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½ΠΎ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° со ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° способноста cap_net_bind_service Π·Π°Π΅Π΄Π½ΠΎ со сè Π΄Ρ€ΡƒΠ³ΠΎ ΡˆΡ‚ΠΎ Π΅ вСќС Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π²ΠΎ capsh:

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

Π”Π° Π³ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ овој Ρ‚ΠΈΠΌ ΠΌΠ°Π»ΠΊΡƒ.

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

ΠŸΠΎΠ²Ρ€Π·Π°Π½ΠΈΡ‚Π΅ способности сС посСбСн Π²ΠΈΠ΄ Π½Π° способности ΠΊΠΎΠΈ сС наслСдСни ΠΎΠ΄ дСтскитС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ³Π° Ρ‚Π΅ΠΊΠΎΠ²Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° со помош Π½Π° execve(). МоТС Π΄Π° сС наслСдат само способности ΡˆΡ‚ΠΎ Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π°Ρ‚, ΠΈΠ»ΠΈ со Π΄Ρ€ΡƒΠ³ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, ΠΊΠ°ΠΊΠΎ способности Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π°.

Π’Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ сС ΠΏΡ€Π°ΡˆΡƒΠ²Π°Ρ‚Π΅ ΡˆΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈ +eip ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС ја Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ способноста Π²ΠΎ ΠΎΠΏΡ†ΠΈΡ˜Π°Ρ‚Π° --caps. ОвиС Π·Π½Π°ΠΌΠ΅Π½Ρ†Π° сС користат Π·Π° Π΄Π° сС ΡƒΡ‚Π²Ρ€Π΄ΠΈ Π΄Π΅ΠΊΠ° способноста:

-ΠΌΠΎΡ€Π° Π΄Π° сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° (p);

- достапни Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° (Π΄);

-ΠΌΠΎΠΆΠ΅ Π΄Π° сС наслСди со Π΄Π΅Ρ‚Π΅ процСси (i).

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ сакамС Π΄Π° користимС cap_net_bind_service, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π° со Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ e. ΠŸΠΎΡ‚ΠΎΠ° ќС ја Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ школка Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°. Ова ќС Π³ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° моТноститС Π±ΠΈΠ½Π°Ρ€Π½ΠΎ ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΠ΅ со Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅Ρ‚ΠΎ i. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, сакамС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½Π° (ΠΎΠ²Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ Π±Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° UID) со стр. ИзглСда ΠΊΠ°ΠΊΠΎ cap_net_bind_service+eip.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ss. АјдС ΠΌΠ°Π»ΠΊΡƒ Π΄Π° Π³ΠΎ скратимС ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Π·Π° Π΄Π° сС Π²ΠΊΠ»ΠΎΠΏΠΈ Π½Π° страницата, Π½ΠΎ ќС ја ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π°Ρ‚Π° ΠΏΠΎΡ€Ρ‚Π° ΠΈ корисничкиот ID освСн 0, Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ 65:

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

Π’ΠΎ овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€ користСвмС capsh, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ школка ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ libcap. Π—Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΈΠ΄Π΅Ρ‚Π΅ man 3 libcap.

Кога ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, доста чСсто Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚ ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π½Π΅ Π³ΠΈ Π·Π½Π°Π΅ ситС карактСристики ΡˆΡ‚ΠΎ ѝ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ; ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, ΠΎΠ²ΠΈΠ΅ карактСристики ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½Π°Ρ‚ Π²ΠΎ Π½ΠΎΠ²ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΠΈ.

Π—Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΄Π° Π³ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ моТноститС Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја Π·Π΅ΠΌΠ΅ΠΌΠ΅ Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° способна Π·Π° BCC, која ја поставува kprobe Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ cap_capable:

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

МоТСмС Π΄Π° Π³ΠΎ постигнСмС истото со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° bpftrace со Сднослојна kprobe Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ cap_capable:

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

Ова ќС ΠΈΠ·Π»Π΅Π·Π΅ Π½Π΅ΡˆΡ‚ΠΎ слично Π½Π° слСдново Π°ΠΊΠΎ способноститС Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° сС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ ΠΏΠΎ kprobe:

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

ΠŸΠ΅Ρ‚Ρ‚Π°Ρ‚Π° ΠΊΠΎΠ»ΠΎΠ½Π° сС способноститС ΡˆΡ‚ΠΎ ΠΌΡƒ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π½Π° процСсот, ΠΈ бидСјќи овој ΠΈΠ·Π»Π΅Π· Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° нСрСвизорски настани, Π³ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ ситС нСрСвизорски ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π°Ρ‚Π° способност со Π·Π½Π°ΠΌΠ΅Π½Ρ†Π΅Ρ‚ΠΎ Π·Π° Ρ€Π΅Π²ΠΈΠ·ΠΈΡ˜Π° (послСдно Π²ΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚) поставСно Π½Π° 1. Бпособност. Π΅Π΄Π΅Π½ ΡˆΡ‚ΠΎ Π½Γ¨ интСрСсира Π΅ CAP_NET_BIND_SERVICE, Ρ‚ΠΎΡ˜ Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ ΠΊΠ°ΠΊΠΎ константа Π²ΠΎ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° include/uapi/linux/ability.h со ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 10:

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

ΠœΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ чСсто сС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС runC ΠΈΠ»ΠΈ Docker Π·Π° Π΄Π° ΠΈΠΌ сС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π²ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ, Π½ΠΎ ΠΈΠΌ сС Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΈ само моТноститС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Кога Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π±Π°Ρ€Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ способности, Docker ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ --cap-add:

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

Оваа ΠΊΠΎΠΌΠ°Π½Π΄Π° ќС ΠΌΡƒ Π΄Π°Π΄Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚ способност CAP_NET_ADMIN, Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΌΡƒ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° ΠΌΡ€Π΅ΠΆΠ½Π° врска Π·Π° Π΄Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅ dummy0 ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΎΡ‚.

Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ користимС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅, Π½ΠΎ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° која Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° програмски Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ сопствСни Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ.

Seccomp

Seccomp Π΅ ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠ° Π·Π° Secure Computing ΠΈ Π΅ бСзбСдносСн слој ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Linux ΡˆΡ‚ΠΎ ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π°Ρ‚ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ. Иако Seccomp Π΅ спорСдлив ΠΏΠΎ способности со Linux, Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° способност Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π° со ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ пофлСксибилСн Π²ΠΎ спорСдба со Π½ΠΈΠ².

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Seccomp ΠΈ Linux Π½Π΅ сС исклучуваат мСѓусСбно ΠΈ чСсто сС користат Π·Π°Π΅Π΄Π½ΠΎ Π·Π° Π΄Π° ΠΈΠΌΠ°Π°Ρ‚ корист ΠΎΠ΄ Π΄Π²Π°Ρ‚Π° пристапи. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС сакатС Π΄Π° ΠΌΡƒ ја Π΄Π°Π΄Π΅Ρ‚Π΅ Π½Π° Π΅Π΄Π΅Π½ процСс способноста CAP_NET_ADMIN, Π½ΠΎ Π΄Π° Π½Π΅ ΠΌΡƒ Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ Π΄Π° ΠΏΡ€ΠΈΡ„Π°ΡœΠ° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ Π·Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ, Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ˜ΡœΠΈ Π³ΠΈ систСмскитС ΠΏΠΎΠ²ΠΈΡ†ΠΈ ΠΏΡ€ΠΈΡ„Π°ΡœΠ°Ρ˜ ΠΈ ΠΏΡ€ΠΈΡ„Π°ΡœΠ°Ρ˜4.

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

Seccomp Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°Π°Ρ‚ со prctl ΠΏΡ€Π΅ΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° PR_SET_SECCOMP. ОвиС Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ ΠΈΠΌΠ°Π°Ρ‚ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° BPF која сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° Π·Π° сСкој ΠΏΠ°ΠΊΠ΅Ρ‚ Seccomp прСтставСн со структурата seccomp_data. Оваа структура содрТи Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ ΠΊΠΎΠ½ инструкциитС Π½Π° процСсорот Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΈ максимум ΡˆΠ΅ΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π·Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ, ΠΈΠ·Ρ€Π°Π·Π΅Π½ΠΈ ΠΊΠ°ΠΊΠΎ uint64.

Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° структурата seccomp_data ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° linux/seccomp.h:

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

Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΠ΄ ΠΎΠ²Π°Π° структура, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅ спорСд систСмскиот ΠΏΠΎΠ²ΠΈΠΊ, Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π΄Π²Π΅Ρ‚Π΅.

По Π΄ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° сСкој ΠΏΠ°ΠΊΠ΅Ρ‚ Seccomp, Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΠΌΠΎΡ€Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π° Π΄Π° донСсС ΠΊΠΎΠ½Π΅Ρ‡Π½Π° ΠΎΠ΄Π»ΡƒΠΊΠ° ΠΈ Π΄Π° ΠΌΡƒ ΠΊΠ°ΠΆΠ΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΡˆΡ‚ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈ слСдно. ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΠΎΠ΄Π»ΡƒΠΊΠ° сС ΠΈΠ·Ρ€Π°Π·ΡƒΠ²Π° со Π΅Π΄Π½Π° ΠΎΠ΄ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈΡ‚Π΅ врСдности (ΡˆΠΈΡ„Ρ€ΠΈ Π·Π° статус).

- SECCOMP_RET_KILL_PROCESS - Π³ΠΎ ΡƒΠ±ΠΈΠ²Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ процСс вСднаш ΠΏΠΎ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ ΡˆΡ‚ΠΎ Π½Π΅ Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ°.

- SECCOMP_RET_KILL_THREAD - ја ΠΏΡ€Π΅ΠΊΠΈΠ½ΡƒΠ²Π° Ρ‚Π΅ΠΊΠΎΠ²Π½Π°Ρ‚Π° нишка вСднаш ΠΏΠΎ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ ΡˆΡ‚ΠΎ Π½Π΅ Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ°.

β€” SECCOMP_RET_KILL β€” алијас Π·Π° SECCOMP_RET_KILL_THREAD, оставСн Π·Π° компатибилност Π½Π°Π½Π°Π·Π°Π΄.

- SECCOMP_RET_TRAP - систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π΅ Π·Π°Π±Ρ€Π°Π½Π΅Ρ‚, Π° сигналот SIGSYS (лош систСмски ΠΏΠΎΠ²ΠΈΠΊ) сС ΠΈΡΠΏΡ€Π°ΡœΠ° Π΄ΠΎ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°.

- SECCOMP_RET_ERRNO - БистСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½, Π° Π΄Π΅Π» ΠΎΠ΄ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π°Ρ‚Π° врСдност Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ SECCOMP_RET_DATA сС прСнСсува Π½Π° корисничкиот простор ΠΊΠ°ΠΊΠΎ врСдност Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°. Π’ΠΎ зависност ΠΎΠ΄ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°, сС Π²Ρ€Π°ΡœΠ°Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ врСдности Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ°. Бписокот со Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π΅ Π΄Π°Π΄Π΅Π½ Π²ΠΎ слСдниот Π΄Π΅Π».

- SECCOMP_RET_TRACE - Π‘Π΅ користи Π·Π° ΠΈΠ·Π²Π΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚Ρ€Π°Π³Π°Ρ‡ΠΎΡ‚ Π½Π° ptrace ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ - PTRACE_O_TRACESECCOMP Π·Π° ΠΏΡ€Π΅ΡΡ€Π΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ ΠΊΠΎΠ³Π° сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ Π·Π° Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° Ρ‚ΠΎΡ˜ процСс. Ако трасСрот Π½Π΅ Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½, сС Π²Ρ€Π°ΡœΠ° Π³Ρ€Π΅ΡˆΠΊΠ°, errno сС поставува Π½Π° -ENOSYS ΠΈ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π½Π΅ сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°.

- SECCOMP_RET_LOG - систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π΅ Ρ€Π΅ΡˆΠ΅Π½ ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°Π½.

- SECCOMP_RET_ALLOW - систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π΅ Сдноставно Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½.

ptrace Π΅ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° слСдСњС Π²ΠΎ процСс Π½Π°Ρ€Π΅Ρ‡Π΅Π½ tracee, со моТност Π·Π° слСдСњС ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° процСсот. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π·Π° слСдСњС ΠΌΠΎΠΆΠ΅ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° влијаС Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° Π³ΠΈ ΠΌΠ΅Π½ΡƒΠ²Π° мСморискитС рСгистри Π½Π° Ρ‚Ρ€Π°Π³Π°. Π’ΠΎ контСкстот Seccomp, ptrace сС користи ΠΊΠΎΠ³Π° сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° ΠΎΠ΄ статусната ΡˆΠΈΡ„Ρ€Π° SECCOMP_RET_TRACE, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ трасСрот ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ спрСчи ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΈ Π΄Π° ја ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° сопствСната Π»ΠΎΠ³ΠΈΠΊΠ°.

Seccomp Π³Ρ€Π΅ΡˆΠΊΠΈ

Од Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅, Π΄ΠΎΠ΄Π΅ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со Seccomp, ќС Π½Π°ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠΈ сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°Π°Ρ‚ со ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π° врСдност ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ SECCOMP_RET_ERRNO. Π—Π° Π΄Π° ΠΏΡ€ΠΈΡ˜Π°Π²ΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°, систСмскиот ΠΏΠΎΠ²ΠΈΠΊ seccomp ќС Π²Ρ€Π°Ρ‚ΠΈ -1 намСсто 0.

Π‘Π»Π΅Π΄Π½ΠΈΠ²Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ сС ΠΌΠΎΠΆΠ½ΠΈ:

- EACCESS - На ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π½Π΅ ΠΌΡƒ Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΄Π° воспоставува систСмски ΠΏΠΎΠ²ΠΈΠΊ. Ова ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС случува Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° CAP_SYS_ADMIN ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΈΠ»ΠΈ no_new_privs Π½Π΅ Π΅ поставСно со prctl (ќС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° ΠΎΠ²Π° ΠΏΠΎΠ΄ΠΎΡ†Π½Π°);

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

β€” EINVAL β€” ΠΎΠ²Π΄Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ:

-Π±Π°Ρ€Π°Π½Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π° Π΅ Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚Π° ΠΈΠ»ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½Π° ΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²ΠΎ Ρ‚Π΅ΠΊΠΎΠ²Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°;

-Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡ‚Π΅ Π·Π½Π°ΠΌΠ΅Π½Ρ†Π° Π½Π΅ Π²Π°ΠΆΠ°Ρ‚ Π·Π° Π±Π°Ρ€Π°Π½Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°;

-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° BPF_ABS, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ со Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅, ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ја Π½Π°Π΄ΠΌΠΈΠ½Π΅ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° структурата seccomp_data;

-Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° инструкции ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π³ΠΎ Π½Π°Π΄ΠΌΠΈΠ½ΡƒΠ²Π° максимумот;

β€” ENOMEM β€” Π½Π΅ΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°;

- EOPNOTSUPP - ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° со SECCOMP_GET_ACTION_AVAIL Π΄Π΅Ρ˜ΡΡ‚Π²ΠΎΡ‚ΠΎ Π±ΠΈΠ»ΠΎ достапно, Π½ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ Π²ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ;

β€” ESRCH β€” сС појави ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ прСнос;

- ENOSYS - НСма ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π΅Π½ Ρ‚Ρ€Π°Π³Π°Ρ‡ Π·Π° Π΄Π΅Ρ˜ΡΡ‚Π²ΠΎΡ‚ΠΎ SECCOMP_RET_TRACE.

prctl Π΅ систСмски ΠΏΠΎΠ²ΠΈΠΊ кој Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° кориснички простор Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π° (поставува ΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°) спСцифични аспСкти Π½Π° процСсот, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС ΡˆΠΈΡ€ΠΎΡ‡ΠΈΠ½Π°Ρ‚Π° Π½Π° Π±Π°Ρ˜Ρ‚ΠΈ, ΠΈΠΌΠΈΡšΠ°Ρ‚Π° Π½Π° Π½ΠΈΡˆΠΊΠΈΡ‚Π΅, Π±Π΅Π·Π±Π΅Π΄Π½ΠΈΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅ (Seccomp), ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈΡ‚Π΅, настанитС Π½Π° Perf ΠΈΡ‚Π½.

Seccomp ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²ΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π·Π° пСсок, Π½ΠΎ Π½Π΅ Π΅. Seccomp Π΅ Π°Π»Π°Ρ‚ΠΊΠ° која ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π½Π° корисницитС Π΄Π° Ρ€Π°Π·Π²ΠΈΡ˜Π°Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° пСсок. Π‘Π΅Π³Π° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° со корисници сС ΠΊΡ€Π΅ΠΈΡ€Π°Π°Ρ‚ со помош Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ΄ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Seccomp.

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

ОвдС ќС ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π΄Π²Π΅Ρ‚Π΅ Π΄Π΅Ρ˜ΡΡ‚Π²Π° дискутирани ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ, ΠΈΠΌΠ΅Π½ΠΎ:

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

β€” Π²Ρ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ Π³ΠΎ Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ prctl.

ΠŸΡ€Π²ΠΎ Π²ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ заглавија ΠΎΠ΄ стандардната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Linux:

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

ΠŸΡ€Π΅Π΄ Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ со овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΡ€Π° Π΄Π° сС осигурамС Π΄Π΅ΠΊΠ° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π΅ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ со CONFIG_SECCOMP ΠΈ CONFIG_SECCOMP_FILTER поставСн Π½Π° y. На Ρ€Π°Π±ΠΎΡ‚Π½Π° машина ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ²Π° Π²Π°ΠΊΠ°:

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

ΠžΡΡ‚Π°Ρ‚ΠΎΠΊΠΎΡ‚ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ‚ Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΎΠ΄ Π΄Π²Π° Π΄Π΅Π»Π° install_filter. ΠŸΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π» ја содрТи Π½Π°ΡˆΠ°Ρ‚Π° листа Π½Π° инструкции Π·Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅ BPF:

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

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ сС поставСни со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΌΠ°ΠΊΡ€ΠΎΠ°Ρ‚Π° BPF_STMT ΠΈ BPF_JUMP Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° linux/filter.h.
АјдС Π΄Π° ΠΏΠΎΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½ΠΈΠ· упатствата.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - систСмот сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π° ΠΈ сС Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π° ΠΎΠ΄ BPF_LD Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Π·Π±ΠΎΡ€ΠΎΡ‚ BPF_W, ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС Π½Π°ΠΎΡ“Π°Π°Ρ‚ Π½Π° фиксно ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ BPF_ABS.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° со помош Π½Π° BPF_JEQ Π΄Π°Π»ΠΈ врСдноста Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π²ΠΎ константата Π½Π° Π°ΠΊΡƒΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ΠΎΡ‚ BPF_K Π΅ Π΅Π΄Π½Π°ΠΊΠ²Π° Π½Π° arch. Ако Π΅ Ρ‚Π°ΠΊΠ°, прСскокнува со ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ 0 Π½Π° слСдната ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π°, ΠΈΠ½Π°ΠΊΡƒ скока Π½Π° ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ 3 (Π²ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜) Π·Π° Π΄Π° сС Ρ„Ρ€Π»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° бидСјќи Π»Π°ΠΊΠΎΡ‚ Π½Π΅ сС совпаѓа.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Π‘Π΅ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π° ΠΈ сС Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π° ΠΎΠ΄ BPF_LD Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Π·Π±ΠΎΡ€ΠΎΡ‚ BPF_W, ΡˆΡ‚ΠΎ Π΅ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π±Ρ€ΠΎΡ˜ содрТан Π²ΠΎ фиксното ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° BPF_ABS.

β€” BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) β€” Π³ΠΎ спорСдува Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ со врСдноста Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° nr. Ако сС Π΅Π΄Π½Π°ΠΊΠ²ΠΈ, ΠΏΡ€Π΅ΠΌΠΈΠ½ΡƒΠ²Π° Π½Π° слСдната ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π° ΠΈ Π³ΠΎ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ, ΠΈΠ½Π°ΠΊΡƒ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° систСмски ΠΏΠΎΠ²ΠΈΠΊ со SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (Π³Ρ€Π΅ΡˆΠΊΠ° & SECCOMP_RET_DATA)) - ја ΠΏΡ€Π΅ΠΊΠΈΠ½ΡƒΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° со BPF_RET ΠΈ ΠΊΠ°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π° Π³Ρ€Π΅ΡˆΠΊΠ° SECCOMP_RET_ERRNO со Π±Ρ€ΠΎΡ˜ΠΎΡ‚ ΠΎΠ΄ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° err.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - ја ΠΏΡ€Π΅ΠΊΠΈΠ½ΡƒΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° со BPF_RET ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠΈ со помош Π½Π° SECCOMP_RET_ALLOW.

SECCOMP Π• CBPF
МоТСби сС ΠΏΡ€Π°ΡˆΡƒΠ²Π°Ρ‚Π΅ Π·ΠΎΡˆΡ‚ΠΎ сС користи список со инструкции намСсто ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ ELF ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° C составСна ΠΎΠ΄ JIT.

ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π·Π° ΠΎΠ²Π°.

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

β€’ Π’Ρ‚ΠΎΡ€ΠΎ, Seccomp ΠΏΡ€ΠΈΡ„Π°ΡœΠ° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ ΠΊΠΎΠ½ Π½ΠΈΠ·Π° ΠΎΠ΄ BPF инструкции Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ Π½ΠΈΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ. ΠœΠ°ΠΊΡ€ΠΎΠ°Ρ‚Π° ΡˆΡ‚ΠΎ Π³ΠΈ користСвмС Сдноставно ΠΏΠΎΠΌΠ°Π³Π°Π°Ρ‚ Π΄Π° сС спСцифицираат ΠΎΠ²ΠΈΠ΅ инструкции Π½Π° Π½Π°Ρ‡ΠΈΠ½ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ.

Ако Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° повСќС помош Π·Π° Ρ€Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π½Π° овој состав, размислСтС Π·Π° псСвдокодот ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ истото:

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

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ќС Π³ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π²ΠΎ структурата socket_filter, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ sock_fprog ΡˆΡ‚ΠΎ Π³ΠΎ содрТи ΠΊΠΎΠ΄ΠΎΡ‚ ΠΈ прСсмСтаната Π΄ΠΎΠ»ΠΆΠΈΠ½Π° Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚. Оваа структура Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° ΠΊΠ°ΠΊΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° процСсот Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°:

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

ΠžΡΡ‚Π°Π½ΡƒΠ²Π° само Π΅Π΄Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° install_filter - Π²Ρ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ ја самата ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°! Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π°, користимС prctl, зСмајќи Π³ΠΎ PR_SET_SECCOMP ΠΊΠ°ΠΊΠΎ ΠΎΠΏΡ†ΠΈΡ˜Π° Π·Π° Π΄Π° Π²Π»Π΅Π·Π΅ΠΌΠ΅ Π²ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π΅Π½ ΠΏΡ€Π΅ΡΠΌΠ΅Ρ‚ΡƒΠ²Π°ΡšΠ΅. ΠŸΠΎΡ‚ΠΎΠ° ΠΌΡƒ ΠΊΠ°ΠΆΡƒΠ²Π°ΠΌΠ΅ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠΎΡ‚ Π΄Π° Π³ΠΎ Π²Ρ‡ΠΈΡ‚Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ SECCOMP_MODE_FILTER, кој Π΅ содрТан Π²ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³ ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ sock_fprog:

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

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја користимС Π½Π°ΡˆΠ°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° install_filter, Π½ΠΎ ΠΏΡ€Π΅Π΄ Ρ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° користимС prctl Π·Π° Π΄Π° поставимС PR_SET_NO_NEW_PRIVS Π·Π° Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΎΡ‚ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ ΠΈ со Ρ‚ΠΎΠ° Π΄Π° ја ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌΠ΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΊΠΎΠ³Π° дСтскитС процСси Π΄ΠΎΠ±ΠΈΠ²Π°Π°Ρ‚ повСќС ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΎΠ΄ Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ. Π‘ΠΎ ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ слСднитС prctl ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° install_filter Π±Π΅Π· Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡ€Π°Π²Π° Π½Π° root.

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° install_filter. АјдС Π΄Π° Π³ΠΈ Π±Π»ΠΎΠΊΠΈΡ€Π°ΠΌΠ΅ ситС систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° X86-64 ΠΈ Сдноставно Π΄Π° Π΄Π°Π΄Π΅ΠΌΠ΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π° ΡˆΡ‚ΠΎ Π³ΠΈ Π±Π»ΠΎΠΊΠΈΡ€Π° ситС ΠΎΠ±ΠΈΠ΄ΠΈ. По ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π°ΠΌΠ΅ со ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚:

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

АјдС Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅. Π—Π° Π΄Π° ја ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° користимС ΠΈΠ»ΠΈ clang ΠΈΠ»ΠΈ gcc, Π²ΠΎ сСкој ΡΠ»ΡƒΡ‡Π°Ρ˜ Ρ‚ΠΎΠ° Π΅ само ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° main.c Π±Π΅Π· посСбни ΠΎΠΏΡ†ΠΈΠΈ:

clang main.c -o filter-write

Како ΡˆΡ‚ΠΎ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ, Π³ΠΈ Π±Π»ΠΎΠΊΠΈΡ€Π°Π²ΠΌΠ΅ ситС записи Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π—Π° Π΄Π° Π³ΠΎ тСстиратС ΠΎΠ²Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π²ΠΈ Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΡˆΡ‚ΠΎ Π΄Π°Π²Π° Π½Π΅ΡˆΡ‚ΠΎ - ls ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ Π΄ΠΎΠ±Π°Ρ€ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚. Π’Π°Π° ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС однСсува Π²Π°ΠΊΠ°:

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

ΠŸΡ€Π΅ΠΊΡ€Π°ΡΠ½ΠΎ! Π•Π²Π΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°: Едноставно ја прСнСсувамС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΡˆΡ‚ΠΎ сакамС Π΄Π° ја тСстирамС ΠΊΠ°ΠΊΠΎ ΠΏΡ€Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚:

./filter-write "ls -la"

Кога сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°, ΠΎΠ²Π°Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π° цСлосно ΠΏΡ€Π°Π·Π΅Π½ ΠΈΠ·Π»Π΅Π·. Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° користимС strace Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΡˆΡ‚ΠΎ сС случува:

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

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ скратСн, Π½ΠΎ соодвСтниот Π΄Π΅Π» ΠΎΠ΄ Π½Π΅Π³ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° Π΄Π΅ΠΊΠ° записитС сС Π±Π»ΠΎΠΊΠΈΡ€Π°Π½ΠΈ со Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° EPERM - истата ΠΎΠ½Π°Π° ΡˆΡ‚ΠΎ ја ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π²ΠΌΠ΅. Ова Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π΅ Π΅ΠΌΠΈΡ‚ΡƒΠ²Π° Π½ΠΈΡˆΡ‚ΠΎ бидСјќи Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° пристапи Π΄ΠΎ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ Π·Π° Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅:

[pid 25099] write(2, "ls: ", 4) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "write error", 11) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "n", 1) = -1 EPERM (Operation not permitted)

Π‘Π΅Π³Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° Seccomp BPF ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ Π΄ΠΎΠ±Ρ€Π° идСја Π·Π° Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ со Π½Π΅Π³ΠΎ. Но, Π·Π°Ρ€Π΅ΠΌ Π½Π΅ Π±ΠΈ сакалС Π΄Π° Π³ΠΎ постигнСтС истото со eBPF намСсто со cBPF Π·Π° Π΄Π° ја искориститС Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° цСлосна моќ?

Кога размислуваат Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ eBPF, ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ Π»ΡƒΡ“Π΅ мислат Π΄Π΅ΠΊΠ° Сдноставно Π³ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ ΠΈ Π³ΠΈ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°Π°Ρ‚ со администраторски ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ. Иако ΠΎΠ²Π°Π° изјава Π΅ Π³Π΅Π½Π΅Ρ€Π°Π»Π½ΠΎ вистинита, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° Π·Π±ΠΈΡ€ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° eBPF Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²ΠΎΠ°. ОвиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π°Π°Ρ‚ BPF LSM стапици.

BPF LSM стапици

Π—Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ слСдСњС Π½Π° систСмскитС настани нСзависно ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π°, LSM Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΡ‚ Π½Π° стапици. ΠŸΠΎΠ²ΠΈΠΊΠΎΡ‚ Π·Π° ΠΊΡƒΠΊΠ° Π΅ Ρ‚Π΅Ρ…Π½ΠΈΡ‡ΠΊΠΈ сличСн Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ, Π½ΠΎ Π΅ систСмски нСзависСн ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½ со инфраструктурата. LSM ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° Π½ΠΎΠ² ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ Π²ΠΎ кој ΡΠ»ΠΎΡ˜ΠΎΡ‚ Π½Π° Π°ΠΏΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ сС ΡΡ€Π΅ΡœΠ°Π²Π°Π°Ρ‚ ΠΊΠΎΠ³Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ со систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ.

Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈΠΌΠ° сСдум ΠΊΡƒΠΊΠΈ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅, Π° SELinux Π΅ СдинствСниот Π²Π³Ρ€Π°Π΄Π΅Π½ LSM ΡˆΡ‚ΠΎ Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°.

Π˜Π·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° Π·Π°ΠΌΠΊΠΈΡ‚Π΅ сС Π½Π°ΠΎΡ“Π° Π²ΠΎ Π΄Ρ€Π²ΠΎΡ‚ΠΎ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° include/linux/security.h:

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

БСкој ΠΎΠ΄ Π½ΠΈΠ² ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„Π°Π·ΠΈ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅:

β€” security_bpf β€” Π²Ρ€ΡˆΠΈ ΠΏΠΎΡ‡Π΅Ρ‚Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ΠΈΡ‚Π΅ BPF систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ;

- security_bpf_map - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° ΠΊΠΎΠ³Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²Ρ€Π°ΡœΠ° дСскриптор Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΌΠ°ΠΏΠ°Ρ‚Π°;

- security_bpf_prog - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° ΠΊΠΎΠ³Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²Ρ€Π°ΡœΠ° дСскриптор Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° eBPF;

β€” security_bpf_map_alloc β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π΄Π°Π»ΠΈ бСзбСдносното ΠΏΠΎΠ»Π΅ Π²ΠΎ ΠΌΠ°ΠΏΠΈΡ‚Π΅ BPF Π΅ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ;

- security_bpf_map_free - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π΄Π°Π»ΠΈ бСзбСдносното ΠΏΠΎΠ»Π΅ Π΅ исчистСно Π²ΠΎ ΠΌΠ°ΠΏΠΈΡ‚Π΅ Π½Π° BPF;

β€” security_bpf_prog_alloc β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π΄Π°Π»ΠΈ бСзбСдносното ΠΏΠΎΠ»Π΅ Π΅ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ Π²ΠΎ BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅;

- security_bpf_prog_free - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Π΄Π°Π»ΠΈ бСзбСдносното ΠΏΠΎΠ»Π΅ Π΅ исчистСно Π²ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ BPF.

Π‘Π΅Π³Π°, глСдајќи Π³ΠΎ сСто ΠΎΠ²Π°, Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅: ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π°Π΄ LSM BPF прСсрСтнувачитС Π΅ Π΄Π΅ΠΊΠ° Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄Π°Ρ‚ Π·Π°ΡˆΡ‚ΠΈΡ‚Π° Π½Π° сСкој ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ eBPF, ΠΎΡΠΈΠ³ΡƒΡ€ΡƒΠ²Π°Ρ˜ΡœΠΈ Π΄Π΅ΠΊΠ° само ΠΎΠ½ΠΈΠ΅ со соодвСтни ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π²Ρ€ΡˆΠ°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ.

ΠšΡ€Π°Ρ‚ΠΎΠΊ ΠΏΡ€Π΅Π³Π»Π΅Π΄

БСзбСдноста Π½Π΅ Π΅ Π½Π΅ΡˆΡ‚ΠΎ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π½Π° Π΅Π΄Π΅Π½ СдинствСн Π½Π°Ρ‡ΠΈΠ½ Π·Π° сС ΡˆΡ‚ΠΎ сакатС Π΄Π° Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΈΡ‚Π΅ систСмитС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²ΠΎΠ° ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ. Π’Π΅Ρ€ΡƒΠ²Π°Π»Π΅ ΠΈΠ»ΠΈ Π½Π΅, Π½Π°Ρ˜Π΄ΠΎΠ±Π°Ρ€ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ систСм Π΅ Π΄Π° сС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²ΠΎΠ° Π½Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° бСзбСдноста Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΈΠ²ΠΎ Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° пристап Π΄ΠΎ Ρ†Π΅Π»ΠΈΠΎΡ‚ систСм. ΠžΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ˜Π° ΠΎΠ΄Π»ΠΈΡ‡Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π΄Π° Π½ΠΈ Π΄Π°Π΄Π°Ρ‚ сСт ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ слоСви ΠΈ Π΄ΠΎΠΏΠΈΡ€Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΄ΠΎΠ±Ρ€ΠΎ Π²ΠΈ Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π·Π° Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ сС слоСви ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ користитС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ BPF Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со Π½ΠΈΠ².

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

Π”Π΅Ρ˜Π²ΠΈΠ΄ ΠšΠ°Π»Π°Π²Π΅Ρ€Π° Π΅ CTO Π²ΠΎ Netlify. Вој Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ Π²ΠΎ ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π½Π° Docker ΠΈ придонСсС Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° Π°Π»Π°Ρ‚ΠΊΠΈΡ‚Π΅ Runc, Go ΠΈ BCC, ΠΊΠ°ΠΊΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ со ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄. ΠŸΠΎΠ·Π½Π°Ρ‚ ΠΏΠΎ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Docker ΠΈ Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° СкосистСмот Π·Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ Docker. Π”Π΅Ρ˜Π²ΠΈΠ΄ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ страстСн Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈΡ‚Π΅ со ΠΏΠ»Π°ΠΌΠ΅Π½ ΠΈ сСкогаш Π±Π°Ρ€Π° Π΄Π° Π³ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° пСрформанситС.

Π›ΠΎΡ€Π΅Π½Ρ†ΠΎ Π€ΠΎΠ½Ρ‚Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΠΎ Ρ‚ΠΈΠΌΠΎΡ‚ со ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ Π²ΠΎ Sysdig, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ првСнствСно Π΅ фокусиран Π½Π° Falco, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Cloud Native Computing Foundation кој ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° бСзбСдност Π½Π° Ρ‚Ρ€Π°Π΅ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΎΡ‚ ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ аномалија ΠΏΡ€Π΅ΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ» Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ ΠΈ eBPF. Вој Π΅ страстСн Π·Π° дистрибуирани систСми, софтвСрски Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΌΡ€Π΅ΠΆΠΈ, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Линукс ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° пСрформанситС.

Β» ПовСќС Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π½Π° Π²Π΅Π±-страница Π½Π° ΠΈΠ·Π΄Π°Π²Π°Ρ‡ΠΎΡ‚
Β» Π‘ΠΎΠ΄Ρ€ΠΆΠΈΠ½Π°
» Извадок

Π—Π° Khabrozhiteley 25% попуст со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΊΡƒΠΏΠΎΠ½ - Linux

По ΡƒΠΏΠ»Π°Ρ‚Π° Π½Π° Ρ…Π°Ρ€Ρ‚ΠΈΠ΅Π½Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ испратСна СлСктронска ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ Π΅-ΠΏΠΎΡˆΡ‚Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€