summaryrefslogtreecommitdiff
path: root/policy.h
diff options
context:
space:
mode:
Diffstat (limited to 'policy.h')
-rw-r--r--policy.h344
1 files changed, 344 insertions, 0 deletions
diff --git a/policy.h b/policy.h
new file mode 100644
index 0000000..a85c4fc
--- /dev/null
+++ b/policy.h
@@ -0,0 +1,344 @@
1/*
2 * Copyright (c) 2004 Security Architects Corporation. All rights reserved.
3 *
4 * Module Name:
5 *
6 * policy.h
7 *
8 * Abstract:
9 *
10 * This module defines various types used by security policy related routines.
11 *
12 * Author:
13 *
14 * Eugene Tsyrklevich 16-Feb-2004
15 *
16 * Revision History:
17 *
18 * None.
19 */
20
21
22#ifndef __POLICY_H__
23#define __POLICY_H__
24
25
26#define POLICY_MAX_SERVICE_NAME_LENGTH 64
27#define POLICY_MAX_OBJECT_NAME_LENGTH 192
28#define POLICY_MAX_RULE_LENGTH 256
29
30// maximum number of '*' characters in a regex
31#define POLICY_TOTAL_NUMBER_OF_STARS 5
32
33#define isalpha(c) ( ((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') )
34
35#if 0
36typedef enum _ActionType
37{
38 ACTION_NONE=0,
39 ACTION_PERMIT,
40 ACTION_PERMIT_DEFAULT,
41 ACTION_LOG,
42 ACTION_LOG_DEFAULT,
43 ACTION_PROCESS, /* further processing is required */
44 ACTION_RESERVED1,
45 ACTION_RESERVED2,
46 ACTION_RESERVED3,
47 ACTION_TERMINATE, /* terminate process */
48 ACTION_ASK, /* XXX user prompt (interactive session only?) */
49 ACTION_ASK_PERMIT, /* User chose permit */
50 ACTION_ASK_LOG, /* User chose log */
51 ACTION_ASK_TERMINATE, /* User chose terminate */
52 ACTION_DENY, /* all actions listed after ACTION_DENY are treated as DENY actions */
53 ACTION_ASK_DENY, /* User chose deny */
54 ACTION_DENY_DEFAULT, /* default deny policy action, used to distinguish between default and explicit deny actions */
55 ACTION_QUIETDENY, /* deny but do not log */
56 ACTION_QUIETDENY_DEFAULT, /* deny but do not log (default action) */
57
58} ACTION_TYPE;
59#endif
60
61
62typedef unsigned char ACTION_TYPE;
63
64#define ACTION_DEFAULT (1 << 7)
65#define ACTION_DENY (1 << 6)
66#define ACTION_PERMIT (1 << 5)
67#define ACTION_LOG (1 << 4)
68#define ACTION_TERMINATE (1 << 3)
69
70#define ACTION_NONE 0
71#define ACTION_ASK 1
72#define ACTION_ASK_PERMIT (ACTION_ASK | ACTION_PERMIT)
73#define ACTION_ASK_LOG (ACTION_ASK | ACTION_LOG)
74#define ACTION_ASK_TERMINATE (ACTION_ASK | ACTION_TERMINATE)
75#define ACTION_ASK_DENY (ACTION_ASK | ACTION_DENY)
76#define ACTION_QUIETDENY (2 | ACTION_DENY)
77#define ACTION_PROCESS 3
78#define ACTION_RESERVED1 4
79#define ACTION_RESERVED2 5
80#define ACTION_RESERVED3 6
81#define ACTION_RESERVED4 7
82
83#define ACTION_DENY_DEFAULT (ACTION_DENY | ACTION_DEFAULT)
84#define ACTION_PERMIT_DEFAULT (ACTION_PERMIT | ACTION_DEFAULT)
85#define ACTION_LOG_DEFAULT (ACTION_LOG | ACTION_DEFAULT)
86#define ACTION_QUIETDENY_DEFAULT (ACTION_QUIETDENY | ACTION_DEFAULT)
87#define ACTION_ASK_DEFAULT (ACTION_ASK | ACTION_DEFAULT)
88
89
90#define DEFAULT_POLICY_ACTION ACTION_PERMIT_DEFAULT
91
92
93/*
94 * WARNING: ObjectParseOps (policy.c) && RuleTypeData (learn.c) structures depend on the order of the
95 * following enum values
96 *
97 * RuleType enumerates all possible object types.
98 * (in C++ we would have a separate class for each)
99 */
100
101typedef enum _RuleType
102{
103 RULE_FILE = 0,
104 RULE_DIRECTORY,
105 RULE_MAILSLOT,
106 RULE_NAMEDPIPE,
107 RULE_REGISTRY,
108 RULE_SECTION,
109 RULE_DLL,
110 RULE_EVENT,
111 RULE_SEMAPHORE,
112 RULE_JOB,
113 RULE_MUTANT,
114 RULE_PORT,
115 RULE_SYMLINK,
116 RULE_TIMER,
117 RULE_PROCESS,
118 RULE_DRIVER,
119 RULE_DIROBJ,
120 RULE_ATOM,
121
122 RULE_NETWORK,
123 RULE_SERVICE,
124 RULE_TIME,
125 RULE_TOKEN,
126 RULE_SYSCALL,
127 RULE_LASTONE, /* not a real rule, just a convinient way of iterating through all rules (i < RULE_LASTONE) */
128
129} RULE_TYPE;
130
131
132typedef enum _MatchType
133{
134 MATCH_SINGLE = 0,
135 MATCH_WILDCARD,
136 MATCH_ALL,
137 MATCH_NONE
138
139} MATCH_TYPE;
140
141
142typedef enum _AlertPriority
143{
144 ALERT_PRIORITY_HIGH = 1,
145 ALERT_PRIORITY_MEDIUM,
146 ALERT_PRIORITY_LOW,
147 ALERT_PRIORITY_INFO,
148
149} ALERT_PRIORITY;
150
151
152/*
153 * Operation Types
154 */
155
156
157#define OP_INVALID 0x00
158#define OP_NONE 0x00
159
160// file ops
161
162#define OP_READ 0x01
163#define OP_WRITE 0x02
164#define OP_READ_WRITE (OP_READ | OP_WRITE)
165#define OP_EXECUTE 0x04
166#define OP_DELETE 0x08
167#define OP_APPEND 0x10
168
169// dirobj & job ops
170#define OP_CREATE 0x01
171#define OP_OPEN 0x02
172
173// directory ops
174
175#define OP_DIR_TRAVERSE 0x01
176#define OP_DIR_CREATE 0x02
177
178// process ops
179
180#define OP_PROC_EXECUTE 0x01
181#define OP_PROC_OPEN 0x02
182
183// port ops
184
185#define OP_PORT_CONNECT 0x01
186#define OP_PORT_CREATE 0x02
187
188// network ops
189
190#define OP_TCPCONNECT 0x01
191#define OP_UDPCONNECT 0x02
192#define OP_CONNECT 0x03
193#define OP_BIND 0x04
194
195// atom ops
196
197#define OP_FIND 0x01
198#define OP_ADD 0x02
199
200// service ops
201
202#define OP_SERVICE_START 0x01
203#define OP_SERVICE_STOP 0x02
204#define OP_SERVICE_CREATE 0x03
205#define OP_SERVICE_DELETE 0x04
206
207// dll/driver ops
208
209#define OP_LOAD 0x01
210#define OP_REGLOAD 0x02
211#define OP_UNLOAD 0x03 // XXX 0x04?
212
213// time change op
214
215#define OP_TIME_CHANGE 0x01
216
217// vdm ops
218
219#define OP_VDM_USE 0x01
220
221// debug ops
222
223#define OP_DEBUG 0x01
224
225// token ops
226
227#define OP_TOKEN_MODIFY 0x01
228
229// buffer overflow protection "virtual op"
230
231#define OP_INVALIDCALL 0x01
232
233
234#define OP_ALL 0xFF
235
236
237// forward declaration
238typedef struct _SECURITY_POLICY SECURITY_POLICY, *PSECURITY_POLICY;
239
240
241/* Rule should really be a class */
242
243typedef struct _POLICY_RULE
244{
245 struct _POLICY_RULE *Next;
246
247 PSECURITY_POLICY pSecurityPolicy;
248
249 ACTION_TYPE ActionType;
250 MATCH_TYPE MatchType;
251 UCHAR OperationType;
252
253 UCHAR RuleNumber; /* is used to associate text descriptions with certain rules */
254
255 USHORT PolicyLineNumber; /* line number in the policy file */
256
257 /*
258 * the majority of rules use the struct below to hold information about string objects they represent
259 * RULE_SYSCALL though does not have any names associated with it and uses ServiceBitArray to create
260 * a bit index for all system calls. Both Name & ServiceBitArray are allocated dynamically.
261 * (in C++ we would have 2 different classes for this)
262 */
263 union
264 {
265 struct
266 {
267 USHORT NameLength;
268 CHAR Name[ANYSIZE_ARRAY];
269 };
270
271 ULONG ServiceBitArray[ANYSIZE_ARRAY];
272 };
273
274} POLICY_RULE, *PPOLICY_RULE;
275
276
277
278typedef struct _SECURITY_POLICY
279{
280 PPOLICY_RULE RuleList[RULE_LASTONE];
281
282 KSPIN_LOCK SpinLock;
283
284 BOOLEAN Initialized; /* Has this policy been initialized already? */
285
286
287#define PROTECTION_OVERFLOW (1 << 0)
288#define PROTECTION_USERLAND (1 << 1)
289#define PROTECTION_DEBUGGING (1 << 2)
290#define PROTECTION_VDM (1 << 3)
291#define PROTECTION_KEYBOARD (1 << 4)
292#define PROTECTION_MODEM (1 << 5)
293#define PROTECTION_SNIFFER (1 << 6)
294#define PROTECTION_EXTENSION (1 << 7)
295
296 USHORT ProtectionFlags;
297
298 ACTION_TYPE DefaultPolicyAction;
299
300 PWSTR Name;
301
302} SECURITY_POLICY, *PSECURITY_POLICY;
303
304
305#define IS_OVERFLOW_PROTECTION_ON(SecPolicy) (((SecPolicy).ProtectionFlags & PROTECTION_OVERFLOW) == PROTECTION_OVERFLOW)
306#define IS_USERLAND_PROTECTION_ON(SecPolicy) (((SecPolicy).ProtectionFlags & PROTECTION_USERLAND) == PROTECTION_USERLAND)
307#define IS_DEBUGGING_PROTECTION_ON(SecPolicy) (((SecPolicy).ProtectionFlags & PROTECTION_DEBUGGING) == PROTECTION_DEBUGGING)
308#define IS_VDM_PROTECTION_ON(SecPolicy) (((SecPolicy).ProtectionFlags & PROTECTION_VDM) == PROTECTION_VDM)
309#define IS_EXTENSION_PROTECTION_ON(SecPolicy) (((SecPolicy).ProtectionFlags & PROTECTION_EXTENSION) == PROTECTION_EXTENSION)
310
311#define TURN_DEBUGGING_PROTECTION_OFF(SecPolicy) ((SecPolicy).ProtectionFlags &= ~PROTECTION_DEBUGGING)
312#define TURN_VDM_PROTECTION_OFF(SecPolicy) ((SecPolicy).ProtectionFlags &= ~PROTECTION_VDM)
313#define TURN_EXTENSION_PROTECTION_OFF(SecPolicy) ((SecPolicy).ProtectionFlags &= ~PROTECTION_EXTENSION)
314
315
316#define PROTECTION_ALL_ON 0xFFFF
317#define PROTECTION_ALL_OFF 0x0000
318
319#define INVALID_OBJECT_SIZE (-1)
320
321
322extern SECURITY_POLICY gSecPolicy;
323extern CHAR SystemDrive, SystemRoot[], SystemRootUnresolved[], *SystemRootDirectory, CDrive[];
324extern USHORT SystemRootLength, SystemRootUnresolvedLength, SystemRootDirectoryLength, CDriveLength;
325extern ULONG NumberOfBitsInUlong, UlongBitShift;
326
327
328#define WILDCARD_MATCH 1
329#define WILDCARD_NO_MATCH 0
330
331
332BOOLEAN InitPolicy();
333void PolicyRemove();
334void PolicyDelete(IN PSECURITY_POLICY pSecPolicy);
335BOOLEAN LoadSecurityPolicy(OUT PSECURITY_POLICY pSecPolicy, IN PWSTR PolicyFile, IN PWSTR FilePath);
336BOOLEAN FindAndLoadSecurityPolicy(OUT PSECURITY_POLICY pSecPolicy, IN PWSTR filename, IN PWSTR UserName);
337ACTION_TYPE PolicyCheck(RULE_TYPE RuleType, PCHAR Object, UCHAR OperationType, UCHAR *RuleNumber, PWSTR *PolicyFilename, USHORT *PolicyLineNumber);
338BOOLEAN PolicyParseObjectRule(PSECURITY_POLICY pSecPolicy, RULE_TYPE RuleType, PCHAR Operation, PCHAR rule);
339VOID InsertPolicyRule(PSECURITY_POLICY pSecPolicy, PPOLICY_RULE PolicyRule, RULE_TYPE RuleType);
340BOOLEAN PolicyPostBootup();
341int WildcardMatch(PCHAR path, PCHAR regex);
342
343
344#endif /* __POLICY_H__ */