OSDN Git Service

5a2aec358322a930a5e6473a9e22acd64462298b
[tomoyo/tomoyo-test1.git] / security / apparmor / policy_unpack.c
1 /*
2  * AppArmor security module
3  *
4  * This file contains AppArmor functions for unpacking policy loaded from
5  * userspace.
6  *
7  * Copyright (C) 1998-2008 Novell/SUSE
8  * Copyright 2009-2010 Canonical Ltd.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation, version 2 of the
13  * License.
14  *
15  * AppArmor uses a serialized binary format for loading policy. To find
16  * policy format documentation see Documentation/admin-guide/LSM/apparmor.rst
17  * All policy is validated before it is used.
18  */
19
20 #include <asm/unaligned.h>
21 #include <linux/ctype.h>
22 #include <linux/errno.h>
23
24 #include "include/apparmor.h"
25 #include "include/audit.h"
26 #include "include/context.h"
27 #include "include/crypto.h"
28 #include "include/match.h"
29 #include "include/path.h"
30 #include "include/policy.h"
31 #include "include/policy_unpack.h"
32
33 #define K_ABI_MASK 0x3ff
34 #define FORCE_COMPLAIN_FLAG 0x800
35 #define VERSION_LT(X, Y) (((X) & K_ABI_MASK) < ((Y) & K_ABI_MASK))
36 #define VERSION_GT(X, Y) (((X) & K_ABI_MASK) > ((Y) & K_ABI_MASK))
37
38 #define v5      5       /* base version */
39 #define v6      6       /* per entry policydb mediation check */
40 #define v7      7       /* full network masking */
41
42 /*
43  * The AppArmor interface treats data as a type byte followed by the
44  * actual data.  The interface has the notion of a a named entry
45  * which has a name (AA_NAME typecode followed by name string) followed by
46  * the entries typecode and data.  Named types allow for optional
47  * elements and extensions to be added and tested for without breaking
48  * backwards compatibility.
49  */
50
51 enum aa_code {
52         AA_U8,
53         AA_U16,
54         AA_U32,
55         AA_U64,
56         AA_NAME,                /* same as string except it is items name */
57         AA_STRING,
58         AA_BLOB,
59         AA_STRUCT,
60         AA_STRUCTEND,
61         AA_LIST,
62         AA_LISTEND,
63         AA_ARRAY,
64         AA_ARRAYEND,
65 };
66
67 /*
68  * aa_ext is the read of the buffer containing the serialized profile.  The
69  * data is copied into a kernel buffer in apparmorfs and then handed off to
70  * the unpack routines.
71  */
72 struct aa_ext {
73         void *start;
74         void *end;
75         void *pos;              /* pointer to current position in the buffer */
76         u32 version;
77 };
78
79 /* audit callback for unpack fields */
80 static void audit_cb(struct audit_buffer *ab, void *va)
81 {
82         struct common_audit_data *sa = va;
83
84         if (aad(sa)->iface.ns) {
85                 audit_log_format(ab, " ns=");
86                 audit_log_untrustedstring(ab, aad(sa)->iface.ns);
87         }
88         if (aad(sa)->name) {
89                 audit_log_format(ab, " name=");
90                 audit_log_untrustedstring(ab, aad(sa)->name);
91         }
92         if (aad(sa)->iface.pos)
93                 audit_log_format(ab, " offset=%ld", aad(sa)->iface.pos);
94 }
95
96 /**
97  * audit_iface - do audit message for policy unpacking/load/replace/remove
98  * @new: profile if it has been allocated (MAYBE NULL)
99  * @ns_name: name of the ns the profile is to be loaded to (MAY BE NULL)
100  * @name: name of the profile being manipulated (MAYBE NULL)
101  * @info: any extra info about the failure (MAYBE NULL)
102  * @e: buffer position info
103  * @error: error code
104  *
105  * Returns: %0 or error
106  */
107 static int audit_iface(struct aa_profile *new, const char *ns_name,
108                        const char *name, const char *info, struct aa_ext *e,
109                        int error)
110 {
111         struct aa_profile *profile = labels_profile(aa_current_raw_label());
112         DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, NULL);
113         if (e)
114                 aad(&sa)->iface.pos = e->pos - e->start;
115         aad(&sa)->iface.ns = ns_name;
116         if (new)
117                 aad(&sa)->name = new->base.hname;
118         else
119                 aad(&sa)->name = name;
120         aad(&sa)->info = info;
121         aad(&sa)->error = error;
122
123         return aa_audit(AUDIT_APPARMOR_STATUS, profile, &sa, audit_cb);
124 }
125
126 void __aa_loaddata_update(struct aa_loaddata *data, long revision)
127 {
128         AA_BUG(!data);
129         AA_BUG(!data->ns);
130         AA_BUG(!data->dents[AAFS_LOADDATA_REVISION]);
131         AA_BUG(!mutex_is_locked(&data->ns->lock));
132         AA_BUG(data->revision > revision);
133
134         data->revision = revision;
135         d_inode(data->dents[AAFS_LOADDATA_DIR])->i_mtime =
136                 current_time(d_inode(data->dents[AAFS_LOADDATA_DIR]));
137         d_inode(data->dents[AAFS_LOADDATA_REVISION])->i_mtime =
138                 current_time(d_inode(data->dents[AAFS_LOADDATA_REVISION]));
139 }
140
141 bool aa_rawdata_eq(struct aa_loaddata *l, struct aa_loaddata *r)
142 {
143         if (l->size != r->size)
144                 return false;
145         if (aa_g_hash_policy && memcmp(l->hash, r->hash, aa_hash_size()) != 0)
146                 return false;
147         return memcmp(l->data, r->data, r->size) == 0;
148 }
149
150 /*
151  * need to take the ns mutex lock which is NOT safe most places that
152  * put_loaddata is called, so we have to delay freeing it
153  */
154 static void do_loaddata_free(struct work_struct *work)
155 {
156         struct aa_loaddata *d = container_of(work, struct aa_loaddata, work);
157         struct aa_ns *ns = aa_get_ns(d->ns);
158
159         if (ns) {
160                 mutex_lock(&ns->lock);
161                 __aa_fs_remove_rawdata(d);
162                 mutex_unlock(&ns->lock);
163                 aa_put_ns(ns);
164         }
165
166         kzfree(d->hash);
167         kfree(d->name);
168         kvfree(d);
169 }
170
171 void aa_loaddata_kref(struct kref *kref)
172 {
173         struct aa_loaddata *d = container_of(kref, struct aa_loaddata, count);
174
175         if (d) {
176                 INIT_WORK(&d->work, do_loaddata_free);
177                 schedule_work(&d->work);
178         }
179 }
180
181 struct aa_loaddata *aa_loaddata_alloc(size_t size)
182 {
183         struct aa_loaddata *d = kvzalloc(sizeof(*d) + size, GFP_KERNEL);
184
185         if (d == NULL)
186                 return ERR_PTR(-ENOMEM);
187         kref_init(&d->count);
188         INIT_LIST_HEAD(&d->list);
189
190         return d;
191 }
192
193 /* test if read will be in packed data bounds */
194 static bool inbounds(struct aa_ext *e, size_t size)
195 {
196         return (size <= e->end - e->pos);
197 }
198
199 /**
200  * aa_u16_chunck - test and do bounds checking for a u16 size based chunk
201  * @e: serialized data read head (NOT NULL)
202  * @chunk: start address for chunk of data (NOT NULL)
203  *
204  * Returns: the size of chunk found with the read head at the end of the chunk.
205  */
206 static size_t unpack_u16_chunk(struct aa_ext *e, char **chunk)
207 {
208         size_t size = 0;
209
210         if (!inbounds(e, sizeof(u16)))
211                 return 0;
212         size = le16_to_cpu(get_unaligned((__le16 *) e->pos));
213         e->pos += sizeof(__le16);
214         if (!inbounds(e, size))
215                 return 0;
216         *chunk = e->pos;
217         e->pos += size;
218         return size;
219 }
220
221 /* unpack control byte */
222 static bool unpack_X(struct aa_ext *e, enum aa_code code)
223 {
224         if (!inbounds(e, 1))
225                 return 0;
226         if (*(u8 *) e->pos != code)
227                 return 0;
228         e->pos++;
229         return 1;
230 }
231
232 /**
233  * unpack_nameX - check is the next element is of type X with a name of @name
234  * @e: serialized data extent information  (NOT NULL)
235  * @code: type code
236  * @name: name to match to the serialized element.  (MAYBE NULL)
237  *
238  * check that the next serialized data element is of type X and has a tag
239  * name @name.  If @name is specified then there must be a matching
240  * name element in the stream.  If @name is NULL any name element will be
241  * skipped and only the typecode will be tested.
242  *
243  * Returns 1 on success (both type code and name tests match) and the read
244  * head is advanced past the headers
245  *
246  * Returns: 0 if either match fails, the read head does not move
247  */
248 static bool unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name)
249 {
250         /*
251          * May need to reset pos if name or type doesn't match
252          */
253         void *pos = e->pos;
254         /*
255          * Check for presence of a tagname, and if present name size
256          * AA_NAME tag value is a u16.
257          */
258         if (unpack_X(e, AA_NAME)) {
259                 char *tag = NULL;
260                 size_t size = unpack_u16_chunk(e, &tag);
261                 /* if a name is specified it must match. otherwise skip tag */
262                 if (name && (!size || strcmp(name, tag)))
263                         goto fail;
264         } else if (name) {
265                 /* if a name is specified and there is no name tag fail */
266                 goto fail;
267         }
268
269         /* now check if type code matches */
270         if (unpack_X(e, code))
271                 return 1;
272
273 fail:
274         e->pos = pos;
275         return 0;
276 }
277
278 static bool unpack_u16(struct aa_ext *e, u16 *data, const char *name)
279 {
280         if (unpack_nameX(e, AA_U16, name)) {
281                 if (!inbounds(e, sizeof(u16)))
282                         return 0;
283                 if (data)
284                         *data = le16_to_cpu(get_unaligned((__le16 *) e->pos));
285                 e->pos += sizeof(u16);
286                 return 1;
287         }
288         return 0;
289 }
290
291 static bool unpack_u32(struct aa_ext *e, u32 *data, const char *name)
292 {
293         if (unpack_nameX(e, AA_U32, name)) {
294                 if (!inbounds(e, sizeof(u32)))
295                         return 0;
296                 if (data)
297                         *data = le32_to_cpu(get_unaligned((__le32 *) e->pos));
298                 e->pos += sizeof(u32);
299                 return 1;
300         }
301         return 0;
302 }
303
304 static bool unpack_u64(struct aa_ext *e, u64 *data, const char *name)
305 {
306         if (unpack_nameX(e, AA_U64, name)) {
307                 if (!inbounds(e, sizeof(u64)))
308                         return 0;
309                 if (data)
310                         *data = le64_to_cpu(get_unaligned((__le64 *) e->pos));
311                 e->pos += sizeof(u64);
312                 return 1;
313         }
314         return 0;
315 }
316
317 static size_t unpack_array(struct aa_ext *e, const char *name)
318 {
319         if (unpack_nameX(e, AA_ARRAY, name)) {
320                 int size;
321                 if (!inbounds(e, sizeof(u16)))
322                         return 0;
323                 size = (int)le16_to_cpu(get_unaligned((__le16 *) e->pos));
324                 e->pos += sizeof(u16);
325                 return size;
326         }
327         return 0;
328 }
329
330 static size_t unpack_blob(struct aa_ext *e, char **blob, const char *name)
331 {
332         if (unpack_nameX(e, AA_BLOB, name)) {
333                 u32 size;
334                 if (!inbounds(e, sizeof(u32)))
335                         return 0;
336                 size = le32_to_cpu(get_unaligned((__le32 *) e->pos));
337                 e->pos += sizeof(u32);
338                 if (inbounds(e, (size_t) size)) {
339                         *blob = e->pos;
340                         e->pos += size;
341                         return size;
342                 }
343         }
344         return 0;
345 }
346
347 static int unpack_str(struct aa_ext *e, const char **string, const char *name)
348 {
349         char *src_str;
350         size_t size = 0;
351         void *pos = e->pos;
352         *string = NULL;
353         if (unpack_nameX(e, AA_STRING, name)) {
354                 size = unpack_u16_chunk(e, &src_str);
355                 if (size) {
356                         /* strings are null terminated, length is size - 1 */
357                         if (src_str[size - 1] != 0)
358                                 goto fail;
359                         *string = src_str;
360                 }
361         }
362         return size;
363
364 fail:
365         e->pos = pos;
366         return 0;
367 }
368
369 static int unpack_strdup(struct aa_ext *e, char **string, const char *name)
370 {
371         const char *tmp;
372         void *pos = e->pos;
373         int res = unpack_str(e, &tmp, name);
374         *string = NULL;
375
376         if (!res)
377                 return 0;
378
379         *string = kmemdup(tmp, res, GFP_KERNEL);
380         if (!*string) {
381                 e->pos = pos;
382                 return 0;
383         }
384
385         return res;
386 }
387
388 #define DFA_VALID_PERM_MASK             0xffffffff
389 #define DFA_VALID_PERM2_MASK            0xffffffff
390
391 /**
392  * verify_accept - verify the accept tables of a dfa
393  * @dfa: dfa to verify accept tables of (NOT NULL)
394  * @flags: flags governing dfa
395  *
396  * Returns: 1 if valid accept tables else 0 if error
397  */
398 static bool verify_accept(struct aa_dfa *dfa, int flags)
399 {
400         int i;
401
402         /* verify accept permissions */
403         for (i = 0; i < dfa->tables[YYTD_ID_ACCEPT]->td_lolen; i++) {
404                 int mode = ACCEPT_TABLE(dfa)[i];
405
406                 if (mode & ~DFA_VALID_PERM_MASK)
407                         return 0;
408
409                 if (ACCEPT_TABLE2(dfa)[i] & ~DFA_VALID_PERM2_MASK)
410                         return 0;
411         }
412         return 1;
413 }
414
415 /**
416  * unpack_dfa - unpack a file rule dfa
417  * @e: serialized data extent information (NOT NULL)
418  *
419  * returns dfa or ERR_PTR or NULL if no dfa
420  */
421 static struct aa_dfa *unpack_dfa(struct aa_ext *e)
422 {
423         char *blob = NULL;
424         size_t size;
425         struct aa_dfa *dfa = NULL;
426
427         size = unpack_blob(e, &blob, "aadfa");
428         if (size) {
429                 /*
430                  * The dfa is aligned with in the blob to 8 bytes
431                  * from the beginning of the stream.
432                  * alignment adjust needed by dfa unpack
433                  */
434                 size_t sz = blob - (char *) e->start -
435                         ((e->pos - e->start) & 7);
436                 size_t pad = ALIGN(sz, 8) - sz;
437                 int flags = TO_ACCEPT1_FLAG(YYTD_DATA32) |
438                         TO_ACCEPT2_FLAG(YYTD_DATA32) | DFA_FLAG_VERIFY_STATES;
439                 dfa = aa_dfa_unpack(blob + pad, size - pad, flags);
440
441                 if (IS_ERR(dfa))
442                         return dfa;
443
444                 if (!verify_accept(dfa, flags))
445                         goto fail;
446         }
447
448         return dfa;
449
450 fail:
451         aa_put_dfa(dfa);
452         return ERR_PTR(-EPROTO);
453 }
454
455 /**
456  * unpack_trans_table - unpack a profile transition table
457  * @e: serialized data extent information  (NOT NULL)
458  * @profile: profile to add the accept table to (NOT NULL)
459  *
460  * Returns: 1 if table successfully unpacked
461  */
462 static bool unpack_trans_table(struct aa_ext *e, struct aa_profile *profile)
463 {
464         void *saved_pos = e->pos;
465
466         /* exec table is optional */
467         if (unpack_nameX(e, AA_STRUCT, "xtable")) {
468                 int i, size;
469
470                 size = unpack_array(e, NULL);
471                 /* currently 4 exec bits and entries 0-3 are reserved iupcx */
472                 if (size > 16 - 4)
473                         goto fail;
474                 profile->file.trans.table = kzalloc(sizeof(char *) * size,
475                                                     GFP_KERNEL);
476                 if (!profile->file.trans.table)
477                         goto fail;
478
479                 profile->file.trans.size = size;
480                 for (i = 0; i < size; i++) {
481                         char *str;
482                         int c, j, pos, size2 = unpack_strdup(e, &str, NULL);
483                         /* unpack_strdup verifies that the last character is
484                          * null termination byte.
485                          */
486                         if (!size2)
487                                 goto fail;
488                         profile->file.trans.table[i] = str;
489                         /* verify that name doesn't start with space */
490                         if (isspace(*str))
491                                 goto fail;
492
493                         /* count internal #  of internal \0 */
494                         for (c = j = 0; j < size2 - 1; j++) {
495                                 if (!str[j]) {
496                                         pos = j;
497                                         c++;
498                                 }
499                         }
500                         if (*str == ':') {
501                                 /* first character after : must be valid */
502                                 if (!str[1])
503                                         goto fail;
504                                 /* beginning with : requires an embedded \0,
505                                  * verify that exactly 1 internal \0 exists
506                                  * trailing \0 already verified by unpack_strdup
507                                  *
508                                  * convert \0 back to : for label_parse
509                                  */
510                                 if (c == 1)
511                                         str[pos] = ':';
512                                 else if (c > 1)
513                                         goto fail;
514                         } else if (c)
515                                 /* fail - all other cases with embedded \0 */
516                                 goto fail;
517                 }
518                 if (!unpack_nameX(e, AA_ARRAYEND, NULL))
519                         goto fail;
520                 if (!unpack_nameX(e, AA_STRUCTEND, NULL))
521                         goto fail;
522         }
523         return 1;
524
525 fail:
526         aa_free_domain_entries(&profile->file.trans);
527         e->pos = saved_pos;
528         return 0;
529 }
530
531 static bool unpack_rlimits(struct aa_ext *e, struct aa_profile *profile)
532 {
533         void *pos = e->pos;
534
535         /* rlimits are optional */
536         if (unpack_nameX(e, AA_STRUCT, "rlimits")) {
537                 int i, size;
538                 u32 tmp = 0;
539                 if (!unpack_u32(e, &tmp, NULL))
540                         goto fail;
541                 profile->rlimits.mask = tmp;
542
543                 size = unpack_array(e, NULL);
544                 if (size > RLIM_NLIMITS)
545                         goto fail;
546                 for (i = 0; i < size; i++) {
547                         u64 tmp2 = 0;
548                         int a = aa_map_resource(i);
549                         if (!unpack_u64(e, &tmp2, NULL))
550                                 goto fail;
551                         profile->rlimits.limits[a].rlim_max = tmp2;
552                 }
553                 if (!unpack_nameX(e, AA_ARRAYEND, NULL))
554                         goto fail;
555                 if (!unpack_nameX(e, AA_STRUCTEND, NULL))
556                         goto fail;
557         }
558         return 1;
559
560 fail:
561         e->pos = pos;
562         return 0;
563 }
564
565 static void *kvmemdup(const void *src, size_t len)
566 {
567         void *p = kvmalloc(len, GFP_KERNEL);
568
569         if (p)
570                 memcpy(p, src, len);
571         return p;
572 }
573
574 static u32 strhash(const void *data, u32 len, u32 seed)
575 {
576         const char * const *key = data;
577
578         return jhash(*key, strlen(*key), seed);
579 }
580
581 static int datacmp(struct rhashtable_compare_arg *arg, const void *obj)
582 {
583         const struct aa_data *data = obj;
584         const char * const *key = arg->key;
585
586         return strcmp(data->key, *key);
587 }
588
589 /**
590  * unpack_profile - unpack a serialized profile
591  * @e: serialized data extent information (NOT NULL)
592  *
593  * NOTE: unpack profile sets audit struct if there is a failure
594  */
595 static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
596 {
597         struct aa_profile *profile = NULL;
598         const char *tmpname, *tmpns = NULL, *name = NULL;
599         const char *info = "failed to unpack profile";
600         size_t size = 0, ns_len;
601         struct rhashtable_params params = { 0 };
602         char *key = NULL;
603         struct aa_data *data;
604         int i, error = -EPROTO;
605         kernel_cap_t tmpcap;
606         u32 tmp;
607
608         *ns_name = NULL;
609
610         /* check that we have the right struct being passed */
611         if (!unpack_nameX(e, AA_STRUCT, "profile"))
612                 goto fail;
613         if (!unpack_str(e, &name, NULL))
614                 goto fail;
615         if (*name == '\0')
616                 goto fail;
617
618         tmpname = aa_splitn_fqname(name, strlen(name), &tmpns, &ns_len);
619         if (tmpns) {
620                 *ns_name = kstrndup(tmpns, ns_len, GFP_KERNEL);
621                 if (!*ns_name) {
622                         info = "out of memory";
623                         goto fail;
624                 }
625                 name = tmpname;
626         }
627
628         profile = aa_alloc_profile(name, NULL, GFP_KERNEL);
629         if (!profile)
630                 return ERR_PTR(-ENOMEM);
631
632         /* profile renaming is optional */
633         (void) unpack_str(e, &profile->rename, "rename");
634
635         /* attachment string is optional */
636         (void) unpack_str(e, &profile->attach, "attach");
637
638         /* xmatch is optional and may be NULL */
639         profile->xmatch = unpack_dfa(e);
640         if (IS_ERR(profile->xmatch)) {
641                 error = PTR_ERR(profile->xmatch);
642                 profile->xmatch = NULL;
643                 info = "bad xmatch";
644                 goto fail;
645         }
646         /* xmatch_len is not optional if xmatch is set */
647         if (profile->xmatch) {
648                 if (!unpack_u32(e, &tmp, NULL)) {
649                         info = "missing xmatch len";
650                         goto fail;
651                 }
652                 profile->xmatch_len = tmp;
653         }
654
655         /* disconnected attachment string is optional */
656         (void) unpack_str(e, &profile->disconnected, "disconnected");
657
658         /* per profile debug flags (complain, audit) */
659         if (!unpack_nameX(e, AA_STRUCT, "flags")) {
660                 info = "profile missing flags";
661                 goto fail;
662         }
663         info = "failed to unpack profile flags";
664         if (!unpack_u32(e, &tmp, NULL))
665                 goto fail;
666         if (tmp & PACKED_FLAG_HAT)
667                 profile->label.flags |= FLAG_HAT;
668         if (!unpack_u32(e, &tmp, NULL))
669                 goto fail;
670         if (tmp == PACKED_MODE_COMPLAIN || (e->version & FORCE_COMPLAIN_FLAG))
671                 profile->mode = APPARMOR_COMPLAIN;
672         else if (tmp == PACKED_MODE_KILL)
673                 profile->mode = APPARMOR_KILL;
674         else if (tmp == PACKED_MODE_UNCONFINED)
675                 profile->mode = APPARMOR_UNCONFINED;
676         if (!unpack_u32(e, &tmp, NULL))
677                 goto fail;
678         if (tmp)
679                 profile->audit = AUDIT_ALL;
680
681         if (!unpack_nameX(e, AA_STRUCTEND, NULL))
682                 goto fail;
683
684         /* path_flags is optional */
685         if (unpack_u32(e, &profile->path_flags, "path_flags"))
686                 profile->path_flags |= profile->label.flags &
687                         PATH_MEDIATE_DELETED;
688         else
689                 /* set a default value if path_flags field is not present */
690                 profile->path_flags = PATH_MEDIATE_DELETED;
691
692         info = "failed to unpack profile capabilities";
693         if (!unpack_u32(e, &(profile->caps.allow.cap[0]), NULL))
694                 goto fail;
695         if (!unpack_u32(e, &(profile->caps.audit.cap[0]), NULL))
696                 goto fail;
697         if (!unpack_u32(e, &(profile->caps.quiet.cap[0]), NULL))
698                 goto fail;
699         if (!unpack_u32(e, &tmpcap.cap[0], NULL))
700                 goto fail;
701
702         info = "failed to unpack upper profile capabilities";
703         if (unpack_nameX(e, AA_STRUCT, "caps64")) {
704                 /* optional upper half of 64 bit caps */
705                 if (!unpack_u32(e, &(profile->caps.allow.cap[1]), NULL))
706                         goto fail;
707                 if (!unpack_u32(e, &(profile->caps.audit.cap[1]), NULL))
708                         goto fail;
709                 if (!unpack_u32(e, &(profile->caps.quiet.cap[1]), NULL))
710                         goto fail;
711                 if (!unpack_u32(e, &(tmpcap.cap[1]), NULL))
712                         goto fail;
713                 if (!unpack_nameX(e, AA_STRUCTEND, NULL))
714                         goto fail;
715         }
716
717         info = "failed to unpack extended profile capabilities";
718         if (unpack_nameX(e, AA_STRUCT, "capsx")) {
719                 /* optional extended caps mediation mask */
720                 if (!unpack_u32(e, &(profile->caps.extended.cap[0]), NULL))
721                         goto fail;
722                 if (!unpack_u32(e, &(profile->caps.extended.cap[1]), NULL))
723                         goto fail;
724                 if (!unpack_nameX(e, AA_STRUCTEND, NULL))
725                         goto fail;
726         }
727
728         if (!unpack_rlimits(e, profile)) {
729                 info = "failed to unpack profile rlimits";
730                 goto fail;
731         }
732
733         size = unpack_array(e, "net_allowed_af");
734         if (size) {
735
736                 for (i = 0; i < size; i++) {
737                         /* discard extraneous rules that this kernel will
738                          * never request
739                          */
740                         if (i >= AF_MAX) {
741                                 u16 tmp;
742
743                                 if (!unpack_u16(e, &tmp, NULL) ||
744                                     !unpack_u16(e, &tmp, NULL) ||
745                                     !unpack_u16(e, &tmp, NULL))
746                                         goto fail;
747                                 continue;
748                         }
749                         if (!unpack_u16(e, &profile->net.allow[i], NULL))
750                                 goto fail;
751                         if (!unpack_u16(e, &profile->net.audit[i], NULL))
752                                 goto fail;
753                         if (!unpack_u16(e, &profile->net.quiet[i], NULL))
754                                 goto fail;
755                 }
756                 if (!unpack_nameX(e, AA_ARRAYEND, NULL))
757                         goto fail;
758         }
759         if (VERSION_LT(e->version, v7)) {
760                 /* pre v7 policy always allowed these */
761                 profile->net.allow[AF_UNIX] = 0xffff;
762                 profile->net.allow[AF_NETLINK] = 0xffff;
763         }
764
765         if (unpack_nameX(e, AA_STRUCT, "policydb")) {
766                 /* generic policy dfa - optional and may be NULL */
767                 info = "failed to unpack policydb";
768                 profile->policy.dfa = unpack_dfa(e);
769                 if (IS_ERR(profile->policy.dfa)) {
770                         error = PTR_ERR(profile->policy.dfa);
771                         profile->policy.dfa = NULL;
772                         goto fail;
773                 } else if (!profile->policy.dfa) {
774                         error = -EPROTO;
775                         goto fail;
776                 }
777                 if (!unpack_u32(e, &profile->policy.start[0], "start"))
778                         /* default start state */
779                         profile->policy.start[0] = DFA_START;
780                 /* setup class index */
781                 for (i = AA_CLASS_FILE; i <= AA_CLASS_LAST; i++) {
782                         profile->policy.start[i] =
783                                 aa_dfa_next(profile->policy.dfa,
784                                             profile->policy.start[0],
785                                             i);
786                 }
787                 if (!unpack_nameX(e, AA_STRUCTEND, NULL))
788                         goto fail;
789         } else
790                 profile->policy.dfa = aa_get_dfa(nulldfa);
791
792         /* get file rules */
793         profile->file.dfa = unpack_dfa(e);
794         if (IS_ERR(profile->file.dfa)) {
795                 error = PTR_ERR(profile->file.dfa);
796                 profile->file.dfa = NULL;
797                 info = "failed to unpack profile file rules";
798                 goto fail;
799         } else if (profile->file.dfa) {
800                 if (!unpack_u32(e, &profile->file.start, "dfa_start"))
801                         /* default start state */
802                         profile->file.start = DFA_START;
803         } else if (profile->policy.dfa &&
804                    profile->policy.start[AA_CLASS_FILE]) {
805                 profile->file.dfa = aa_get_dfa(profile->policy.dfa);
806                 profile->file.start = profile->policy.start[AA_CLASS_FILE];
807         } else
808                 profile->file.dfa = aa_get_dfa(nulldfa);
809
810         if (!unpack_trans_table(e, profile)) {
811                 info = "failed to unpack profile transition table";
812                 goto fail;
813         }
814
815         if (unpack_nameX(e, AA_STRUCT, "data")) {
816                 info = "out of memory";
817                 profile->data = kzalloc(sizeof(*profile->data), GFP_KERNEL);
818                 if (!profile->data)
819                         goto fail;
820
821                 params.nelem_hint = 3;
822                 params.key_len = sizeof(void *);
823                 params.key_offset = offsetof(struct aa_data, key);
824                 params.head_offset = offsetof(struct aa_data, head);
825                 params.hashfn = strhash;
826                 params.obj_cmpfn = datacmp;
827
828                 if (rhashtable_init(profile->data, &params)) {
829                         info = "failed to init key, value hash table";
830                         goto fail;
831                 }
832
833                 while (unpack_strdup(e, &key, NULL)) {
834                         data = kzalloc(sizeof(*data), GFP_KERNEL);
835                         if (!data) {
836                                 kzfree(key);
837                                 goto fail;
838                         }
839
840                         data->key = key;
841                         data->size = unpack_blob(e, &data->data, NULL);
842                         data->data = kvmemdup(data->data, data->size);
843                         if (data->size && !data->data) {
844                                 kzfree(data->key);
845                                 kzfree(data);
846                                 goto fail;
847                         }
848
849                         rhashtable_insert_fast(profile->data, &data->head,
850                                                profile->data->p);
851                 }
852
853                 if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
854                         info = "failed to unpack end of key, value data table";
855                         goto fail;
856                 }
857         }
858
859         if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
860                 info = "failed to unpack end of profile";
861                 goto fail;
862         }
863
864         return profile;
865
866 fail:
867         if (profile)
868                 name = NULL;
869         else if (!name)
870                 name = "unknown";
871         audit_iface(profile, NULL, name, info, e, error);
872         aa_free_profile(profile);
873
874         return ERR_PTR(error);
875 }
876
877 /**
878  * verify_head - unpack serialized stream header
879  * @e: serialized data read head (NOT NULL)
880  * @required: whether the header is required or optional
881  * @ns: Returns - namespace if one is specified else NULL (NOT NULL)
882  *
883  * Returns: error or 0 if header is good
884  */
885 static int verify_header(struct aa_ext *e, int required, const char **ns)
886 {
887         int error = -EPROTONOSUPPORT;
888         const char *name = NULL;
889         *ns = NULL;
890
891         /* get the interface version */
892         if (!unpack_u32(e, &e->version, "version")) {
893                 if (required) {
894                         audit_iface(NULL, NULL, NULL, "invalid profile format",
895                                     e, error);
896                         return error;
897                 }
898         }
899
900         /* Check that the interface version is currently supported.
901          * if not specified use previous version
902          * Mask off everything that is not kernel abi version
903          */
904         if (VERSION_LT(e->version, v5) || VERSION_GT(e->version, v7)) {
905                 audit_iface(NULL, NULL, NULL, "unsupported interface version",
906                             e, error);
907                 return error;
908         }
909
910         /* read the namespace if present */
911         if (unpack_str(e, &name, "namespace")) {
912                 if (*name == '\0') {
913                         audit_iface(NULL, NULL, NULL, "invalid namespace name",
914                                     e, error);
915                         return error;
916                 }
917                 if (*ns && strcmp(*ns, name))
918                         audit_iface(NULL, NULL, NULL, "invalid ns change", e,
919                                     error);
920                 else if (!*ns)
921                         *ns = name;
922         }
923
924         return 0;
925 }
926
927 static bool verify_xindex(int xindex, int table_size)
928 {
929         int index, xtype;
930         xtype = xindex & AA_X_TYPE_MASK;
931         index = xindex & AA_X_INDEX_MASK;
932         if (xtype == AA_X_TABLE && index >= table_size)
933                 return 0;
934         return 1;
935 }
936
937 /* verify dfa xindexes are in range of transition tables */
938 static bool verify_dfa_xindex(struct aa_dfa *dfa, int table_size)
939 {
940         int i;
941         for (i = 0; i < dfa->tables[YYTD_ID_ACCEPT]->td_lolen; i++) {
942                 if (!verify_xindex(dfa_user_xindex(dfa, i), table_size))
943                         return 0;
944                 if (!verify_xindex(dfa_other_xindex(dfa, i), table_size))
945                         return 0;
946         }
947         return 1;
948 }
949
950 /**
951  * verify_profile - Do post unpack analysis to verify profile consistency
952  * @profile: profile to verify (NOT NULL)
953  *
954  * Returns: 0 if passes verification else error
955  */
956 static int verify_profile(struct aa_profile *profile)
957 {
958         if (profile->file.dfa &&
959             !verify_dfa_xindex(profile->file.dfa,
960                                profile->file.trans.size)) {
961                 audit_iface(profile, NULL, NULL, "Invalid named transition",
962                             NULL, -EPROTO);
963                 return -EPROTO;
964         }
965
966         return 0;
967 }
968
969 void aa_load_ent_free(struct aa_load_ent *ent)
970 {
971         if (ent) {
972                 aa_put_profile(ent->rename);
973                 aa_put_profile(ent->old);
974                 aa_put_profile(ent->new);
975                 kfree(ent->ns_name);
976                 kzfree(ent);
977         }
978 }
979
980 struct aa_load_ent *aa_load_ent_alloc(void)
981 {
982         struct aa_load_ent *ent = kzalloc(sizeof(*ent), GFP_KERNEL);
983         if (ent)
984                 INIT_LIST_HEAD(&ent->list);
985         return ent;
986 }
987
988 /**
989  * aa_unpack - unpack packed binary profile(s) data loaded from user space
990  * @udata: user data copied to kmem  (NOT NULL)
991  * @lh: list to place unpacked profiles in a aa_repl_ws
992  * @ns: Returns namespace profile is in if specified else NULL (NOT NULL)
993  *
994  * Unpack user data and return refcounted allocated profile(s) stored in
995  * @lh in order of discovery, with the list chain stored in base.list
996  * or error
997  *
998  * Returns: profile(s) on @lh else error pointer if fails to unpack
999  */
1000 int aa_unpack(struct aa_loaddata *udata, struct list_head *lh,
1001               const char **ns)
1002 {
1003         struct aa_load_ent *tmp, *ent;
1004         struct aa_profile *profile = NULL;
1005         int error;
1006         struct aa_ext e = {
1007                 .start = udata->data,
1008                 .end = udata->data + udata->size,
1009                 .pos = udata->data,
1010         };
1011
1012         *ns = NULL;
1013         while (e.pos < e.end) {
1014                 char *ns_name = NULL;
1015                 void *start;
1016                 error = verify_header(&e, e.pos == e.start, ns);
1017                 if (error)
1018                         goto fail;
1019
1020                 start = e.pos;
1021                 profile = unpack_profile(&e, &ns_name);
1022                 if (IS_ERR(profile)) {
1023                         error = PTR_ERR(profile);
1024                         goto fail;
1025                 }
1026
1027                 error = verify_profile(profile);
1028                 if (error)
1029                         goto fail_profile;
1030
1031                 if (aa_g_hash_policy)
1032                         error = aa_calc_profile_hash(profile, e.version, start,
1033                                                      e.pos - start);
1034                 if (error)
1035                         goto fail_profile;
1036
1037                 ent = aa_load_ent_alloc();
1038                 if (!ent) {
1039                         error = -ENOMEM;
1040                         goto fail_profile;
1041                 }
1042
1043                 ent->new = profile;
1044                 ent->ns_name = ns_name;
1045                 list_add_tail(&ent->list, lh);
1046         }
1047         udata->abi = e.version & K_ABI_MASK;
1048         if (aa_g_hash_policy) {
1049                 udata->hash = aa_calc_hash(udata->data, udata->size);
1050                 if (IS_ERR(udata->hash)) {
1051                         error = PTR_ERR(udata->hash);
1052                         udata->hash = NULL;
1053                         goto fail;
1054                 }
1055         }
1056         return 0;
1057
1058 fail_profile:
1059         aa_put_profile(profile);
1060
1061 fail:
1062         list_for_each_entry_safe(ent, tmp, lh, list) {
1063                 list_del_init(&ent->list);
1064                 aa_load_ent_free(ent);
1065         }
1066
1067         return error;
1068 }