@@ -22,10 +22,12 @@ import (
2222)
2323
2424// credentialsWithCaps creates a credentials object with the given capabilities.
25- func credentialsWithCaps (inheritable , bounding CapabilitySet ) * Credentials {
25+ func credentialsWithCaps (permitted , inheritable , bounding , ambient CapabilitySet ) * Credentials {
2626 return NewUserCredentials (1001 , 1001 , nil , & TaskCapabilities {
27+ PermittedCaps : permitted ,
2728 InheritableCaps : inheritable ,
2829 BoundingCaps : bounding ,
30+ AmbientCaps : ambient ,
2931 }, NewRootUserNamespace ())
3032}
3133
@@ -72,7 +74,7 @@ func TestComputeCredsForExec(t *testing.T) {
7274 PermittedCaps : CapabilitySetOf (linux .CAP_NET_ADMIN ),
7375 InheritableCaps : CapabilitySetOf (linux .CAP_NET_ADMIN ),
7476 },
75- creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
77+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , 0 ),
7678 wantPermitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
7779 wantEffective : true ,
7880 },
@@ -84,7 +86,7 @@ func TestComputeCredsForExec(t *testing.T) {
8486 PermittedCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
8587 InheritableCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID }),
8688 },
87- creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
89+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , 0 ),
8890 wantPermitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
8991 wantEffective : true ,
9092 },
@@ -96,7 +98,7 @@ func TestComputeCredsForExec(t *testing.T) {
9698 PermittedCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
9799 InheritableCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID }),
98100 },
99- creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
101+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , 0 ),
100102 wantPermitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
101103 wantEffective : false ,
102104 },
@@ -108,9 +110,65 @@ func TestComputeCredsForExec(t *testing.T) {
108110 PermittedCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
109111 InheritableCaps : CapabilitySetOf (linux .CAP_CHOWN ),
110112 },
111- creds : credentialsWithCaps (AllCapabilities , CapabilitySetOf (linux .CAP_CHOWN )),
113+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_CHOWN ), 0 ),
112114 wantErr : linuxerr .EPERM ,
113115 },
116+ {
117+ name : "TestAmbientCapsPreservedNonPrivileged" ,
118+ filePrivs : FilePrivileges {
119+ HasCaps : false ,
120+ Effective : false ,
121+ },
122+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_NET_ADMIN )),
123+ wantPermitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
124+ wantEffective : true ,
125+ },
126+ {
127+ name : "TestAmbientAndFileCapsCombined" ,
128+ filePrivs : FilePrivileges {
129+ HasCaps : true ,
130+ Effective : false ,
131+ PermittedCaps : CapabilitySetOf (linux .CAP_CHOWN ),
132+ InheritableCaps : CapabilitySetOf (linux .CAP_CHOWN ),
133+ },
134+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_NET_ADMIN )),
135+ wantPermitted : CapabilitySetOf (linux .CAP_CHOWN ),
136+ wantEffective : false ,
137+ },
138+ {
139+ name : "TestAmbientCapsPreservedWithFileCapsAndNoNewPrivs" ,
140+ filePrivs : FilePrivileges {
141+ HasCaps : true ,
142+ Effective : false ,
143+ PermittedCaps : CapabilitySetOf (linux .CAP_CHOWN ),
144+ InheritableCaps : CapabilitySetOf (linux .CAP_CHOWN ),
145+ },
146+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_NET_ADMIN )),
147+ noNewPrivs : true ,
148+ wantPermitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
149+ wantEffective : true ,
150+ },
151+ {
152+ name : "TestAmbientCapsClearedWithSUIDNonRoot" ,
153+ filePrivs : FilePrivileges {
154+ SetUserID : KUID (1002 ),
155+ },
156+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_NET_ADMIN )),
157+ allowSUID : true ,
158+ wantPermitted : 0 ,
159+ wantEffective : false ,
160+ },
161+ {
162+ name : "TestAmbientCapsPreservedWithSUIDAndNoNewPrivs" ,
163+ filePrivs : FilePrivileges {
164+ SetUserID : KUID (1002 ),
165+ },
166+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities , AllCapabilities , CapabilitySetOf (linux .CAP_NET_ADMIN )),
167+ noNewPrivs : true ,
168+ allowSUID : true ,
169+ wantPermitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
170+ wantEffective : true ,
171+ },
114172 } {
115173 t .Run (tst .name , func (t * testing.T ) {
116174 newC , _ , err := ComputeCredsForExec (tst .creds , tst .filePrivs , "" , tst .noNewPrivs , tst .stopPrivGain , tst .allowSUID )
0 commit comments