Module Name: src Committed By: elad Date: Fri Oct 2 23:50:16 UTC 2009
Modified Files: src/sys/kern: uipc_socket.c src/sys/secmodel/suser: secmodel_suser.c Log Message: Move some of the socket policy back to the subsystem. Remove include we don't need in the secmodel code. To generate a diff of this commit: cvs rdiff -u -r1.190 -r1.191 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.12 -r1.13 src/sys/secmodel/suser/secmodel_suser.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.190 src/sys/kern/uipc_socket.c:1.191 --- src/sys/kern/uipc_socket.c:1.190 Fri Sep 11 22:06:29 2009 +++ src/sys/kern/uipc_socket.c Fri Oct 2 23:50:16 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.190 2009/09/11 22:06:29 dyoung Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.191 2009/10/02 23:50:16 elad Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.190 2009/09/11 22:06:29 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.191 2009/10/02 23:50:16 elad Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -151,6 +151,8 @@ static int socurkva; static kcondvar_t socurkva_cv; +static kauth_listener_t socket_listener; + #define SOCK_LOAN_CHUNK 65536 static size_t sodopendfree(void); @@ -428,6 +430,53 @@ return m; } +static int +socket_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie, + void *arg0, void *arg1, void *arg2, void *arg3) +{ + int result; + enum kauth_network_req req; + + result = KAUTH_RESULT_DEFER; + req = (enum kauth_network_req)arg0; + + if (action != KAUTH_NETWORK_SOCKET) + return result; + + switch (req) { + case KAUTH_REQ_NETWORK_SOCKET_DROP: { + /* Normal users can only drop their own connections. */ + struct socket *so = (struct socket *)arg1; + uid_t sockuid = so->so_uidinfo->ui_uid; + + if (sockuid == kauth_cred_getuid(cred) || + sockuid == kauth_cred_geteuid(cred)) + result = KAUTH_RESULT_ALLOW; + + break; + } + + case KAUTH_REQ_NETWORK_SOCKET_OPEN: + /* We allow "raw" routing/bluetooth sockets to anyone. */ + if ((u_long)arg1 == PF_ROUTE || (u_long)arg1 == PF_BLUETOOTH) + result = KAUTH_RESULT_ALLOW; + else { + /* Privileged, let secmodel handle this. */ + if ((u_long)arg2 == SOCK_RAW) + break; + } + + result = KAUTH_RESULT_ALLOW; + + break; + + default: + break; + } + + return result; +} + void soinit(void) { @@ -445,6 +494,9 @@ callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback, &sokva_reclaimerentry, NULL, sokva_reclaim_callback); + + socket_listener = kauth_listen_scope(KAUTH_SCOPE_NETWORK, + socket_listener_cb, NULL); } /* @@ -499,6 +551,7 @@ so->so_snd.sb_mowner = &prp->pr_domain->dom_mowner; so->so_mowner = &prp->pr_domain->dom_mowner; #endif + /* so->so_cred = kauth_cred_dup(l->l_cred); */ uid = kauth_cred_geteuid(l->l_cred); so->so_uidinfo = uid_find(uid); so->so_egid = kauth_cred_getegid(l->l_cred); @@ -641,6 +694,7 @@ /* Remove acccept filter if one is present. */ if (so->so_accf != NULL) (void)accept_filt_clear(so); + /* kauth_cred_free(so->so_cred); */ sounlock(so); if (refs == 0) /* XXX */ soput(so); Index: src/sys/secmodel/suser/secmodel_suser.c diff -u src/sys/secmodel/suser/secmodel_suser.c:1.12 src/sys/secmodel/suser/secmodel_suser.c:1.13 --- src/sys/secmodel/suser/secmodel_suser.c:1.12 Fri Oct 2 23:24:15 2009 +++ src/sys/secmodel/suser/secmodel_suser.c Fri Oct 2 23:50:16 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: secmodel_suser.c,v 1.12 2009/10/02 23:24:15 elad Exp $ */ +/* $NetBSD: secmodel_suser.c,v 1.13 2009/10/02 23:50:16 elad Exp $ */ /*- * Copyright (c) 2006 Elad Efrat <e...@netbsd.org> * All rights reserved. @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.12 2009/10/02 23:24:15 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.13 2009/10/02 23:50:16 elad Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -49,7 +49,6 @@ #include <sys/socketvar.h> #include <sys/sysctl.h> #include <sys/tty.h> -#include <net/route.h> #include <sys/vnode.h> #include <sys/proc.h> #include <sys/uidinfo.h> @@ -864,55 +863,29 @@ case KAUTH_NETWORK_SOCKET: switch (req) { case KAUTH_REQ_NETWORK_SOCKET_DROP: - /* - * The superuser can drop any connection. Normal users - * can only drop their own connections. - */ - if (isroot) - result = KAUTH_RESULT_ALLOW; - else { - struct socket *so = (struct socket *)arg1; - uid_t sockuid = so->so_uidinfo->ui_uid; - - if (sockuid == kauth_cred_getuid(cred) || - sockuid == kauth_cred_geteuid(cred)) - result = KAUTH_RESULT_ALLOW; - } - - - break; - case KAUTH_REQ_NETWORK_SOCKET_OPEN: - if ((u_long)arg1 == PF_ROUTE || (u_long)arg1 == PF_BLUETOOTH) - result = KAUTH_RESULT_ALLOW; - else if ((u_long)arg2 == SOCK_RAW) { - if (isroot) - result = KAUTH_RESULT_ALLOW; - } else - result = KAUTH_RESULT_ALLOW; - break; - case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK: + case KAUTH_REQ_NETWORK_SOCKET_SETPRIV: if (isroot) result = KAUTH_RESULT_ALLOW; break; case KAUTH_REQ_NETWORK_SOCKET_CANSEE: + if (isroot) { + result = KAUTH_RESULT_ALLOW; + break; + } + if (secmodel_bsd44_curtain) { uid_t so_uid; so_uid = ((struct socket *)arg1)->so_uidinfo->ui_uid; - if (isroot || - kauth_cred_geteuid(cred) == so_uid) + if (kauth_cred_geteuid(cred) == so_uid) result = KAUTH_RESULT_ALLOW; } else result = KAUTH_RESULT_ALLOW; - break; - case KAUTH_REQ_NETWORK_SOCKET_SETPRIV: - if (isroot) - result = KAUTH_RESULT_ALLOW; break; default: