Home | History | Annotate | Download | only in racoon
      1 /*	$NetBSD: session.c,v 1.7.6.2 2007/08/01 11:52:22 vanhu Exp $	*/
      2 
      3 /*	$KAME: session.c,v 1.32 2003/09/24 02:01:17 jinmei Exp $	*/
      4 
      5 /*
      6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. Neither the name of the project nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #include "config.h"
     35 
     36 #include <sys/types.h>
     37 #include <sys/param.h>
     38 #include <sys/time.h>
     39 #include <sys/socket.h>
     40 #if HAVE_SYS_WAIT_H
     41 # include <sys/wait.h>
     42 #endif
     43 #ifndef WEXITSTATUS
     44 # define WEXITSTATUS(s)	((unsigned)(s) >> 8)
     45 #endif
     46 #ifndef WIFEXITED
     47 # define WIFEXITED(s)	(((s) & 255) == 0)
     48 #endif
     49 
     50 #include PATH_IPSEC_H
     51 
     52 #include <stdlib.h>
     53 #include <stdio.h>
     54 #include <string.h>
     55 #include <errno.h>
     56 #ifdef HAVE_UNISTD_H
     57 #include <unistd.h>
     58 #endif
     59 #include <signal.h>
     60 #include <sys/stat.h>
     61 #include <paths.h>
     62 
     63 #include <netinet/in.h>
     64 #include <resolv.h>
     65 
     66 #include "libpfkey.h"
     67 
     68 #include "var.h"
     69 #include "misc.h"
     70 #include "vmbuf.h"
     71 #include "plog.h"
     72 #include "debug.h"
     73 
     74 #include "schedule.h"
     75 #include "session.h"
     76 #include "grabmyaddr.h"
     77 #include "evt.h"
     78 #include "cfparse_proto.h"
     79 #include "isakmp_var.h"
     80 #include "isakmp_xauth.h"
     81 #include "isakmp_cfg.h"
     82 #include "admin_var.h"
     83 #include "admin.h"
     84 #include "privsep.h"
     85 #include "oakley.h"
     86 #include "pfkey.h"
     87 #include "handler.h"
     88 #include "localconf.h"
     89 #include "remoteconf.h"
     90 #include "backupsa.h"
     91 #ifdef ENABLE_NATT
     92 #include "nattraversal.h"
     93 #endif
     94 
     95 
     96 #include "algorithm.h" /* XXX ??? */
     97 
     98 #include "sainfo.h"
     99 
    100 static void close_session __P((void));
    101 static void check_rtsock __P((void *));
    102 static void initfds __P((void));
    103 static void init_signal __P((void));
    104 static int set_signal __P((int sig, RETSIGTYPE (*func) __P((int))));
    105 static void check_sigreq __P((void));
    106 static void check_flushsa_stub __P((void *));
    107 static void check_flushsa __P((void));
    108 static int close_sockets __P((void));
    109 
    110 static fd_set mask0;
    111 static fd_set maskdying;
    112 static int nfds = 0;
    113 static volatile sig_atomic_t sigreq[NSIG + 1];
    114 static int dying = 0;
    115 
    116 int
    117 session(void)
    118 {
    119 	fd_set rfds;
    120 	struct timeval *timeout;
    121 	int error;
    122 	struct myaddrs *p;
    123 	char pid_file[MAXPATHLEN];
    124 	FILE *fp;
    125 	pid_t racoon_pid = 0;
    126 	int i;
    127 
    128 	/* initialize schedular */
    129 	sched_init();
    130 
    131 	init_signal();
    132 
    133 #ifdef ENABLE_ADMINPORT
    134 	if (admin_init() < 0)
    135 		exit(1);
    136 #endif
    137 
    138 	initmyaddr();
    139 
    140 	if (isakmp_init() < 0)
    141 		exit(1);
    142 
    143 	initfds();
    144 
    145 #ifdef ENABLE_NATT
    146 	natt_keepalive_init ();
    147 #endif
    148 
    149 	if (privsep_init() != 0)
    150 		exit(1);
    151 
    152 	for (i = 0; i <= NSIG; i++)
    153 		sigreq[i] = 0;
    154 
    155 	/* write .pid file */
    156 	racoon_pid = getpid();
    157 	if (lcconf->pathinfo[LC_PATHTYPE_PIDFILE] == NULL)
    158 		strlcpy(pid_file, _PATH_VARRUN "racoon.pid", MAXPATHLEN);
    159 	else if (lcconf->pathinfo[LC_PATHTYPE_PIDFILE][0] == '/')
    160 		strlcpy(pid_file, lcconf->pathinfo[LC_PATHTYPE_PIDFILE], MAXPATHLEN);
    161 	else {
    162 		strlcat(pid_file, _PATH_VARRUN, MAXPATHLEN);
    163 		strlcat(pid_file, lcconf->pathinfo[LC_PATHTYPE_PIDFILE], MAXPATHLEN);
    164 	}
    165 	fp = fopen(pid_file, "w");
    166 	if (fp) {
    167 		if (fchmod(fileno(fp),
    168 			S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
    169 			syslog(LOG_ERR, "%s", strerror(errno));
    170 			fclose(fp);
    171 			exit(1);
    172 		}
    173 		fprintf(fp, "%ld\n", (long)racoon_pid);
    174 		fclose(fp);
    175 	} else {
    176 		plog(LLV_ERROR, LOCATION, NULL,
    177 			"cannot open %s", pid_file);
    178 	}
    179 
    180 	while (1) {
    181 		if (dying)
    182 			rfds = maskdying;
    183 		else
    184 			rfds = mask0;
    185 
    186 		/*
    187 		 * asynchronous requests via signal.
    188 		 * make sure to reset sigreq to 0.
    189 		 */
    190 		check_sigreq();
    191 
    192 		/* scheduling */
    193 		timeout = schedular();
    194 
    195 		error = select(nfds, &rfds, (fd_set *)0, (fd_set *)0, timeout);
    196 		if (error < 0) {
    197 			switch (errno) {
    198 			case EINTR:
    199 				continue;
    200 			default:
    201 				plog(LLV_ERROR, LOCATION, NULL,
    202 					"failed to select (%s)\n",
    203 					strerror(errno));
    204 				return -1;
    205 			}
    206 			/*NOTREACHED*/
    207 		}
    208 
    209 #ifdef ENABLE_ADMINPORT
    210 		if ((lcconf->sock_admin != -1) &&
    211 		    (FD_ISSET(lcconf->sock_admin, &rfds)))
    212 			admin_handler();
    213 #endif
    214 
    215 		for (p = lcconf->myaddrs; p; p = p->next) {
    216 			if (!p->addr)
    217 				continue;
    218 			if (FD_ISSET(p->sock, &rfds))
    219 				isakmp_handler(p->sock);
    220 		}
    221 
    222 		if (FD_ISSET(lcconf->sock_pfkey, &rfds))
    223 			pfkey_handler();
    224 
    225 		if (lcconf->rtsock >= 0 && FD_ISSET(lcconf->rtsock, &rfds)) {
    226 			if (update_myaddrs() && lcconf->autograbaddr)
    227 				check_rtsock(NULL);
    228 			else
    229 				initfds();
    230 		}
    231 	}
    232 }
    233 
    234 /* clear all status and exit program. */
    235 static void
    236 close_session()
    237 {
    238 #ifdef ENABLE_FASTQUIT
    239 	flushph2();
    240 #endif
    241 	flushph1();
    242 	close_sockets();
    243 	backupsa_clean();
    244 
    245 	plog(LLV_INFO, LOCATION, NULL, "racoon shutdown\n");
    246 	exit(0);
    247 }
    248 
    249 static void
    250 check_rtsock(unused)
    251 	void *unused;
    252 {
    253 	isakmp_close();
    254 	grab_myaddrs();
    255 	autoconf_myaddrsport();
    256 	isakmp_open();
    257 
    258 	/* initialize socket list again */
    259 	initfds();
    260 }
    261 
    262 static void
    263 initfds()
    264 {
    265 	struct myaddrs *p;
    266 
    267 	nfds = 0;
    268 
    269 	FD_ZERO(&mask0);
    270 	FD_ZERO(&maskdying);
    271 
    272 #ifdef ENABLE_ADMINPORT
    273 	if (lcconf->sock_admin != -1) {
    274 		if (lcconf->sock_admin >= FD_SETSIZE) {
    275 			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
    276 			exit(1);
    277 		}
    278 		FD_SET(lcconf->sock_admin, &mask0);
    279 		/* XXX should we listen on admin socket when dying ?
    280 		 */
    281 #if 0
    282 		FD_SET(lcconf->sock_admin, &maskdying);
    283 #endif
    284 		nfds = (nfds > lcconf->sock_admin ? nfds : lcconf->sock_admin);
    285 	}
    286 #endif
    287 	if (lcconf->sock_pfkey >= FD_SETSIZE) {
    288 		plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
    289 		exit(1);
    290 	}
    291 	FD_SET(lcconf->sock_pfkey, &mask0);
    292 	FD_SET(lcconf->sock_pfkey, &maskdying);
    293 	nfds = (nfds > lcconf->sock_pfkey ? nfds : lcconf->sock_pfkey);
    294 	if (lcconf->rtsock >= 0) {
    295 		if (lcconf->rtsock >= FD_SETSIZE) {
    296 			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
    297 			exit(1);
    298 		}
    299 		FD_SET(lcconf->rtsock, &mask0);
    300 		nfds = (nfds > lcconf->rtsock ? nfds : lcconf->rtsock);
    301 	}
    302 
    303 	for (p = lcconf->myaddrs; p; p = p->next) {
    304 		if (!p->addr)
    305 			continue;
    306 		if (p->sock >= FD_SETSIZE) {
    307 			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
    308 			exit(1);
    309 		}
    310 		FD_SET(p->sock, &mask0);
    311 		nfds = (nfds > p->sock ? nfds : p->sock);
    312 	}
    313 	nfds++;
    314 }
    315 
    316 static int signals[] = {
    317 	SIGHUP,
    318 	SIGINT,
    319 	SIGTERM,
    320 	SIGUSR1,
    321 	SIGUSR2,
    322 	SIGCHLD,
    323 	0
    324 };
    325 
    326 /*
    327  * asynchronous requests will actually dispatched in the
    328  * main loop in session().
    329  */
    330 RETSIGTYPE
    331 signal_handler(sig)
    332 	int sig;
    333 {
    334 	/* Do not just set it to 1, because we may miss some signals by just setting
    335 	 * values to 0/1
    336 	 */
    337 	sigreq[sig]++;
    338 }
    339 
    340 
    341 /* XXX possible mem leaks and no way to go back for now !!!
    342  */
    343 static void reload_conf(){
    344 	int error;
    345 
    346 #ifdef ENABLE_HYBRID
    347 	if ((isakmp_cfg_init(ISAKMP_CFG_INIT_WARM)) != 0) {
    348 		plog(LLV_ERROR, LOCATION, NULL,
    349 		    "ISAKMP mode config structure reset failed, "
    350 		    "not reloading\n");
    351 		return;
    352 	}
    353 #endif
    354 
    355 	save_sainfotree();
    356 
    357 	/* TODO: save / restore / flush old lcconf (?) / rmtree
    358 	 */
    359 /*	initlcconf();*/ /* racoon_conf ? ! */
    360 
    361 	save_rmconf();
    362 	initrmconf();
    363 
    364 	/* Do a part of pfkey_init() ?
    365 	 * SPD reload ?
    366 	 */
    367 
    368 	save_params();
    369 	error = cfparse();
    370 	if (error != 0){
    371 		plog(LLV_ERROR, LOCATION, NULL, "config reload failed\n");
    372 		/* We are probably in an inconsistant state... */
    373 		return;
    374 	}
    375 	restore_params();
    376 
    377 #if 0
    378 	if (dump_config)
    379 		dumprmconf ();
    380 #endif
    381 
    382 	/*
    383 	 * init_myaddr() ?
    384 	 * If running in privilege separation, do not reinitialize
    385 	 * the IKE listener, as we will not have the right to
    386 	 * setsockopt(IP_IPSEC_POLICY).
    387 	 */
    388 	if (geteuid() == 0)
    389 		check_rtsock(NULL);
    390 
    391 	/* Revalidate ph1 / ph2tree !!!
    392 	 * update ctdtree if removing some ph1 !
    393 	 */
    394 	revalidate_ph12();
    395 	/* Update ctdtree ?
    396 	 */
    397 
    398 	save_sainfotree_flush();
    399 	save_rmconf_flush();
    400 }
    401 
    402 static void
    403 check_sigreq()
    404 {
    405 	int sig;
    406 
    407 	/*
    408 	 * XXX We are not able to tell if we got
    409 	 * several time the same signal. This is
    410 	 * not a problem for the current code,
    411 	 * but we shall remember this limitation.
    412 	 */
    413 	for (sig = 0; sig <= NSIG; sig++) {
    414 		if (sigreq[sig] == 0)
    415 			continue;
    416 
    417 		sigreq[sig]--;
    418 		switch(sig) {
    419 		case 0:
    420 			return;
    421 
    422 			/* Catch up childs, mainly scripts.
    423 			 */
    424 		case SIGCHLD:
    425 	    {
    426 			pid_t pid;
    427 			int s;
    428 
    429 			pid = wait(&s);
    430 	    }
    431 		break;
    432 
    433 #ifdef DEBUG_RECORD_MALLOCATION
    434 		/*
    435 		 * XXX This operation is signal handler unsafe and may lead to
    436 		 * crashes and security breaches: See Henning Brauer talk at
    437 		 * EuroBSDCon 2005. Do not run in production with this option
    438 		 * enabled.
    439 		 */
    440 		case SIGUSR2:
    441 			DRM_dump();
    442 			break;
    443 #endif
    444 
    445 		case SIGHUP:
    446 			/* Save old configuration, load new one...  */
    447 			reload_conf();
    448 			break;
    449 
    450 		case SIGINT:
    451 		case SIGTERM:
    452 			plog(LLV_INFO, LOCATION, NULL,
    453 			    "caught signal %d\n", sig);
    454 			EVT_PUSH(NULL, NULL, EVTT_RACOON_QUIT, NULL);
    455 			pfkey_send_flush(lcconf->sock_pfkey,
    456 			    SADB_SATYPE_UNSPEC);
    457 #ifdef ENABLE_FASTQUIT
    458 			close_session();
    459 #else
    460 			sched_new(1, check_flushsa_stub, NULL);
    461 #endif
    462 			dying = 1;
    463 			break;
    464 
    465 		default:
    466 			plog(LLV_INFO, LOCATION, NULL,
    467 			    "caught signal %d\n", sig);
    468 			break;
    469 		}
    470 	}
    471 }
    472 
    473 /*
    474  * waiting the termination of processing until sending DELETE message
    475  * for all inbound SA will complete.
    476  */
    477 static void
    478 check_flushsa_stub(p)
    479 	void *p;
    480 {
    481 
    482 	check_flushsa();
    483 }
    484 
    485 static void
    486 check_flushsa()
    487 {
    488 	vchar_t *buf;
    489 	struct sadb_msg *msg, *end, *next;
    490 	struct sadb_sa *sa;
    491 	caddr_t mhp[SADB_EXT_MAX + 1];
    492 	int n;
    493 
    494 	buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
    495 	if (buf == NULL) {
    496 		plog(LLV_DEBUG, LOCATION, NULL,
    497 		    "pfkey_dump_sadb: returned nothing.\n");
    498 		return;
    499 	}
    500 
    501 	msg = (struct sadb_msg *)buf->v;
    502 	end = (struct sadb_msg *)(buf->v + buf->l);
    503 
    504 	/* counting SA except of dead one. */
    505 	n = 0;
    506 	while (msg < end) {
    507 		if (PFKEY_UNUNIT64(msg->sadb_msg_len) < sizeof(*msg))
    508 			break;
    509 		next = (struct sadb_msg *)((caddr_t)msg + PFKEY_UNUNIT64(msg->sadb_msg_len));
    510 		if (msg->sadb_msg_type != SADB_DUMP) {
    511 			msg = next;
    512 			continue;
    513 		}
    514 
    515 		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
    516 			plog(LLV_ERROR, LOCATION, NULL,
    517 				"pfkey_check (%s)\n", ipsec_strerror());
    518 			msg = next;
    519 			continue;
    520 		}
    521 
    522 		sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
    523 		if (!sa) {
    524 			msg = next;
    525 			continue;
    526 		}
    527 
    528 		if (sa->sadb_sa_state != SADB_SASTATE_DEAD) {
    529 			n++;
    530 			msg = next;
    531 			continue;
    532 		}
    533 
    534 		msg = next;
    535 	}
    536 
    537 	if (buf != NULL)
    538 		vfree(buf);
    539 
    540 	if (n) {
    541 		sched_new(1, check_flushsa_stub, NULL);
    542 		return;
    543 	}
    544 
    545 	close_session();
    546 }
    547 
    548 static void
    549 init_signal()
    550 {
    551 	int i;
    552 
    553 	for (i = 0; signals[i] != 0; i++)
    554 		if (set_signal(signals[i], signal_handler) < 0) {
    555 			plog(LLV_ERROR, LOCATION, NULL,
    556 				"failed to set_signal (%s)\n",
    557 				strerror(errno));
    558 			exit(1);
    559 		}
    560 }
    561 
    562 static int
    563 set_signal(sig, func)
    564 	int sig;
    565 	RETSIGTYPE (*func) __P((int));
    566 {
    567 	struct sigaction sa;
    568 
    569 	memset((caddr_t)&sa, 0, sizeof(sa));
    570 	sa.sa_handler = func;
    571 	sa.sa_flags = SA_RESTART;
    572 
    573 	if (sigemptyset(&sa.sa_mask) < 0)
    574 		return -1;
    575 
    576 	if (sigaction(sig, &sa, (struct sigaction *)0) < 0)
    577 		return(-1);
    578 
    579 	return 0;
    580 }
    581 
    582 static int
    583 close_sockets()
    584 {
    585 	isakmp_close();
    586 	pfkey_close(lcconf->sock_pfkey);
    587 #ifdef ENABLE_ADMINPORT
    588 	(void)admin_close();
    589 #endif
    590 	return 0;
    591 }
    592 
    593