2 * Copyright (c) 2007 Bjoern A. Zeeb
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR, NCIRCLE NETWORK SECURITY,
18 * INC., OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
20 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
22 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 * Confirm that privilege is required to open a pfkey socket, and that this
31 * is not allowed in jail.
34 #include <sys/types.h>
35 #include <sys/socket.h>
36 #include <net/pfkeyv2.h>
37 #include <netinet/in.h>
38 #include <netipsec/ipsec.h>
47 static char policy_bypass
[] = "in bypass";
48 static char policy_entrust
[] = "in entrust";
49 static char *bypassbuf
= NULL
;
50 static char *entrustbuf
= NULL
;
55 priv_netinet_ipsec_policy_bypass_setup_af(int asroot
, int injail
,
56 struct test
*test
, int af
)
59 bypassbuf
= ipsec_set_policy(policy_bypass
, sizeof(policy_bypass
) - 1);
60 if (bypassbuf
== NULL
) {
61 warn("%s: ipsec_set_policy(NULL)", __func__
);
66 sd
= socket(AF_INET
, SOCK_DGRAM
, 0);
68 warn("%s: socket4", __func__
);
73 sd
= socket(AF_INET6
, SOCK_DGRAM
, 0);
75 warn("%s: socket6", __func__
);
80 warnx("%s: unexpected address family", __func__
);
87 priv_netinet_ipsec_policy4_bypass_setup(int asroot
, int injail
,
91 return (priv_netinet_ipsec_policy_bypass_setup_af(asroot
, injail
, test
,
96 priv_netinet_ipsec_policy6_bypass_setup(int asroot
, int injail
,
100 return (priv_netinet_ipsec_policy_bypass_setup_af(asroot
, injail
, test
,
107 priv_netinet_ipsec_policy_entrust_setup_af(int asroot
, int injail
,
108 struct test
*test
, int af
)
111 entrustbuf
= ipsec_set_policy(policy_entrust
, sizeof(policy_entrust
)-1);
112 if (entrustbuf
== NULL
) {
113 warn("%s: ipsec_set_policy(NULL)", __func__
);
118 sd
= socket(AF_INET
, SOCK_DGRAM
, 0);
120 warn("%s: socket4", __func__
);
125 sd
= socket(AF_INET6
, SOCK_DGRAM
, 0);
127 warn("%s: socket6", __func__
);
132 warnx("%s: unexpected address family", __func__
);
139 priv_netinet_ipsec_policy4_entrust_setup(int asroot
, int injail
,
143 return (priv_netinet_ipsec_policy_entrust_setup_af(asroot
, injail
, test
,
148 priv_netinet_ipsec_policy6_entrust_setup(int asroot
, int injail
,
152 return (priv_netinet_ipsec_policy_entrust_setup_af(asroot
, injail
, test
,
158 priv_netinet_ipsec_pfkey(int asroot
, int injail
, struct test
*test
)
162 fd
= socket(PF_KEY
, SOCK_RAW
, PF_KEY_V2
);
168 * The injail checks are not really priv checks but making sure
169 * sys/kern/uipc_socket.c:socreate cred checks are working correctly.
171 if (asroot
&& injail
)
172 expect("priv_netinet_ipsec_pfkey(asroot, injail)", error
,
173 -1, EPROTONOSUPPORT
);
174 if (asroot
&& !injail
)
175 expect("priv_netinet_ipsec_pfkey(asroot, !injail)", error
,
177 if (!asroot
&& injail
)
178 expect("priv_netinet_ipsec_pfkey(!asroot, injail)", error
,
179 -1, EPROTONOSUPPORT
);
180 if (!asroot
&& !injail
)
181 expect("priv_netinet_ipsec_pfkey(!asroot, !injail)", error
,
189 priv_netinet_ipsec_policy_bypass_af(int asroot
, int injail
, struct test
*test
,
192 int error
, level
, optname
;
197 optname
= IP_IPSEC_POLICY
;
200 level
= IPPROTO_IPV6
;
201 optname
= IPV6_IPSEC_POLICY
;
204 warnx("%s: unexpected address family", __func__
);
207 error
= setsockopt(sd
, level
, optname
,
208 bypassbuf
, ipsec_get_policylen(bypassbuf
));
209 if (asroot
&& injail
)
210 expect("priv_netinet_ipsec_policy_bypass(asroot, injail)",
211 error
, -1, EACCES
); /* see ipsec_set_policy */
212 if (asroot
&& !injail
)
213 expect("priv_netinet_ipsec_policy_bypass(asroot, !injail)",
215 if (!asroot
&& injail
)
216 expect("priv_netinet_ipsec_policy_bypass(!asroot, injail)",
217 error
, -1, EACCES
); /* see ipsec_set_policy */
218 if (!asroot
&& !injail
)
219 expect("priv_netinet_ipsec_policy_bypass(!asroot, !injail)",
220 error
, -1, EACCES
); /* see ipsec_set_policy */
224 priv_netinet_ipsec_policy4_bypass(int asroot
, int injail
, struct test
*test
)
227 priv_netinet_ipsec_policy_bypass_af(asroot
, injail
, test
, AF_INET
);
231 priv_netinet_ipsec_policy6_bypass(int asroot
, int injail
, struct test
*test
)
234 priv_netinet_ipsec_policy_bypass_af(asroot
, injail
, test
, AF_INET6
);
239 priv_netinet_ipsec_policy_entrust_af(int asroot
, int injail
, struct test
*test
,
242 int error
, level
, optname
;
247 optname
= IP_IPSEC_POLICY
;
250 level
= IPPROTO_IPV6
;
251 optname
= IPV6_IPSEC_POLICY
;
254 warnx("%s: unexpected address family", __func__
);
257 error
= setsockopt(sd
, level
, optname
,
258 entrustbuf
, ipsec_get_policylen(entrustbuf
));
259 if (asroot
&& injail
)
260 expect("priv_netinet_ipsec_policy_entrust(asroot, injail)",
261 error
, 0, 0); /* XXX ipsec_set_policy */
262 if (asroot
&& !injail
)
263 expect("priv_netinet_ipsec_policy_entrust(asroot, !injail)",
265 if (!asroot
&& injail
)
266 expect("priv_netinet_ipsec_policy_entrust(!asroot, injail)",
267 error
, 0, 0); /* XXX ipsec_set_policy */
268 if (!asroot
&& !injail
)
269 expect("priv_netinet_ipsec_policy_entrust(!asroot, !injail)",
270 error
, 0, 0); /* XXX ipsec_set_policy */
274 priv_netinet_ipsec_policy4_entrust(int asroot
, int injail
, struct test
*test
)
277 priv_netinet_ipsec_policy_entrust_af(asroot
, injail
, test
, AF_INET
);
281 priv_netinet_ipsec_policy6_entrust(int asroot
, int injail
, struct test
*test
)
284 priv_netinet_ipsec_policy_entrust_af(asroot
, injail
, test
, AF_INET6
);
289 priv_netinet_ipsec_policy_bypass_cleanup(int asroot
, int injail
,
293 if (bypassbuf
!= NULL
) {
304 priv_netinet_ipsec_policy_entrust_cleanup(int asroot
, int injail
,
308 if (entrustbuf
!= NULL
) {