aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Kasatkin <d.kasatkin@samsung.com>2014-11-05 10:01:15 -0500
committerMimi Zohar <zohar@linux.vnet.ibm.com>2014-11-17 23:12:01 -0500
commitc9cd2ce2bc6313aafa33f8e28d29a8690252f219 (patch)
tree6918661e956daa2bb688ea70103df3cc8859e246
parentfd5f4e9054acbf4f22fac81a358baf3c27aa42ac (diff)
integrity: provide a hook to load keys when rootfs is ready
Keys can only be loaded once the rootfs is mounted. Initcalls are not suitable for that. This patch defines a special hook to load the x509 public keys onto the IMA keyring, before attempting to access any file. The keys are required for verifying the file's signature. The hook is called after the root filesystem is mounted and before the kernel calls 'init'. Changes in v3: * added more explanation to the patch description (Mimi) Changes in v2: * Hook renamed as 'integrity_load_keys()' to handle both IMA and EVM keys by integrity subsystem. * Hook patch moved after defining loading functions Signed-off-by: Dmitry Kasatkin <d.kasatkin@samsung.com> Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
-rw-r--r--include/linux/integrity.h6
-rw-r--r--init/main.c6
-rw-r--r--security/integrity/iint.c11
3 files changed, 22 insertions, 1 deletions
diff --git a/include/linux/integrity.h b/include/linux/integrity.h
index 83222cebd47b..c2d6082a1a4c 100644
--- a/include/linux/integrity.h
+++ b/include/linux/integrity.h
@@ -24,6 +24,7 @@ enum integrity_status {
24#ifdef CONFIG_INTEGRITY 24#ifdef CONFIG_INTEGRITY
25extern struct integrity_iint_cache *integrity_inode_get(struct inode *inode); 25extern struct integrity_iint_cache *integrity_inode_get(struct inode *inode);
26extern void integrity_inode_free(struct inode *inode); 26extern void integrity_inode_free(struct inode *inode);
27extern void __init integrity_load_keys(void);
27 28
28#else 29#else
29static inline struct integrity_iint_cache * 30static inline struct integrity_iint_cache *
@@ -36,5 +37,10 @@ static inline void integrity_inode_free(struct inode *inode)
36{ 37{
37 return; 38 return;
38} 39}
40
41static inline void integrity_load_keys(void)
42{
43}
39#endif /* CONFIG_INTEGRITY */ 44#endif /* CONFIG_INTEGRITY */
45
40#endif /* _LINUX_INTEGRITY_H */ 46#endif /* _LINUX_INTEGRITY_H */
diff --git a/init/main.c b/init/main.c
index e8ae1fef0908..2c1928d08b78 100644
--- a/init/main.c
+++ b/init/main.c
@@ -78,6 +78,7 @@
78#include <linux/context_tracking.h> 78#include <linux/context_tracking.h>
79#include <linux/random.h> 79#include <linux/random.h>
80#include <linux/list.h> 80#include <linux/list.h>
81#include <linux/integrity.h>
81 82
82#include <asm/io.h> 83#include <asm/io.h>
83#include <asm/bugs.h> 84#include <asm/bugs.h>
@@ -1026,8 +1027,11 @@ static noinline void __init kernel_init_freeable(void)
1026 * Ok, we have completed the initial bootup, and 1027 * Ok, we have completed the initial bootup, and
1027 * we're essentially up and running. Get rid of the 1028 * we're essentially up and running. Get rid of the
1028 * initmem segments and start the user-mode stuff.. 1029 * initmem segments and start the user-mode stuff..
1030 *
1031 * rootfs is available now, try loading the public keys
1032 * and default modules
1029 */ 1033 */
1030 1034
1031 /* rootfs is available now, try loading default modules */ 1035 integrity_load_keys();
1032 load_default_modules(); 1036 load_default_modules();
1033} 1037}
diff --git a/security/integrity/iint.c b/security/integrity/iint.c
index dbee618526b6..df45640fbac6 100644
--- a/security/integrity/iint.c
+++ b/security/integrity/iint.c
@@ -245,3 +245,14 @@ out:
245 fput(file); 245 fput(file);
246 return rc; 246 return rc;
247} 247}
248
249/*
250 * integrity_load_keys - load integrity keys hook
251 *
252 * Hooks is called from init/main.c:kernel_init_freeable()
253 * when rootfs is ready
254 */
255void __init integrity_load_keys(void)
256{
257 ima_load_x509();
258}