fs: port privilege checking helpers to mnt_idmap
[platform/kernel/linux-starfive.git] / fs / attr.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  linux/fs/attr.c
4  *
5  *  Copyright (C) 1991, 1992  Linus Torvalds
6  *  changes by Thomas Schoebel-Theuer
7  */
8
9 #include <linux/export.h>
10 #include <linux/time.h>
11 #include <linux/mm.h>
12 #include <linux/string.h>
13 #include <linux/sched/signal.h>
14 #include <linux/capability.h>
15 #include <linux/fsnotify.h>
16 #include <linux/fcntl.h>
17 #include <linux/security.h>
18 #include <linux/evm.h>
19 #include <linux/ima.h>
20
21 #include "internal.h"
22
23 /**
24  * setattr_should_drop_sgid - determine whether the setgid bit needs to be
25  *                            removed
26  * @idmap:      idmap of the mount @inode was found from
27  * @inode:      inode to check
28  *
29  * This function determines whether the setgid bit needs to be removed.
30  * We retain backwards compatibility and require setgid bit to be removed
31  * unconditionally if S_IXGRP is set. Otherwise we have the exact same
32  * requirements as setattr_prepare() and setattr_copy().
33  *
34  * Return: ATTR_KILL_SGID if setgid bit needs to be removed, 0 otherwise.
35  */
36 int setattr_should_drop_sgid(struct mnt_idmap *idmap,
37                              const struct inode *inode)
38 {
39         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
40         umode_t mode = inode->i_mode;
41
42         if (!(mode & S_ISGID))
43                 return 0;
44         if (mode & S_IXGRP)
45                 return ATTR_KILL_SGID;
46         if (!in_group_or_capable(idmap, inode,
47                                  i_gid_into_vfsgid(mnt_userns, inode)))
48                 return ATTR_KILL_SGID;
49         return 0;
50 }
51
52 /**
53  * setattr_should_drop_suidgid - determine whether the set{g,u}id bit needs to
54  *                               be dropped
55  * @idmap:      idmap of the mount @inode was found from
56  * @inode:      inode to check
57  *
58  * This function determines whether the set{g,u}id bits need to be removed.
59  * If the setuid bit needs to be removed ATTR_KILL_SUID is returned. If the
60  * setgid bit needs to be removed ATTR_KILL_SGID is returned. If both
61  * set{g,u}id bits need to be removed the corresponding mask of both flags is
62  * returned.
63  *
64  * Return: A mask of ATTR_KILL_S{G,U}ID indicating which - if any - setid bits
65  * to remove, 0 otherwise.
66  */
67 int setattr_should_drop_suidgid(struct mnt_idmap *idmap,
68                                 struct inode *inode)
69 {
70         umode_t mode = inode->i_mode;
71         int kill = 0;
72
73         /* suid always must be killed */
74         if (unlikely(mode & S_ISUID))
75                 kill = ATTR_KILL_SUID;
76
77         kill |= setattr_should_drop_sgid(idmap, inode);
78
79         if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode)))
80                 return kill;
81
82         return 0;
83 }
84 EXPORT_SYMBOL(setattr_should_drop_suidgid);
85
86 /**
87  * chown_ok - verify permissions to chown inode
88  * @idmap:      idmap of the mount @inode was found from
89  * @inode:      inode to check permissions on
90  * @ia_vfsuid:  uid to chown @inode to
91  *
92  * If the inode has been found through an idmapped mount the idmap of
93  * the vfsmount must be passed through @idmap. This function will then
94  * take care to map the inode according to @idmap before checking
95  * permissions. On non-idmapped mounts or if permission checking is to be
96  * performed on the raw inode simply pass @nop_mnt_idmap.
97  */
98 static bool chown_ok(struct mnt_idmap *idmap,
99                      const struct inode *inode, vfsuid_t ia_vfsuid)
100 {
101         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
102
103         vfsuid_t vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
104         if (vfsuid_eq_kuid(vfsuid, current_fsuid()) &&
105             vfsuid_eq(ia_vfsuid, vfsuid))
106                 return true;
107         if (capable_wrt_inode_uidgid(idmap, inode, CAP_CHOWN))
108                 return true;
109         if (!vfsuid_valid(vfsuid) &&
110             ns_capable(inode->i_sb->s_user_ns, CAP_CHOWN))
111                 return true;
112         return false;
113 }
114
115 /**
116  * chgrp_ok - verify permissions to chgrp inode
117  * @idmap:      idmap of the mount @inode was found from
118  * @inode:      inode to check permissions on
119  * @ia_vfsgid:  gid to chown @inode to
120  *
121  * If the inode has been found through an idmapped mount the idmap of
122  * the vfsmount must be passed through @idmap. This function will then
123  * take care to map the inode according to @idmap before checking
124  * permissions. On non-idmapped mounts or if permission checking is to be
125  * performed on the raw inode simply pass @nop_mnt_idmap.
126  */
127 static bool chgrp_ok(struct mnt_idmap *idmap,
128                      const struct inode *inode, vfsgid_t ia_vfsgid)
129 {
130         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
131
132         vfsgid_t vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
133         vfsuid_t vfsuid = i_uid_into_vfsuid(mnt_userns, inode);
134         if (vfsuid_eq_kuid(vfsuid, current_fsuid())) {
135                 if (vfsgid_eq(ia_vfsgid, vfsgid))
136                         return true;
137                 if (vfsgid_in_group_p(ia_vfsgid))
138                         return true;
139         }
140         if (capable_wrt_inode_uidgid(idmap, inode, CAP_CHOWN))
141                 return true;
142         if (!vfsgid_valid(vfsgid) &&
143             ns_capable(inode->i_sb->s_user_ns, CAP_CHOWN))
144                 return true;
145         return false;
146 }
147
148 /**
149  * setattr_prepare - check if attribute changes to a dentry are allowed
150  * @idmap:      idmap of the mount the inode was found from
151  * @dentry:     dentry to check
152  * @attr:       attributes to change
153  *
154  * Check if we are allowed to change the attributes contained in @attr
155  * in the given dentry.  This includes the normal unix access permission
156  * checks, as well as checks for rlimits and others. The function also clears
157  * SGID bit from mode if user is not allowed to set it. Also file capabilities
158  * and IMA extended attributes are cleared if ATTR_KILL_PRIV is set.
159  *
160  * If the inode has been found through an idmapped mount the idmap of
161  * the vfsmount must be passed through @idmap. This function will then
162  * take care to map the inode according to @idmap before checking
163  * permissions. On non-idmapped mounts or if permission checking is to be
164  * performed on the raw inode simply passs @nop_mnt_idmap.
165  *
166  * Should be called as the first thing in ->setattr implementations,
167  * possibly after taking additional locks.
168  */
169 int setattr_prepare(struct mnt_idmap *idmap, struct dentry *dentry,
170                     struct iattr *attr)
171 {
172         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
173         struct inode *inode = d_inode(dentry);
174         unsigned int ia_valid = attr->ia_valid;
175
176         /*
177          * First check size constraints.  These can't be overriden using
178          * ATTR_FORCE.
179          */
180         if (ia_valid & ATTR_SIZE) {
181                 int error = inode_newsize_ok(inode, attr->ia_size);
182                 if (error)
183                         return error;
184         }
185
186         /* If force is set do it anyway. */
187         if (ia_valid & ATTR_FORCE)
188                 goto kill_priv;
189
190         /* Make sure a caller can chown. */
191         if ((ia_valid & ATTR_UID) &&
192             !chown_ok(idmap, inode, attr->ia_vfsuid))
193                 return -EPERM;
194
195         /* Make sure caller can chgrp. */
196         if ((ia_valid & ATTR_GID) &&
197             !chgrp_ok(idmap, inode, attr->ia_vfsgid))
198                 return -EPERM;
199
200         /* Make sure a caller can chmod. */
201         if (ia_valid & ATTR_MODE) {
202                 vfsgid_t vfsgid;
203
204                 if (!inode_owner_or_capable(idmap, inode))
205                         return -EPERM;
206
207                 if (ia_valid & ATTR_GID)
208                         vfsgid = attr->ia_vfsgid;
209                 else
210                         vfsgid = i_gid_into_vfsgid(mnt_userns, inode);
211
212                 /* Also check the setgid bit! */
213                 if (!in_group_or_capable(idmap, inode, vfsgid))
214                         attr->ia_mode &= ~S_ISGID;
215         }
216
217         /* Check for setting the inode time. */
218         if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) {
219                 if (!inode_owner_or_capable(idmap, inode))
220                         return -EPERM;
221         }
222
223 kill_priv:
224         /* User has permission for the change */
225         if (ia_valid & ATTR_KILL_PRIV) {
226                 int error;
227
228                 error = security_inode_killpriv(idmap, dentry);
229                 if (error)
230                         return error;
231         }
232
233         return 0;
234 }
235 EXPORT_SYMBOL(setattr_prepare);
236
237 /**
238  * inode_newsize_ok - may this inode be truncated to a given size
239  * @inode:      the inode to be truncated
240  * @offset:     the new size to assign to the inode
241  *
242  * inode_newsize_ok must be called with i_mutex held.
243  *
244  * inode_newsize_ok will check filesystem limits and ulimits to check that the
245  * new inode size is within limits. inode_newsize_ok will also send SIGXFSZ
246  * when necessary. Caller must not proceed with inode size change if failure is
247  * returned. @inode must be a file (not directory), with appropriate
248  * permissions to allow truncate (inode_newsize_ok does NOT check these
249  * conditions).
250  *
251  * Return: 0 on success, -ve errno on failure
252  */
253 int inode_newsize_ok(const struct inode *inode, loff_t offset)
254 {
255         if (offset < 0)
256                 return -EINVAL;
257         if (inode->i_size < offset) {
258                 unsigned long limit;
259
260                 limit = rlimit(RLIMIT_FSIZE);
261                 if (limit != RLIM_INFINITY && offset > limit)
262                         goto out_sig;
263                 if (offset > inode->i_sb->s_maxbytes)
264                         goto out_big;
265         } else {
266                 /*
267                  * truncation of in-use swapfiles is disallowed - it would
268                  * cause subsequent swapout to scribble on the now-freed
269                  * blocks.
270                  */
271                 if (IS_SWAPFILE(inode))
272                         return -ETXTBSY;
273         }
274
275         return 0;
276 out_sig:
277         send_sig(SIGXFSZ, current, 0);
278 out_big:
279         return -EFBIG;
280 }
281 EXPORT_SYMBOL(inode_newsize_ok);
282
283 /**
284  * setattr_copy - copy simple metadata updates into the generic inode
285  * @idmap:      idmap of the mount the inode was found from
286  * @inode:      the inode to be updated
287  * @attr:       the new attributes
288  *
289  * setattr_copy must be called with i_mutex held.
290  *
291  * setattr_copy updates the inode's metadata with that specified
292  * in attr on idmapped mounts. Necessary permission checks to determine
293  * whether or not the S_ISGID property needs to be removed are performed with
294  * the correct idmapped mount permission helpers.
295  * Noticeably missing is inode size update, which is more complex
296  * as it requires pagecache updates.
297  *
298  * If the inode has been found through an idmapped mount the idmap of
299  * the vfsmount must be passed through @idmap. This function will then
300  * take care to map the inode according to @idmap before checking
301  * permissions. On non-idmapped mounts or if permission checking is to be
302  * performed on the raw inode simply pass @nop_mnt_idmap.
303  *
304  * The inode is not marked as dirty after this operation. The rationale is
305  * that for "simple" filesystems, the struct inode is the inode storage.
306  * The caller is free to mark the inode dirty afterwards if needed.
307  */
308 void setattr_copy(struct mnt_idmap *idmap, struct inode *inode,
309                   const struct iattr *attr)
310 {
311         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
312         unsigned int ia_valid = attr->ia_valid;
313
314         i_uid_update(mnt_userns, attr, inode);
315         i_gid_update(mnt_userns, attr, inode);
316         if (ia_valid & ATTR_ATIME)
317                 inode->i_atime = attr->ia_atime;
318         if (ia_valid & ATTR_MTIME)
319                 inode->i_mtime = attr->ia_mtime;
320         if (ia_valid & ATTR_CTIME)
321                 inode->i_ctime = attr->ia_ctime;
322         if (ia_valid & ATTR_MODE) {
323                 umode_t mode = attr->ia_mode;
324                 if (!in_group_or_capable(idmap, inode,
325                                          i_gid_into_vfsgid(mnt_userns, inode)))
326                         mode &= ~S_ISGID;
327                 inode->i_mode = mode;
328         }
329 }
330 EXPORT_SYMBOL(setattr_copy);
331
332 int may_setattr(struct mnt_idmap *idmap, struct inode *inode,
333                 unsigned int ia_valid)
334 {
335         int error;
336
337         if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_TIMES_SET)) {
338                 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
339                         return -EPERM;
340         }
341
342         /*
343          * If utimes(2) and friends are called with times == NULL (or both
344          * times are UTIME_NOW), then we need to check for write permission
345          */
346         if (ia_valid & ATTR_TOUCH) {
347                 if (IS_IMMUTABLE(inode))
348                         return -EPERM;
349
350                 if (!inode_owner_or_capable(idmap, inode)) {
351                         error = inode_permission(idmap, inode, MAY_WRITE);
352                         if (error)
353                                 return error;
354                 }
355         }
356         return 0;
357 }
358 EXPORT_SYMBOL(may_setattr);
359
360 /**
361  * notify_change - modify attributes of a filesytem object
362  * @idmap:      idmap of the mount the inode was found from
363  * @dentry:     object affected
364  * @attr:       new attributes
365  * @delegated_inode: returns inode, if the inode is delegated
366  *
367  * The caller must hold the i_mutex on the affected object.
368  *
369  * If notify_change discovers a delegation in need of breaking,
370  * it will return -EWOULDBLOCK and return a reference to the inode in
371  * delegated_inode.  The caller should then break the delegation and
372  * retry.  Because breaking a delegation may take a long time, the
373  * caller should drop the i_mutex before doing so.
374  *
375  * Alternatively, a caller may pass NULL for delegated_inode.  This may
376  * be appropriate for callers that expect the underlying filesystem not
377  * to be NFS exported.  Also, passing NULL is fine for callers holding
378  * the file open for write, as there can be no conflicting delegation in
379  * that case.
380  *
381  * If the inode has been found through an idmapped mount the idmap of
382  * the vfsmount must be passed through @idmap. This function will then
383  * take care to map the inode according to @idmap before checking
384  * permissions. On non-idmapped mounts or if permission checking is to be
385  * performed on the raw inode simply pass @nop_mnt_idmap.
386  */
387 int notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
388                   struct iattr *attr, struct inode **delegated_inode)
389 {
390         struct user_namespace *mnt_userns = mnt_idmap_owner(idmap);
391         struct inode *inode = dentry->d_inode;
392         umode_t mode = inode->i_mode;
393         int error;
394         struct timespec64 now;
395         unsigned int ia_valid = attr->ia_valid;
396
397         WARN_ON_ONCE(!inode_is_locked(inode));
398
399         error = may_setattr(idmap, inode, ia_valid);
400         if (error)
401                 return error;
402
403         if ((ia_valid & ATTR_MODE)) {
404                 umode_t amode = attr->ia_mode;
405                 /* Flag setting protected by i_mutex */
406                 if (is_sxid(amode))
407                         inode->i_flags &= ~S_NOSEC;
408         }
409
410         now = current_time(inode);
411
412         attr->ia_ctime = now;
413         if (!(ia_valid & ATTR_ATIME_SET))
414                 attr->ia_atime = now;
415         else
416                 attr->ia_atime = timestamp_truncate(attr->ia_atime, inode);
417         if (!(ia_valid & ATTR_MTIME_SET))
418                 attr->ia_mtime = now;
419         else
420                 attr->ia_mtime = timestamp_truncate(attr->ia_mtime, inode);
421
422         if (ia_valid & ATTR_KILL_PRIV) {
423                 error = security_inode_need_killpriv(dentry);
424                 if (error < 0)
425                         return error;
426                 if (error == 0)
427                         ia_valid = attr->ia_valid &= ~ATTR_KILL_PRIV;
428         }
429
430         /*
431          * We now pass ATTR_KILL_S*ID to the lower level setattr function so
432          * that the function has the ability to reinterpret a mode change
433          * that's due to these bits. This adds an implicit restriction that
434          * no function will ever call notify_change with both ATTR_MODE and
435          * ATTR_KILL_S*ID set.
436          */
437         if ((ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) &&
438             (ia_valid & ATTR_MODE))
439                 BUG();
440
441         if (ia_valid & ATTR_KILL_SUID) {
442                 if (mode & S_ISUID) {
443                         ia_valid = attr->ia_valid |= ATTR_MODE;
444                         attr->ia_mode = (inode->i_mode & ~S_ISUID);
445                 }
446         }
447         if (ia_valid & ATTR_KILL_SGID) {
448                 if (mode & S_ISGID) {
449                         if (!(ia_valid & ATTR_MODE)) {
450                                 ia_valid = attr->ia_valid |= ATTR_MODE;
451                                 attr->ia_mode = inode->i_mode;
452                         }
453                         attr->ia_mode &= ~S_ISGID;
454                 }
455         }
456         if (!(attr->ia_valid & ~(ATTR_KILL_SUID | ATTR_KILL_SGID)))
457                 return 0;
458
459         /*
460          * Verify that uid/gid changes are valid in the target
461          * namespace of the superblock.
462          */
463         if (ia_valid & ATTR_UID &&
464             !vfsuid_has_fsmapping(mnt_userns, inode->i_sb->s_user_ns,
465                                   attr->ia_vfsuid))
466                 return -EOVERFLOW;
467         if (ia_valid & ATTR_GID &&
468             !vfsgid_has_fsmapping(mnt_userns, inode->i_sb->s_user_ns,
469                                   attr->ia_vfsgid))
470                 return -EOVERFLOW;
471
472         /* Don't allow modifications of files with invalid uids or
473          * gids unless those uids & gids are being made valid.
474          */
475         if (!(ia_valid & ATTR_UID) &&
476             !vfsuid_valid(i_uid_into_vfsuid(mnt_userns, inode)))
477                 return -EOVERFLOW;
478         if (!(ia_valid & ATTR_GID) &&
479             !vfsgid_valid(i_gid_into_vfsgid(mnt_userns, inode)))
480                 return -EOVERFLOW;
481
482         error = security_inode_setattr(idmap, dentry, attr);
483         if (error)
484                 return error;
485         error = try_break_deleg(inode, delegated_inode);
486         if (error)
487                 return error;
488
489         if (inode->i_op->setattr)
490                 error = inode->i_op->setattr(idmap, dentry, attr);
491         else
492                 error = simple_setattr(idmap, dentry, attr);
493
494         if (!error) {
495                 fsnotify_change(dentry, ia_valid);
496                 ima_inode_post_setattr(idmap, dentry);
497                 evm_inode_post_setattr(dentry, ia_valid);
498         }
499
500         return error;
501 }
502 EXPORT_SYMBOL(notify_change);