9
9
10
10
#include <errno.h>
11
11
#include <linux/landlock.h>
12
+ #include <linux/securebits.h>
12
13
#include <sys/capability.h>
13
14
#include <sys/socket.h>
14
15
#include <sys/syscall.h>
@@ -115,11 +116,16 @@ static void _init_caps(struct __test_metadata *const _metadata, bool drop_all)
115
116
/* clang-format off */
116
117
CAP_DAC_OVERRIDE ,
117
118
CAP_MKNOD ,
119
+ CAP_NET_ADMIN ,
120
+ CAP_NET_BIND_SERVICE ,
118
121
CAP_SYS_ADMIN ,
119
122
CAP_SYS_CHROOT ,
120
- CAP_NET_BIND_SERVICE ,
121
123
/* clang-format on */
122
124
};
125
+ const unsigned int noroot = SECBIT_NOROOT | SECBIT_NOROOT_LOCKED ;
126
+
127
+ if ((cap_get_secbits () & noroot ) != noroot )
128
+ EXPECT_EQ (0 , cap_set_secbits (noroot ));
123
129
124
130
cap_p = cap_get_proc ();
125
131
EXPECT_NE (NULL , cap_p )
@@ -137,6 +143,8 @@ static void _init_caps(struct __test_metadata *const _metadata, bool drop_all)
137
143
TH_LOG ("Failed to cap_set_flag: %s" , strerror (errno ));
138
144
}
139
145
}
146
+
147
+ /* Automatically resets ambient capabilities. */
140
148
EXPECT_NE (-1 , cap_set_proc (cap_p ))
141
149
{
142
150
TH_LOG ("Failed to cap_set_proc: %s" , strerror (errno ));
@@ -145,6 +153,9 @@ static void _init_caps(struct __test_metadata *const _metadata, bool drop_all)
145
153
{
146
154
TH_LOG ("Failed to cap_free: %s" , strerror (errno ));
147
155
}
156
+
157
+ /* Quickly checks that ambient capabilities are cleared. */
158
+ EXPECT_NE (-1 , cap_get_ambient (caps [0 ]));
148
159
}
149
160
150
161
/* We cannot put such helpers in a library because of kselftest_harness.h . */
@@ -158,8 +169,9 @@ static void __maybe_unused drop_caps(struct __test_metadata *const _metadata)
158
169
_init_caps (_metadata , true);
159
170
}
160
171
161
- static void _effective_cap (struct __test_metadata * const _metadata ,
162
- const cap_value_t caps , const cap_flag_value_t value )
172
+ static void _change_cap (struct __test_metadata * const _metadata ,
173
+ const cap_flag_t flag , const cap_value_t cap ,
174
+ const cap_flag_value_t value )
163
175
{
164
176
cap_t cap_p ;
165
177
@@ -168,7 +180,7 @@ static void _effective_cap(struct __test_metadata *const _metadata,
168
180
{
169
181
TH_LOG ("Failed to cap_get_proc: %s" , strerror (errno ));
170
182
}
171
- EXPECT_NE (-1 , cap_set_flag (cap_p , CAP_EFFECTIVE , 1 , & caps , value ))
183
+ EXPECT_NE (-1 , cap_set_flag (cap_p , flag , 1 , & cap , value ))
172
184
{
173
185
TH_LOG ("Failed to cap_set_flag: %s" , strerror (errno ));
174
186
}
@@ -183,15 +195,35 @@ static void _effective_cap(struct __test_metadata *const _metadata,
183
195
}
184
196
185
197
static void __maybe_unused set_cap (struct __test_metadata * const _metadata ,
186
- const cap_value_t caps )
198
+ const cap_value_t cap )
187
199
{
188
- _effective_cap (_metadata , caps , CAP_SET );
200
+ _change_cap (_metadata , CAP_EFFECTIVE , cap , CAP_SET );
189
201
}
190
202
191
203
static void __maybe_unused clear_cap (struct __test_metadata * const _metadata ,
192
- const cap_value_t caps )
204
+ const cap_value_t cap )
205
+ {
206
+ _change_cap (_metadata , CAP_EFFECTIVE , cap , CAP_CLEAR );
207
+ }
208
+
209
+ static void __maybe_unused
210
+ set_ambient_cap (struct __test_metadata * const _metadata , const cap_value_t cap )
211
+ {
212
+ _change_cap (_metadata , CAP_INHERITABLE , cap , CAP_SET );
213
+
214
+ EXPECT_NE (-1 , cap_set_ambient (cap , CAP_SET ))
215
+ {
216
+ TH_LOG ("Failed to set ambient capability %d: %s" , cap ,
217
+ strerror (errno ));
218
+ }
219
+ }
220
+
221
+ static void __maybe_unused clear_ambient_cap (
222
+ struct __test_metadata * const _metadata , const cap_value_t cap )
193
223
{
194
- _effective_cap (_metadata , caps , CAP_CLEAR );
224
+ EXPECT_EQ (1 , cap_get_ambient (cap ));
225
+ _change_cap (_metadata , CAP_INHERITABLE , cap , CAP_CLEAR );
226
+ EXPECT_EQ (0 , cap_get_ambient (cap ));
195
227
}
196
228
197
229
/* Receives an FD from a UNIX socket. Returns the received FD, or -errno. */
0 commit comments