เจ•เจฟเจคเจพเจฌ "เจฒเฉ€เจจเจ•เจธ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจฒเจˆ เจฌเฉ€เจชเฉ€เจเจซ"

เจ•เจฟเจคเจพเจฌ "เจฒเฉ€เจจเจ•เจธ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจฒเจˆ เจฌเฉ€เจชเฉ€เจเจซ"เจนเฉˆเจฒเฉ‹, เจ–เจพเจฌเจฐเฉ‹ เจจเจฟเจตเจพเจธเฉ€เจ“! BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจธเจนเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเจฟเจธเจŸเจฎ เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจจเฉเจ•เจธ เจฒเฉฑเจญเจฃ เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค เจคเฉเจธเฉ€เจ‚ เจธเจฟเฉฑเจ–เฉ‹เจ—เฉ‡ เจ•เจฟ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจตเจฟเจนเจพเจฐ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ…เจคเฉ‡ เจธเฉฐเจธเจผเฉ‹เจงเจจ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเจพ เจนเฉˆ, เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ˜เจŸเจจเจพเจตเจพเจ‚ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจเฅค David Calavera เจ…เจคเฉ‡ Lorenzo Fontana BPF เจฆเฉ€ เจธเจผเจ•เจคเฉ€ เจจเฉ‚เฉฐ เจ…เจจเจฒเฉŒเจ• เจ•เจฐเจจ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเจจเจ—เฉ‡เฅค เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ…เจจเฉเจ•เฉ‚เจฒเจจ, เจจเฉˆเฉฑเจŸเจตเจฐเจ•เจฟเฉฐเจ—, เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‡ เจ†เจชเจฃเฉ‡ เจ—เจฟเจ†เจจ เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเฉ‹เฅค - เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจตเจฟเจนเจพเจฐ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ…เจคเฉ‡ เจธเฉ‹เจง เจ•เจฐเจจ เจฒเจˆ BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค - เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจฐเฉ€เจฌเฉ‚เจŸ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ•เจฐเจจเจฒ เจ‡เจตเฉˆเจ‚เจŸเจธ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ‡เฉฐเจœเฉˆเจ•เจŸ เจ•เจฐเฉ‹เฅค โ€” C, Go เจœเจพเจ‚ Python เจตเจฟเฉฑเจš เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจ•เฉ‹เจก เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค - เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ เจฆเฉ‡ เจฎเจพเจฒเจ• เจฆเฉเจ†เจฐเจพ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจฒเจ“เฅค

เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจธเฉˆเจ•เฉŒเจ‚เจช

BPF เจธเจฅเจฟเจฐเจคเจพ, เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจœเจพเจ‚ เจ—เจคเฉ€ เจฆเจพ เจฌเจฒเฉ€เจฆเจพเจจ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฆเจพ เจ‡เฉฑเจ• เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจคเจฐเฉ€เจ•เจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจ•เจฐเจจเจฒ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‡ เจธเฉ‹เจšเจฟเจ† เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค Seccomp เจซเจฟเจฒเจŸเจฐ, เจœเจฟเจธเจจเฉ‚เฉฐ Seccomp BPF เจตเฉ€ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจ•เฉ‡ Seccomp เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ…เจฒเฉฑเจ—-เจฅเจฒเฉฑเจ—เจคเจพ เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เจธเจฆเฉ€ เจฌเจนเฉเจชเฉฑเจ–เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ‡เฉฑเจ• เจšเฉฐเจ—เจพ เจตเจฟเจšเจพเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจธ เจ…เจงเจฟเจ†เจ‡ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฆเฉฑเจธเจพเจ‚เจ—เฉ‡ เจ•เจฟ Seccomp เจ•เฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจซเจฟเจฐ เจคเฉเจธเฉ€เจ‚ เจธเจฟเฉฑเจ–เฉ‹เจ—เฉ‡ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Seccomp เจซเจฟเจฒเจŸเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเฉ‡ เจนเจจเฅค เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒเจŸ-เจ‡เจจ BPF เจนเฉเฉฑเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจฒเฉ€เจจเจ•เจธ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฒเจˆ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเจจเฅค

เจฒเฉ€เจจเจ•เจธ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเฉ‹เจกเฉ€เจŠเจฒ (LSM) เจ‡เฉฑเจ• เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจนเฉˆ เจœเฉ‹ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฎเจพเจกเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจเฅค LSM เจจเฉ‚เฉฐ เจธเจฟเฉฑเจงเฉ‡ เจ•เจฐเจจเจฒ เจธเฉ‹เจฐเจธ เจŸเฉเจฐเฉ€ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ Apparmor, SELinux เจ…เจคเฉ‡ Tomoyoเฅค

เจ†เจ‰ เจฒเฉ€เจจเจ•เจธ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจšเจฐเจšเจพ เจ•เจฐเจ•เฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจเฅค

เจซเฉ€เจšเจฐ

เจฒเฉ€เจจเจ•เจธ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเจพ เจจเจฟเจšเฉ‹เฉœ เจ‡เจน เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจ…เจงเจฟเจ•เจพเจฐเจค เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจชเจฐ เจ‰เจธ เจ‰เจฆเฉ‡เจธเจผ เจฒเจˆ เจธเฉ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚, เจœเจพเจ‚ เจจเจนเฉ€เจ‚ เจคเจพเจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐเจค เจฌเจฃเจพเจ‰เจฃเจพ, เจนเจฎเจฒเฉ‡ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ•เฉเจ เจ•เจพเจฐเจœ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจชเฉเจฐเจพเจชเจค เจชเฉ‹เจฐเจŸ เจ–เฉ‹เจฒเฉเจนเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ 80 เจ•เจนเฉ‹, เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฐเฉ‚เจŸ เจตเจœเฉ‹เจ‚ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฌเจœเจพเจ, เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ CAP_NET_BIND_SERVICE เจธเจฎเจฐเฉฑเจฅเจพ เจฆเฉ‡ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

main.go เจจเจพเจฎเจ• เจ—เฉ‹ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹:

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

เจ‡เจน เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจชเฉ‹เจฐเจŸ 80 'เจคเฉ‡ เจ‡เฉฑเจ• HTTP เจธเจฐเจตเจฐ เจฆเฉ€ เจธเฉ‡เจตเจพ เจ•เจฐเจฆเจพ เจนเฉˆ (เจ‡เจน เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจชเฉเจฐเจพเจชเจค เจชเฉ‹เจฐเจŸ เจนเฉˆ)เฅค เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉฐเจ•เจฒเจจ เจคเฉ‹เจ‚ เจคเฉเจฐเฉฐเจค เจฌเจพเจ…เจฆ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚:

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

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฐเฉ‚เจŸ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจฆเฉ‡ เจฐเจนเฉ‡ เจนเจพเจ‚, เจ‡เจน เจ•เฉ‹เจก เจชเฉ‹เจฐเจŸ เจจเฉ‚เฉฐ เจฌเจพเจˆเจกเจฟเฉฐเจ— เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจธเฉเฉฑเจŸ เจฆเฉ‡เจตเฉ‡เจ—เจพ:

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

capsh (เจธเจผเฉˆเฉฑเจฒ เจฎเฉˆเจจเฉ‡เจœเจฐ) เจ‡เฉฑเจ• เจŸเฉ‚เจฒ เจนเฉˆ เจœเฉ‹ เจธเจฎเจฐเฉฑเจฅเจพ เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเฉˆเฉฑเจŸ เจจเจพเจฒ เจธเจผเฉˆเฉฑเจฒ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจชเฉ‚เจฐเฉ‡ เจฐเฉ‚เจŸ เจ…เจงเจฟเจ•เจพเจฐ เจฆเฉ‡เจฃ เจฆเฉ€ เจฌเจœเจพเจ, เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฎเฉŒเจœเฉ‚เจฆ เจนเจฐ เจšเฉ€เจœเจผ เจฆเฉ‡ เจจเจพเจฒ 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' - เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ (เจ…เจธเฉ€เจ‚ เจฐเฉ‚เจŸ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡), เจ…เจธเฉ€เจ‚ cap_net_bind_service เจ…เจคเฉ‡ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‰เจชเจญเฉ‹เจ—เจคเจพ ID เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡ เจฐเฉ‚เจŸ เจŸเฉ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจจเจนเฉ€เจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ•เฉˆเจช_เจธเฉˆเจŸเฉเจ‡เจก เจ…เจคเฉ‡ เจ•เฉˆเจช_เจธเฉˆเจŸเจ—เจฟเจกเฅค
  • โ€”keep=1 โ€” เจ…เจธเฉ€เจ‚ เจฐเฉ‚เจŸ เจ–เจพเจคเฉ‡ เจคเฉ‹เจ‚ เจธเจตเจฟเฉฑเจš เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ‡เฉฐเจธเจŸเจพเจฒ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉฑเจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค
  • โ€”user=โ€œเจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚โ€ โ€” เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจตเจพเจฒเจพ เจ…เฉฐเจคเจฎ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค
  • โ€”addamb=cap_net_bind_service โ€” เจฐเฉ‚เจŸ เจฎเฉ‹เจก เจคเฉ‹เจ‚ เจธเจตเจฟเจš เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ€ เจ•เจฒเฉ€เจ…เจฐเจฟเฉฐเจ— เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹เฅค
  • - -c "./capabilities" - เจธเจฟเจฐเจซเจผ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจšเจฒเจพเจ“เฅค

เจฒเจฟเฉฐเจ•เจก เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจ•เจฟเจธเจฎ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจœเฉ‹ เจฌเจพเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจš เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจœเจฆเฉ‹เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ execve() เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ. เจธเจฟเจฐเจซเจผ เจ‰เจน เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฌเฉฐเจงเจฟเจค เจนเฉ‹เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจœเจพเจ‚ เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจตเจพเจคเจพเจตเจฐเจฃ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจตเจœเฉ‹เจ‚, เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจš เจฎเจฟเจฒ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจคเฉเจธเฉ€เจ‚ เจธเจผเจพเจ‡เจฆ เจธเฉ‹เจš เจฐเจนเฉ‡ เจนเฉ‹เจตเฉ‹เจ—เฉ‡ เจ•เจฟ --caps เจตเจฟเจ•เจฒเจช เจตเจฟเฉฑเจš เจธเจฎเจฐเฉฑเจฅเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ +eip เจฆเจพ เจ•เฉ€ เจ…เจฐเจฅ เจนเฉˆเฅค เจ‡เจน เจซเจฒเฉˆเจ— เจ‡เจน เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ•เจฟ เจธเจฎเจฐเฉฑเจฅเจพ:

- เจ•เจฟเจฐเจฟเจ†เจธเจผเฉ€เจฒ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (เจชเฉ€);

- เจตเจฐเจคเฉ‹เจ‚ เจฒเจˆ เจ‰เจชเจฒเจฌเจง (e);

- เจฌเฉฑเจšเฉ‡ เจฆเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ (i) เจฆเฉเจ†เจฐเจพ เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจš เจฎเจฟเจฒ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ cap_net_bind_service เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚, เจธเจพเจจเฉ‚เฉฐ เจ‡เจน เจˆ เจซเจฒเฉˆเจ— เจจเจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจตเจฟเฉฑเจš เจธเจผเฉˆเฉฑเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ‡เจน เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฌเจพเจˆเจจเจฐเฉ€ เจจเฉ‚เฉฐ เจšเจฒเจพเจเจ—เจพ เจ…เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธเจจเฉ‚เฉฐ i เจซเจฒเฉˆเจ— เจจเจพเจฒ เจฎเจพเจฐเจ• เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡ (เจ…เจธเฉ€เจ‚ UID เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ…เจœเจฟเจนเจพ เจ•เฉ€เจคเจพ) p เจจเจพเจฒ. เจ‡เจน cap_net_bind_service+eip เจตเจฐเจ—เจพ เจฒเฉฑเจ—เจฆเจพ เจนเฉˆเฅค

เจคเฉเจธเฉ€เจ‚ ss เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจคเฉ€เจœเจพ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹. เจ†เจ‰ เจชเฉ‡เจœ 'เจคเฉ‡ เจซเจฟเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเจพ เจ›เฉ‹เจŸเจพ เจ•เจฐเฉ€เจ, เจชเจฐ เจ‡เจน 0 เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจชเฉ‹เจฐเจŸ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ ID เจฆเจฟเจ–เจพเจเจ—เจพ, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš 65:

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

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ•เฉˆเจชเจธเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจนเฉˆ, เจชเจฐ เจคเฉเจธเฉ€เจ‚ libcap เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เฉฑเจ• เจธเจผเฉˆเฉฑเจฒ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจนเฉ‹เจฐ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเจˆ, man 3 libcap เจตเฉ‡เจ–เฉ‹เฅค

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡, เจ…เจ•เจธเจฐ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจชเจคเจพ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ เจœเฉ‹ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจธเจฎเฉ‡เจ‚ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ; เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจน เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฟเจนเจคเจฐ เจขเฉฐเจ— เจจเจพเจฒ เจธเจฎเจเจฃ เจฒเจˆ, เจ…เจธเฉ€เจ‚ BCC เจธเจฎเจฐเฉฑเจฅ เจŸเฉ‚เจฒ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ cap_capable เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจ เจฒเจˆ kprobe เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ:

/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

เจ…เจธเฉ€เจ‚ cap_capable เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ•-เจฒเจพเจˆเจจเจฐ kprobe เจจเจพเจฒ bpftrace เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจนเฉ€ เจšเฉ€เจœเจผ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

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 เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจ†เจˆเจกเฉˆเจ‚เจŸเฉ€เจซเจพเจ‡เจฐ 10 เจฆเฉ‡ เจจเจพเจฒ include/uapi/linux/ability.h เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจธเฉ‹เจฐเจธ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจตเจœเฉ‹เจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ:

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

เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจ•เจธเจฐ เจฐเจจเจŸเจพเจˆเจฎ 'เจคเฉ‡ เจธเจฎเจฐเฉฑเจฅ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฐเจจเจธเฉ€ เจœเจพเจ‚ เจกเฉŒเจ•เจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ—เฉˆเจฐ-เจชเฉเจฐเจพเจชเจค เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡เจฃ เจฒเจˆ, เจชเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฟเจฐเจซ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เฉเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจกเฉŒเจ•เจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ --cap-add เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ:

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

เจ‡เจน เจ•เจฎเจพเจ‚เจก เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ CAP_NET_ADMIN เจธเจฎเจฐเฉฑเจฅเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเฉ‡เจ—เฉ€, เจ‡เจธ เจจเฉ‚เฉฐ เจกเจฎเฉ€0 เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจฒเจˆ เจ‡เฉฑเจ• เจจเฉˆเจŸเจตเจฐเจ• เจฒเจฟเฉฐเจ• เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค

เจ…เจ—เจฒเจพ เจญเจพเจ— เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจตเจฐเจ—เฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจจเฉ€ เจนเฉˆ, เจชเจฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ€ เจคเจ•เจจเฉ€เจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจœเฉ‹ เจธเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจซเจฟเจฒเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเฉ‡เจŸเจฟเจ• เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค

Seccomp

Seccomp เจฆเจพ เจ…เจฐเจฅ เจนเฉˆ เจธเจ•เจฟเจ“เจฐ เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ— เจ…เจคเฉ‡ เจ‡เจน เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ‡เฉฑเจ• เจธเฉเจฐเฉฑเจ–เจฟเจ† เจชเจฐเจค เจนเฉˆ เจœเฉ‹ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉเจ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ Seccomp เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจจเจพเจฒ เจคเฉเจฒเจจเจพเจฏเฉ‹เจ— เจนเฉˆ, เจ•เฉเจ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจธเจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจฎเฉเจ•เจพเจฌเจฒเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจฒเจšเจ•เจฆเจพเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค

Seccomp เจ…เจคเฉ‡ Linux เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจ†เจชเจธ เจตเจฟเฉฑเจš เจจเจฟเจตเฉ‡เจ•เจฒเฉ‡ เจจเจนเฉ€เจ‚ เจนเจจ เจ…เจคเฉ‡ เจ…เจ•เจธเจฐ เจฆเฉ‹เจตเจพเจ‚ เจชเจนเฉเฉฐเจšเจพเจ‚ เจคเฉ‹เจ‚ เจฒเจพเจญ เจฒเฉˆเจฃ เจฒเจˆ เจ‡เจ•เฉฑเจ เฉ‡ เจตเจฐเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ CAP_NET_ADMIN เจธเจฎเจฐเฉฑเจฅเจพ เจฆเฉ‡เจฃเจพ เจšเจพเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจชเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจธเจพเจ•เฉ‡เจŸ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเฉ‡ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเฉ‹4 เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจ•เจฐเฉ‹เฅค

Seccomp เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจตเจฟเจงเฉ€ SECOMP_MODE_FILTER เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ BPF เจซเจฟเจฒเจŸเจฐเจพเจ‚ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจนเฉˆ, เจ…เจคเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจ‰เจธเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฒเจˆเฅค

Seccomp เจซเจฟเจฒเจŸเจฐ PR_SET_SECCOMP เจ•เจพเจฐเจตเจพเจˆ เจฆเฉเจ†เจฐเจพ prctl เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจซเจฟเจฒเจŸเจฐ เจ‡เฉฑเจ• BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเจพ เจฐเฉ‚เจช เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจ เจœเฉ‹ seccomp_data เจขเจพเจ‚เจšเฉ‡ เจฆเฉเจ†เจฐเจพ เจฆเจฐเจธเจพเจ เจนเจฐเฉ‡เจ• Seccomp เจชเฉˆเจ•เฉ‡เจŸ เจฒเจˆ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจขเจพเจ‚เจšเฉ‡ เจตเจฟเฉฑเจš เจธเฉฐเจฆเจฐเจญ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ, เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ, เจ…เจคเฉ‡ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจ›เฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจธ, uint64 เจตเจœเฉ‹เจ‚ เจฆเจฐเจธเจพเจ เจ—เจ เจนเจจเฅค

linux/seccomp.h เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจธเฉ‹เจฐเจธ เจ•เฉ‹เจก เจคเฉ‹เจ‚ seccomp_data เจขเจพเจ‚เจšเจพ เจ…เจœเจฟเจนเจพ เจฆเจฟเจธเจฆเจพ เจนเฉˆ:

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

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจขเจพเจ‚เจšเฉ‡ เจคเฉ‹เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ…เจธเฉ€เจ‚ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ, เจ‡เจธเจฆเฉ‡ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚, เจœเจพเจ‚ เจฆเฉ‹เจตเจพเจ‚ เจฆเฉ‡ เจธเฉเจฎเฉ‡เจฒ เจฆเฉเจ†เจฐเจพ เจซเจฟเจฒเจŸเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

เจนเจฐเฉ‡เจ• Seccomp เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจ…เฉฐเจคเจฟเจฎ เจซเฉˆเจธเจฒเจพ เจฒเฉˆเจฃ เจฒเจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจฆเฉฑเจธเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจ…เฉฑเจ—เฉ‡ เจ•เฉ€ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจ…เฉฐเจคเจฎ เจซเฉˆเจธเจฒเจพ เจตเจพเจชเจธเฉ€ เจฎเฉเฉฑเจฒเจพเจ‚ (เจธเจŸเฉ‡เจŸเจธ เจ•เฉ‹เจก) เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจฆเฉเจ†เจฐเจพ เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆเฅค

- SECOMP_RET_KILL_PROCESS - เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจคเฉเจฐเฉฐเจค เจฌเจพเจ…เจฆ เจชเฉ‚เจฐเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เจธ เจ•เจพเจฐเจจ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

- SECOMP_RET_KILL_THREAD - เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจคเฉเจฐเฉฐเจค เจฌเจพเจ…เจฆ เจฎเฉŒเจœเฉ‚เจฆเจพ เจฅเฉเจฐเฉˆเจก เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เจธ เจ•เจพเจฐเจจ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

โ€” SECOMP_RET_KILL โ€” SECOMP_RET_KILL_THREAD เจฒเจˆ เจ‰เจชเจจเจพเจฎ, เจชเจฟเจ›เฉœเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฒเจˆ เจ›เฉฑเจกเจฟเจ† เจ—เจฟเจ†เฅค

- SECOMP_RET_TRAP - เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจฎเจจเจพเจนเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ SIGSYS (เจฌเฉˆเจก เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ) เจธเจฟเจ—เจจเจฒ เจ‰เจธ เจ•เฉฐเจฎ เจฒเจˆ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

- SECOMP_RET_ERRNO - เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ…เจคเฉ‡ SECOMP_RET_DATA เจซเจฟเจฒเจŸเจฐ เจฐเจฟเจŸเจฐเจจ เจฎเฉเฉฑเจฒ เจฆเจพ เจนเจฟเฉฑเจธเจพ errno เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจจเฉ‚เฉฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ—เจฒเจคเฉ€ เจฆเฉ‡ เจ•เจพเจฐเจจ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจตเฉฑเจ–-เจตเฉฑเจ– เจ—เจฒเจคเฉ€ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ…เจ—เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš เจ—เจฒเจคเฉ€ เจจเฉฐเจฌเจฐเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจนเฉˆเฅค

- SECOMP_RET_TRACE - ptrace เจŸเจฐเฉ‡เจธเจฐ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ - PTRACE_O_TRACESECCOMP เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจฒเจˆ เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจ‰เจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฃ เจ…เจคเฉ‡ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจŸเจฐเฉ‡เจธเจฐ เจ•เจจเฉˆเจ•เจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจตเจพเจชเจธ เจ† เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, errno เจจเฉ‚เฉฐ -ENOSYS 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‡เจ† เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

- SECOMP_RET_LOG - เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจนเฉฑเจฒ เจนเฉ‹ เจ—เจˆ เจนเฉˆ เจ…เจคเฉ‡ เจฒเฉŒเจ— เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค

- SECOMP_RET_ALLOW - เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจธเจฟเจฐเจซเจผ เจ‡เจœเจพเจœเจผเจค เจนเฉˆเฅค

ptrace เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจนเฉˆ เจœเฉ‹ เจŸเจฐเฉ‡เจธเฉ€ เจจเจพเจฎเจ• เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจŸเจฐเฉ‡เจธเจฟเฉฐเจ— เจฎเจ•เฉˆเจจเจฟเจœเจผเจฎ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ…เจคเฉ‡ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจนเฉˆเฅค เจŸเจฐเฉ‡เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจŸเจฐเฉ‡เจธเฉ€ เจฆเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ‹เจง เจธเจ•เจฆเจพ เจนเฉˆเฅค Seccomp เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš, ptrace เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ SECOMP_RET_TRACE เจธเจฅเจฟเจคเฉ€ เจ•เฉ‹เจก เจฆเฉเจ†เจฐเจพ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจฃ 'เจคเฉ‡ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจŸเจฐเฉ‡เจธเจฐ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฐเฉ‹เจ• เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเจพ เจคเจฐเจ• เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

Seccomp เจ—เจฒเจคเฉ€เจ†เจ‚

เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡, Seccomp เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจˆ เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐเจจเจพ เจชเจตเฉ‡เจ—เจพ, เจœเฉ‹ เจ•เจฟ SECOMP_RET_ERRNO เจ•เจฟเจธเจฎ เจฆเฉ‡ เจตเจพเจชเจธเฉ€ เจฎเฉเฉฑเจฒ เจฆเฉเจ†เจฐเจพ เจชเจ›เจพเจฃเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เจฐเจจ เจฒเจˆ, seccomp เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ 1 เจฆเฉ€ เจฌเจœเจพเจ -0 เจตเจพเจชเจธ เจ†เจตเฉ‡เจ—เฉ€เฅค

เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจธเฉฐเจญเจต เจนเจจ:

- EACCESS - เจ•เจพเจฒเจฐ เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจน เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจธ เจตเจฟเฉฑเจš CAP_SYS_ADMIN เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจนเจจ เจœเจพเจ‚ prctl เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ no_new_privs เจธเฉˆเฉฑเจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡);

โ€” EFAULT โ€” เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ (seccomp_data เจขเจพเจ‚เจšเฉ‡ เจตเจฟเฉฑเจš args) เจฆเจพ เจ•เฉ‹เจˆ เจตเฉˆเจง เจชเจคเจพ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ;

โ€” EINVAL โ€” เจ‡เฉฑเจฅเฉ‡ เจšเจพเจฐ เจ•เจพเจฐเจจ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ:

- เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ เจ•เจพเจฐเจตเจพเจˆ เจ…เจฃเจœเจพเจฃ เจนเฉˆ เจœเจพเจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ;

-เจจเจฟเจธเจผเจšเจฟเจค เจซเจฒเฉˆเจ— เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ เจ•เจพเจฐเจตเจพเจˆ เจฒเจˆ เจตเฉˆเจง เจจเจนเฉ€เจ‚ เจนเจจ;

-เจ“เจชเจฐเฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš BPF_ABS เจธเจผเจพเจฎเจฒ เจนเฉˆ, เจชเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ”เจซเจธเฉˆเฉฑเจŸ เจตเจฟเฉฑเจš เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจนเจจ, เจœเฉ‹ เจ•เจฟ seccomp_data เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจ†เจ•เจพเจฐ เจคเฉ‹เจ‚ เจตเฉฑเจง เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ;

-เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจ…เจงเจฟเจ•เจคเจฎ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ—เจˆ เจนเฉˆ;

โ€” ENOMEM โ€” เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ;

- EOPNOTSUPP - เจ“เจชเจฐเฉ‡เจธเจผเจจ เจจเฉ‡ เจธเฉฐเจ•เฉ‡เจค เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ•เจฟ SECOMP_GET_ACTION_AVAIL เจจเจพเจฒ เจ•เจพเจฐเจตเจพเจˆ เจ‰เจชเจฒเจฌเจง เจธเฉ€, เจชเจฐ เจ•เจฐเจจเจฒ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเจพเจชเจธเฉ€ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ;

โ€” ESRCH โ€” เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจŸเฉเจฐเฉ€เจฎ เจจเฉ‚เฉฐ เจธเจฎเจ•เจพเจฒเฉ€ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ‡เฉฑเจ• เจธเจฎเฉฑเจธเจฟเจ† เจ†เจˆ เจนเฉˆ;

- ENOSYS - SECOMP_RET_TRACE เจเจ•เจธเจผเจจ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจ•เฉ‹เจˆ เจŸเจฐเฉ‡เจธเจฐ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

prctl เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ-เจธเจชเฉ‡เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจ–เจพเจธ เจชเจนเจฟเจฒเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ (เจธเฉˆเฉฑเจŸ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ) เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฌเจพเจˆเจŸ เจเจ‚เจกเฉ€เจ…เจจเจธ, เจฅเจฐเจฟเฉฑเจก เจจเจพเจฎ, เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ—เจฃเจจเจพ เจฎเฉ‹เจก (Seccomp), เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ, เจชเจฐเจซ เจ‡เจตเฉˆเจ‚เจŸเจธ, เจ†เจฆเจฟเฅค

Seccomp เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจตเจพเจ‚เจ— เจฒเฉฑเจ— เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ…เจœเจฟเจนเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค Seccomp เจ‡เฉฑเจ• เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจนเฉˆ เจœเฉ‹ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจตเจฟเจงเฉ€ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจนเฉเจฃ เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‡เฉฐเจŸเจฐเจเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฌเจฃเจพเจ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจœเจฟเจธเจจเฉ‚เฉฐ เจธเฉ‡เจ•เจ•เฉ‹เจฎ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉเจ†เจฐเจพ เจธเจฟเฉฑเจงเจพ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

BPF Seccomp เจซเจฟเจฒเจŸเจฐ เจ‰เจฆเจพเจนเจฐเจจ

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจชเจนเจฟเจฒเจพเจ‚ เจตเจฟเจšเจพเจฐเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจฆเฉ‹ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจœเฉ‹เฉœเจจเจพ เจนเฉˆ, เจ…เจฐเจฅเจพเจค:

- เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• Seccomp BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡, เจœเฉ‹ เจฒเจ เจ—เจ เจซเฉˆเจธเจฒเจฟเจ†เจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจฐเจฟเจŸเจฐเจจ เจ•เฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ;

โ€” prctl เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจซเจฟเจฒเจŸเจฐ เจฒเฉ‹เจก เจ•เจฐเฉ‹เฅค

เจชเจนเจฟเจฒเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจคเฉ‹เจ‚ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

#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),
  };

เจจเจฟเจฐเจฆเฉ‡เจธเจผ linux/filter.h เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค BPF_STMT เจ…เจคเฉ‡ BPF_JUMP เจฎเฉˆเจ•เจฐเฉ‹ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค
เจฆเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจฆเฉเจ†เจฐเจพ เจœเจพเจฃ เจฆเจฟเจ“.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(structure 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 เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ‰เจน เจฌเจฐเจพเจฌเจฐ เจนเจจ, เจคเจพเจ‚ เจ…เจ—เจฒเฉ€ เจนเจฆเจพเจ‡เจค 'เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจตเจงเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจ…เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจจเจนเฉ€เจ‚ เจคเจพเจ‚ SECOMP_RET_ALLOW เจจเจพเจฒ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ERRNO | (เจ—เจฒเจคเฉ€ & SECCOMP_RET_DATA)) - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ BPF_RET เจจเจพเจฒ เจธเจฎเจพเจชเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจ—เจฒเจคเฉ€ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจคเฉ‹เจ‚ เจจเฉฐเจฌเจฐ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ SECOMP_RET_ERRNO เจชเฉˆเจฆเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

- BPF_STMT(BPF_RET + BPF_K, SECOMP_RET_ALLOW) - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ BPF_RET เจจเจพเจฒ เจ–เจคเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ SECCOMP_RET_ALLOW เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

SECOMP 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;

เจธเจพเจ•เจŸ_เจซเจฟเจฒเจŸเจฐ เจฌเจฃเจคเจฐ เจตเจฟเฉฑเจš เจซเจฟเจฒเจŸเจฐ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉ‹เจก เจ…เจคเฉ‡ เจซเจฟเจฒเจŸเจฐ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เฉ€เจคเฉ€ เจฒเฉฐเจฌเจพเจˆ เจตเจพเจฒเจพ เจ‡เฉฑเจ• sock_fprog เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ˜เฉ‹เจธเจผเจฃเจพ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฆเจฒเฉ€เจฒ เจตเจœเฉ‹เจ‚ เจ‡เจธ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

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

install_filter เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ•เจฐเจจ เจฒเจˆ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจšเฉ€เจœเจผ เจฌเจšเฉ€ เจนเฉˆ - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจฒเฉ‹เจก เจ•เจฐเฉ‹! เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ prctl เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, PR_SET_SECCOMP เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจตเจœเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจฎเฉ‹เจก เจจเฉ‚เฉฐ SECOMP_MODE_FILTER เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจซเจฟเจฒเจŸเจฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ เจ•เจฟ sock_fprog เจ•เจฟเจธเจฎ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจ— เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉˆ:

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

เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ install_filter เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจ‡เจธ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจฎเฉŒเจœเฉ‚เจฆเจพ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฒเจˆ PR_SET_NO_NEW_PRIVS เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ prctl เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‰เจธ เจธเจฅเจฟเจคเฉ€ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจฌเจพเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจฎเจพเจชเจฟเจ†เจ‚ เจจเจพเจฒเฉ‹เจ‚ เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ, เจ…เจธเฉ€เจ‚ เจฌเจฟเจจเจพเจ‚ เจฐเฉ‚เจŸ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจฆเฉ‡ install_filter เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€เจ†เจ‚ prctl เจ•เจพเจฒเจพเจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ 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 -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 เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจ—เฉฑเจฒ เจฆเจพ เจšเฉฐเจ—เจพ เจตเจฟเจšเจพเจฐ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจจเจพเจฒ เจ•เฉ€ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจชเจฐ เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจชเฉ‚เจฐเฉ€ เจธเจผเจ•เจคเฉ€ เจจเฉ‚เฉฐ เจตเจฐเจคเจฃ เจฒเจˆ cBPF เจฆเฉ€ เจฌเจœเจพเจ eBPF เจจเจพเจฒ เจ‰เจนเฉ€ เจšเฉ€เจœเจผ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจชเจธเฉฐเจฆ เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‹เจ—เฉ‡?

eBPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฌเจพเจฐเฉ‡ เจธเฉ‹เจšเจฆเฉ‡ เจนเฉ‹เจ, เจฌเจนเฉเจคเฉ‡ เจฒเฉ‹เจ• เจธเฉ‹เจšเจฆเฉ‡ เจนเจจ เจ•เจฟ เจ‰เจน เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจธเจผเจพเจธเจ• เจฆเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจจเจพเจฒ เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจน เจ•เจฅเจจ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจนเฉ€ เจนเฉˆ, เจ•เจฐเจจเจฒ เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉฑเจงเจฐเจพเจ‚ 'เจคเฉ‡ eBPF เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจˆ เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจนเจจเจพเจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ BPF LSM เจŸเฉเจฐเฉˆเจช เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

BPF LSM เจœเจพเจฒ

เจธเจฟเจธเจŸเจฎ เจ‡เจตเฉˆเจ‚เจŸเจธ เจฆเฉ€ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ-เจธเฉเจคเฉฐเจคเจฐ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ, LSM เจซเจพเจนเจพเจ‚ เจฆเฉ€ เจงเจพเจฐเจจเจพ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจนเฉเฉฑเจ• เจ•เจพเจฒ เจคเจ•เจจเฉ€เจ•เฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆ, เจชเจฐ เจธเจฟเจธเจŸเจฎ เจธเฉเจคเฉฐเจคเจฐ เจนเฉˆ เจ…เจคเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจจเจพเจฒ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจนเฉˆเฅค LSM เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจธเฉฐเจ•เจฒเจช เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจเจฌเจธเจŸเจฐเฉˆเจ•เจธเจผเจจ เจฒเฉ‡เจ…เจฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ 'เจคเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจจเจพเจฒ เจจเจœเจฟเฉฑเจ เจฃ เจตเฉ‡เจฒเฉ‡ เจ†เจ‰เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค

เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจธเฉฑเจค เจนเฉเฉฑเจ• เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ 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 'เจคเฉ‡ CTO เจนเฉˆเฅค เจ‰เจธเจจเฉ‡ เจกเฉŒเจ•เจฐ เจธเจนเจพเจ‡เจคเจพ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจ…เจคเฉ‡ Runc, Go เจ…เจคเฉ‡ BCC เจŸเฉ‚เจฒเจธ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจนเฉ‹เจฐ เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจตเจฟเฉฑเจš เจฏเฉ‹เจ—เจฆเจพเจจ เจชเจพเจ‡เจ†เฅค เจกเฉŒเจ•เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจชเจฒเฉฑเจ—เจ‡เจจ เจˆเจ•เฉ‹เจธเจฟเจธเจŸเจฎ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฒเจˆ เจ‰เจธเจฆเฉ‡ เจ•เฉฐเจฎ เจฒเจˆ เจœเจพเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจกเฉ‡เจตเจฟเจก เจซเจฒเฉ‡เจฎ เจ—เฉเจฐเจพเจซเจพเจ‚ เจฌเจพเจฐเฉ‡ เจฌเจนเฉเจค เจญเจพเจตเฉเจ• เจนเฉˆ เจ…เจคเฉ‡ เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฒเฉ‹เจฐเฉ‡เจ‚เจœเจผเฉ‹ เจซเฉ‹เจ‚เจŸเจพเจจเจพ Sysdig 'เจคเฉ‡ เจ“เจชเจจ เจธเฉ‹เจฐเจธ เจŸเฉ€เจฎ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจน เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ Falco 'เจคเฉ‡ เจ•เฉ‡เจ‚เจฆเฉเจฐเจฟเจค เจนเฉˆ, เจ‡เฉฑเจ• เจ•เจฒเจพเจŠเจก เจจเฉ‡เจŸเจฟเจต เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ— เจซเจพเจŠเจ‚เจกเฉ‡เจธเจผเจจ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจœเฉ‹ เจ•เจฟ เจ•เจฐเจจเจฒ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ…เจคเฉ‡ eBPF เจฐเจพเจนเฉ€เจ‚ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฐเจจเจŸเจพเจˆเจฎ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ…เจคเฉ‡ เจ…เจธเฉฐเจ—เจคเจคเจพ เจ–เฉ‹เจœ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‰เจน เจกเจฟเจธเจŸเจฐเฉ€เจฌเจฟเจŠเจŸเจก เจธเจฟเจธเจŸเจฎ, เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจจเฉˆเฉฑเจŸเจตเจฐเจ•เจฟเฉฐเจ—, เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ, เจ…เจคเฉ‡ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฌเจพเจฐเฉ‡ เจญเจพเจตเฉเจ• เจนเฉˆเฅค

ยปเจ•เจฟเจคเจพเจฌ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเฉ‡ เจ‡เจธ 'เจคเฉ‡ เจฎเจฟเจฒ เจธเจ•เจฆเฉ‡ เจนเจจ เจชเฉเจฐเจ•เจพเจธเจผเจ• เจฆเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ
ยป เจตเจฟเจธเจผเจพ-เจธเฉ‚เจšเฉ€
ยป เจ…เฉฐเจธเจผ

Khabrozhiteley เจฒเจˆ เจ•เฉ‚เจชเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ 25% เจฆเฉ€ เจ›เฉ‹เจŸ - เจฒเฉ€เจจเจ•เจธ

เจ•เจฟเจคเจพเจฌ เจฆเฉ‡ เจ•เจพเจ—เจœเจผเฉ€ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจญเฉเจ—เจคเจพเจจ 'เจคเฉ‡, เจ‡เฉฑเจ• เจ‡เจฒเฉˆเจ•เจŸเฉเจฐเจพเจจเจฟเจ• เจ•เจฟเจคเจพเจฌ เจˆ-เจฎเฉ‡เจฒ เจฆเฉเจ†เจฐเจพ เจญเฉ‡เจœเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹