integrity.h 8.3 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
2 3 4 5 6 7 8
/*
 * Copyright (C) 2009-2010 IBM Corporation
 *
 * Authors:
 * Mimi Zohar <zohar@us.ibm.com>
 */

9 10 11 12 13 14
#ifdef pr_fmt
#undef pr_fmt
#endif

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

15 16 17
#include <linux/types.h>
#include <linux/integrity.h>
#include <crypto/sha.h>
18
#include <linux/key.h>
19
#include <linux/audit.h>
20
#include <linux/hash_info.h>
21

22
/* iint action cache flags */
M
Mimi Zohar 已提交
23 24 25 26 27 28 29 30
#define IMA_MEASURE		0x00000001
#define IMA_MEASURED		0x00000002
#define IMA_APPRAISE		0x00000004
#define IMA_APPRAISED		0x00000008
/*#define IMA_COLLECT		0x00000010  do not use this flag */
#define IMA_COLLECTED		0x00000020
#define IMA_AUDIT		0x00000040
#define IMA_AUDITED		0x00000080
31 32
#define IMA_HASH		0x00000100
#define IMA_HASHED		0x00000200
33

34
/* iint cache flags */
M
Mimi Zohar 已提交
35
#define IMA_ACTION_FLAGS	0xff000000
36 37 38 39
#define IMA_DIGSIG_REQUIRED	0x01000000
#define IMA_PERMIT_DIRECTIO	0x02000000
#define IMA_NEW_FILE		0x04000000
#define EVM_IMMUTABLE_DIGSIG	0x08000000
40
#define IMA_FAIL_UNVERIFIABLE_SIGS	0x10000000
41
#define IMA_MODSIG_ALLOWED	0x20000000
42
#define IMA_CHECK_BLACKLIST	0x40000000
43

44
#define IMA_DO_MASK		(IMA_MEASURE | IMA_APPRAISE | IMA_AUDIT | \
45
				 IMA_HASH | IMA_APPRAISE_SUBMASK)
46
#define IMA_DONE_MASK		(IMA_MEASURED | IMA_APPRAISED | IMA_AUDITED | \
47 48
				 IMA_HASHED | IMA_COLLECTED | \
				 IMA_APPRAISED_SUBMASK)
49 50

/* iint subaction appraise cache flags */
51 52 53 54 55 56 57 58
#define IMA_FILE_APPRAISE	0x00001000
#define IMA_FILE_APPRAISED	0x00002000
#define IMA_MMAP_APPRAISE	0x00004000
#define IMA_MMAP_APPRAISED	0x00008000
#define IMA_BPRM_APPRAISE	0x00010000
#define IMA_BPRM_APPRAISED	0x00020000
#define IMA_READ_APPRAISE	0x00040000
#define IMA_READ_APPRAISED	0x00080000
59 60
#define IMA_CREDS_APPRAISE	0x00100000
#define IMA_CREDS_APPRAISED	0x00200000
61
#define IMA_APPRAISE_SUBMASK	(IMA_FILE_APPRAISE | IMA_MMAP_APPRAISE | \
62 63
				 IMA_BPRM_APPRAISE | IMA_READ_APPRAISE | \
				 IMA_CREDS_APPRAISE)
64
#define IMA_APPRAISED_SUBMASK	(IMA_FILE_APPRAISED | IMA_MMAP_APPRAISED | \
65 66
				 IMA_BPRM_APPRAISED | IMA_READ_APPRAISED | \
				 IMA_CREDS_APPRAISED)
67

68 69 70 71 72 73 74
/* iint cache atomic_flags */
#define IMA_CHANGE_XATTR	0
#define IMA_UPDATE_XATTR	1
#define IMA_CHANGE_ATTR		2
#define IMA_DIGSIG		3
#define IMA_MUST_MEASURE	4

75 76 77 78
enum evm_ima_xattr_type {
	IMA_XATTR_DIGEST = 0x01,
	EVM_XATTR_HMAC,
	EVM_IMA_XATTR_DIGSIG,
79
	IMA_XATTR_DIGEST_NG,
80
	EVM_XATTR_PORTABLE_DIGSIG,
81
	IMA_XATTR_LAST
82 83 84 85
};

struct evm_ima_xattr_data {
	u8 type;
86 87 88 89 90 91
	u8 data[];
} __packed;

/* Only used in the EVM HMAC code. */
struct evm_xattr {
	struct evm_ima_xattr_data data;
92
	u8 digest[SHA1_DIGEST_SIZE];
93 94 95 96 97 98 99
} __packed;

#define IMA_MAX_DIGEST_SIZE	64

struct ima_digest_data {
	u8 algo;
	u8 length;
100 101 102 103 104 105 106 107 108 109 110
	union {
		struct {
			u8 unused;
			u8 type;
		} sha1;
		struct {
			u8 type;
			u8 algo;
		} ng;
		u8 data[2];
	} xattr;
111
	u8 digest[];
112
} __packed;
113

114 115 116 117
/*
 * signature format v2 - for using with asymmetric keys
 */
struct signature_v2_hdr {
118
	uint8_t type;		/* xattr type */
119
	uint8_t version;	/* signature format version */
120
	uint8_t	hash_algo;	/* Digest algorithm [enum hash_algo] */
121 122
	__be32 keyid;		/* IMA key identifier - not X509/PGP specific */
	__be16 sig_size;	/* signature size */
123
	uint8_t sig[];		/* signature payload */
124 125
} __packed;

126 127
/* integrity data associated with an inode */
struct integrity_iint_cache {
128
	struct rb_node rb_node;	/* rooted in integrity_iint_tree */
129
	struct mutex mutex;	/* protects: version, flags, digest */
130 131
	struct inode *inode;	/* back pointer to inode in question */
	u64 version;		/* track inode changes */
M
Mimi Zohar 已提交
132
	unsigned long flags;
133
	unsigned long measured_pcrs;
134
	unsigned long atomic_flags;
135 136 137
	enum integrity_status ima_file_status:4;
	enum integrity_status ima_mmap_status:4;
	enum integrity_status ima_bprm_status:4;
138
	enum integrity_status ima_read_status:4;
139
	enum integrity_status ima_creds_status:4;
140
	enum integrity_status evm_status:4;
141
	struct ima_digest_data *ima_hash;
142 143
};

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
enum compact_types { COMPACT_KEY, COMPACT_PARSER, COMPACT_FILE,
		     COMPACT_METADATA, COMPACT__LAST };
enum compact_modifiers { COMPACT_MOD_IMMUTABLE, COMPACT_MOD__LAST };

struct ima_digest {
	struct hlist_node hnext;
	enum hash_algo algo;
	enum compact_types type;
	u16 modifiers;
	u16 count;
	u8 digest[0];
};

static inline bool ima_digest_is_immutable(struct ima_digest *digest)
{
	return (digest->modifiers & (1 << COMPACT_MOD_IMMUTABLE));
}

#ifdef CONFIG_IMA_DIGEST_LIST
struct ima_digest *ima_lookup_digest(u8 *digest, enum hash_algo algo,
				     enum compact_types type);
struct ima_digest *ima_digest_allow(struct ima_digest *digest, int action);
#else
static inline struct ima_digest *ima_lookup_digest(u8 *digest,
						   enum hash_algo algo,
						   enum compact_types type)
{
	return NULL;
}
static inline struct ima_digest *ima_digest_allow(struct ima_digest *digest,
						  int action)
{
	return NULL;
}
#endif

180 181 182 183
/* rbtree tree calls to lookup, insert, delete
 * integrity data associated with an inode.
 */
struct integrity_iint_cache *integrity_iint_find(struct inode *inode);
184

185
int integrity_kernel_read(struct file *file, loff_t offset,
186 187
			  void *addr, unsigned long count);

188
#define INTEGRITY_KEYRING_EVM		0
189
#define INTEGRITY_KEYRING_IMA		1
190 191
#define INTEGRITY_KEYRING_PLATFORM	2
#define INTEGRITY_KEYRING_MAX		3
192

193 194
extern struct dentry *integrity_dir;

195 196
struct modsig;

197
#ifdef CONFIG_INTEGRITY_SIGNATURE
198 199

int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
D
Dmitry Kasatkin 已提交
200
			    const char *digest, int digestlen);
201
int integrity_modsig_verify(unsigned int id, const struct modsig *modsig);
202

203
int __init integrity_init_keyring(const unsigned int id);
204
int __init integrity_load_x509(const unsigned int id, const char *path);
205
int __init integrity_load_cert(const unsigned int id, const char *source,
206
			       const void *data, size_t len, key_perm_t perm);
207 208 209 210 211 212 213 214 215
#else

static inline int integrity_digsig_verify(const unsigned int id,
					  const char *sig, int siglen,
					  const char *digest, int digestlen)
{
	return -EOPNOTSUPP;
}

216 217 218 219 220 221
static inline int integrity_modsig_verify(unsigned int id,
					  const struct modsig *modsig)
{
	return -EOPNOTSUPP;
}

222 223 224 225
static inline int integrity_init_keyring(const unsigned int id)
{
	return 0;
}
226 227 228 229

static inline int __init integrity_load_cert(const unsigned int id,
					     const char *source,
					     const void *data, size_t len,
230
					     key_perm_t perm)
231 232 233
{
	return 0;
}
234
#endif /* CONFIG_INTEGRITY_SIGNATURE */
235

236 237 238 239 240 241 242 243 244 245 246
#ifdef CONFIG_INTEGRITY_ASYMMETRIC_KEYS
int asymmetric_verify(struct key *keyring, const char *sig,
		      int siglen, const char *data, int datalen);
#else
static inline int asymmetric_verify(struct key *keyring, const char *sig,
				    int siglen, const char *data, int datalen)
{
	return -EOPNOTSUPP;
}
#endif

247 248 249 250 251 252 253 254 255 256
#ifdef CONFIG_IMA_APPRAISE_MODSIG
int ima_modsig_verify(struct key *keyring, const struct modsig *modsig);
#else
static inline int ima_modsig_verify(struct key *keyring,
				    const struct modsig *modsig)
{
	return -EOPNOTSUPP;
}
#endif

257 258 259 260 261 262 263 264
#ifdef CONFIG_IMA_LOAD_X509
void __init ima_load_x509(void);
#else
static inline void ima_load_x509(void)
{
}
#endif

265 266 267 268 269 270 271 272
#ifdef CONFIG_EVM_LOAD_X509
void __init evm_load_x509(void);
#else
static inline void evm_load_x509(void)
{
}
#endif

273 274 275 276 277
#ifdef CONFIG_INTEGRITY_AUDIT
/* declarations */
void integrity_audit_msg(int audit_msgno, struct inode *inode,
			 const unsigned char *fname, const char *op,
			 const char *cause, int result, int info);
278

279 280 281 282 283
void integrity_audit_message(int audit_msgno, struct inode *inode,
			     const unsigned char *fname, const char *op,
			     const char *cause, int result, int info,
			     int errno);

284 285 286 287 288 289
static inline struct audit_buffer *
integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
{
	return audit_log_start(ctx, gfp_mask, type);
}

290 291 292 293 294 295 296
#else
static inline void integrity_audit_msg(int audit_msgno, struct inode *inode,
				       const unsigned char *fname,
				       const char *op, const char *cause,
				       int result, int info)
{
}
297

298 299 300 301 302 303 304 305
static inline void integrity_audit_message(int audit_msgno,
					   struct inode *inode,
					   const unsigned char *fname,
					   const char *op, const char *cause,
					   int result, int info, int errno)
{
}

306 307 308 309 310 311
static inline struct audit_buffer *
integrity_audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type)
{
	return NULL;
}

312
#endif
313 314 315 316 317 318 319 320 321 322

#ifdef CONFIG_INTEGRITY_PLATFORM_KEYRING
void __init add_to_platform_keyring(const char *source, const void *data,
				    size_t len);
#else
static inline void __init add_to_platform_keyring(const char *source,
						  const void *data, size_t len)
{
}
#endif