chiark / gitweb /
noip.c: Shut up some GCC warnings.
[preload-hacks] / noip.1
CommitLineData
e4976bb0 1.de VS
2.sp 1
3.RS
4.nf
5.ft B
6..
7.de VE
8.ft R
9.fi
10.RE
11.sp 1
12..
13.TH noip 1 "5 May 2005" "Straylight/Edgeware" "Preload hacks"
14.SH NAME
15noip \- run programs without the ability to use IP sockets
16.SH SYNOPSIS
17.B noip
18.RI [ command
19.RI [ args ...]]
20.SH DESCRIPTION
21The
22.B noip
23program runs
24.I command
25(by default, the user's shell, as determined by the
26.B SHELL
27environment variable) in an environment where attempts to use TCP/IP
28networking are (mostly) transparently translated into the use of
29Unix-domain sockets in a private directory.
30.PP
31There are many programs which use TCP/IP for their own internal
32communications needs, largely unnecessarily. This can present security
33problems: even if a program binds its listening sockets to
34.BR localhost ,
35other users on the same system can still connect, and many such programs
36don't seem to have authentication systems.
37.PP
38.B noip
39addresses this problem by intercepting a program's networking calls and
40making it use Unix-domain sockets in a private directory instead of
41TCP/IP. Now its communications are truly private to the running user.
42.SS The socket directory
43The
44.B noip
45program keeps its sockets in a directory whose name can be configured,
46but by default is
47.BI noip- \c
48.IR username ,
49where
50.I username
51is determined by the
52.B USER
53or
54.B LOGNAME
55environment variables, or is
56.BI uid- \c
57.IR realuid
58in the temporary directory, which in turn is determined by the
59.B TMPDIR
60or
61.B TMP
62environment variables, or is
63.BR /tmp .
64The sockets in this directory are simply named
65.IB dottedquad : port
66after the Internet sockets they represent.
67.PP
68If the socket directory does not exist when a program running under
69.B noip
70starts up, it is created and made readable and writable only by the
71current user. Also, it is scanned and any apparently stale sockets are
72removed.
73.SS Configuration
74The operation of
75.B noip
76is controlled by a configuration file. By default,
77.B noip
78reads configuration from
79.B .noip
80in the calling user's home directory, as determined by the
81.B HOME
5b49f527 82environment, or, failing that, looking up the effective user id in the
83password database. However, if the environment variable
a6d9626b 84.B NOIP_CONFIG
85is set, then the file it names is read instead (assuming it exists; if
86it doesn't, no configuration is read).
e4976bb0 87.PP
88The configuration file has a simple line-based format. A line is
89ignored if it consists only of whitespace, or if its first whitespace
90character is
91.RB ` # '.
92Otherwise, the first whitespace-delimited word is a keyword and the
93remainder of the line is a value. The following keywords are
94recognized.
95.TP
96.BR "debug " [\fInumber\fR]
97If
98.I number
99is nonzero, turn debugging on; if it is zero, turn debugging off. The
100default, if no
101.I number
102is given, is to turn debugging on. Debugging is written to standard
103error. Some debugging is produced before the configuration file is
104read; the environment variable
105.B NOIP_DEBUG
106can be used to control this.
107.TP
108.BI "socketdir " directory
109Store the Unix-domain sockets in
110.IR directory
a6d9626b 111rather than the default. The environment variable
112.B NOIP_SOCKETDIR
113can also be used to control which directory is used for sockets.
e4976bb0 114.TP
f6049fdd 115.BI "autoports " min "\-" max
116Select which ports are used for implicit binding. Allocating ports can
117be a bit slow, since checking whether a Unix domain socket is in use is
118difficult. A wide range makes things easier, because
119.B noip
120starts by trying ports at random from the given range. The environment
121variable
122.B NOIP_AUTOPORTS
123can also be used to control which ports are assigned automatically.
124.TP
e4976bb0 125.BI "realbind " acl-entry
126Add an entry to the
127.B realbind
128access control list (ACL). When a program attempts to
129.BR bind (2)
130a socket to an address, the
131.B realbind
132ACL is consulted. If the address is matched, then the program is
133allowed to bind a real Internet socket to that address; otherwise, the
a6d9626b 134socket is bound to a Unix-domain socket. Three environment variables
135are consulted too:
136.BR NOIP_REALBIND_BEFORE ,
137.BR NOIP_REALBIND ,
138and
139.BR NOIP_REALBIND_AFTER .
140The
141.B _BEFORE
142rules are inserted at the front of the list; the
143.B _AFTER
144rules are appended on the end. Currently, the rules in
145.B NOIP_REALBIND
146are also put at the end (before the
147.B _AFTER
148rules), though this may change later.
e4976bb0 149.TP
a6d9626b 150.BI "realconnect " acl-entry
e4976bb0 151Add an entry to the
152.B realconnect
153access control list (ACL). When a program attempts to
154.BR connect (2)
155a socket to an address, or to contact another socket using
156.BR sendto (2)
157or
158.BR sendmsg (2),
159the
160.B realconnect
161ACL is consulted. If the destination address is matched, then the
162program is allowed to contact the real Internet socket; otherwise, the
a6d9626b 163attempt is made to contact a Unix-domain socket. Three environment variables
164are consulted too:
165.BR NOIP_REALCONNET_BEFORE ,
166.BR NOIP_REALCONNECT ,
167and
168.BR NOIP_REALCONNECT_AFTER .
169The
170.B _BEFORE
171rules are inserted at the front of the list; the
172.B _AFTER
173rules are appended on the end. Currently, the rules in
174.B NOIP_REALCONNECT
175are also put at the end (before the
176.B _AFTER
177rules), though this may change later.
e4976bb0 178.PP
179(Aside: An attempt to connect to a remote host may not be a hopeless failure,
180even if a real IP socket is denied:
181.B noip
182deliberately makes no attempt to check that addresses being bound to
183sockets correspond to locally available addresses; and besides, sockets
184can be introduced into the directory by other programs simulating remote
185servers.)
186.PP
187An
188.I acl-entry
a6d9626b 189is a comma-separated list of entries of the form:
e4976bb0 190.IP
191.BR + | \-
192.IR address \c
193.RB [ \- \c
194.IR address | \c
195.BR / \c
196.IR mask ]| \c
197.BR local | any
198.RB [ : \c
199.IR port [ \c
200.BI \- \c
201.IR port ]]
202.PP
203(The spaces in the above are optional.)
204.PP
205The leading sign says whether
206matching addresses should be
207.I accepted
208.RB (` + ')
209or
210.I denied
211.RB (` \- ').
212.PP
213The IP-address portion may be any of the following
214.TP
215.B any
216Matches all addresses.
217.TP
218.B local
219Matches the address of one of the machine's network interfaces.
220.TP
221.I address
222Matches just the given address
223.TP
224.IB address \- address
225Matches any address which falls in the given range. Addresses are
226compared lexicographically, with octets to the left given precedence
227over octets to the right.
228.TP
229.IB address / mask
230Matches an address in the given network. The
231.I mask
232may be a netmask in dotted-quad form, or a one-bit-count.
233.PP
234The port portion may be omitted (which means `match any port'), or may
235be a single
236.I port
237or a range
238.IB port \- port
239to match.
240.PP
241Range comparisons are always inclusive of both endpoints.
242.PP
243ACL entries are processed in the order they appear in the configuration
244file. The default action of an ACL, used if none of its entries match,
245is the opposite of the last actual entry in the list: if the last entry
246says `accept', then the default is to deny, and vice-versa. If the ACL
247is empty, the default is to deny all addresses.
248.PP
249For example, it may be useful to allow access at least to a DNS server.
250This can be accomplished by adding a line
251.VS
a8be0591 252realconnect +1.2.3.4:53
e4976bb0 253.VE
254to the configuration file, where 1.2.3.4 is the IP address of one of
255your DNS server.
256.SS Example applications
257SLIME is an Emacs extension for doing interactive programming with Lisp
258systems. It communicates with the Lisp system using TCP sockets, since
259Unix-domain sockets are unavailable on Windows, and besides, they are
260less well supported by Lisp implementations. Unfortunately, when the
261author wrote this program, SLIME applied no authentication on its TCP
262port, allowing any local user to take over the running Lisp. Worse,
263some Lisps are unable to bind a listening socket to a particular
264address, leaving the socket potentially available to anyone on the
265network. By running Emacs under
266.BR noip ,
267the security hole is closed completely and no messing with
268authentication secrets is needed.
269.PP
270SSH is an excellent tool for secure communications over hostile
271networks. In particular, its ability to forward TCP connections to a
272port on one side of an SSH tunnel to the other side is very useful.
273However, such a forwarded port is available to all users on the source
274side of the tunnel. Using
275.B noip
276and a suitable configuration, a user can restrict access to a forwarded
277port to himself or a small group.
278.SH BUGS
279.B noip
280is implemented as an
281.B LD_PRELOAD
282hack. It won't work on setuid programs. Also, perhaps more
a8be0591 283importantly, it can't do anything to prevent a
e4976bb0 284.I malicious
a8be0591 285program's use of networking: a program could theoretically issue sockets
e4976bb0 286system calls directly instead of using the C library calls that
287.B noip
288intercepts. It is intended only as a tool for enhancing the security of
289software written by well-meaning programmers who don't understand the
290security aspects of writing networking code.
291.PP
292It's very hard to tell exactly what state a Unix-domain socket is in.
293If the filesystem object isn't there, it's not active, but if it
294.I is
295then the socket might be in use or it might be stale.
296.B noip
297consults
298.B /proc/net/unix
299to decide whether a socket is in use, but this can fail in two ways.
300Firstly, if the socket is created and renamed, the kernel doesn't
301notice, and
302.B noip
303will think that the new name is stale. Secondly, if the socket is
304created, used, unlinked while it's still in use, and recreated, then
305.B noip
306will think that it's in use when in fact it's gone stale. Don't mess
307with
308.BR noip 's
309sockets unless you know what you're doing.
310.PP
311The procedure to replace a Unix-domain socket by an Internet one is
312fairly thorough, but there are some missing cases. In particular, if
313the socket being bound or connected is a duplicate (using
314.BR dup (2))
315then only one of the copies will be fixed. Similarly, copies owned by
316child processes will be unaffected.
317.PP
318This manual is surprisingly long and complicated for such a simple hack.
319.SH AUTHOR
a8be0591 320Mark Wooding, <mdw@distorted.org.uk>