ruleset.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Landlock LSM - Ruleset management
  4. *
  5. * Copyright © 2016-2020 Mickaël Salaün <mic@digikod.net>
  6. * Copyright © 2018-2020 ANSSI
  7. */
  8. #include <linux/bits.h>
  9. #include <linux/bug.h>
  10. #include <linux/compiler_types.h>
  11. #include <linux/err.h>
  12. #include <linux/errno.h>
  13. #include <linux/kernel.h>
  14. #include <linux/lockdep.h>
  15. #include <linux/overflow.h>
  16. #include <linux/rbtree.h>
  17. #include <linux/refcount.h>
  18. #include <linux/slab.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/workqueue.h>
  21. #include "limits.h"
  22. #include "object.h"
  23. #include "ruleset.h"
  24. static struct landlock_ruleset *create_ruleset(const u32 num_layers)
  25. {
  26. struct landlock_ruleset *new_ruleset;
  27. new_ruleset =
  28. kzalloc(struct_size(new_ruleset, access_masks, num_layers),
  29. GFP_KERNEL_ACCOUNT);
  30. if (!new_ruleset)
  31. return ERR_PTR(-ENOMEM);
  32. refcount_set(&new_ruleset->usage, 1);
  33. mutex_init(&new_ruleset->lock);
  34. new_ruleset->root_inode = RB_ROOT;
  35. #if IS_ENABLED(CONFIG_INET)
  36. new_ruleset->root_net_port = RB_ROOT;
  37. #endif /* IS_ENABLED(CONFIG_INET) */
  38. new_ruleset->num_layers = num_layers;
  39. /*
  40. * hierarchy = NULL
  41. * num_rules = 0
  42. * access_masks[] = 0
  43. */
  44. return new_ruleset;
  45. }
  46. struct landlock_ruleset *
  47. landlock_create_ruleset(const access_mask_t fs_access_mask,
  48. const access_mask_t net_access_mask,
  49. const access_mask_t scope_mask)
  50. {
  51. struct landlock_ruleset *new_ruleset;
  52. /* Informs about useless ruleset. */
  53. if (!fs_access_mask && !net_access_mask && !scope_mask)
  54. return ERR_PTR(-ENOMSG);
  55. new_ruleset = create_ruleset(1);
  56. if (IS_ERR(new_ruleset))
  57. return new_ruleset;
  58. if (fs_access_mask)
  59. landlock_add_fs_access_mask(new_ruleset, fs_access_mask, 0);
  60. if (net_access_mask)
  61. landlock_add_net_access_mask(new_ruleset, net_access_mask, 0);
  62. if (scope_mask)
  63. landlock_add_scope_mask(new_ruleset, scope_mask, 0);
  64. return new_ruleset;
  65. }
  66. static void build_check_rule(void)
  67. {
  68. const struct landlock_rule rule = {
  69. .num_layers = ~0,
  70. };
  71. BUILD_BUG_ON(rule.num_layers < LANDLOCK_MAX_NUM_LAYERS);
  72. }
  73. static bool is_object_pointer(const enum landlock_key_type key_type)
  74. {
  75. switch (key_type) {
  76. case LANDLOCK_KEY_INODE:
  77. return true;
  78. #if IS_ENABLED(CONFIG_INET)
  79. case LANDLOCK_KEY_NET_PORT:
  80. return false;
  81. #endif /* IS_ENABLED(CONFIG_INET) */
  82. default:
  83. WARN_ON_ONCE(1);
  84. return false;
  85. }
  86. }
  87. static struct landlock_rule *
  88. create_rule(const struct landlock_id id,
  89. const struct landlock_layer (*const layers)[], const u32 num_layers,
  90. const struct landlock_layer *const new_layer)
  91. {
  92. struct landlock_rule *new_rule;
  93. u32 new_num_layers;
  94. build_check_rule();
  95. if (new_layer) {
  96. /* Should already be checked by landlock_merge_ruleset(). */
  97. if (WARN_ON_ONCE(num_layers >= LANDLOCK_MAX_NUM_LAYERS))
  98. return ERR_PTR(-E2BIG);
  99. new_num_layers = num_layers + 1;
  100. } else {
  101. new_num_layers = num_layers;
  102. }
  103. new_rule = kzalloc(struct_size(new_rule, layers, new_num_layers),
  104. GFP_KERNEL_ACCOUNT);
  105. if (!new_rule)
  106. return ERR_PTR(-ENOMEM);
  107. RB_CLEAR_NODE(&new_rule->node);
  108. if (is_object_pointer(id.type)) {
  109. /* This should be catched by insert_rule(). */
  110. WARN_ON_ONCE(!id.key.object);
  111. landlock_get_object(id.key.object);
  112. }
  113. new_rule->key = id.key;
  114. new_rule->num_layers = new_num_layers;
  115. /* Copies the original layer stack. */
  116. memcpy(new_rule->layers, layers,
  117. flex_array_size(new_rule, layers, num_layers));
  118. if (new_layer)
  119. /* Adds a copy of @new_layer on the layer stack. */
  120. new_rule->layers[new_rule->num_layers - 1] = *new_layer;
  121. return new_rule;
  122. }
  123. static struct rb_root *get_root(struct landlock_ruleset *const ruleset,
  124. const enum landlock_key_type key_type)
  125. {
  126. switch (key_type) {
  127. case LANDLOCK_KEY_INODE:
  128. return &ruleset->root_inode;
  129. #if IS_ENABLED(CONFIG_INET)
  130. case LANDLOCK_KEY_NET_PORT:
  131. return &ruleset->root_net_port;
  132. #endif /* IS_ENABLED(CONFIG_INET) */
  133. default:
  134. WARN_ON_ONCE(1);
  135. return ERR_PTR(-EINVAL);
  136. }
  137. }
  138. static void free_rule(struct landlock_rule *const rule,
  139. const enum landlock_key_type key_type)
  140. {
  141. might_sleep();
  142. if (!rule)
  143. return;
  144. if (is_object_pointer(key_type))
  145. landlock_put_object(rule->key.object);
  146. kfree(rule);
  147. }
  148. static void build_check_ruleset(void)
  149. {
  150. const struct landlock_ruleset ruleset = {
  151. .num_rules = ~0,
  152. .num_layers = ~0,
  153. };
  154. BUILD_BUG_ON(ruleset.num_rules < LANDLOCK_MAX_NUM_RULES);
  155. BUILD_BUG_ON(ruleset.num_layers < LANDLOCK_MAX_NUM_LAYERS);
  156. }
  157. /**
  158. * insert_rule - Create and insert a rule in a ruleset
  159. *
  160. * @ruleset: The ruleset to be updated.
  161. * @id: The ID to build the new rule with. The underlying kernel object, if
  162. * any, must be held by the caller.
  163. * @layers: One or multiple layers to be copied into the new rule.
  164. * @num_layers: The number of @layers entries.
  165. *
  166. * When user space requests to add a new rule to a ruleset, @layers only
  167. * contains one entry and this entry is not assigned to any level. In this
  168. * case, the new rule will extend @ruleset, similarly to a boolean OR between
  169. * access rights.
  170. *
  171. * When merging a ruleset in a domain, or copying a domain, @layers will be
  172. * added to @ruleset as new constraints, similarly to a boolean AND between
  173. * access rights.
  174. */
  175. static int insert_rule(struct landlock_ruleset *const ruleset,
  176. const struct landlock_id id,
  177. const struct landlock_layer (*const layers)[],
  178. const size_t num_layers)
  179. {
  180. struct rb_node **walker_node;
  181. struct rb_node *parent_node = NULL;
  182. struct landlock_rule *new_rule;
  183. struct rb_root *root;
  184. might_sleep();
  185. lockdep_assert_held(&ruleset->lock);
  186. if (WARN_ON_ONCE(!layers))
  187. return -ENOENT;
  188. if (is_object_pointer(id.type) && WARN_ON_ONCE(!id.key.object))
  189. return -ENOENT;
  190. root = get_root(ruleset, id.type);
  191. if (IS_ERR(root))
  192. return PTR_ERR(root);
  193. walker_node = &root->rb_node;
  194. while (*walker_node) {
  195. struct landlock_rule *const this =
  196. rb_entry(*walker_node, struct landlock_rule, node);
  197. if (this->key.data != id.key.data) {
  198. parent_node = *walker_node;
  199. if (this->key.data < id.key.data)
  200. walker_node = &((*walker_node)->rb_right);
  201. else
  202. walker_node = &((*walker_node)->rb_left);
  203. continue;
  204. }
  205. /* Only a single-level layer should match an existing rule. */
  206. if (WARN_ON_ONCE(num_layers != 1))
  207. return -EINVAL;
  208. /* If there is a matching rule, updates it. */
  209. if ((*layers)[0].level == 0) {
  210. /*
  211. * Extends access rights when the request comes from
  212. * landlock_add_rule(2), i.e. @ruleset is not a domain.
  213. */
  214. if (WARN_ON_ONCE(this->num_layers != 1))
  215. return -EINVAL;
  216. if (WARN_ON_ONCE(this->layers[0].level != 0))
  217. return -EINVAL;
  218. this->layers[0].access |= (*layers)[0].access;
  219. return 0;
  220. }
  221. if (WARN_ON_ONCE(this->layers[0].level == 0))
  222. return -EINVAL;
  223. /*
  224. * Intersects access rights when it is a merge between a
  225. * ruleset and a domain.
  226. */
  227. new_rule = create_rule(id, &this->layers, this->num_layers,
  228. &(*layers)[0]);
  229. if (IS_ERR(new_rule))
  230. return PTR_ERR(new_rule);
  231. rb_replace_node(&this->node, &new_rule->node, root);
  232. free_rule(this, id.type);
  233. return 0;
  234. }
  235. /* There is no match for @id. */
  236. build_check_ruleset();
  237. if (ruleset->num_rules >= LANDLOCK_MAX_NUM_RULES)
  238. return -E2BIG;
  239. new_rule = create_rule(id, layers, num_layers, NULL);
  240. if (IS_ERR(new_rule))
  241. return PTR_ERR(new_rule);
  242. rb_link_node(&new_rule->node, parent_node, walker_node);
  243. rb_insert_color(&new_rule->node, root);
  244. ruleset->num_rules++;
  245. return 0;
  246. }
  247. static void build_check_layer(void)
  248. {
  249. const struct landlock_layer layer = {
  250. .level = ~0,
  251. .access = ~0,
  252. };
  253. BUILD_BUG_ON(layer.level < LANDLOCK_MAX_NUM_LAYERS);
  254. BUILD_BUG_ON(layer.access < LANDLOCK_MASK_ACCESS_FS);
  255. }
  256. /* @ruleset must be locked by the caller. */
  257. int landlock_insert_rule(struct landlock_ruleset *const ruleset,
  258. const struct landlock_id id,
  259. const access_mask_t access)
  260. {
  261. struct landlock_layer layers[] = { {
  262. .access = access,
  263. /* When @level is zero, insert_rule() extends @ruleset. */
  264. .level = 0,
  265. } };
  266. build_check_layer();
  267. return insert_rule(ruleset, id, &layers, ARRAY_SIZE(layers));
  268. }
  269. static void get_hierarchy(struct landlock_hierarchy *const hierarchy)
  270. {
  271. if (hierarchy)
  272. refcount_inc(&hierarchy->usage);
  273. }
  274. static void put_hierarchy(struct landlock_hierarchy *hierarchy)
  275. {
  276. while (hierarchy && refcount_dec_and_test(&hierarchy->usage)) {
  277. const struct landlock_hierarchy *const freeme = hierarchy;
  278. hierarchy = hierarchy->parent;
  279. kfree(freeme);
  280. }
  281. }
  282. static int merge_tree(struct landlock_ruleset *const dst,
  283. struct landlock_ruleset *const src,
  284. const enum landlock_key_type key_type)
  285. {
  286. struct landlock_rule *walker_rule, *next_rule;
  287. struct rb_root *src_root;
  288. int err = 0;
  289. might_sleep();
  290. lockdep_assert_held(&dst->lock);
  291. lockdep_assert_held(&src->lock);
  292. src_root = get_root(src, key_type);
  293. if (IS_ERR(src_root))
  294. return PTR_ERR(src_root);
  295. /* Merges the @src tree. */
  296. rbtree_postorder_for_each_entry_safe(walker_rule, next_rule, src_root,
  297. node) {
  298. struct landlock_layer layers[] = { {
  299. .level = dst->num_layers,
  300. } };
  301. const struct landlock_id id = {
  302. .key = walker_rule->key,
  303. .type = key_type,
  304. };
  305. if (WARN_ON_ONCE(walker_rule->num_layers != 1))
  306. return -EINVAL;
  307. if (WARN_ON_ONCE(walker_rule->layers[0].level != 0))
  308. return -EINVAL;
  309. layers[0].access = walker_rule->layers[0].access;
  310. err = insert_rule(dst, id, &layers, ARRAY_SIZE(layers));
  311. if (err)
  312. return err;
  313. }
  314. return err;
  315. }
  316. static int merge_ruleset(struct landlock_ruleset *const dst,
  317. struct landlock_ruleset *const src)
  318. {
  319. int err = 0;
  320. might_sleep();
  321. /* Should already be checked by landlock_merge_ruleset() */
  322. if (WARN_ON_ONCE(!src))
  323. return 0;
  324. /* Only merge into a domain. */
  325. if (WARN_ON_ONCE(!dst || !dst->hierarchy))
  326. return -EINVAL;
  327. /* Locks @dst first because we are its only owner. */
  328. mutex_lock(&dst->lock);
  329. mutex_lock_nested(&src->lock, SINGLE_DEPTH_NESTING);
  330. /* Stacks the new layer. */
  331. if (WARN_ON_ONCE(src->num_layers != 1 || dst->num_layers < 1)) {
  332. err = -EINVAL;
  333. goto out_unlock;
  334. }
  335. dst->access_masks[dst->num_layers - 1] = src->access_masks[0];
  336. /* Merges the @src inode tree. */
  337. err = merge_tree(dst, src, LANDLOCK_KEY_INODE);
  338. if (err)
  339. goto out_unlock;
  340. #if IS_ENABLED(CONFIG_INET)
  341. /* Merges the @src network port tree. */
  342. err = merge_tree(dst, src, LANDLOCK_KEY_NET_PORT);
  343. if (err)
  344. goto out_unlock;
  345. #endif /* IS_ENABLED(CONFIG_INET) */
  346. out_unlock:
  347. mutex_unlock(&src->lock);
  348. mutex_unlock(&dst->lock);
  349. return err;
  350. }
  351. static int inherit_tree(struct landlock_ruleset *const parent,
  352. struct landlock_ruleset *const child,
  353. const enum landlock_key_type key_type)
  354. {
  355. struct landlock_rule *walker_rule, *next_rule;
  356. struct rb_root *parent_root;
  357. int err = 0;
  358. might_sleep();
  359. lockdep_assert_held(&parent->lock);
  360. lockdep_assert_held(&child->lock);
  361. parent_root = get_root(parent, key_type);
  362. if (IS_ERR(parent_root))
  363. return PTR_ERR(parent_root);
  364. /* Copies the @parent inode or network tree. */
  365. rbtree_postorder_for_each_entry_safe(walker_rule, next_rule,
  366. parent_root, node) {
  367. const struct landlock_id id = {
  368. .key = walker_rule->key,
  369. .type = key_type,
  370. };
  371. err = insert_rule(child, id, &walker_rule->layers,
  372. walker_rule->num_layers);
  373. if (err)
  374. return err;
  375. }
  376. return err;
  377. }
  378. static int inherit_ruleset(struct landlock_ruleset *const parent,
  379. struct landlock_ruleset *const child)
  380. {
  381. int err = 0;
  382. might_sleep();
  383. if (!parent)
  384. return 0;
  385. /* Locks @child first because we are its only owner. */
  386. mutex_lock(&child->lock);
  387. mutex_lock_nested(&parent->lock, SINGLE_DEPTH_NESTING);
  388. /* Copies the @parent inode tree. */
  389. err = inherit_tree(parent, child, LANDLOCK_KEY_INODE);
  390. if (err)
  391. goto out_unlock;
  392. #if IS_ENABLED(CONFIG_INET)
  393. /* Copies the @parent network port tree. */
  394. err = inherit_tree(parent, child, LANDLOCK_KEY_NET_PORT);
  395. if (err)
  396. goto out_unlock;
  397. #endif /* IS_ENABLED(CONFIG_INET) */
  398. if (WARN_ON_ONCE(child->num_layers <= parent->num_layers)) {
  399. err = -EINVAL;
  400. goto out_unlock;
  401. }
  402. /* Copies the parent layer stack and leaves a space for the new layer. */
  403. memcpy(child->access_masks, parent->access_masks,
  404. flex_array_size(parent, access_masks, parent->num_layers));
  405. if (WARN_ON_ONCE(!parent->hierarchy)) {
  406. err = -EINVAL;
  407. goto out_unlock;
  408. }
  409. get_hierarchy(parent->hierarchy);
  410. child->hierarchy->parent = parent->hierarchy;
  411. out_unlock:
  412. mutex_unlock(&parent->lock);
  413. mutex_unlock(&child->lock);
  414. return err;
  415. }
  416. static void free_ruleset(struct landlock_ruleset *const ruleset)
  417. {
  418. struct landlock_rule *freeme, *next;
  419. might_sleep();
  420. rbtree_postorder_for_each_entry_safe(freeme, next, &ruleset->root_inode,
  421. node)
  422. free_rule(freeme, LANDLOCK_KEY_INODE);
  423. #if IS_ENABLED(CONFIG_INET)
  424. rbtree_postorder_for_each_entry_safe(freeme, next,
  425. &ruleset->root_net_port, node)
  426. free_rule(freeme, LANDLOCK_KEY_NET_PORT);
  427. #endif /* IS_ENABLED(CONFIG_INET) */
  428. put_hierarchy(ruleset->hierarchy);
  429. kfree(ruleset);
  430. }
  431. void landlock_put_ruleset(struct landlock_ruleset *const ruleset)
  432. {
  433. might_sleep();
  434. if (ruleset && refcount_dec_and_test(&ruleset->usage))
  435. free_ruleset(ruleset);
  436. }
  437. static void free_ruleset_work(struct work_struct *const work)
  438. {
  439. struct landlock_ruleset *ruleset;
  440. ruleset = container_of(work, struct landlock_ruleset, work_free);
  441. free_ruleset(ruleset);
  442. }
  443. void landlock_put_ruleset_deferred(struct landlock_ruleset *const ruleset)
  444. {
  445. if (ruleset && refcount_dec_and_test(&ruleset->usage)) {
  446. INIT_WORK(&ruleset->work_free, free_ruleset_work);
  447. schedule_work(&ruleset->work_free);
  448. }
  449. }
  450. /**
  451. * landlock_merge_ruleset - Merge a ruleset with a domain
  452. *
  453. * @parent: Parent domain.
  454. * @ruleset: New ruleset to be merged.
  455. *
  456. * Returns the intersection of @parent and @ruleset, or returns @parent if
  457. * @ruleset is empty, or returns a duplicate of @ruleset if @parent is empty.
  458. */
  459. struct landlock_ruleset *
  460. landlock_merge_ruleset(struct landlock_ruleset *const parent,
  461. struct landlock_ruleset *const ruleset)
  462. {
  463. struct landlock_ruleset *new_dom;
  464. u32 num_layers;
  465. int err;
  466. might_sleep();
  467. if (WARN_ON_ONCE(!ruleset || parent == ruleset))
  468. return ERR_PTR(-EINVAL);
  469. if (parent) {
  470. if (parent->num_layers >= LANDLOCK_MAX_NUM_LAYERS)
  471. return ERR_PTR(-E2BIG);
  472. num_layers = parent->num_layers + 1;
  473. } else {
  474. num_layers = 1;
  475. }
  476. /* Creates a new domain... */
  477. new_dom = create_ruleset(num_layers);
  478. if (IS_ERR(new_dom))
  479. return new_dom;
  480. new_dom->hierarchy =
  481. kzalloc(sizeof(*new_dom->hierarchy), GFP_KERNEL_ACCOUNT);
  482. if (!new_dom->hierarchy) {
  483. err = -ENOMEM;
  484. goto out_put_dom;
  485. }
  486. refcount_set(&new_dom->hierarchy->usage, 1);
  487. /* ...as a child of @parent... */
  488. err = inherit_ruleset(parent, new_dom);
  489. if (err)
  490. goto out_put_dom;
  491. /* ...and including @ruleset. */
  492. err = merge_ruleset(new_dom, ruleset);
  493. if (err)
  494. goto out_put_dom;
  495. return new_dom;
  496. out_put_dom:
  497. landlock_put_ruleset(new_dom);
  498. return ERR_PTR(err);
  499. }
  500. /*
  501. * The returned access has the same lifetime as @ruleset.
  502. */
  503. const struct landlock_rule *
  504. landlock_find_rule(const struct landlock_ruleset *const ruleset,
  505. const struct landlock_id id)
  506. {
  507. const struct rb_root *root;
  508. const struct rb_node *node;
  509. root = get_root((struct landlock_ruleset *)ruleset, id.type);
  510. if (IS_ERR(root))
  511. return NULL;
  512. node = root->rb_node;
  513. while (node) {
  514. struct landlock_rule *this =
  515. rb_entry(node, struct landlock_rule, node);
  516. if (this->key.data == id.key.data)
  517. return this;
  518. if (this->key.data < id.key.data)
  519. node = node->rb_right;
  520. else
  521. node = node->rb_left;
  522. }
  523. return NULL;
  524. }
  525. /*
  526. * @layer_masks is read and may be updated according to the access request and
  527. * the matching rule.
  528. * @masks_array_size must be equal to ARRAY_SIZE(*layer_masks).
  529. *
  530. * Returns true if the request is allowed (i.e. relevant layer masks for the
  531. * request are empty).
  532. */
  533. bool landlock_unmask_layers(const struct landlock_rule *const rule,
  534. const access_mask_t access_request,
  535. layer_mask_t (*const layer_masks)[],
  536. const size_t masks_array_size)
  537. {
  538. size_t layer_level;
  539. if (!access_request || !layer_masks)
  540. return true;
  541. if (!rule)
  542. return false;
  543. /*
  544. * An access is granted if, for each policy layer, at least one rule
  545. * encountered on the pathwalk grants the requested access,
  546. * regardless of its position in the layer stack. We must then check
  547. * the remaining layers for each inode, from the first added layer to
  548. * the last one. When there is multiple requested accesses, for each
  549. * policy layer, the full set of requested accesses may not be granted
  550. * by only one rule, but by the union (binary OR) of multiple rules.
  551. * E.g. /a/b <execute> + /a <read> => /a/b <execute + read>
  552. */
  553. for (layer_level = 0; layer_level < rule->num_layers; layer_level++) {
  554. const struct landlock_layer *const layer =
  555. &rule->layers[layer_level];
  556. const layer_mask_t layer_bit = BIT_ULL(layer->level - 1);
  557. const unsigned long access_req = access_request;
  558. unsigned long access_bit;
  559. bool is_empty;
  560. /*
  561. * Records in @layer_masks which layer grants access to each
  562. * requested access.
  563. */
  564. is_empty = true;
  565. for_each_set_bit(access_bit, &access_req, masks_array_size) {
  566. if (layer->access & BIT_ULL(access_bit))
  567. (*layer_masks)[access_bit] &= ~layer_bit;
  568. is_empty = is_empty && !(*layer_masks)[access_bit];
  569. }
  570. if (is_empty)
  571. return true;
  572. }
  573. return false;
  574. }
  575. typedef access_mask_t
  576. get_access_mask_t(const struct landlock_ruleset *const ruleset,
  577. const u16 layer_level);
  578. /**
  579. * landlock_init_layer_masks - Initialize layer masks from an access request
  580. *
  581. * Populates @layer_masks such that for each access right in @access_request,
  582. * the bits for all the layers are set where this access right is handled.
  583. *
  584. * @domain: The domain that defines the current restrictions.
  585. * @access_request: The requested access rights to check.
  586. * @layer_masks: It must contain %LANDLOCK_NUM_ACCESS_FS or
  587. * %LANDLOCK_NUM_ACCESS_NET elements according to @key_type.
  588. * @key_type: The key type to switch between access masks of different types.
  589. *
  590. * Returns: An access mask where each access right bit is set which is handled
  591. * in any of the active layers in @domain.
  592. */
  593. access_mask_t
  594. landlock_init_layer_masks(const struct landlock_ruleset *const domain,
  595. const access_mask_t access_request,
  596. layer_mask_t (*const layer_masks)[],
  597. const enum landlock_key_type key_type)
  598. {
  599. access_mask_t handled_accesses = 0;
  600. size_t layer_level, num_access;
  601. get_access_mask_t *get_access_mask;
  602. switch (key_type) {
  603. case LANDLOCK_KEY_INODE:
  604. get_access_mask = landlock_get_fs_access_mask;
  605. num_access = LANDLOCK_NUM_ACCESS_FS;
  606. break;
  607. #if IS_ENABLED(CONFIG_INET)
  608. case LANDLOCK_KEY_NET_PORT:
  609. get_access_mask = landlock_get_net_access_mask;
  610. num_access = LANDLOCK_NUM_ACCESS_NET;
  611. break;
  612. #endif /* IS_ENABLED(CONFIG_INET) */
  613. default:
  614. WARN_ON_ONCE(1);
  615. return 0;
  616. }
  617. memset(layer_masks, 0,
  618. array_size(sizeof((*layer_masks)[0]), num_access));
  619. /* An empty access request can happen because of O_WRONLY | O_RDWR. */
  620. if (!access_request)
  621. return 0;
  622. /* Saves all handled accesses per layer. */
  623. for (layer_level = 0; layer_level < domain->num_layers; layer_level++) {
  624. const unsigned long access_req = access_request;
  625. const access_mask_t access_mask =
  626. get_access_mask(domain, layer_level);
  627. unsigned long access_bit;
  628. for_each_set_bit(access_bit, &access_req, num_access) {
  629. if (BIT_ULL(access_bit) & access_mask) {
  630. (*layer_masks)[access_bit] |=
  631. BIT_ULL(layer_level);
  632. handled_accesses |= BIT_ULL(access_bit);
  633. }
  634. }
  635. }
  636. return handled_accesses;
  637. }