Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 1 | ================================= |
| 2 | IMA Template Management Mechanism |
| 3 | ================================= |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 4 | |
| 5 | |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 6 | Introduction |
| 7 | ============ |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 8 | |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 9 | The original ``ima`` template is fixed length, containing the filedata hash |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 10 | and pathname. The filedata hash is limited to 20 bytes (md5/sha1). |
| 11 | The pathname is a null terminated string, limited to 255 characters. |
| 12 | To overcome these limitations and to add additional file metadata, it is |
| 13 | necessary to extend the current version of IMA by defining additional |
| 14 | templates. For example, information that could be possibly reported are |
| 15 | the inode UID/GID or the LSM labels either of the inode and of the process |
| 16 | that is accessing it. |
| 17 | |
| 18 | However, the main problem to introduce this feature is that, each time |
| 19 | a new template is defined, the functions that generate and display |
| 20 | the measurements list would include the code for handling a new format |
| 21 | and, thus, would significantly grow over the time. |
| 22 | |
| 23 | The proposed solution solves this problem by separating the template |
| 24 | management from the remaining IMA code. The core of this solution is the |
| 25 | definition of two new data structures: a template descriptor, to determine |
| 26 | which information should be included in the measurement list; a template |
| 27 | field, to generate and display data of a given type. |
| 28 | |
| 29 | Managing templates with these structures is very simple. To support |
| 30 | a new data type, developers define the field identifier and implement |
| 31 | two functions, init() and show(), respectively to generate and display |
| 32 | measurement entries. Defining a new template descriptor requires |
Roberto Sassu | c2426d2 | 2014-10-13 14:08:42 +0200 | [diff] [blame] | 33 | specifying the template format (a string of field identifiers separated |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 34 | by the ``|`` character) through the ``ima_template_fmt`` kernel command line |
Roberto Sassu | c2426d2 | 2014-10-13 14:08:42 +0200 | [diff] [blame] | 35 | parameter. At boot time, IMA initializes the chosen template descriptor |
| 36 | by translating the format into an array of template fields structures taken |
| 37 | from the set of the supported ones. |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 38 | |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 39 | After the initialization step, IMA will call ``ima_alloc_init_template()`` |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 40 | (new function defined within the patches for the new template management |
| 41 | mechanism) to generate a new measurement entry by using the template |
| 42 | descriptor chosen through the kernel configuration or through the newly |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 43 | introduced ``ima_template`` and ``ima_template_fmt`` kernel command line parameters. |
Roberto Sassu | c2426d2 | 2014-10-13 14:08:42 +0200 | [diff] [blame] | 44 | It is during this phase that the advantages of the new architecture are |
| 45 | clearly shown: the latter function will not contain specific code to handle |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 46 | a given template but, instead, it simply calls the ``init()`` method of the template |
Roberto Sassu | c2426d2 | 2014-10-13 14:08:42 +0200 | [diff] [blame] | 47 | fields associated to the chosen template descriptor and store the result |
| 48 | (pointer to allocated data and data length) in the measurement entry structure. |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 49 | |
| 50 | The same mechanism is employed to display measurements entries. |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 51 | The functions ``ima[_ascii]_measurements_show()`` retrieve, for each entry, |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 52 | the template descriptor used to produce that entry and call the show() |
| 53 | method for each item of the array of template fields structures. |
| 54 | |
| 55 | |
| 56 | |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 57 | Supported Template Fields and Descriptors |
| 58 | ========================================= |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 59 | |
| 60 | In the following, there is the list of supported template fields |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 61 | ``('<identifier>': description)``, that can be used to define new template |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 62 | descriptors by adding their identifier to the format string |
| 63 | (support for more data types will be added later): |
| 64 | |
| 65 | - 'd': the digest of the event (i.e. the digest of a measured file), |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 66 | calculated with the SHA1 or MD5 hash algorithm; |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 67 | - 'n': the name of the event (i.e. the file name), with size up to 255 bytes; |
| 68 | - 'd-ng': the digest of the event, calculated with an arbitrary hash |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 69 | algorithm (field format: [<hash algo>:]digest, where the digest |
| 70 | prefix is shown only if the hash algorithm is not SHA1 or MD5); |
Thiago Jung Bauermann | 3878d50 | 2019-06-27 23:19:32 -0300 | [diff] [blame] | 71 | - 'd-modsig': the digest of the event without the appended modsig; |
Mimi Zohar | ef8894b | 2013-11-17 00:31:47 -0500 | [diff] [blame] | 72 | - 'n-ng': the name of the event, without size limitations; |
Roberto Sassu | 026d7fc | 2021-05-14 17:27:52 +0200 | [diff] [blame] | 73 | - 'sig': the file signature, or the EVM portable signature if the file |
| 74 | signature is not found; |
Thiago Jung Bauermann | 3878d50 | 2019-06-27 23:19:32 -0300 | [diff] [blame] | 75 | - 'modsig' the appended file signature; |
Prakhar Srivastava | 86b4da8 | 2019-06-23 23:23:30 -0700 | [diff] [blame] | 76 | - 'buf': the buffer data that was used to generate the hash without size limitations; |
Roberto Sassu | 026d7fc | 2021-05-14 17:27:52 +0200 | [diff] [blame] | 77 | - 'evmsig': the EVM portable signature; |
Roberto Sassu | 7dcfeac | 2021-05-28 09:38:07 +0200 | [diff] [blame] | 78 | - 'iuid': the inode UID; |
| 79 | - 'igid': the inode GID; |
Roberto Sassu | f8216f6 | 2021-05-28 09:38:08 +0200 | [diff] [blame] | 80 | - 'imode': the inode mode; |
Roberto Sassu | 22a558f | 2021-06-08 14:31:20 +0200 | [diff] [blame] | 81 | - 'xattrnames': a list of xattr names (separated by ``|``), only if the xattr is |
Roberto Sassu | 8314b67 | 2021-06-01 10:23:38 +0200 | [diff] [blame] | 82 | present; |
| 83 | - 'xattrlengths': a list of xattr lengths (u32), only if the xattr is present; |
| 84 | - 'xattrvalues': a list of xattr values; |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 85 | |
| 86 | |
| 87 | Below, there is the list of defined template descriptors: |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 88 | |
| 89 | - "ima": its format is ``d|n``; |
| 90 | - "ima-ng" (default): its format is ``d-ng|n-ng``; |
Prakhar Srivastava | 86b4da8 | 2019-06-23 23:23:30 -0700 | [diff] [blame] | 91 | - "ima-sig": its format is ``d-ng|n-ng|sig``; |
| 92 | - "ima-buf": its format is ``d-ng|n-ng|buf``; |
Thiago Jung Bauermann | 3878d50 | 2019-06-27 23:19:32 -0300 | [diff] [blame] | 93 | - "ima-modsig": its format is ``d-ng|n-ng|sig|d-modsig|modsig``; |
Roberto Sassu | 88016de | 2021-06-03 15:17:05 +0200 | [diff] [blame] | 94 | - "evm-sig": its format is ``d-ng|n-ng|evmsig|xattrnames|xattrlengths|xattrvalues|iuid|igid|imode``; |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 95 | |
| 96 | |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 97 | Use |
| 98 | === |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 99 | |
| 100 | To specify the template descriptor to be used to generate measurement entries, |
| 101 | currently the following methods are supported: |
| 102 | |
| 103 | - select a template descriptor among those supported in the kernel |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 104 | configuration (``ima-ng`` is the default choice); |
Roberto Sassu | adf53a7 | 2013-06-07 12:16:29 +0200 | [diff] [blame] | 105 | - specify a template descriptor name from the kernel command line through |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 106 | the ``ima_template=`` parameter; |
Roberto Sassu | c2426d2 | 2014-10-13 14:08:42 +0200 | [diff] [blame] | 107 | - register a new template descriptor with custom format through the kernel |
Kees Cook | 7b05b11 | 2017-05-13 04:51:39 -0700 | [diff] [blame] | 108 | command line parameter ``ima_template_fmt=``. |