aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/security
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-07-10 21:43:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-07-10 21:43:43 -0400
commit028db3e290f15ac509084c0fc3b9d021f668f877 (patch)
tree7497244a90100f2464403063f88f83a555da03b3 /Documentation/security
parente9a83bd2322035ed9d7dcf35753d3f984d76c6a5 (diff)
Revert "Merge tag 'keys-acl-20190703' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs"
This reverts merge 0f75ef6a9cff49ff612f7ce0578bced9d0b38325 (and thus effectively commits 7a1ade847596 ("keys: Provide KEYCTL_GRANT_PERMISSION") 2e12256b9a76 ("keys: Replace uid/gid/perm permissions checking with an ACL") that the merge brought in). It turns out that it breaks booting with an encrypted volume, and Eric biggers reports that it also breaks the fscrypt tests [1] and loading of in-kernel X.509 certificates [2]. The root cause of all the breakage is likely the same, but David Howells is off email so rather than try to work it out it's getting reverted in order to not impact the rest of the merge window. [1] https://lore.kernel.org/lkml/20190710011559.GA7973@sol.localdomain/ [2] https://lore.kernel.org/lkml/20190710013225.GB7973@sol.localdomain/ Link: https://lore.kernel.org/lkml/CAHk-=wjxoeMJfeBahnWH=9zShKp2bsVy527vo3_y8HfOdhwAAw@mail.gmail.com/ Reported-by: Eric Biggers <ebiggers@kernel.org> Cc: David Howells <dhowells@redhat.com> Cc: James Morris <jmorris@namei.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation/security')
-rw-r--r--Documentation/security/keys/core.rst128
-rw-r--r--Documentation/security/keys/request-key.rst9
2 files changed, 31 insertions, 106 deletions
diff --git a/Documentation/security/keys/core.rst b/Documentation/security/keys/core.rst
index bc561ca95c86..d6d8b0b756b6 100644
--- a/Documentation/security/keys/core.rst
+++ b/Documentation/security/keys/core.rst
@@ -57,9 +57,9 @@ Each key has a number of attributes:
57 type provides an operation to perform a match between the description on a 57 type provides an operation to perform a match between the description on a
58 key and a criterion string. 58 key and a criterion string.
59 59
60 * Each key has an owner user ID, a group ID and an ACL. These are used to 60 * Each key has an owner user ID, a group ID and a permissions mask. These
61 control what a process may do to a key from userspace, and whether a 61 are used to control what a process may do to a key from userspace, and
62 kernel service will be able to find the key. 62 whether a kernel service will be able to find the key.
63 63
64 * Each key can be set to expire at a specific time by the key type's 64 * Each key can be set to expire at a specific time by the key type's
65 instantiation function. Keys can also be immortal. 65 instantiation function. Keys can also be immortal.
@@ -198,110 +198,43 @@ The key service provides a number of features besides keys:
198Key Access Permissions 198Key Access Permissions
199====================== 199======================
200 200
201Keys have an owner user ID, a group ID and an ACL. The ACL is made up of a 201Keys have an owner user ID, a group access ID, and a permissions mask. The mask
202sequence of ACEs that each contain three elements: 202has up to eight bits each for possessor, user, group and other access. Only
203six of each set of eight bits are defined. These permissions granted are:
203 204
204 * The type of subject. 205 * View
205 * The subject.
206 206
207 These two together indicate the subject to whom the permits are granted. 207 This permits a key or keyring's attributes to be viewed - including key
208 The type can be one of: 208 type and description.
209 209
210 * ``KEY_ACE_SUBJ_STANDARD`` 210 * Read
211 211
212 The subject is a standard 'macro' type. The subject can be one of: 212 This permits a key's payload to be viewed or a keyring's list of linked
213 213 keys.
214 * ``KEY_ACE_EVERYONE``
215
216 The permits are granted to everyone. It replaces the old 'other'
217 type on the assumption that you wouldn't grant a permission to other
218 that you you wouldn't grant to everyone else.
219
220 * ``KEY_ACE_OWNER``
221
222 The permits are granted to the owner of the key (key->uid).
223
224 * ``KEY_ACE_GROUP``
225
226 The permits are granted to the key's group (key->gid).
227
228 * ``KEY_ACE_POSSESSOR``
229
230 The permits are granted to anyone who possesses the key.
231
232 * The set of permits granted to the subject. These include:
233
234 * ``KEY_ACE_VIEW``
235
236 This permits a key or keyring's attributes to be viewed - including the
237 key type and description.
238
239 * ``KEY_ACE_READ``
240
241 This permits a key's payload to be viewed or a keyring's list of linked
242 keys.
243
244 * ``KEY_ACE_WRITE``
245
246 This permits a key's payload to be instantiated or updated, or it allows
247 a link to be added to or removed from a keyring.
248
249 * ``KEY_ACE_SEARCH``
250
251 This permits keyrings to be searched and keys to be found. Searches can
252 only recurse into nested keyrings that have search permission set.
253
254 * ``KEY_ACE_LINK``
255
256 This permits a key or keyring to be linked to. To create a link from a
257 keyring to a key, a process must have Write permission on the keyring
258 and Link permission on the key.
259
260 * ``KEY_ACE_SET_SECURITY``
261
262 This permits a key's UID, GID and permissions mask to be changed.
263 214
264 * ``KEY_ACE_INVAL`` 215 * Write
265 216
266 This permits a key to be invalidated with KEYCTL_INVALIDATE. 217 This permits a key's payload to be instantiated or updated, or it allows a
218 link to be added to or removed from a keyring.
267 219
268 * ``KEY_ACE_REVOKE`` 220 * Search
269 221
270 This permits a key to be revoked with KEYCTL_REVOKE. 222 This permits keyrings to be searched and keys to be found. Searches can
223 only recurse into nested keyrings that have search permission set.
271 224
272 * ``KEY_ACE_JOIN`` 225 * Link
273 226
274 This permits a keyring to be joined as a session by 227 This permits a key or keyring to be linked to. To create a link from a
275 KEYCTL_JOIN_SESSION_KEYRING or KEYCTL_SESSION_TO_PARENT. 228 keyring to a key, a process must have Write permission on the keyring and
229 Link permission on the key.
276 230
277 * ``KEY_ACE_CLEAR`` 231 * Set Attribute
278 232
279 This permits a keyring to be cleared. 233 This permits a key's UID, GID and permissions mask to be changed.
280 234
281For changing the ownership, group ID or permissions mask, being the owner of 235For changing the ownership, group ID or permissions mask, being the owner of
282the key or having the sysadmin capability is sufficient. 236the key or having the sysadmin capability is sufficient.
283 237
284The legacy KEYCTL_SETPERM and KEYCTL_DESCRIBE functions can only see/generate
285View, Read, Write, Search, Link and SetAttr permits, and do this for each of
286possessor, user, group and other permission sets as a 32-bit flag mask. These
287will be approximated/inferred:
288
289 SETPERM Permit Implied ACE Permit
290 =============== =======================
291 Search Inval, Join
292 Write Revoke, Clear
293 Setattr Set Security, Revoke
294
295 ACE Permit Described as
296 =============== =======================
297 Inval Search
298 Join Search
299 Revoke Write (unless Setattr)
300 Clear write
301 Set Security Setattr
302
303'Other' will be approximated as/inferred from the 'Everyone' subject.
304
305 238
306SELinux Support 239SELinux Support
307=============== 240===============
@@ -1151,8 +1084,7 @@ payload contents" for more information.
1151 1084
1152 struct key *request_key(const struct key_type *type, 1085 struct key *request_key(const struct key_type *type,
1153 const char *description, 1086 const char *description,
1154 const char *callout_info, 1087 const char *callout_info);
1155 struct key_acl *acl);
1156 1088
1157 This is used to request a key or keyring with a description that matches 1089 This is used to request a key or keyring with a description that matches
1158 the description specified according to the key type's match_preparse() 1090 the description specified according to the key type's match_preparse()
@@ -1167,8 +1099,6 @@ payload contents" for more information.
1167 If successful, the key will have been attached to the default keyring for 1099 If successful, the key will have been attached to the default keyring for
1168 implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING. 1100 implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
1169 1101
1170 If a key is created, it will be given the specified ACL.
1171
1172 See also Documentation/security/keys/request-key.rst. 1102 See also Documentation/security/keys/request-key.rst.
1173 1103
1174 1104
@@ -1177,8 +1107,7 @@ payload contents" for more information.
1177 struct key *request_key_tag(const struct key_type *type, 1107 struct key *request_key_tag(const struct key_type *type,
1178 const char *description, 1108 const char *description,
1179 struct key_tag *domain_tag, 1109 struct key_tag *domain_tag,
1180 const char *callout_info, 1110 const char *callout_info);
1181 struct key_acl *acl);
1182 1111
1183 This is identical to request_key(), except that a domain tag may be 1112 This is identical to request_key(), except that a domain tag may be
1184 specifies that causes search algorithm to only match keys matching that 1113 specifies that causes search algorithm to only match keys matching that
@@ -1193,8 +1122,7 @@ payload contents" for more information.
1193 struct key_tag *domain_tag, 1122 struct key_tag *domain_tag,
1194 const void *callout_info, 1123 const void *callout_info,
1195 size_t callout_len, 1124 size_t callout_len,
1196 void *aux, 1125 void *aux);
1197 struct key_acl *acl);
1198 1126
1199 This is identical to request_key_tag(), except that the auxiliary data is 1127 This is identical to request_key_tag(), except that the auxiliary data is
1200 passed to the key_type->request_key() op if it exists, and the 1128 passed to the key_type->request_key() op if it exists, and the
@@ -1267,7 +1195,7 @@ payload contents" for more information.
1267 1195
1268 struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid, 1196 struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid,
1269 const struct cred *cred, 1197 const struct cred *cred,
1270 struct key_acl *acl, 1198 key_perm_t perm,
1271 struct key_restriction *restrict_link, 1199 struct key_restriction *restrict_link,
1272 unsigned long flags, 1200 unsigned long flags,
1273 struct key *dest); 1201 struct key *dest);
diff --git a/Documentation/security/keys/request-key.rst b/Documentation/security/keys/request-key.rst
index f356fd06c8d5..35f2296b704a 100644
--- a/Documentation/security/keys/request-key.rst
+++ b/Documentation/security/keys/request-key.rst
@@ -11,16 +11,14 @@ The process starts by either the kernel requesting a service by calling
11 11
12 struct key *request_key(const struct key_type *type, 12 struct key *request_key(const struct key_type *type,
13 const char *description, 13 const char *description,
14 const char *callout_info, 14 const char *callout_info);
15 struct key_acl *acl);
16 15
17or:: 16or::
18 17
19 struct key *request_key_tag(const struct key_type *type, 18 struct key *request_key_tag(const struct key_type *type,
20 const char *description, 19 const char *description,
21 const struct key_tag *domain_tag, 20 const struct key_tag *domain_tag,
22 const char *callout_info, 21 const char *callout_info);
23 struct key_acl *acl);
24 22
25or:: 23or::
26 24
@@ -29,8 +27,7 @@ or::
29 const struct key_tag *domain_tag, 27 const struct key_tag *domain_tag,
30 const char *callout_info, 28 const char *callout_info,
31 size_t callout_len, 29 size_t callout_len,
32 void *aux, 30 void *aux);
33 struct key_acl *acl);
34 31
35or:: 32or::
36 33