Linux Capabilities
Vroegâh, toen alles nog beter anders was, had een proces of
gebruikers-rechten, en mocht bijna niks, of root-rechten, en mocht bijna alles.
Tools als arping, die zelf netwerk pakketjes willen maken buiten het kernel
om, moesten toen dan ook op disk het SETUID bitje hebben, zodat ze bij het
uitvoeren als root zouden draaien.
Al terug in 1999 is hier verandering in gekomen, toen processen “Capabilities” konden krijgen met het 2.2 kernel. Sinds 2008 kunnen deze capabilities ook aan executables op disk gekoppeld worden, zodat er fijnmazig rechten uitgedeeld kunnen worden aan tools die dat nodig hebben.
In deze video kijkt Wander naar de basis van dit mechanisme, en hoe je dit kunt gebruiken om tooltjes meer rechten te geven.
Extra
Voor de mensen die willen weten hoe je vanuit een applicatie capabilities die
op permitted staan naar effective kunt zetten:
1package main
2
3import (
4 "fmt"
5 "log"
6
7 "kernel.org/pub/linux/libs/security/libcap/cap"
8)
9
10func main() {
11 origcaps := cap.GetProc()
12 fmt.Printf("starting process has these capabilities: %q\n", origcaps)
13
14 c, err := origcaps.Dup()
15 if err != nil {
16 log.Fatalf("failed to dup caps: %v", err)
17 }
18
19 if cap_dac_override, _ := c.GetFlag(cap.Permitted, cap.DAC_OVERRIDE); !cap_dac_override {
20 log.Fatalf("insufficient privilege to request DAC OVERRIDE - want %q, have %q", cap.DAC_OVERRIDE, c)
21 }
22
23 if err := c.SetFlag(cap.Effective, true, cap.DAC_OVERRIDE); err != nil {
24 log.Fatalf("unable to set capability: %v", err)
25 }
26
27 if err := c.SetProc(); err != nil {
28 log.Fatalf("unable to raise capabilities %q: %v", c, err)
29 }
30
31 newcaps := cap.GetProc()
32 fmt.Printf("current process has these capabilities: %q\n", newcaps)
33}
Als je dit compileert en uitvoert, dan krijg je dit:
1starting process has these capabilities: "="
22025/11/13 18:42:07 insufficient privilege to request DAC OVERRIDE - want "cap_dac_override", have "="
Wanneer je dan sudo setcap CAP_DAC_OVERRIDE+p <filenaam> draait op de binary,
dan krijg je dit als je het nog een keertje draait:
Wander Boessenkool