~ubuntu-branches/ubuntu/precise/apparmor/precise-security

« back to all changes in this revision

Viewing changes to .pc/0009-apparmor-lp959560-part1.patch/parser/parser.h

  • Committer: Package Import Robot
  • Author(s): Steve Beattie, Jamie Strandboge, Serge Hallyn, Steve Beattie
  • Date: 2012-04-12 06:17:42 UTC
  • Revision ID: package-import@ubuntu.com-20120412061742-9v75hjko2mjtbewv
Tags: 2.7.102-0ubuntu3
[ Jamie Strandboge ]
* debian/patches/0007-ubuntu-manpage-updates.patch: update apparmor(5)
  to describe Ubuntu's two-stage policy load and how to add utilize it
  when developing policy (LP: #974089)

[ Serge Hallyn ]
* debian/apparmor.init: do nothing in a container.  This can be
  removed once stacked profiles are supported and used by lxc.
  (LP: #978297)

[ Steve Beattie ]
* debian/patches/0008-apparmor-lp963756.patch: Fix permission mapping
  for change_profile onexec (LP: #963756)
* debian/patches/0009-apparmor-lp959560-part1.patch,
  debian/patches/0010-apparmor-lp959560-part2.patch: Update the parser
  to support the 'in' keyword for value lists, and make mount
  operations aware of 'in' keyword so they can affect the flags build
  list (LP: #959560)
* debian/patches/0011-apparmor-lp872446.patch: fix logprof missing
  exec events in complain mode (LP: #872446)
* debian/patches/0012-apparmor-lp978584.patch: allow inet6 access in
  dovecot imap-login profile (LP: #978584)
* debian/patches/0013-apparmor-lp800826.patch: fix libapparmor
  log parsing library from dropping apparmor network events that
  contain ip addresses or ports in them (LP: #800826)
* debian/patches/0014-apparmor-lp979095.patch: document new mount rule
  syntax and usage in apparmor.d(5) manpage (LP: #979095)
* debian/patches/0015-apparmor-lp963756.patch: Fix change_onexec
  for profiles without attachment specification (LP: #963756,
  LP: #978038)
* debian/patches/0016-apparmor-lp968956.patch: Fix protocol error when
  loading policy to kernels without compat patches (LP: #968956)
* debian/patches/0017-apparmor-lp979135.patch: Fix change_profile to
  grant access to /proc/attr api (LP: #979135)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *   Copyright (c) 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007
 
3
 *   NOVELL (All rights reserved)
 
4
 *
 
5
 *   Copyright (c) 2010 - 2012
 
6
 *   Canonical Ltd. (All rights reserved)
 
7
 *
 
8
 *   This program is free software; you can redistribute it and/or
 
9
 *   modify it under the terms of version 2 of the GNU General Public
 
10
 *   License published by the Free Software Foundation.
 
11
 *
 
12
 *   This program is distributed in the hope that it will be useful,
 
13
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
 *   GNU General Public License for more details.
 
16
 *
 
17
 *   You should have received a copy of the GNU General Public License
 
18
 *   along with this program; if not, contact Novell, Inc. or Canonical
 
19
 *   Ltd.
 
20
 */
 
21
 
 
22
#ifndef __AA_PARSER_H
 
23
#define __AA_PARSER_H
 
24
 
 
25
#include <netinet/in.h>
 
26
#include <sys/resource.h>
 
27
#include "immunix.h"
 
28
#include "libapparmor_re/apparmor_re.h"
 
29
#include "libapparmor_re/aare_rules.h"
 
30
 
 
31
struct mnt_ent;
 
32
 
 
33
/* Global variable to pass token to lexer.  Will be replaced by parameter
 
34
 * when lexer and parser are made reentrant
 
35
 */
 
36
extern int parser_token;
 
37
 
 
38
typedef enum pattern_t pattern_t;
 
39
 
 
40
struct flagval {
 
41
        int hat;
 
42
        int complain;
 
43
        int audit;
 
44
        int path;
 
45
};
 
46
 
 
47
struct named_transition {
 
48
        int present;
 
49
        char *namespace;
 
50
        char *name;
 
51
};
 
52
 
 
53
struct cod_pattern {
 
54
        char *regex;            // posix regex
 
55
};
 
56
 
 
57
struct value_list {
 
58
        char *value;
 
59
 
 
60
        struct value_list *next;
 
61
};
 
62
 
 
63
struct cond_entry {
 
64
        char *name;
 
65
        struct value_list *vals;
 
66
 
 
67
        struct cond_entry *next;
 
68
};
 
69
 
 
70
struct cod_entry {
 
71
        char *namespace;
 
72
        char *name;
 
73
        char *link_name;
 
74
        char *nt_name;
 
75
        struct codomain *codomain;      /* Special codomain defined
 
76
                                         * just for this executable */
 
77
        int mode;                       /* mode is 'or' of AA_* bits */
 
78
        int audit;                      /* audit flags for mode */
 
79
        int deny;                       /* TRUE or FALSE */
 
80
 
 
81
        int alias_ignore;               /* ignore for alias processing */
 
82
 
 
83
        int subset;
 
84
 
 
85
        pattern_t pattern_type;
 
86
        struct cod_pattern pat;
 
87
 
 
88
        struct cod_entry *next;
 
89
};
 
90
 
 
91
/* supported AF protocols */
 
92
struct aa_network_entry {
 
93
        unsigned int family;
 
94
        unsigned int type;
 
95
        unsigned int protocol;
 
96
 
 
97
        struct aa_network_entry *next;
 
98
};
 
99
 
 
100
struct aa_rlimits {
 
101
        unsigned int specified;                 /* limits that are set */
 
102
        rlim_t limits[RLIMIT_NLIMITS];
 
103
};
 
104
 
 
105
struct alt_name {
 
106
        char *name;
 
107
        struct alt_name *next;
 
108
};
 
109
 
 
110
struct codomain {
 
111
        char *namespace;
 
112
        char *name;                             /* codomain name */
 
113
        char *attachment;
 
114
        struct alt_name *altnames;
 
115
        void *xmatch;
 
116
        size_t xmatch_size;
 
117
        int xmatch_len;
 
118
 
 
119
        /* char *sub_name; */                   /* subdomain name or NULL */
 
120
        /* int default_deny; */                 /* TRUE or FALSE */
 
121
        int local;
 
122
        int local_mode;                         /* true if local, not hat */
 
123
        int local_audit;
 
124
 
 
125
        struct codomain *parent;
 
126
 
 
127
        struct flagval flags;
 
128
 
 
129
        uint64_t capabilities;
 
130
        uint64_t audit_caps;
 
131
        uint64_t deny_caps;
 
132
        uint64_t quiet_caps;
 
133
 
 
134
        unsigned int *network_allowed;          /* array of type masks
 
135
                                                 * indexed by AF_FAMILY */
 
136
        unsigned int *audit_network;
 
137
        unsigned int *deny_network;
 
138
        unsigned int *quiet_network;
 
139
 
 
140
        struct aa_rlimits rlimits;
 
141
 
 
142
        char *exec_table[AA_EXEC_COUNT];
 
143
        struct cod_entry *entries;
 
144
        struct mnt_entry *mnt_ents;
 
145
 
 
146
        void *hat_table;
 
147
        //struct codomain *next;
 
148
 
 
149
        aare_ruleset_t *dfarules;
 
150
        int dfarule_count;
 
151
        void *dfa;
 
152
        size_t dfa_size;
 
153
 
 
154
        aare_ruleset_t *policy_rules;
 
155
        int policy_rule_count;
 
156
        void *policy_dfa;
 
157
        size_t policy_dfa_size;
 
158
};
 
159
 
 
160
struct sd_hat {
 
161
        char *hat_name;
 
162
        unsigned int hat_magic;
 
163
};
 
164
 
 
165
/* describe an ip address */
 
166
struct ipv4_desc {
 
167
        struct in_addr addr;
 
168
        unsigned long mask;
 
169
        unsigned short port[2];
 
170
};
 
171
 
 
172
struct ipv4_endpoints {
 
173
        struct ipv4_desc * src;
 
174
        struct ipv4_desc * dest;
 
175
};
 
176
 
 
177
struct var_string {
 
178
        char *prefix;
 
179
        char *var;
 
180
        char *suffix;
 
181
};
 
182
 
 
183
#define COD_READ_CHAR           'r'
 
184
#define COD_WRITE_CHAR          'w'
 
185
#define COD_APPEND_CHAR         'a'
 
186
#define COD_EXEC_CHAR           'x'
 
187
#define COD_LINK_CHAR           'l'
 
188
#define COD_LOCK_CHAR           'k'
 
189
#define COD_MMAP_CHAR           'm'
 
190
#define COD_INHERIT_CHAR        'i'
 
191
#define COD_UNCONFINED_CHAR     'U'
 
192
#define COD_UNSAFE_UNCONFINED_CHAR      'u'
 
193
#define COD_PROFILE_CHAR        'P'
 
194
#define COD_UNSAFE_PROFILE_CHAR 'p'
 
195
#define COD_LOCAL_CHAR          'C'
 
196
#define COD_UNSAFE_LOCAL_CHAR   'c'
 
197
 
 
198
#define OPTION_ADD      1
 
199
#define OPTION_REMOVE   2
 
200
#define OPTION_REPLACE  3
 
201
#define OPTION_STDOUT   4
 
202
#define OPTION_OFILE    5
 
203
 
 
204
#define AARE_NONE 0
 
205
#define AARE_DFA 2
 
206
 
 
207
#define BOOL int
 
208
 
 
209
#define FLAG_CHANGEHAT_1_4  2
 
210
#define FLAG_CHANGEHAT_1_5  3
 
211
 
 
212
extern int preprocess_only;
 
213
 
 
214
#define PATH_CHROOT_REL 0x1
 
215
#define PATH_NS_REL 0x2
 
216
#define PATH_CHROOT_NSATTACH 0x4
 
217
#define PATH_CHROOT_NO_ATTACH 0x8
 
218
#define PATH_MEDIATE_DELETED 0x10
 
219
#define PATH_DELEGATE_DELETED 0x20
 
220
#define PATH_ATTACH 0x40
 
221
#define PATH_NO_ATTACH 0x80
 
222
 
 
223
 
 
224
 
 
225
#ifdef DEBUG
 
226
#define PDEBUG(fmt, args...) printf("parser: " fmt, ## args)
 
227
#else
 
228
#define PDEBUG(fmt, args...)    /* Do nothing */
 
229
#endif
 
230
#define NPDEBUG(fmt, args...)   /* Do nothing */
 
231
 
 
232
#define PERROR(fmt, args...) fprintf(stderr, fmt, ## args)
 
233
 
 
234
#ifndef TRUE
 
235
#define TRUE    (1)
 
236
#endif
 
237
#ifndef FALSE
 
238
#define FALSE   (0)
 
239
#endif
 
240
 
 
241
#define MIN_PORT 0
 
242
#define MAX_PORT 65535
 
243
 
 
244
#ifndef __unused
 
245
#define __unused __attribute__ ((unused))
 
246
#endif
 
247
 
 
248
 
 
249
#define list_for_each(LIST, ENTRY) \
 
250
        for ((ENTRY) = (LIST); (ENTRY); (ENTRY) = (ENTRY)->next)
 
251
#define list_for_each_safe(LIST, ENTRY, TMP) \
 
252
        for ((ENTRY) = (LIST), (TMP) = (LIST) ? (LIST)->next : NULL; (ENTRY); (ENTRY) = (TMP), (TMP) = (TMP) ? (TMP)->next : NULL)
 
253
#define list_last_entry(LIST, ENTRY) \
 
254
        for ((ENTRY) = (LIST); (ENTRY) && (ENTRY)->next; (ENTRY) = (ENTRY)->next)
 
255
#define list_append(LISTA, LISTB)               \
 
256
        do {                                    \
 
257
                typeof(LISTA) ___tmp;           \
 
258
                list_last_entry((LISTA), ___tmp);\
 
259
                ___tmp->next = (LISTB);         \
 
260
        } while (0)
 
261
 
 
262
/* from parser_common.c */
 
263
extern int regex_type;
 
264
extern int perms_create;
 
265
extern int net_af_max_override;
 
266
extern int kernel_load;
 
267
extern int kernel_supports_network;
 
268
extern int kernel_supports_mount;
 
269
extern int flag_changehat_version;
 
270
extern int conf_verbose;
 
271
extern int conf_quiet;
 
272
extern int names_only;
 
273
extern int option;
 
274
extern int current_lineno;
 
275
extern dfaflags_t dfaflags;
 
276
extern char *progname;
 
277
extern char *subdomainbase;
 
278
extern char *profilename;
 
279
extern char *profile_namespace;
 
280
extern char *current_filename;
 
281
extern FILE *ofile;
 
282
extern int read_implies_exec;
 
283
extern void pwarn(char *fmt, ...) __attribute__((__format__(__printf__, 1, 2)));
 
284
 
 
285
/* from parser_main (cannot be used in tst builds) */
 
286
extern int force_complain;
 
287
extern struct timespec mru_tstamp;
 
288
extern void update_mru_tstamp(FILE *file);
 
289
 
 
290
/* provided by parser_lex.l (cannot be used in tst builds) */
 
291
extern FILE *yyin;
 
292
extern void yyrestart(FILE *fp);
 
293
extern int yyparse(void);
 
294
extern void yyerror(const char *msg, ...);
 
295
extern int yylex(void);
 
296
 
 
297
/* parser_include.c */
 
298
extern char *basedir;
 
299
 
 
300
/* parser_regex.c */
 
301
extern int process_regex(struct codomain *cod);
 
302
extern int post_process_entry(struct cod_entry *entry);
 
303
extern void reset_regex(void);
 
304
 
 
305
extern int process_policydb(struct codomain *cod);
 
306
 
 
307
extern int process_policy_ents(struct codomain *cod);
 
308
 
 
309
/* parser_variable.c */
 
310
extern int process_variables(struct codomain *cod);
 
311
extern struct var_string *split_out_var(char *string);
 
312
extern void free_var_string(struct var_string *var);
 
313
 
 
314
/* parser_misc.c */
 
315
extern struct value_list *new_value_list(char *value);
 
316
extern struct value_list *dup_value_list(struct value_list *list);
 
317
extern void free_value_list(struct value_list *list);
 
318
extern void print_value_list(struct value_list *list);
 
319
extern struct cond_entry *new_cond_entry(char *name, struct value_list *list);
 
320
extern void free_cond_entry(struct cond_entry *ent);
 
321
extern void print_cond_entry(struct cond_entry *ent);
 
322
extern char *processid(char *string, int len);
 
323
extern char *processquoted(char *string, int len);
 
324
extern char *processunquoted(char *string, int len);
 
325
extern int get_keyword_token(const char *keyword);
 
326
extern int name_to_capability(const char *keyword);
 
327
extern int get_rlimit(const char *name);
 
328
extern char *process_var(const char *var);
 
329
extern int parse_mode(const char *mode);
 
330
extern struct cod_entry *new_entry(char *namespace, char *id, int mode,
 
331
                                   char *link_id);
 
332
extern struct aa_network_entry *new_network_ent(unsigned int family,
 
333
                                                unsigned int type,
 
334
                                                unsigned int protocol);
 
335
extern struct aa_network_entry *network_entry(const char *family,
 
336
                                              const char *type,
 
337
                                              const char *protocol);
 
338
extern size_t get_af_max(void);
 
339
 
 
340
extern void debug_cod_list(struct codomain *list);
 
341
/* returns -1 if value != true or false, otherwise 0 == false, 1 == true */
 
342
extern int str_to_boolean(const char* str);
 
343
extern struct cod_entry *copy_cod_entry(struct cod_entry *cod);
 
344
extern void free_cod_entries(struct cod_entry *list);
 
345
extern void free_mnt_entries(struct mnt_entry *list);
 
346
 
 
347
/* parser_symtab.c */
 
348
struct set_value {;
 
349
        char *val;
 
350
        struct set_value *next;
 
351
};
 
352
extern int add_boolean_var(const char *var, int boolean);
 
353
extern int get_boolean_var(const char *var);
 
354
extern int new_set_var(const char *var, const char *value);
 
355
extern int add_set_value(const char *var, const char *value);
 
356
extern struct set_value *get_set_var(const char *var);
 
357
extern char *get_next_set_value(struct set_value **context);
 
358
extern void dump_symtab(void);
 
359
extern void dump_expanded_symtab(void);
 
360
void free_symtabs(void);
 
361
 
 
362
/* parser_alias.c */
 
363
extern int new_alias(const char *from, const char *to);
 
364
extern void replace_aliases(struct codomain *cod);
 
365
extern void free_aliases(void);
 
366
 
 
367
/* parser_merge.c */
 
368
extern int codomain_merge_rules(struct codomain *cod);
 
369
 
 
370
/* parser_interface.c */
 
371
typedef struct __sdserialize sd_serialize;
 
372
extern int load_codomain(int option, struct codomain *cod);
 
373
extern int sd_serialize_profile(sd_serialize *p, struct codomain *cod,
 
374
                                int flatten);
 
375
extern int sd_load_buffer(int option, char *buffer, int size);
 
376
extern int cache_fd;
 
377
 
 
378
 
 
379
/* parser_policy.c */
 
380
extern void add_to_list(struct codomain *codomain);
 
381
extern void add_hat_to_policy(struct codomain *policy, struct codomain *hat);
 
382
extern void add_entry_to_policy(struct codomain *policy, struct cod_entry *entry);
 
383
extern void post_process_nt_entries(struct codomain *cod);
 
384
extern void post_process_mnt_entries(struct codomain *cod);
 
385
extern int post_process_policy(int debug_only);
 
386
extern int process_hat_regex(struct codomain *cod);
 
387
extern int process_hat_variables(struct codomain *cod);
 
388
extern int process_hat_policydb(struct codomain *cod);
 
389
extern int post_merge_rules(void);
 
390
extern int merge_hat_rules(struct codomain *cod);
 
391
extern struct codomain *merge_policy(struct codomain *a, struct codomain *b);
 
392
extern int load_policy(int option);
 
393
extern int load_hats(sd_serialize *p, struct codomain *cod);
 
394
extern int load_flattened_hats(struct codomain *cod);
 
395
extern void free_policy(struct codomain *cod);
 
396
extern void dump_policy(void);
 
397
extern void dump_policy_hats(struct codomain *cod);
 
398
extern void dump_policy_names(void);
 
399
extern int die_if_any_regex(void);
 
400
void free_policies(void);
 
401
 
 
402
#ifdef UNIT_TEST
 
403
/* For the unit-test builds, we must include function stubs for stuff that
 
404
 * only exists in the excluded object files; everything else should live
 
405
 * in parser_common.c.
 
406
 */
 
407
 
 
408
/* parser_yacc.y */
 
409
void yyerror(const char *msg, ...)
 
410
{
 
411
        va_list arg;
 
412
        char buf[PATH_MAX];
 
413
 
 
414
        va_start(arg, msg);
 
415
        vsnprintf(buf, sizeof(buf), msg, arg);
 
416
        va_end(arg);
 
417
 
 
418
        PERROR(_("AppArmor parser error: %s\n"), buf);
 
419
 
 
420
        exit(1);
 
421
}
 
422
 
 
423
#define MY_TEST(statement, error)               \
 
424
        if (!(statement)) {                     \
 
425
                PERROR("FAIL: %s\n", error);    \
 
426
                rc = 1;                         \
 
427
        }
 
428
 
 
429
#endif
 
430
 
 
431
#endif /** __AA_PARSER_H */