ืืขืื, ืืึทืืจืึธ ืจืขืืืืึทื ืฅ! ืื BPF ืืืืจืืืขื ืืึทืฉืื ืืื ืืืื ืขืจ ืคืื ืื ืืขืจืกื ืืืืืืืง ืงืึทืืคึผืึธืื ืึทื ืฅ ืคืื ืื ืืื ืืงืก ืงืขืจื. ืืืื ืืขืืขืจืืง ื ืืฆื ืืืขื ืืึธืื ืกืืกืืขื ืขื ืืืฉืึทื ืืจื ืฆื ืืขืคึฟืื ืขื ืืกืจืื ืืช ืืื ืกืึธืืืืข ืืคืืื ืื ืืขืจืกื ืงืึธืืคึผืืืฆืืจื ืคึผืจืึธืืืขืืก. ืืืจ ืืืขื ืืขืจื ืขื ืืื ืฆื ืฉืจืืึทืื ืืืืื ืืืึธืก ืืึธื ืืืึธืจ ืืื ืืึธืืืคืืฆืืจื ืื ื ืึทืืืจ ืคืื ืื ืงืขืจื, ืืื ืฆื ืืขืฉืึธืืขื ืื ืกืืจืืืขื ื ืงืึธื ืฆื ืืึธื ืืืึธืจ events ืืื ืื ืงืขืจื, ืืื ืคืื ืืขืจ. David Calavera ืืื Lorenzo Fontana ืืืขื ืืขืืคึฟื ืืืจ ืืคืฉืืืกื ืื ืืึทืื ืคืื BPF. ืืงืกืคึผืึทื ื ืืืื ืืืืกื ืคืื ืคืึธืจืฉืืขืืื ื ืึทืคึผืืึทืืึทืืืืฉืึทื, ื ืขืืืืึธืจืงืื ื, ืืืืขืจืืืื. - ื ืืฆื BPF ืฆื ืืึธื ืืืึธืจ ืืื ืืึธืืืคืืฆืืจื ืื ื ืึทืืืจ ืคืื ืื ืืื ืืงืก ืงืขืจื. - ืึทืจืืึทื ืฉืคึผืจืืฆื ืงืึธื ืฆื ืกืืงืืืจืื ืืึธื ืืืึธืจ ืงืขืจื ืืขืฉืขืขื ืืฉื ืึธื ืจืืงืึธืืคึผืืืข ืื ืงืขืจื ืึธืืขืจ ืจืขืืึธืึธื ืื ืกืืกืืขื. - ื ืืฆื ืืึทืงืืืขื ืงืึธื ืืืืฉืคืืื ืืื C, Go ืึธืืขืจ Python. - ื ืขืืขื ืงืึธื ืืจืึธื ืืืจื ืึธืื ืื ื ืื BPF ืคึผืจืึธืืจืึทื ืืขืื ืฆืืงื.
Linux Kernel Security, ืืืึทื ืคึฟืขืึดืงืืืื ืืื ืกืขืงืึธืืคึผ
BPF ืืื ืึท ืฉืืึทืจืง ืืืขื ืฆื ืคืึทืจืืจืืืืขืจื ืื ืงืขืจื ืึธื ืกืึทืงืจืึทืคืืืกืื ื ืคืขืกืืงืืึทื, ืืืืขืจืืืื ืึธืืขืจ ืืืืงืืึทื. ืคึฟืึทืจ ืืขื ืกืืื, ืื ืงืขืจื ืืขืืืขืืึธืคึผืขืจืก ืืขืืึทื ืง ืขืก ืืืึธืื ืืืื ืึท ืืืืข ืืขืืึทื ืง ืฆื ื ืืฆื ืืืึทื ืืืขืจืกืึทืืืืึทืื ืฆื ืคึฟืึทืจืืขืกืขืจื ืคึผืจืึธืฆืขืก ืืคืืขืืื ืืขืจืืงืืื ืืื Secomp ืืืจื ืืืคึผืืึทืืขื ืื ื Secomp ืคืืืืขืจืก ืืขืฉืืืฆื ืืืจื BPF ืืืืื, ืืืื ืืืงืื ื ืืื Secomp BPF. ืืื ืืขื ืงืึทืคึผืืื ืืืจ ืืืขืื ืืขืจืงืืขืจื ืืืึธืก Secommp ืืื ืืื ืืื ืขืก ืืื ืืขื ืืฆื. ืืขืจื ืึธื ืืืจ ืืืขื ืืขืจื ืขื ืืื ืฆื ืฉืจืืึทืื Secomp ืคืืืืขืจืก ื ืืฆื BPF ืืืืื. ืืขืจื ืึธื, ืืืจ ืืืขืื ืงืืงื ืืื ืื ืืขืืืื-ืืื BPF ืืืงืก ืืืึธืก ืืขื ืขื ืึทืจืืึทื ืืขืจืขืื ื ืืื ืื ืงืขืจื ืคึฟืึทืจ ืืื ืืงืก ืืืืขืจืืืื ืืึทืืืฉืืื.
ืืื ืืงืก ืกืขืงืืจืืื ืืึธืืืืขืก (LSM) ืืขื ืขื ืึท ืคืจืืืืืืขืจืง ืืืึธืก ืืื ืึท ืืึทื ื ืคืื ืคืึทื ืืงืฉืึทื ื ืืืึธืก ืงืขื ืขื ืืืื ืืขื ืืฆื ืฆื ืื ืกืืจืืืขื ื ืคืึทืจืฉืืื ืืืืขืจืืืื ืืึธืืขืืก ืืืืฃ ืึท ืกืืึทื ืืขืจืืืืื ืฉืืืืืขืจ. LSM ืงืขื ืขื ืืืื ืืขืืืืื ื ืืืืึทื ืืื ืื ืงืขืจื ืืงืืจ ืืืื, ืึทืืึท ืืื ืึทืคึผืคึผืึทืจืืึธืจ, 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 (ืืึธืก ืืื ืึท ืคึผืจืืืืืืืืฉื ืคึผืึธืจื). ืืืืฉืึทืืืึทืื ืืืจ ืืืืคื ืขืก ืืื ื ืึธื ืืึทืืืื ื:
$ go build -o capabilities main.go
$ ./capabilitiesืึธืืขืจ, ืืื ื ืืืจ ืืขืื ื ืืฉื ืืืึธืจืฆื ืคึผืจืืืืืืึทืืืฉืึทื, ืืขืจ ืงืึธื ืืืขื ืืืึทืจืคื ืึท ืืขืืช ืืืขื ืืืื ืืื ื ืื ืคึผืึธืจื:
2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1ืงืึทืคึผืฉ (ืฉืึธื ืคืึทืจืืืึทืืืขืจ) ืืื ืึท ืืขืฆืืึทื ืืืึธืก ืืืืคื ืึท ืฉืึธื ืืื ืึท ืกืคึผืขืฆืืคืืฉ ืืึทื ื ืคืื ืงืืืคึผืึทืืืืึทืืื.
ืืื ืืขื ืคืึทื, ืืื ืฉืืื ืืขืจืืื ื, ืึทื ืฉืืึธื ืฆื ืืขืื ืคืื ืืืึธืจืฆื ืจืขืื, ืืืจ ืงืขื ืขื ืืขืื ืคึผืจืืืืืืืืฉื ืคึผืึธืจื ืืืื ืืื ื ืืืจื ืคึผืจืึทืืืืืืื ื ืื cap_net_bind_service ืคืืืืงืืื ืฆืืืึทืืขื ืืื ืึทืืฅ ืืืึธืก ืืื ืฉืืื ืืื ืืขื ืคึผืจืึธืืจืึทื. ืฆื ืืึธื ืืึธืก, ืืืจ ืงืขื ืขื ืึทืจืืึทื ื ืขืืขื ืืื ืืืขืจ ืคึผืจืึธืืจืึทื ืืื ืงืึทืคึผืฉ:
# 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"ืืื ืก ืคึฟืึทืจืฉืืืื ืืขื ืงืึธืืขืงืืืื ืึท ืืืกื.
- ืงืึทืคึผืฉ - ื ืืฆื ืงืึทืคึผืฉ ืืื ืึท ืฉืึธื.
- โcaps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - ืืื ื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืฉื ืืขื ืืึทื ืืฆืขืจ (ืืืจ ืืึธื ื ืืฉื ืืืขืื ืฆื ืืืืคื ืืื ืืืึธืจืฆื), ืืืจ ืกืคึผืขืฆืืคืืฆืืจื cap_net_bind_service ืืื ืื ืคืืืืงืืื ืฆื ืึทืงืืฉืึทืืืึทืื ืืืืฉื ืื ืืึทื ืืฆืขืจ ืฉืืึทื ืคึฟืื ืืืึธืจืฆื ืฆื ืงืืื ืขืจ, ื ืืืืื cap_setuid ืืื cap_setgid.
- -ืงืขืคึผ = 1 - ืืืจ ืืืืื ืฆื ืืึทืืื ืื ืืื ืกืืึทืืืจื ืงืืืคึผืึทืืืืึทืืื ืืืขื ืกืืืืืฉืื ื ืคืื ืื ืืืึธืจืฆื ืืฉืืื.
- โ ืืึทื ืืฆืขืจ = "ืงืืื ืขืจ" โ ืืขืจ ืกืืฃ ืืึทื ืืฆืขืจ ืืืึธืก ืืืืคื ืืขื ืคึผืจืึธืืจืึทื ืืืขื ืืืื ืงืืื ืขืจ.
- โaddamb=cap_net_bind_service โ ืฉืืขืื ืื ืงืืืจืื ื ืคืื ืคึฟืึทืจืืื ืืขื ืข ืงืืืคึผืึทืืืืึทืืื ื ืึธื ืกืืืืืฉืื ื ืคืื ืืืึธืจืฆื ืืึธืืข.
- - C "./ืงืืืคึผืึทืืืืึทืืื" - ื ืึธืจ ืืืืคื ืืขื ืคึผืจืึธืืจืึทื.
ืืื ืืงื ืงืืืคึผืึทืืืืึทืืื ืืขื ืขื ืึท ืกืคึผืขืฆืืขื ืกืึธืจื ืคืื ืงืืืคึผืึทืืืืึทืืื ืืืึธืก ืืขื ืขื ืื ืืขืจืึทืืื ืืืจื ืงืื ื ืืืืื ืืืขื ืื ืงืจืึทื ื ืคึผืจืึธืืจืึทื ืขืงืกืึทืงืืืฅ ืืื ื ืืฆื ืขืงืกืขืงืืืข (). ืืืืื ืงืืืคึผืึทืืืืึทืืื ืืืึธืก ืืขื ืขื ืขืจืืืืื ืฆื ืืืื ืคืืจืืื ืื, ืึธืืขืจ ืืื ืื ืืขืจืข ืืืขืจืืขืจ, ืืื ืกืืืืืืข ืงืืืคึผืึทืืืืึทืืื, ืงืขื ืขื ืืืื ืื ืืขืจืึทืืื.
ืืืจ ืืืกืืึธืืข ืืืึทื ืืขืจืื ื ืืืึธืก +eip ืืืื ื ืึธื ืกืคึผืขืฆืืคืืฆืืจื ืื ืคืืืืงืืื ืืื ืื --caps ืึธืคึผืฆืืข. ืื ืคืืึทืืก ืืขื ืขื ืืขื ืืฆื ืฆื ืืึทืฉืืืกื ืื ืคืืืืงืืื:
-ืืืื ืืืื ืึทืงืืืืืืืืื (ืคึผ);
- ืื ืืืฆื ืคึฟืึทืจ ื ืืฆื (E);
-ืงืขื ืขื ืืืื ืื ืืขืจืึทืืื ืืืจื ืงืื ื ืคึผืจืึทืกืขืกืึทื (ืืื).
ืืื ื ืืืจ ืืืืื ืฆื ื ืืฆื cap_net_bind_service, ืืืจ ืืึทืจืคึฟื ืฆื ืืึธื ืืึธืก ืืื ืื E ืคืึธื. ืืขืจื ืึธื ืืืจ ืืืขืื ืึธื ืืืืื ืื ืฉืึธื ืืื ืื ืืึทืคึฟืขื. ืืึธืก ืืืขื ืืืืคื ืื ืืืื ืขืจื ืงืืืคึผืึทืืืืึทืืื ืืื ืืืจ ืืึทืจืคึฟื ืฆื ืฆืืืื ืขืก ืืื ืื i ืคืึธื. ืฆืื ืกืืฃ, ืืืจ ืืืขืื ืึทื ืื ืฉืืจืื ืืึธื ืืืื ืขื ืืืืึทืื (ืืืจ ืืืื ืืึธืก ืึธื ืืฉืึทื ืืื ื ืื UID) ืืื ืคึผ. ืขืก ืงืืงื ืืื cap_net_bind_service+eip.
ืืืจ ืงืขื ืขื ืงืึธื ืืจืึธืืืจื ืื ืจืขืืืืืึทื ืืื ss. ืืึธืืืจ ืคืึทืจืงืืจืฆื ืื ืจืขืืืืืึทื ืึท ืืืกื ืฆื ืคึผืึทืกืืง ืืืืฃ ืืขื ืืืึทื, ืึธืืขืจ ืขืก ืืืขื ืืืืึทืื ืื ืคึฟืึทืจืืื ืื ืคึผืึธืจื ืืื ืืึทื ืืฆืขืจ ืฉืืึทื ืื ืืขืจืข ืืื 0, ืืื ืืขื ืคืึทื 65:
# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0ืืื ืืขื ืืืึทืฉืคึผืื ืืืจ ืืขืืืืื ื ืงืึทืคึผืฉ, ืึธืืขืจ ืืืจ ืงืขื ืขื ืฉืจืืึทืื ืึท ืฉืึธื ืืื ืืืืงืึทืคึผ. ืคึฟืึทืจ ืืขืจ ืืื ืคึฟืึธืจืืึทืฆืืข, ืืขื ืืขื ืืฉ 3 libcap.
ืืืขื ืฉืจืืืื ืืืืื, ืึธืคื ืื ืืขืืืขืืึธืคึผืขืจ ืงืขื ื ืืฉื ืืืืกื ืืื ืฉืืืึทืื ืึทืืข ืื ืคึฟืขืึดืงืืืื ืืืึธืก ืื ืคึผืจืึธืืจืึทื ืืึทืจืฃ ืืื ืื ืืืืคื ืฆืืื; ืืขืจืฆื, ืื ืคึฟืขืึดืงืืืื ืงืขื ืืืืฉื ืืื ื ืืึทืข ืืืขืจืกืืขืก.
ืฆื ืืขืกืขืจ ืคึฟืึทืจืฉืืืื ืื ืงืืืคึผืึทืืืืึทืืื ืคืื ืืื ืืืขืจ ืคึผืจืึธืืจืึทื, ืืืจ ืงืขื ืขื ื ืขืืขื ืื BCC ืืืืืขืืืืืง ืืขืฆืืึทื, ืืืึธืก ืฉืืขืื ืื ืงืคึผืจืึธืืข ืคึฟืึทืจ ืื 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 ืืื ืึท ืืืื-ืืื ืขืจ ืงืคึผืจืึธืืข ืืื ืื 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. Capability ืืืื ืขืจ ืืืึธืก ืืืจ ืืขื ืขื ืืื ืืขืจืขืกืืจื ืืื ืืื CAP_NET_BIND_SERVICE, ืขืก ืืื ืืืคืืื ื ืืื ืึท ืงืขืกืืืืขืจืืืง ืืื ืื ืงืขืจื ืืงืืจ ืงืึธื ืืื ืืขืจ ืืขืงืข ืึทืจืืึทื ื ืขืืขื/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 ืฆืืืื ื.
ืืขืจ ืืืืึทืืขืจ ืึธืคึผืืืืืื ื ืืืืืื ืืื ืฆื ื ืืฆื ืคึฟืขืึดืงืืืื ืึทืืึท ืืื ืคึฟืืืืจืืจืื ื, ืึธืืขืจ ื ืืฆื ืึท ืึทื ืืขืจืฉ ืืขืื ืืง ืืืึธืก ืึทืืึทืื ืืื ืื ืฆื ืคึผืจืึธืืจืึทืืืึทืืืง ืื ืกืืจืืืขื ื ืืื ืืืขืจ ืืืืืขื ืข ืคืืืืขืจืก.
Secomp
Secomp ืฉืืืื ืคึฟืึทืจ Secure Computing ืืื ืืื ืึท ืืืืขืจืืืื ืฉืืืืข ืืืคึผืืึทืืขื ืึทื ืืื ืื ืืื ืืงืก ืงืขืจื ืืืึธืก ืึทืืึทืื ืืขืืืขืืึธืคึผืขืจืก ืฆื ืคืืืืขืจ ืืืืขืจ ืกืืกืืขื ืจืืคื. ืืึธืืฉ Secommp ืืื ืคืึทืจืืืืึทืืืขื ืืื ืงืืืคึผืึทืืืืึทืืื ืฆื ืืื ืืงืก, ืืืื ืคืืืืงืืื ืฆื ืคืืจื ืืืืขืจ ืกืืกืืขื ืจืืคื ืืืื ืขืก ืคืื ืืขืจ ืคืืขืงืกืึทืืึทื ืงืึทืืคึผืขืจื ืืื ืืื.
Secomp ืืื Linux ืคึฟืขืึดืงืืืื ืืขื ืขื ื ืืฉื ืืืืืฉืืึทืื ืืืกืฉืืืกืืง ืืื ืืขื ืขื ืึธืคื ืืขื ืืฆื ืฆืืืึทืืขื ืฆื ื ืืฅ ืคืื ืืืืืข ืึทืคึผืจืึธืืืฉืื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืจ ืืื ืืืขืื ืฆื ืืขืื ืึท ืคึผืจืึธืฆืขืก ืื CAP_NET_ADMIN ืคืืืืงืืื ืึธืืขืจ ื ืืฉื ืืึธืื ืขืก ืฆื ืึธื ื ืขืืขื ืืึธืืขื ืงืึทื ืขืงืฉืึทื ื, ืืืึทืงืื ื ืื ืึธื ื ืขืืขื ืืื ืึธื ื ืขืืขื4 ืกืืกืืขื ืงืึทืืืก.
ืื Secomp ืคึฟืืืืจืืจืื ื ืืืคึฟื ืืื ืืืืืจื ืืืืฃ BPF ืคืืืืขืจืก ืึทืคึผืขืจืืืืื ื ืืื ืื SECCOMP_MODE_FILTER ืืึธืืข, ืืื ืกืืกืืขื ืจืืคื ืคึฟืืืืจืืจืื ื ืืื ืืืจืืืขืงืึธืื ืืื ืื ืืขืืืข ืืืขื ืืื ืคึฟืึทืจ ืคึผืึทืงืืฅ.
ืกืขืงืึธืืคึผ ืคืืืืขืจืก ืืขื ืขื ืืึธืืืื ืืื ืคึผืจืงืื ืืืจื ืื PR_SET_SECCOMP ืึธืคึผืขืจืึทืฆืืข. ืื ืคืืืืขืจืก ื ืขืืขื ืื ืคืึธืจืขื ืคืื ืึท BPF ืคึผืจืึธืืจืึทื ืืืึธืก ืืื ืขืงืกืึทืงืืืืึทื ืคึฟืึทืจ ืืขืืขืจ ืกืขืงืึธืืคึผ ืคึผืึทืงืึทื ืจืขืคึผืจืืืขื ืืื ืืืจื ืื ืกืขืงืงืึธืืคึผ_ืืึทืืึท ืกืืจืืงืืืจ. ืื ืกืืจืืงืืืจ ืึผืืื ืื ืจืขืคึฟืขืจืขื ืฅ ืึทืจืงืึทืืขืงืืฉืขืจ, ืึท ืืืึทืื ืฆื ืคึผืจืึทืกืขืกืขืจ ืืื ืกืืจืืงืฆืืขืก ืืื ืืขืจ ืฆืืื ืคืื ืื ืกืืกืืขื ืจืืคื, ืืื ืึท ืืึทืงืกืืืื ืคืื ืืขืงืก ืกืืกืืขื ืจืืคื ืึทืจืืืืขื ืื, ืืืืกืืขืืจืืงื ืืื uint64.
ืืึธืก ืืื ืืื ืื secomp_data ืกืืจืืงืืืจ ืงืืงื ืืื ืคึฟืื ืื ืงืขืจื ืืงืืจ ืงืึธื ืืื ืื linux/secomp.h ืืขืงืข:
struct seccomp_data {
int nr;
__u32 arch;
__u64 instruction_pointer;
__u64 args[6];
};ืืื ืืืจ ืงืขื ืขื ืืขื ืคึฟืื ืืขื ืกืืจืืงืืืจ, ืืืจ ืงืขื ืขื ืคืืืืขืจ ืืืจื ืื ืกืืกืืขื ืจืืคื, ืืืึทื ืึทืจืืืืขื ืื ืึธืืขืจ ืึท ืงืึธืืืื ืึทืฆืืข ืคืื โโโโืืืืืข.
ื ืึธื ืืืงืืืขื ืืขืืขืจ ืกืขืงืึธืืคึผ ืคึผืึทืงืึทื, ืืขืจ ืคืืืืขืจ ืืืื ืืืจืืคืืจื ืคึผืจืึทืกืขืกืื ื ืฆื ืืึทืื ืึท ืืขืฆื ืืึทืฉืืืก ืืื ืืึธืื ืื ืงืขืจื ืืืึธืก ืฆื ืืึธื ืืืืึทืืขืจ. ืื ืืขืฆื ืืึทืฉืืืก ืืื ืืืืกืืขืืจืืงื ืืืจื ืืืื ืขืจ ืคืื ืื ืฆืืจืืงืงืืืขื ืืืึทืืืขืก (ืกืืึทืืืก ืงืึธืืื).
- 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_O_TRACESECCOMP ืฆื ืื ืืขืจืกืขืคึผื ืืืขื ืึท ืกืืกืืขื ืจืืคื ืืื ืขืงืกืึทืงืืืืึทื ืฆื ืืขื ืืื ืงืึธื ืืจืึธืืืจื ืืขื ืคึผืจืึธืฆืขืก. ืืืื ืึท ืืจืืืกืขืจ ืืื ื ืืฉื ืงืึธื ื ืขืงืืขื, ืึท ืืขืืช ืืื ืืืืืขืงืขืจื, ืขืจืจื ืึธ ืืื ืืึทืฉืืืื ืฆื -ENOSYS, ืืื ืื ืกืืกืืขื ืจืืคื ืืื ื ืืฉื ืขืงืกืึทืงืืืืึทื.
- SECCOMP_RET_LOG - ืื ืกืืกืืขื ืจืืคื ืืื ืจืืืึทืืืื ืืื ืืึธืื.
- SECCOMP_RET_ALLOW - ืื ืกืืกืืขื ืจืืคื ืืื ืคืฉืื ืขืจืืืืื.
ptrace ืืื ืึท ืกืืกืืขื ืจืืคื ืฆื ืื ืกืืจืืืขื ื ืืจืืืกืื ื ืืขืงืึทื ืืืึทืื ืืื ืึท ืคึผืจืึธืฆืขืก ืืขืจืืคึฟื ืืจืึทืกืขืข, ืืื ืื ืคืืืืงืืื ืฆื ืืึธื ืืืึธืจ ืืื ืงืึธื ืืจืึธืืืจื ืื ืืืจืืคืืจืื ื ืคืื ืืขื ืคึผืจืึธืฆืขืก. ืื ืฉืคึผืืจ ืคึผืจืึธืืจืึทื ืงืขื ืขื ืืคืขืงืืืืืื ืืฉืคึผืขื ืืขืจ ืืืจืืคืืจืื ื ืืื ืืึธืืืคืืฆืืจื ืื ืืืงืึธืจื ืจืขืืืฉืืกืืขืจื ืคืื ืืจืึทืกืขืข. ืืื ืื Secomp ืงืึธื ืืขืงืกื, ptrace ืืื ืืขื ืืฆื ืืืขื ืืจืืืขืจื ืืืจื ืื SECCOMP_RET_TRACE ืกืืึทืืืก ืงืึธื, ืึทืืื ืื ืืจืืืกืขืจ ืงืขื ืขื ืคืึทืจืืืึทืื ืื ืกืืกืืขื ืจืืคื ืคืื ืขืงืกืึทืงืืืืื ื ืืื ืื ืกืืจืืืขื ื ืืืื ืืืืืขื ืข ืืึธืืืง.
ืืืืกืงืืืึทืื ืื ืืขืืช
ืคืื ืฆืืื ืฆื ืฆืืื, ืืืขื ืืืจ ืึทืจืืขื ืืื Secomp, ืืืจ ืืืขื ืืจืขืคื ืคืึทืจืฉืืื ืขืจืจืึธืจืก, ืืืึธืก ืืขื ืขื ืืืืขื ืึทืคืืื ืืืจื ืึท ืฆืืจืืงืงืขืจ ืืืขืจื ืคืื ืืืคึผ SECCOMP_RET_ERRNO. ืฆื ืืึทืจืืื ืึท ืืขืืช, ืื ืกืขืงืงืึธืืคึผ ืกืืกืืขื ืจืืคื ืืืขื ืฆืืจืืงืงืืืขื -1 ืึทื ืฉืืึธื ืคืื 0.
ืื ืคืืืืขื ืืข ืขืจืจืึธืจืก ืืขื ืขื ืืขืืืขื:
- ืึทืงืกืขืก - ืืขืจ ืงืึทืืืขืจ ืืื ื ืืฉื ืขืจืืืืื ืฆื ืืึทืื ืึท ืกืืกืืขื ืจืืคื. ืืขื ืืืืฉืึทืืืึทืื ืืึทืคึผืึทื ื ืืืืึทื ืขืก ืืื ื ืืฉื ืืึธืื CAP_SYS_ADMIN ืคึผืจืืืืืืึทืืืฉืึทื ืึธืืขืจ no_new_privs ืืื ื ืืฉื ืืึทืฉืืืื ื ืืฆื prctl (ืืืจ ืืืขืื ืจืขืื ืืืขืื ืืขื ืฉืคึผืขืืขืจ);
- EFAULT - ืื ืืืจืืืขืืื ืืขื ืึทืจืืืืขื ืื (ืึทืจืืก ืืื ืื ืกืขืงืงืึธืืคึผ_ืืึทืืึท ืกืืจืืงืืืจ) ืืึธื ื ืื ืืึธืื ืึท ืืืืืืง ืึทืืจืขืก;
- EINVAL - ืขืก ืงืขื ืืืื ืคืืจ ืกืืืืช ืืึธ:
-ืื ืืขืืขืื ืึธืคึผืขืจืึทืฆืืข ืืื ืืืืืึทืงืึทื ื ืึธืืขืจ ื ืืฉื ืืขืฉืืืฆื ืืืจื ืื ืงืขืจื ืืื ืื ืงืจืึทื ื ืงืึทื ืคืืืืขืจืืืฉืึทื;
-ืื ืกืคึผืขืกืืคืืขื ืคืืึทืืก ืืขื ืขื ื ืืฉื ืืืืืืง ืคึฟืึทืจ ืื ืืขืืขืื ืึธืคึผืขืจืึทืฆืืข;
-ืึธืคึผืขืจืึทืฆืืข ืืืื BPF_ABS, ืึธืืขืจ ืขืก ืืขื ืขื ืคึผืจืึธืืืขืืก ืืื ืื ืกืคึผืขืกืืคืืขื ืคืึธืืึธ, ืืืึธืก ืงืขื ืืงืกืื ืื ืืจืืืก ืคืื ืื ืกืขืงืงืึธืืคึผ_ืืึทืืึท ืกืืจืืงืืืจ;
-ืื ื ืืืขืจ ืคืื ืื ืกืืจืึทืงืฉืึทื ื ืืืจืืืขืืื ืืขื ืฆื ืื ืคืืืืขืจ ืืงืกืืื ืื ืืึทืงืกืืืื;
- ENOMEM - ื ืื ืืขื ืื ืืึผืจืื ืฆื ืืืกืคืืจื ืืขื ืคึผืจืึธืืจืึทื;
- EOPNOTSUPP - ืื ืึธืคึผืขืจืึทืฆืืข ืืื ืื ืืขืืืืื ืึทื ืืื SECCOMP_GET_ACTION_AVAIL ืื ืึทืงืฆืืข ืืื ืื ืืืฆื, ืึธืืขืจ ืืขืจ ืงืขืจื ืฉืืืฆื ื ืืฉื ืงืขืจื ืืื ืึทืจืืืืขื ืื;
- ESRCH - ืึท ืคึผืจืึธืืืขื ืืื ืคืืจืืขืงืืืขื ืืืขื ืกืื ืืงืจืึทื ืืืืื ื ืื ืื ืืขืจ ืืืึทื;
- ENOSYS - ืขืก ืืื ืงืืื ืืจืืืกืขืจ ืึทืืึทืืฉื ืฆื ืื SECCOMP_RET_TRACE ืงืึทืืฃ.
prctl ืืื ืึท ืกืืกืืขื ืจืืคื ืืืึธืก ืึทืืึทืื ืึท ืืึทื ืืฆืขืจ-ืคึผืืึทืฅ ืคึผืจืึธืืจืึทื ืฆื ืืึทื ืืคึผืืืืจื (ืฉืืขืื ืืื ืืึทืงืืืขื) ืกืคึผืขืฆืืคืืฉ ืึทืกืคึผืขืงืฅ ืคืื ืึท ืคึผืจืึธืฆืขืก, ืึทืืึท ืืื ืืืืืข ืขื ืื ืึทืก, ืคืึธืืขื ื ืขืืขื, ืืืืขืจ ืงืึทืืคึผืืึทืืืืฉืึทื ืืึธืืข (Secomp), ืคึผืจืืืืืืึทืืืฉืึทื, ืคึผืขืจืฃ ืืขืฉืขืขื ืืฉื, ืขืืง.
Secommp ืงืขื ืืืกืงืืืขื ืืื ืึท ืืึทืืืงืึทืกืื ืืขืื ืึธืืึธืืืข ืคึฟืึทืจ ืืืจ, ืึธืืขืจ ืืึธืก ืืื ื ืืฉื. Secommp ืืื ืึท ื ืืฆื ืืืึธืก ืึทืืึทืื ื ืืฆืขืจืก ืฆื ืึทื ืืืืืงืืขื ืึท ืืึทืืืงืึทืกืื ืืขืงืึทื ืืืึทื. ืืืฆื ืืึธืื ืก ืงืืง ืืื ืืึทื ืืฆืขืจ ืื ืืขืจืึทืงืฉืึทื ืืืืื ืืขื ืขื ืืืฉืืคื ืืื ืึท ืคืืืืขืจ ืืขืจืืคึฟื ืืืืึทื ืืืจื ืื Secommp ืกืืกืืขื ืจืืคื.
ืืืืฉืคึผืื ืคืื BPF Secommp ืคืืืืขืจ
ืืึธ ืืืจ ืืืขืื ืืืืึทืื ืืื ืฆื ืคืึทืจืืื ืื ืื ืฆืืืื ืึทืงืฉืึทื ื ืืืกืงืึทืกื ืคืจืืขืจ, ื ืืืืื:
- ืืืจ ืืืขืื ืฉืจืืึทืื ืึท Secomp 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 ืฉืืขืื ืฆื ื. ืืืืฃ ืึท ืืจืืขืื ืืึทืฉืื ืืืจ ืงืขื ืขื ืงืึธื ืืจืึธืืืจื ืืขื ืืื ืืึธืก:
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 ืืึทืงืจืึธืก ืืืคืืื ื ืืื ืื ืืื ืืงืก / ืคืืืืขืจ.ื ืืขืงืข.
ืืื ืก ืืืื ืืืจื ืื ืื ืกืืจืึทืงืฉืึทื ื.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct secomp_data, arch))) - ืื ืกืืกืืขื ืืึธืืื ืืื ืึทืงืืืืืึทืืืืฅ ืคึฟืื BPF_LD ืืื ืื ืคืึธืจืขื ืคืื ืื ืืืึธืจื BPF_W, ืคึผืึทืงืึทื ืืึทืื ืืื ืืืื ืืื ืึท ืคืึทืจืคืขืกืืืงื ืคืึธืืึธ BPF_ABS.
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ืึทืจืืฉ, 0, 3) - ืืฉืขืงืก ื ืืฆื BPF_JEQ ืฆื ืื ืึทืจืงืึทืืขืงืืฉืขืจ ืืืขืจื ืืื ืื BPF_K ืึทืงืืืืืึทืืึทืืึธืจ ืงืขืกืืืืขืจืืืง ืืื ืืืืึทื ืฆื ืึทืจืืฉ. ืืืื ืึทืืื, ืืืฉืึทืืคึผืก ืืืึท ืคืึธืืึธ 0 ืฆื ืืขืจ ืืืืึทืืขืจ ืืืืขื, ืึทื ืืขืจืฉ ืืืฉืึทืืคึผืก ืืืึท ืคืึธืืึธ 3 (ืืื ืืขื ืคืึทื) ืฆื ืืืึทืจืคื ืึท ืืขืืช ืืืืึทื ืึทืจืืฉ ืืื ื ืืฉื ืืืืึทืื.
- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct secomp_data, nr))) - ืืึธืื ืืื ืึทืงืืืืืึทืืืืฅ ืคึฟืื BPF_LD ืืื ืื ืคืึธืจืขื ืคืื ืื ืืืึธืจื BPF_W, ืืืึธืก ืืื ืื ืกืืกืืขื ืจืืคื ื ืืืขืจ ืงืึทื ืืืื ื ืืื ืื ืคืึทืจืคืขืกืืืงื ืคืึธืืึธ ืคืื BPF_ABS.
- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) - ืงืึทืืคึผืขืจื ืื ืกืืกืืขื ืจืืคื ื ืืืขืจ ืืื ืื ืืืขืจื ืคืื ืื ื ืืืขืจ ืืืขืจืืึทืืึทื. ืืืื ืืื ืืขื ืขื ืืืืึทื, ืืึทื ืืืืฃ ืฆื ืืขืจ ืืืืึทืืขืจ ืืืืขื ืืื ืืืกืืืืึทื ืื ืกืืกืืขื ืจืืคื, ืึทื ืืขืจืฉ ืึทืืึทืื ืื ืกืืกืืขื ืจืืคื ืืื SECCOMP_RET_ALLOW.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (ืืขืืช & SECCOMP_RET_DATA)) - ืืขืจืืึทื ืืืฅ ืื ืคึผืจืึธืืจืึทื ืืื BPF_RET ืืื ืืื ืึท ืจืขืืืืืึทื ืืจืืื ืึท ืืขืืช SECCOMP_RET_ERRNO ืืื ืื ื ืืืขืจ ืคืื ืื ืืขืืช ืืืึทืืขืืืืืง.
- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - ืืขืจืืึทื ืืืฅ ืื ืคึผืจืึธืืจืึทื ืืื BPF_RET ืืื ืึทืืึทืื ืื ืกืืกืืขื ืจืืคื ืฆื ืืืื ืขืงืกืึทืงืืืืึทื ืืื SECCOMP_RET_ALLOW.
SECCOMP ืืื CBPF
ืืืจ ืงืขื ืืืื ืืืึทื ืืขืจืื ื ืืืึธืก ืึท ืจืฉืืื ืคืื ืื ืกืืจืึทืงืฉืึทื ื ืืื ืืขื ืืฆื ืึทื ืฉืืึธื ืคืื ืึท ืงืึธืืคึผืืืขื ELF ืืืืคืขืฅ ืึธืืขืจ ืึท JIT ืงืึธืืคึผืืืขื C ืคึผืจืึธืืจืึทื.ืขืก ืืขื ืขื ืฆืืืื ืกืืืืช ืคึฟืึทืจ ืืขื.
โข ืขืจืฉืืขืจ, Secomp ื ืืฆื cBPF (ืงืืึทืกืืฉ BPF) ืืื ื ืื eBPF, ืืืึธืก ืืืื: ืขืก ืืื ืงืืื ืจืขืืืฉืืกืืขืจื, ืึธืืขืจ ืืืืื ืึทื ืึทืงืืืืืึทืืึทืืึธืจ ืฆื ืงืจืึธื ืื ืืขืฆืืข ืจืขืืืืืึทื ืคืื ืื ืืขืืฉืื, ืืื ืงืขื ืขื ืืืื ืืขืืขื ืืื ืืขื ืืืึทืฉืคึผืื.
โข ืจืืข, Secomp ืึทืงืกืขืคึผืฅ ืึท ืึธื ืืืืึทื ืฆื ืึท ืืขื ืืข ืคืื โโ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;
}ืฆืื ืกืืฃ, ืืืจ ืงืขื ืขื ื ืืฆื ืืื ืืืขืจ ืื ืกืืึทืื_ืคืืืืขืจ ืคึฟืื ืงืฆืืข, ืึธืืขืจ ืคืจืืขืจ ืืืจ ืืึทืจืคึฟื ืฆื ื ืืฆื prctl ืฆื ืฉืืขืื PR_SET_NO_NEW_PRIVS ืคึฟืึทืจ ืื ืงืจืึทื ื ืืืจืืคืืจืื ื ืืื ืืขืจืืื ืืืกืืืืื ืื ืกืืืืึทืฆืืข ืืื ืงืื ื ืคึผืจืึทืกืขืกืึทื ืืึทืงืืืขื ืืขืจ ืคึผืจืืืืืืึทืืืฉืึทื ืืื ืืืืขืจ ืขืืืขืจื. ืืื ืืขื, ืืืจ ืงืขื ืขื ืืึทืื ืื ืคืืืืขื ืืข prctl ืจืืคื ืืื ืื install_filter ืคืื ืงืฆืืข ืึธื ืืืึธืจืฆื ืจืขืื.
ืืืฆื ืืืจ ืงืขื ืขื ืจืืคื ืื 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]);
}ืืืืืจ ืื ืืืืืขื. ืฆื ืฆืื ืืืคื ืขืืขื ืืื ืืืขืจ ืคึผืจืึธืืจืึทื ืืืจ ืงืขื ืขื ื ืืฆื ืึธืืขืจ ืงืืึทื ื ืึธืืขืจ ืืงืง, ืึธืืขืจ ืืืขื ืขืก ืก ื ืึธืจ ืงืึทืืคึผืืืืื ื ืื main.c ืืขืงืข ืึธื ืกืคึผืขืฆืืขื ืึธืคึผืฆืืขืก:
clang main.c -o filter-writeืืื ืฉืืื ืื ืืขืืืืื, ืืืจ ืืึธืื ืืคืืขืฉืืขืื ืึทืืข ืืืื ืกื ืืื ืืขื ืคึผืจืึธืืจืึทื. ืฆื ืคึผืจืืืืจื ืืขื ืืืจ ืืึทืจืคึฟื ืึท ืคึผืจืึธืืจืึทื ืืืึธืก ืึทืืืคึผืืฅ ืขืคึผืขืก - ืขืก ืืืื ื ืืื ืึท ืืื ืงืึทื ืืืืึทื. ืืืื ืคืืจื ืื ืืื ืืขืืืขื ืืื:
ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c
ืืืื ืืขืจืืขื! ืืึธ ืก ืืื ื ืืฆื ืืื ืืืขืจ ืจืึทืคึผืขืจ ืคึผืจืึธืืจืึทื ืงืืงื ืืื: ืืืจ ืคืฉืื ืคืึธืจื ืื ืคึผืจืึธืืจืึทื ืืืจ ืืืืื ืฆื ืคึผืจืืืืจื ืืื ืืขืจ ืขืจืฉืืขืจ ืึทืจืืืืขื ื:
./filter-write "ls -la"ืืืขื ืขืงืกืึทืงืืืืึทื, ืืขื ืคึผืจืึธืืจืึทื ืืจืืื ืืึธืจ ืืืืืืง ืจืขืืืืืึทื. ืึธืืขืจ, ืืืจ ืงืขื ืขื ื ืืฆื ืกืืจืึทืกืข ืฆื ืืขื ืืืึธืก ืืื ืืขืฉืขืขื ืืฉ:
strace -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)ืืืฆื ืืืจ ืคึฟืึทืจืฉืืืื ืืื Secomp 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. ืขืจ ืืึธื ืืขืืจืืขื ืืื ืืึธืงืขืจ ืฉืืืฆื ืืื ืงืึทื ืืจืืืืืืื ืฆื ืืขืจ ืึทื ืืืืืงืืื ื ืคืื Runc, Go ืืื BCC ืืืฉืืจืื, ืืื ืืขืืื ื ืืื ืื ืืขืจืข ืึธืคึฟื ืืงืืจ ืคึผืจืึทืืืฉืขืงืก. ืืึทืืืืกื ืคึฟืึทืจ ืืืื ืึทืจืืขื ืืืืฃ ืืึธืงืขืจ ืคึผืจืึทืืืฉืขืงืก ืืื ืึทื ืืืืืงืืื ื ืคืื ืื ืืึธืงืงืขืจ ืคึผืืืืื ืืงืึธืืกืืกืืึทื. ืืื ืืื ืืืืขืจ ืืืึทืื ืฉืึทืคืืืขื ืืืขืื ืคืืึทื ืืจืึทืคืก ืืื ืืื ืฉืืขื ืืืง ืืืื ืฆื ืึทืคึผืืึทืืืื ืคืึธืจืฉืืขืืื ื.
ืืึธืจืขื ืืึธ ืคืึธื ืืึทื ืึท ืึทืจืืขื ืืืืฃ ืื ืึธืคึฟื ืืงืืจ ืืึทื ืฉืึทืคึฟื ืืื Sysdig, ืืื ืขืจ ืืื ืืคึฟืจื ืคืึธืืงืืกื ืืืืฃ Falco, ืึท ืงืืึธืื ื ืึทืืืืืข ืงืึทืืคึผืืืืื ื ืืืืงืืคึผืขืืืข ืคึผืจืืืขืงื ืืืึธืก ืืื ืงืึทื ืืืื ืขืจ ืจืื ืืืืข ืืืืขืจืืืื ืืื ืึทื ืึทืืึทืื ืืืืขืงืฉืึทื ืืืจื ืึท ืงืขืจื ืืึธืืืืข ืืื eBPF. ืขืจ ืืื ืืืึทืื ืฉืึทืคืืืขื ืืืขืื ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขืืขื, ืืืืืืืืืจื ืืืคืืื ื ื ืขืืืืึธืจืงืื ื, ืื ืืื ืืงืก ืงืขืจื ืืื ืคืึธืจืฉืืขืืื ื ืึทื ืึทืืืกืืก.
ยป ืืขืจ ืืขืืึทืืืก ืืืขืื ืืขื ืืื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื
ยป
ยป
ืคึฟืึทืจ Khabrozhiteley 25% ืึทืจืึธืคึผืจืขืืขื ืขื ืืื ืงืืคึผืึธื - ืืื ืืงืก
ืืื ืฆืึธืืื ื ืคืื ืื ืคึผืึทืคึผืืจ ืืืขืจืกืืข ืคืื โโืืขื ืืื, ืึทื ืขืืขืงืืจืึธื ืืฉ ืืื ืืืขื ืืืื ืืขืฉืืงื ืืืจื E- ืคึผืึธืกื.
ืืงืืจ: www.habr.com
