1d06b4cefSMariusz Zaborski.\" Copyright (c) 2018 Mariusz Zaborski <oshogbo@FreeBSD.org> 2d06b4cefSMariusz Zaborski.\" All rights reserved. 3d06b4cefSMariusz Zaborski.\" 4d06b4cefSMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without 5d06b4cefSMariusz Zaborski.\" modification, are permitted provided that the following conditions 6d06b4cefSMariusz Zaborski.\" are met: 7d06b4cefSMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright 8d06b4cefSMariusz Zaborski.\" notice, this list of conditions and the following disclaimer. 9d06b4cefSMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright 10d06b4cefSMariusz Zaborski.\" notice, this list of conditions and the following disclaimer in the 11d06b4cefSMariusz Zaborski.\" documentation and/or other materials provided with the distribution. 12d06b4cefSMariusz Zaborski.\" 13d06b4cefSMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 14d06b4cefSMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15d06b4cefSMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16d06b4cefSMariusz Zaborski.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 17d06b4cefSMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18d06b4cefSMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19d06b4cefSMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20d06b4cefSMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21d06b4cefSMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22d06b4cefSMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23d06b4cefSMariusz Zaborski.\" SUCH DAMAGE. 24d06b4cefSMariusz Zaborski.\" 25d06b4cefSMariusz Zaborski.\" $FreeBSD$ 26d06b4cefSMariusz Zaborski.\" 27*133b8ab5SAlan Somers.Dd April 18, 2020 28d06b4cefSMariusz Zaborski.Dt CAP_DNS 3 29d06b4cefSMariusz Zaborski.Os 30d06b4cefSMariusz Zaborski.Sh NAME 31fe249490SMariusz Zaborski.Nm cap_getaddrinfo , 32fe249490SMariusz Zaborski.Nm cap_getnameinfo , 33d06b4cefSMariusz Zaborski.Nm cap_gethostbyname , 34d06b4cefSMariusz Zaborski.Nm cap_gethostbyname2 , 35d06b4cefSMariusz Zaborski.Nm cap_gethostbyaddr , 36d06b4cefSMariusz Zaborski.Nm cap_dns_type_limit , 37d06b4cefSMariusz Zaborski.Nm cap_dns_family_limit 38d06b4cefSMariusz Zaborski.Nd "library for getting network host entry in capability mode" 39d06b4cefSMariusz Zaborski.Sh LIBRARY 40d06b4cefSMariusz Zaborski.Lb libcap_dns 41d06b4cefSMariusz Zaborski.Sh SYNOPSIS 42d06b4cefSMariusz Zaborski.In sys/nv.h 43d06b4cefSMariusz Zaborski.In libcasper.h 44d06b4cefSMariusz Zaborski.In casper/cap_dns.h 45fe249490SMariusz Zaborski.Ft int 46fe249490SMariusz Zaborski.Fn cap_getaddrinfo "cap_channel_t *chan" "const char *hostname" "const char *servname" "const struct addrinfo *hints" "struct addrinfo **res" 47fe249490SMariusz Zaborski.Ft int 48fe249490SMariusz Zaborski.Fn cap_getnameinfo "cap_channel_t *chan" "const struct sockaddr *sa" "socklen_t salen" "char *host" "size_t hostlen" "char *serv" "size_t servlen" "int flags" 49d06b4cefSMariusz Zaborski.Ft "struct hostent *" 50d06b4cefSMariusz Zaborski.Fn cap_gethostbyname "const cap_channel_t *chan" "const char *name" 51d06b4cefSMariusz Zaborski.Ft "struct hostent *" 52d06b4cefSMariusz Zaborski.Fn cap_gethostbyname2 "const cap_channel_t *chan" "const char *name" "int af" 53d06b4cefSMariusz Zaborski.Ft "struct hostent *" 54d06b4cefSMariusz Zaborski.Fn cap_gethostbyaddr "const cap_channel_t *chan" "const void *addr" "socklen_t len" "int af" 55d06b4cefSMariusz Zaborski.Ft "int" 56d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit "cap_channel_t *chan" "const char * const *types" "size_t ntypes" 57d06b4cefSMariusz Zaborski.Ft "int" 58d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit "const cap_channel_t *chan" "const int *families" "size_t nfamilies" 59d06b4cefSMariusz Zaborski.Sh DESCRIPTION 60fe249490SMariusz Zaborski.Bf -symbolic 61fe249490SMariusz ZaborskiThe 62fe249490SMariusz Zaborski.Fn cap_getaddrinfo , 63fe249490SMariusz Zaborskiand 64fe249490SMariusz Zaborski.Fn cap_getnameinfo , 65fe249490SMariusz Zaborskifunctions are preferred over the 66fe249490SMariusz Zaborski.Fn cap_gethostbyname , 67fe249490SMariusz Zaborski.Fn cap_gethostbyname2 , 68fe249490SMariusz Zaborskiand 69fe249490SMariusz Zaborski.Fn cap_gethostbyaddr 70fe249490SMariusz Zaborskifunctions. 71fe249490SMariusz Zaborski.Ef 72fe249490SMariusz Zaborski.Pp 73d06b4cefSMariusz ZaborskiThe functions 74d06b4cefSMariusz Zaborski.Fn cap_gethostbyname , 75d06b4cefSMariusz Zaborski.Fn cap_gethostbyname2 , 76d06b4cefSMariusz Zaborski.Fn cep_gethostbyaddr 77d06b4cefSMariusz Zaborskiand 78280f3264SMariusz Zaborski.Fn cap_getnameinfo 79d06b4cefSMariusz Zaborskiare respectively equivalent to 80*133b8ab5SAlan Somers.Xr gethostbyname 3 , 81*133b8ab5SAlan Somers.Xr gethostbyname2 3 , 82*133b8ab5SAlan Somers.Xr gethostbyaddr 3 83d06b4cefSMariusz Zaborskiand 84*133b8ab5SAlan Somers.Xr getnameinfo 3 85d06b4cefSMariusz Zaborskiexcept that the connection to the 86d06b4cefSMariusz Zaborski.Nm system.dns 87d06b4cefSMariusz Zaborskiservice needs to be provided. 88d06b4cefSMariusz Zaborski.Pp 89d06b4cefSMariusz ZaborskiThe 90d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit 91d06b4cefSMariusz Zaborskifunction limits the functions allowed in the service. 92d06b4cefSMariusz ZaborskiThe 93d06b4cefSMariusz Zaborski.Fa types 94d06b4cefSMariusz Zaborskivariable can be set to 95752d135eSMariusz Zaborski.Dv ADDR2NAME 96d06b4cefSMariusz Zaborskior 97752d135eSMariusz Zaborski.Dv NAME2ADDR . 98d06b4cefSMariusz ZaborskiSee the 99d06b4cefSMariusz Zaborski.Sx LIMITS 100d06b4cefSMariusz Zaborskisection for more details. 101d06b4cefSMariusz ZaborskiThe 102d06b4cefSMariusz Zaborski.Fa ntpyes 103d06b4cefSMariusz Zaborskivariable contains the number of 104d06b4cefSMariusz Zaborski.Fa types 105d06b4cefSMariusz Zaborskiprovided. 106d06b4cefSMariusz Zaborski.Pp 107d06b4cefSMariusz ZaborskiThe 108d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit 109d06b4cefSMariusz Zaborskifunctions allows to limit address families. 110d06b4cefSMariusz ZaborskiFor details see 111d06b4cefSMariusz Zaborski.Sx LIMITS . 112d06b4cefSMariusz ZaborskiThe 113d06b4cefSMariusz Zaborski.Fa nfamilies 114d06b4cefSMariusz Zaborskivariable contains the number of 115d06b4cefSMariusz Zaborski.Fa families 116d06b4cefSMariusz Zaborskiprovided. 117d06b4cefSMariusz Zaborski.Sh LIMITS 118d06b4cefSMariusz ZaborskiThe preferred way of setting limits is to use the 119d06b4cefSMariusz Zaborski.Fn cap_dns_type_limit 120d06b4cefSMariusz Zaborskiand 121d06b4cefSMariusz Zaborski.Fn cap_dns_family_limit 122d06b4cefSMariusz Zaborskifunctions, but the limits of service can be set also using 123d06b4cefSMariusz Zaborski.Xr cap_limit_set 3 . 124a241c14fSMariusz ZaborskiThe 125a241c14fSMariusz Zaborski.Xr nvlist 9 126a241c14fSMariusz Zaborskifor that function can contain the following values and types: 127d06b4cefSMariusz Zaborski.Bl -ohang -offset indent 128d06b4cefSMariusz Zaborski.It type ( NV_TYPE_STRING ) 129d06b4cefSMariusz ZaborskiThe 130d06b4cefSMariusz Zaborski.Va type 131d06b4cefSMariusz Zaborskican have two values: 132752d135eSMariusz Zaborski.Dv ADDR2NAME 133d06b4cefSMariusz Zaborskior 134752d135eSMariusz Zaborski.Dv NAME2ADDR . 135d06b4cefSMariusz ZaborskiThe 136fd253945SMariusz Zaborski.Dv ADDR2NAME 137577dff6aSMariusz Zaborskimeans that reverse DNS lookups are allowed with 138577dff6aSMariusz Zaborski.Fn cap_getnameinfo 139d06b4cefSMariusz Zaborskiand 140d06b4cefSMariusz Zaborski.Fn cap_gethostbyaddr 141577dff6aSMariusz Zaborskifunctions. 142d06b4cefSMariusz ZaborskiIn case when 143d06b4cefSMariusz Zaborski.Va type 144d06b4cefSMariusz Zaborskiis set to 145fd253945SMariusz Zaborski.Dv NAME2ADDR 146577dff6aSMariusz Zaborskithe name resolution is allowed with 147577dff6aSMariusz Zaborski.Fn cap_getaddrinfo , 148577dff6aSMariusz Zaborski.Fn cap_gethostbyname , 149577dff6aSMariusz Zaborskiand 150577dff6aSMariusz Zaborski.Fn cap_gethostbyname2 151577dff6aSMariusz Zaborskifunctions. 152d06b4cefSMariusz Zaborski.It family ( NV_TYPE_NUMBER ) 153d06b4cefSMariusz ZaborskiThe 154d06b4cefSMariusz Zaborski.Va family 155d06b4cefSMariusz Zaborskilimits service to one of the address families (e.g. 156d06b4cefSMariusz Zaborski.Dv AF_INET , AF_INET6 , 157d06b4cefSMariusz Zaborskietc.). 158d06b4cefSMariusz Zaborski.Sh EXAMPLES 159d06b4cefSMariusz ZaborskiThe following example first opens a capability to casper and then uses this 160d06b4cefSMariusz Zaborskicapability to create the 161d06b4cefSMariusz Zaborski.Nm system.dns 162d06b4cefSMariusz Zaborskicasper service and uses it to resolve an IP address. 163d06b4cefSMariusz Zaborski.Bd -literal 164d06b4cefSMariusz Zaborskicap_channel_t *capcas, *capdns; 165db9a6e41SMariusz Zaborskiint familylimit, error; 166d06b4cefSMariusz Zaborskiconst char *ipstr = "127.0.0.1"; 167fd253945SMariusz Zaborskiconst char *typelimit = "ADDR2NAME"; 168db9a6e41SMariusz Zaborskichar hname[NI_MAXHOST]; 169db9a6e41SMariusz Zaborskistruct addrinfo hints, *res; 170d06b4cefSMariusz Zaborski 171d06b4cefSMariusz Zaborski/* Open capability to Casper. */ 172d06b4cefSMariusz Zaborskicapcas = cap_init(); 173d06b4cefSMariusz Zaborskiif (capcas == NULL) 174d06b4cefSMariusz Zaborski err(1, "Unable to contact Casper"); 175d06b4cefSMariusz Zaborski 176db9a6e41SMariusz Zaborski/* Cache NLA for gai_strerror. */ 177db9a6e41SMariusz Zaborskicaph_cache_catpages(); 178db9a6e41SMariusz Zaborski 179d06b4cefSMariusz Zaborski/* Enter capability mode sandbox. */ 180db9a6e41SMariusz Zaborskiif (caph_enter() < 0) 181d06b4cefSMariusz Zaborski err(1, "Unable to enter capability mode"); 182d06b4cefSMariusz Zaborski 183d06b4cefSMariusz Zaborski/* Use Casper capability to create capability to the system.dns service. */ 184d06b4cefSMariusz Zaborskicapdns = cap_service_open(capcas, "system.dns"); 185d06b4cefSMariusz Zaborskiif (capdns == NULL) 186d06b4cefSMariusz Zaborski err(1, "Unable to open system.dns service"); 187d06b4cefSMariusz Zaborski 188d06b4cefSMariusz Zaborski/* Close Casper capability, we don't need it anymore. */ 189d06b4cefSMariusz Zaborskicap_close(capcas); 190d06b4cefSMariusz Zaborski 191d06b4cefSMariusz Zaborski/* Limit system.dns to reserve IPv4 addresses */ 192d06b4cefSMariusz Zaborskifamilylimit = AF_INET; 193d06b4cefSMariusz Zaborskiif (cap_dns_family_limit(capdns, &familylimit, 1) < 0) 194d06b4cefSMariusz Zaborski err(1, "Unable to limit access to the system.dns service"); 195d06b4cefSMariusz Zaborski 196db9a6e41SMariusz Zaborski/* Convert IP address in C-string to struct sockaddr. */ 197db9a6e41SMariusz Zaborskimemset(&hints, 0, sizeof(hints)); 198db9a6e41SMariusz Zaborskihints.ai_family = familylimit; 199db9a6e41SMariusz Zaborskihints.ai_flags = AI_NUMERICHOST; 200db9a6e41SMariusz Zaborskierror = cap_getaddrinfo(capdns, ipstr, NULL, &hints, &res); 201db9a6e41SMariusz Zaborskiif (error != 0) 202db9a6e41SMariusz Zaborski errx(1, "cap_getaddrinfo(): %s: %s", ipstr, gai_strerror(error)); 203db9a6e41SMariusz Zaborski 204db9a6e41SMariusz Zaborski/* Limit system.dns to reverse DNS lookups. */ 205db9a6e41SMariusz Zaborskiif (cap_dns_type_limit(capdns, &typelimit, 1) < 0) 206db9a6e41SMariusz Zaborski err(1, "Unable to limit access to the system.dns service"); 207d06b4cefSMariusz Zaborski 208d06b4cefSMariusz Zaborski/* Find hostname for the given IP address. */ 209db9a6e41SMariusz Zaborskierror = cap_getnameinfo(capdns, res->ai_addr, res->ai_addrlen, hname, sizeof(hname), 210db9a6e41SMariusz Zaborski NULL, 0, 0); 211db9a6e41SMariusz Zaborskiif (error != 0) 212db9a6e41SMariusz Zaborski errx(1, "cap_getnameinfo(): %s: %s", ipstr, gai_strerror(error)); 213d06b4cefSMariusz Zaborski 214db9a6e41SMariusz Zaborskiprintf("Name associated with %s is %s.\\n", ipstr, hname); 215d06b4cefSMariusz Zaborski.Ed 216d06b4cefSMariusz Zaborski.Sh SEE ALSO 217d06b4cefSMariusz Zaborski.Xr cap_enter 2 , 218db9a6e41SMariusz Zaborski.Xr caph_enter 3 , 219d06b4cefSMariusz Zaborski.Xr err 3 , 220d06b4cefSMariusz Zaborski.Xr gethostbyaddr 3 , 221d06b4cefSMariusz Zaborski.Xr gethostbyname 3 , 222d06b4cefSMariusz Zaborski.Xr gethostbyname2 3 , 223d06b4cefSMariusz Zaborski.Xr getnameinfo 3 , 22485ebe1f1SMariusz Zaborski.Xr capsicum 4 , 22585ebe1f1SMariusz Zaborski.Xr nv 9 226d06b4cefSMariusz Zaborski.Sh AUTHORS 227d06b4cefSMariusz ZaborskiThe 228d06b4cefSMariusz Zaborski.Nm cap_dns 229d06b4cefSMariusz Zaborskiservice was implemented by 230d06b4cefSMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net 231d06b4cefSMariusz Zaborskiunder sponsorship from the FreeBSD Foundation. 232d06b4cefSMariusz Zaborski.Pp 233d06b4cefSMariusz ZaborskiThis manual page was written by 234d06b4cefSMariusz Zaborski.An Mariusz Zaborski Aq Mt oshogbo@FreeBSD.org . 235