source: trunk/include/samhain.h@ 311

Last change on this file since 311 was 295, checked in by katerina, 14 years ago

Support for IPv6 (ticket #222).

File size: 13.9 KB
Line 
1/* SAMHAIN file system integrity testing */
2/* Copyright (C) 1999 Rainer Wichmann */
3/* */
4/* This program is free software; you can redistribute it */
5/* and/or modify */
6/* it under the terms of the GNU General Public License as */
7/* published by */
8/* the Free Software Foundation; either version 2 of the License, or */
9/* (at your option) any later version. */
10/* */
11/* This program is distributed in the hope that it will be useful, */
12/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
13/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
14/* GNU General Public License for more details. */
15/* */
16/* You should have received a copy of the GNU General Public License */
17/* along with this program; if not, write to the Free Software */
18/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#ifndef SAMHAIN_H
21#define SAMHAIN_H
22
23#include <sys/types.h>
24#include "slib.h"
25
26#ifdef SH_ENCRYPT
27#include "rijndael-api-fst.h"
28#endif
29
30/**************************************************
31 *
32 * STANDARD DEFINES
33 *
34 **************************************************/
35
36/* IPv6 */
37#if defined(HAVE_GETNAMEINFO) && defined(HAVE_GETADDRINFO)
38
39#if defined(SH_COMPILE_STATIC) && defined(__linux__)
40#undef USE_IPVX
41#define SH_SOCKMAX 1
42#else
43
44#if defined(USE_IPV4)
45#undef USE_IPVX
46#else
47#define USE_IPVX 1
48#endif
49
50#define SH_SOCKMAX 8
51#endif
52
53#else
54#undef USE_IPVX
55#define SH_SOCKMAX 1
56#endif
57
58/* end IPv6 */
59
60#define REPLACE_OLD
61
62/* Standard buffer sizes.
63 * IPv6 is 8 groups of 4 hex digits seperated by colons.
64 */
65#define SH_IP_BUF 48
66#define SH_MINIBUF 64
67#define SH_BUFSIZE 1024
68#define SH_MAXBUF 4096
69#define SH_PATHBUF 256
70#define SH_MSG_BUF 64512
71
72#define SH_ERRBUF_SIZE 64
73
74/* MAX_PATH_STORE must be >= KEY_LEN
75 */
76#define MAX_PATH_STORE 12287
77
78/* Sizes for arrays (user, group, timestamp).
79 */
80#define SOCKPASS_MAX 14
81#define USER_MAX 20
82#define GROUP_MAX 20
83#define TIM_MAX 32
84
85#define CMODE_SIZE 11
86
87#define ATTRBUF_SIZE 16
88#define ATTRBUF_USED 12
89
90/* The number of bytes in a key,
91 * the number of chars in its hex repesentation,
92 * and the block size of the hash algorithm.
93 */
94#define KEY_BYT 24
95#define KEY_LEN 48
96#define KEY_BLOCK 24
97#define KEYBUF_SIZE (KEY_LEN+1)
98
99/* The length of the compiled-in password.
100 */
101#define PW_LEN 8
102
103#undef GOOD
104#define GOOD 1
105#undef BAD
106#define BAD 0
107#undef ON
108#define ON 1
109#undef OFF
110#define OFF 0
111#undef S_TRUE
112#define S_TRUE 1
113#undef S_FALSE
114#define S_FALSE 0
115
116/* An unsigned integer guaranteed to be 32 bit.
117 */
118#if defined(HAVE_INT_32)
119#define UINT32 unsigned int
120#define SINT32 int
121#elif defined(HAVE_LONG_32)
122#define UINT32 unsigned long
123#define SINT32 long
124#elif defined(HAVE_SHORT_32)
125#define UINT32 unsigned short
126#define SINT32 short
127#endif
128
129#ifdef HAVE_INTTYPES_H
130#include <inttypes.h>
131#endif
132#ifdef HAVE_STDINT_H
133#include <stdint.h>
134#endif
135
136#if !defined(HAVE_UINT16_T)
137#define UINT16 unsigned short
138#else
139#define UINT16 uint16_t
140#endif
141
142#if !defined(HAVE_UINT64_T)
143
144#ifdef HAVE_LONG_LONG_64
145#define UINT64 unsigned long long
146#else
147#ifdef HAVE_LONG_64
148#define UINT64 unsigned long
149#else
150#error "no 64bit type found"
151#endif
152#endif
153
154#else
155#define UINT64 uint64_t
156#endif
157
158
159
160#define UBYTE unsigned char
161
162
163enum {
164 SH_CHECK_NONE = 0,
165 SH_CHECK_INIT = 1,
166 SH_CHECK_CHECK = 2
167};
168
169#define SH_MOD_THREAD 1
170#define SH_MOD_ACTIVE 0
171#define SH_MOD_FAILED -1
172#define SH_MOD_OFFSET 10
173
174/* Flags for file status
175 */
176#define SH_FFLAG_ALLIGNORE (1<<0)
177#define SH_FFLAG_VISITED (1<<1)
178#define SH_FFLAG_CHECKED (1<<3)
179#define SH_FFLAG_REPORTED (1<<3)
180#define SH_FFLAG_SUIDCHK (1<<4)
181
182#define SH_FFLAG_ALLIGNORE_SET(a) (((a) & SH_FFLAG_ALLIGNORE) != 0)
183#define SET_SH_FFLAG_ALLIGNORE(a) ((a) |= SH_FFLAG_ALLIGNORE)
184#define CLEAR_SH_FFLAG_ALLIGNORE(a) ((a) &= ~SH_FFLAG_ALLIGNORE)
185
186#define SH_FFLAG_VISITED_SET(a) (((a) & SH_FFLAG_VISITED) != 0)
187#define SET_SH_FFLAG_VISITED(a) ((a) |= SH_FFLAG_VISITED)
188#define CLEAR_SH_FFLAG_VISITED(a) ((a) &= ~SH_FFLAG_VISITED)
189
190#define SH_FFLAG_CHECKED_SET(a) (((a) & SH_FFLAG_VISITED) != 0)
191#define SET_SH_FFLAG_CHECKED(a) ((a) |= SH_FFLAG_VISITED)
192#define CLEAR_SH_FFLAG_CHECKED(a) ((a) &= ~SH_FFLAG_VISITED)
193
194#define SH_FFLAG_REPORTED_SET(a) (((a) & SH_FFLAG_REPORTED) != 0)
195#define SET_SH_FFLAG_REPORTED(a) ((a) |= SH_FFLAG_REPORTED)
196#define CLEAR_SH_FFLAG_REPORTED(a) ((a) &= ~SH_FFLAG_REPORTED)
197
198#define SH_FFLAG_SUIDCHK_SET(a) (((a) & SH_FFLAG_SUIDCHK) != 0)
199#define SET_SH_FFLAG_SUIDCHK(a) ((a) |= SH_FFLAG_SUIDCHK)
200#define CLEAR_SH_FFLAG_SUIDCHK(a) ((a) &= ~SH_FFLAG_SUIDCHK)
201
202
203/**************************************************
204 *
205 * TYPEDEFS
206 *
207 **************************************************/
208
209enum {
210 SH_LEVEL_READONLY = 1,
211 SH_LEVEL_LOGFILES = 2,
212 SH_LEVEL_LOGGROW = 3,
213 SH_LEVEL_NOIGNORE = 4,
214 SH_LEVEL_ALLIGNORE = 5,
215 SH_LEVEL_ATTRIBUTES = 6,
216 SH_LEVEL_USER0 = 7,
217 SH_LEVEL_USER1 = 8,
218 SH_LEVEL_USER2 = 9,
219 SH_LEVEL_USER3 = 10,
220 SH_LEVEL_USER4 = 11,
221 SH_LEVEL_PRELINK = 12
222};
223
224typedef struct {
225 time_t alarm_interval;
226 time_t alarm_last;
227} sh_timer_t;
228
229typedef struct {
230 char path[SH_PATHBUF];
231 char hash[KEY_LEN+1];
232} sh_sh_df;
233
234typedef struct {
235 char user[USER_MAX];
236 char group[GROUP_MAX];
237 char home[SH_PATHBUF];
238 uid_t uid;
239 gid_t gid;
240} sh_sh_user;
241
242typedef struct {
243 char name[SH_PATHBUF]; /* local hostname */
244 char system[SH_MINIBUF]; /* system */
245 char release[SH_MINIBUF]; /* release */
246 char machine[SH_MINIBUF]; /* machine */
247} sh_sh_local;
248
249typedef struct {
250 char name[SH_PATHBUF];
251 char alt[SH_PATHBUF];
252} sh_sh_remote;
253
254typedef struct {
255 unsigned long bytes_hashed; /* bytes last check */
256 unsigned long bytes_speed; /* bytes/sec last check */
257 unsigned long mail_success; /* mails sent */
258 unsigned long mail_failed; /* mails not sent */
259 time_t time_start; /* start last check */
260 time_t time_check; /* time last check */
261 unsigned long dirs_checked; /* #dirs last check */
262 unsigned long files_checked; /* #files last check */
263} sh_sh_stat;
264
265typedef struct {
266 int exit; /* exit value */
267 int checkSum; /* whether to init/check checksums */
268 int update; /* update db */
269 int opts; /* reading cl options */
270 int started; /* finished with startup stuff */
271 int isdaemon; /* daemon or not */
272 int loop; /* go in loop even if not daemon */
273 int nice; /* desired nicety */
274 int isserver; /* server or not */
275 int islocked; /* BAD if logfile not locked */
276 int smsg; /* GOOD if end message sent */
277 int log_start; /* TRUE if new audit trail */
278 int reportonce; /* TRUE if bad files only once rep.*/
279 int fulldetail; /* TRUE if full details requested */
280 int client_severity; /* TRUE if client severity used */
281 int client_class; /* TRUE if client class used */
282 int audit;
283 unsigned long aud_mask;
284 int hidefile; /* TRUE if file not reveled in log */
285} sh_sh_flag;
286
287typedef struct {
288
289 char prg_name[8];
290
291 UINT64 pid;
292
293 sh_sh_df exec;
294 sh_sh_df conf;
295 sh_sh_df data;
296
297 sh_sh_user real;
298 sh_sh_user effective;
299 sh_sh_user run;
300
301 sh_sh_local host;
302
303 sh_sh_remote srvtime;
304 sh_sh_remote srvmail;
305 sh_sh_remote srvexport;
306 sh_sh_remote srvcons;
307 sh_sh_remote srvlog;
308
309 sh_sh_stat statistics;
310 sh_sh_flag flag;
311
312#ifdef SH_STEALTH
313 unsigned long off_data;
314#endif
315
316 sh_timer_t mailNum;
317 sh_timer_t mailTime;
318 sh_timer_t fileCheck;
319
320 int looptime; /* timing for main loop */
321 /*@null@*//*@out@*/ char * timezone;
322} sh_struct;
323
324
325extern volatile int sig_raised;
326extern volatile int sig_urgent;
327extern volatile int sig_debug_switch; /* SIGUSR1 */
328extern volatile int sig_suspend_switch; /* SIGUSR2 */
329extern volatile int sh_global_suspend_flag;
330extern volatile int sig_fresh_trail; /* SIGIOT */
331extern volatile int sh_thread_pause_flag;
332extern volatile int sig_config_read_again; /* SIGHUP */
333extern volatile int sig_terminate; /* SIGQUIT */
334extern volatile int sig_termfast; /* SIGTERM */
335extern volatile int sig_force_check; /* SIGTTOU */
336
337extern long int eintr__result;
338
339extern int sh_argc_store;
340extern char ** sh_argv_store;
341
342#include "sh_calls.h"
343
344
345typedef struct {
346 char sh_sockpass[2*SOCKPASS_MAX+2];
347 char sigkey_old[KEY_LEN+1];
348 char sigkey_new[KEY_LEN+1];
349 char mailkey_old[KEY_LEN+1];
350 char mailkey_new[KEY_LEN+1];
351 char crypt[KEY_LEN+1];
352 char session[KEY_LEN+1];
353 char vernam[KEY_LEN+1];
354 int mlock_failed;
355
356 char pw[PW_LEN];
357
358 char poolv[KEY_BYT];
359 int poolc;
360
361 int rngI;
362 UINT32 rng0[3];
363 UINT32 rng1[3];
364 UINT32 rng2[3];
365
366 UINT32 res_vec[6];
367
368 UINT32 ErrFlag[2];
369
370#ifdef SH_ENCRYPT
371 /*@out@*/ keyInstance keyInstE;
372 /*@out@*/ keyInstance keyInstD;
373#endif
374} sh_key_t;
375
376extern sh_struct sh;
377/*@null@*/ extern sh_key_t *skey;
378
379/**************************************************
380 *
381 * macros
382 *
383 **************************************************/
384
385#if defined(__GNUC__) && (__GNUC__ >= 4)
386#define SH_GNUC_SENTINEL __attribute__((__sentinel__))
387#else
388#define SH_GNUC_SENTINEL
389#endif
390
391#if defined(__GNUC__) && (__GNUC__ >= 3)
392#undef SH_GNUC_PURE
393#define SH_GNUC_PURE __attribute__((pure))
394#undef SH_GNUC_CONST
395#define SH_GNUC_CONST __attribute__((const))
396#undef SH_GNUC_NORETURN
397#define SH_GNUC_NORETURN __attribute__((noreturn))
398#undef SH_GNUC_MALLOC
399#define SH_GNUC_MALLOC __attribute__((malloc))
400#else
401#undef SH_GNUC_PURE
402#define SH_GNUC_PURE
403#undef SH_GNUC_CONST
404#define SH_GNUC_CONST
405#undef SH_GNUC_NORETURN
406#define SH_GNUC_NORETURN
407#undef SH_GNUC_MALLOC
408#define SH_GNUC_MALLOC
409#endif
410
411
412/* The semantics of the built-in are that it is expected that expr == const
413 * for __builtin_expect ((expr), const)
414 */
415#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
416#define SH_LIKELY(expr) (__builtin_expect((expr), 1))
417#define SH_UNLIKELY(expr) (__builtin_expect((expr), 0))
418#else
419#define SH_LIKELY(expr) (expr)
420#define SH_UNLIKELY(expr) (expr)
421#endif
422
423/* signal-safe log function
424 */
425int safe_logger (int thesignal, int method, char * details);
426void safe_fatal (const char * details, const char *f, int l);
427
428#define SH_VALIDATE_EQ(a,b) \
429 do { \
430 if ((a) != (b)) safe_fatal(#a " != " #b, FIL__, __LINE__);\
431 } while (0)
432
433#define SH_VALIDATE_NE(a,b) \
434 do { \
435 if ((a) == (b)) safe_fatal(#a " == " #b, FIL__, __LINE__);\
436 } while (0)
437
438#define SH_VALIDATE_GE(a,b) \
439 do { \
440 if ((a) < (b)) safe_fatal(#a " < " #b, FIL__, __LINE__);\
441 } while (0)
442
443#if defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK)
444#define MLOCK(a, b) \
445 if ((skey != NULL) && skey->mlock_failed == SL_FALSE){ \
446 (void) sl_set_suid(); \
447 if (sh_unix_mlock(FIL__, __LINE__, a, b) < 0) skey->mlock_failed = SL_TRUE; \
448 (void) sl_unset_suid(); }
449#else
450#define MLOCK(a, b) \
451 ;
452#endif
453
454#if defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK)
455#define MUNLOCK(a, b) \
456 if ((skey != NULL) && skey->mlock_failed == SL_FALSE){ \
457 (void) sl_set_suid(); \
458 (void) sh_unix_munlock( a, b );\
459 (void) sl_unset_suid(); }
460#else
461#define MUNLOCK(a, b) \
462 ;
463#endif
464
465#ifdef SH_STEALTH
466void sh_do_encode (char * str, int len);
467#define sh_do_decode sh_do_encode
468#endif
469
470/* #if defined(SCREW_IT_UP)
471 * extern volatile int sh_not_traced;
472 * inline int sh_sigtrap_prepare();
473 * inline int sh_derr();
474 * #endif
475 */
476
477#if defined(SCREW_IT_UP) && (defined(__FreeBSD__) || defined(__linux__)) && defined(__i386__)
478#define BREAKEXIT(expr) \
479 do { \
480 int ixi; \
481 for (ixi = 0; ixi < 8; ++ixi) { \
482 if ((*(volatile unsigned *)((unsigned) expr + ixi) & 0xff) == 0xcc) \
483 _exit(EXIT_FAILURE); \
484 } \
485 } \
486 while (1 == 0)
487#else
488#define BREAKEXIT(expr)
489#endif
490
491
492
493#include "sh_cat.h"
494#include "sh_trace.h"
495#include "sh_mem.h"
496
497#endif
498
499/* CRIT: */
500/* NEW_CLIENT <client> */
501/* BAD_CLIENT <client> -- <details> */
502/* ERR_CLIENT <client> -- <details> */
503
504/* ALERT: */
505/* LOG_KEY samhain|yule <key> */
506/* STARTUP samhain|yule -- user <username> */
507/* EXIT samhain|yule */
508/* GOODSIG <file> <user> */
509/* FP_KEY <fingerprint> */
510/* GOODSIG_DAT <file> <user> */
511/* FP_KEY_DAT <fingerprint> */
512/* TIGER_CFG <file> <checksum> */
513/* TIGER_DAT <file> <checksum> */
514
515/* PANIC -- <details> */
516/* ERROR -- <details> */
517
518/* Policy */
519/* POLICY <code> <file> */
520/* <code> = MISSING || ADDED || NOT_A_DIRECTORY || <policy> */
521
522
523
Note: See TracBrowser for help on using the repository browser.