home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume36 / log_tcp / part01 next >
Text File  |  1993-03-07  |  59KB  |  1,495 lines

  1. Newsgroups: comp.sources.misc
  2. From: wietse@wzv.win.tue.nl (Wietse Venema)
  3. Subject: v36i004:  log_tcp - TCP/IP daemon wrapper, v5.0, Part01/03
  4. Message-ID: <csm-v36i004=log_tcp.221238@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 19f2404d94df58075d924c1f0d5662ae
  6. Date: Mon, 8 Mar 1993 04:13:30 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: wietse@wzv.win.tue.nl (Wietse Venema)
  10. Posting-number: Volume 36, Issue 4
  11. Archive-name: log_tcp/part01
  12. Environment: UNIX
  13. Supersedes: log_tcp: Volume 30, Issue 79-80
  14.  
  15. With the programs that come with this kit you can monitor incoming
  16. requests for IP services such as TFTP, EXEC, FTP, RSH, TELNET, RLOGIN,
  17. FINGER, SYSTAT, and many others.
  18.  
  19. Optional features are: access control based on pattern matching; remote
  20. username lookup using the RFC 931 protocol; protection against attacks
  21. from hosts that pretend to have someone elses name; protection against
  22. attacks from hosts that pretend to have someone elses network address.
  23.  
  24. The programs can be installed without requiring any changes to existing
  25. software or configuration files. By default, they just log the remote
  26. host name and do some sanity checks on the origin the request. No
  27. information is exchanged with the remote client process.
  28.  
  29. The most notable differences with respect to the previous release are:
  30.  
  31.     - Additional protection against attacks from hosts that pretend to
  32.     have someone elses network address. For example, the address of a
  33.     trusted host within your own network.
  34.  
  35.     - The access control language has been extended with a simple but
  36.     powerful operator that greatly simplifies the design of rule sets
  37.     (ALL: .foo.edu EXCEPT dialup.foo.edu). Blank lines are permitted,
  38.     and long lines can be continued with backslash-newline.
  39.  
  40.     - All configurable stuff, including path names, has been moved into
  41.     the Makefile so that you no longer have to hack source code to just
  42.     configure the programs.
  43.  
  44.     - Ported to Solaris 2. TLI-based applications not yet supported.
  45.     Several workarounds for System V bugs.
  46.  
  47.     - A small loophole in the netgroup lookup code was closed, and the
  48.     remote username lookup code was made more portable.
  49.  
  50.     - Still more documentation. The README file now provides tutorial
  51.     sections with introductions to client, server, inetd and syslogd.
  52.  
  53. With the exception of source routed connections, the default mode of
  54. operation should be backwards compatible with earlier versions.
  55.  
  56.     Wietse Venema (wietse@wzv.win.tue.nl),
  57.     Department of Mathematics and Computing Science,
  58.     Eindhoven University of Technology,
  59.     The Netherlands.
  60.  
  61. #! /bin/sh
  62. # This is a shell archive.  Remove anything before this line, then unpack
  63. # it by saving it into a file and typing "sh file".  To overwrite existing
  64. # files, type "sh file -c".  You can also feed this as standard input via
  65. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  66. # will see the following message at the end:
  67. #        "End of archive 1 (of 3)."
  68. # Contents:  BLURB README clean_exit.c fix_options.c hosts_access.3
  69. #   hosts_ctl.c hosts_info.c inet_addr_fix log_tcp.h miscd.c
  70. #   patchlevel.h refuse.c setenv.c
  71. # Wrapped by wietse@wzv on Sun Mar  7 22:58:26 1993
  72. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  73. if test -f BLURB -a "${1}" != "-c" ; then 
  74.   echo shar: Will not over-write existing file \"BLURB\"
  75. else
  76. echo shar: Extracting \"BLURB\" \(2119 characters\)
  77. sed "s/^X//" >BLURB <<'END_OF_BLURB'
  78. X@(#) BLURB 1.7 93/03/07 22:47:49
  79. X
  80. XWith the programs that come with this kit you can monitor incoming
  81. Xrequests for IP services such as TFTP, EXEC, FTP, RSH, TELNET, RLOGIN,
  82. XFINGER, SYSTAT, and many others.
  83. X
  84. XOptional features are: access control based on pattern matching; remote
  85. Xusername lookup using the RFC 931 protocol; protection against attacks
  86. Xfrom hosts that pretend to have someone elses name; protection against
  87. Xattacks from hosts that pretend to have someone elses network address.
  88. X
  89. XThe programs can be installed without requiring any changes to existing
  90. Xsoftware or configuration files. By default, they just log the remote
  91. Xhost name and do some sanity checks on the origin the request. No
  92. Xinformation is exchanged with the remote client process.
  93. X
  94. XThe most notable differences with respect to the previous release are:
  95. X
  96. X    - Additional protection against attacks from hosts that pretend to
  97. X    have someone elses network address. For example, the address of a
  98. X    trusted host within your own network.
  99. X
  100. X    - The access control language has been extended with a simple but
  101. X    powerful operator that greatly simplifies the design of rule sets
  102. X    (ALL: .foo.edu EXCEPT dialup.foo.edu). Blank lines are permitted,
  103. X    and long lines can be continued with backslash-newline.
  104. X
  105. X    - All configurable stuff, including path names, has been moved into
  106. X    the Makefile so that you no longer have to hack source code to just
  107. X    configure the programs.
  108. X
  109. X    - Ported to Solaris 2. TLI-based applications not yet supported.
  110. X    Several workarounds for System V bugs.
  111. X
  112. X    - A small loophole in the netgroup lookup code was closed, and the
  113. X    remote username lookup code was made more portable.
  114. X
  115. X    - Still more documentation. The README file now provides tutorial
  116. X    sections with introductions to client, server, inetd and syslogd.
  117. X
  118. XWith the exception of source routed connections, the default mode of
  119. Xoperation should be backwards compatible with earlier versions.
  120. X
  121. X    Wietse Venema (wietse@wzv.win.tue.nl),
  122. X    Department of Mathematics and Computing Science,
  123. X    Eindhoven University of Technology,
  124. X    The Netherlands.
  125. END_OF_BLURB
  126. if test 2119 -ne `wc -c <BLURB`; then
  127.     echo shar: \"BLURB\" unpacked with wrong size!
  128. fi
  129. # end of overwriting check
  130. fi
  131. if test -f README -a "${1}" != "-c" ; then 
  132.   echo shar: Will not over-write existing file \"README\"
  133. else
  134. echo shar: Extracting \"README\" \(34604 characters\)
  135. sed "s/^X//" >README <<'END_OF_README'
  136. X@(#) README 1.9 93/03/07 22:47:24
  137. X
  138. X
  139. XTable of contents
  140. X-----------------
  141. X
  142. X    1 - Introduction
  143. X    2 - Disclaimer
  144. X    3 - Tutorials
  145. X        3.1 - How it works
  146. X        3.2 - Where the logging information goes
  147. X    4 - Features
  148. X        4.1 - Access control
  149. X        4.2 - Host name spoofing
  150. X        4.3 - Host address spoofing
  151. X        4.4 - Remote username lookups
  152. X        4.5 - Language extension hooks
  153. X    5 - Other works
  154. X        5.1 - Related documents
  155. X        5.2 - Related software
  156. X    6 - Limitations
  157. X        6.1 - Known wrapper limitations
  158. X        6.2 - Known system software bugs
  159. X    7 - Configuration and installation
  160. X        7.1 - Easy configuration and installation
  161. X        7.2 - Advanced configuration and installation
  162. X        7.3 - Daemons with arbitrary path names
  163. X        7.4 - Building and testing the access control rules
  164. X        7.5 - Other applications
  165. X    8 - Acknowledgements
  166. X
  167. X1 - Introduction
  168. X----------------
  169. X
  170. XWith this package you can monitor incoming connections to the SYSTAT,
  171. XFINGER, FTP, TELNET, RLOGIN, RSH, EXEC, TFTP, TALK, and other network
  172. Xservices.  
  173. X
  174. XThe package provides tiny daemon wrapper programs that can be installed
  175. Xwithout any changes to existing software or to existing configuration
  176. Xfiles.  The wrappers report the name of the remote host and of the
  177. Xrequested service; the wrappers do not exchange information with the
  178. Xremote client process, and impose no overhead on the actual
  179. Xcommunication between the client and server applications.
  180. X
  181. XOptional features are: access control to restrict what systems can
  182. Xconnect to your network daemons; remote user name lookups with the RFC
  183. X931 protocol; additional protection against hosts that pretend to have
  184. Xsomeone elses host name; additional protection against hosts that
  185. Xpretend to have someone elses host address.
  186. X
  187. XEarly versions of the programs were tested with Ultrix >= 2.2, with
  188. XSunOS >= 3.4 and ISC 2.2. Later versions have been installed on a wide
  189. Xvariety of platforms such as SunOS 4.x and 5.x, Ultrix 3.x and 4.x, DEC
  190. XOSF/1 T1.2-2, HP-UX 8.x, AIX 3.1.5, Apollo SR10.3.5, Sony, NeXT, SCO
  191. XUNIX, DG/UX, Cray, and an unknown number of other ones.  
  192. X
  193. XRequirements are that the network daemons are spawned by a super server
  194. Xsuch as the inetd; a 4.3BSD-style socket programming interface; and the
  195. Xavailability of a syslog(3) library and of a syslogd(8) daemon.  The
  196. Xwrappers should run without modification on any system that satisfies
  197. Xthese requirements.  Workarounds have been implemented for several
  198. Xcommon bugs in systems software.
  199. X
  200. XWhat to do if this is your first encounter with the wrapper programs:
  201. X1) read the tutorial sections for an introduction to the relevant
  202. Xconcepts and terminology; 2) glance over the security feature sections
  203. Xin this document; 3) follow the installation instructions (easy or
  204. Xadvanced). I recommend that you first use the default security feature
  205. Xsettings.  Run the wrappers for a few days to become familiar with
  206. Xtheir logs, before doing anything drastic such as cutting off access or
  207. Xinstalling booby traps.
  208. X
  209. X2 - Disclaimer
  210. X--------------
  211. X
  212. XThe wrapper programs rely on source address information obtained from
  213. Xnetwork packets. Such information is not 100 percent reliable, although
  214. Xthe wrappers do their best to expose forgeries.
  215. X
  216. XIn the absence of cryptographic protection of message contents, and of
  217. Xcryptographic authentication of message originators, all data from the
  218. Xnetwork should be treated with sound scepticism.
  219. X
  220. XTHIS RESTRICTION IS BY NO MEANS SPECIFIC TO THE TCP/IP PROTOCOLS.
  221. X
  222. X3 - Tutorials
  223. X-------------
  224. X
  225. XThe tutorial sections give a gentle introduction to the operation of
  226. Xthe wrapper programs, and introduce some of the terminology that is
  227. Xused in the remainder of the document: client, server, the inetd and
  228. Xsyslogd daemons, and their configuration files.
  229. X
  230. X3.1 - How it works
  231. X------------------
  232. X
  233. XAlmost every application of the TCP/IP protocols is based on a client-
  234. Xserver model. For example, when a user invokes the telnet command to
  235. Xconnect to one of your systems, a telnet server process is executed on
  236. Xthe target host. The telnet server process connects the user to a login
  237. Xprocess. A few examples of client and server programs are shown in the
  238. Xtable below:
  239. X
  240. X              client   server    application
  241. X              --------------------------------
  242. X              telnet   telnetd   remote login
  243. X              ftp      ftpd      file transfer
  244. X              finger   fingerd   show users
  245. X
  246. XThe usual approach is to run one single daemon process that waits for
  247. Xall kinds of incoming network connections. Whenever a connection is
  248. Xestablished, this daemon (usually called inetd) runs the appropriate
  249. Xserver program and goes back to sleep, waiting for other connections.
  250. X
  251. XThe wrapper programs rely on a simple, but powerful mechanism.  Instead
  252. Xof directly running the desired server program, the inetd is tricked
  253. Xinto running a small wrapper program. The wrapper logs the remote host
  254. Xname or address and performs some additional checks.  When all is well,
  255. Xthe wrapper executes the desired server program and goes away.
  256. X
  257. XThe wrapper programs have no interaction with the remote user (or
  258. Xclient process).  This has two major advantages: 1) the wrappers are
  259. Xapplication-independent, so that the same program can protect many
  260. Xkinds of network services; 2) no interaction also means that the
  261. Xwrappers are invisible from outside (at least for regular users).
  262. X
  263. XAnother important property is that the wrapper programs are active only
  264. Xwhen the initial contact between client and server is established. Once
  265. Xa wrapper has done its work there is no overhead on the client-server
  266. Xcommunication.
  267. X
  268. XThe simple mechanism has one major drawback: since the wrappers go away
  269. Xafter the initial contact between client and server processes, the
  270. Xwrappers are of little use with network daemons that service more than
  271. Xone client.  The wrappers would only see the first client attempt to
  272. Xcontact such a server. The NFS mount daemon is a typical example of
  273. Xa daemon that services requests from multiple clients.
  274. X
  275. XThere are two ways to use the wrapper programs:
  276. X
  277. X1) The easy way: move network daemons to some other directory and fill
  278. X   the resulting holes with copies of the wrapper programs.  This
  279. X   approach involves no changes to configuration files, so there is
  280. X   very little risk of breaking things.
  281. X
  282. X2) The advanced way: leave the network daemons alone and modify the
  283. X   inetd configuration file.  For example, an entry such as:
  284. X
  285. X     tftp  dgram  udp  wait  root  /usr/etc/tcpd  in.tftpd -s /tftpboot
  286. X
  287. X   When a tftp request arrives, inetd will run the wrapper program
  288. X   (tcpd) with a process name `in.tftpd'.  This is the name that the
  289. X   wrapper will use when logging the request and when scanning the
  290. X   optional access control tables.  `in.tftpd' is also the name of the
  291. X   server program that the wrapper will attempt to run when all is
  292. X   well.  Any arguments (`-s /tftpboot' in this particular example) are
  293. X   transparently passed on to the server program.
  294. X
  295. XFor an account of the history of the wrapper programs, with real-life
  296. Xexamples, see the section below on related documents.
  297. X
  298. X3.2 - Where the logging information goes
  299. X----------------------------------------
  300. X
  301. XThe wrapper programs send their logging information to the syslog
  302. Xdaemon (syslogd). The disposition of the wrapper logs is determined by
  303. Xthe syslog configuration file (usually /etc/syslog.conf). Messages are
  304. Xwritten to files, to the console, or are forwarded to a @loghost.
  305. X
  306. XOlder syslog implementations (still found on Ultrix systems) only
  307. Xsupport priority levels ranging from 9 (debug-level messages) to 0
  308. X(alerts). All logging information of the same priority level (or more
  309. Xurgent) is written to the same destination.  In the syslog.conf file,
  310. Xpriority levels are specified in numerical form.  For example,
  311. X
  312. X    8/usr/spool/mqueue/syslog
  313. X
  314. Xcauses all messages with priority 8 (informational messages), and
  315. Xanything that is more urgent, to be appended to the file
  316. X/usr/spool/mqueue/syslog.
  317. X
  318. XNewer syslog implementations support message classes in addition to
  319. Xpriority levels.  Examples of message classes are: mail, daemon, auth
  320. Xand news. In the syslog.conf file, priority levels are specified with
  321. Xsymbolic names: debug, info, notice, ..., emerg. For example,
  322. X
  323. X    mail.debug            /var/log/syslog
  324. X
  325. Xcauses all messages of class mail with priority debug (or more urgent)
  326. Xto be appended to the /var/log/syslog file.
  327. X
  328. XBy default, the wrapper logs go to the same place as the transaction
  329. Xlogs of the sendmail daemon. The disposition can be changed by editing
  330. Xthe Makefile and/or the syslog.conf file. Send a `kill -HUP' to the
  331. Xsyslogd after changing its configuration file. Remember that syslogd,
  332. Xjust like sendmail, insists on one or more TABs between the left-hand
  333. Xside and the right-hand side expressions in its configuration file.
  334. X
  335. X4 - Features
  336. X------------
  337. X
  338. X4.1 - Access control
  339. X--------------------
  340. X
  341. XWhen compiled with -DHOSTS_ACCESS, the wrapper programs support a
  342. Xsimple form of access control.  Access can be controlled per host, per
  343. Xservice, or combinations thereof. The software provides hooks for the
  344. Xexecution of shell commands when an access control rule fires; this
  345. Xfeature may be used to install "booby traps".  For details, see the
  346. Xhosts_access.5 manual page, which is in `nroff -man' format. A later
  347. Xsection describes how you can test your access control rules.
  348. X
  349. XAccess control is enabled by default. It can be turned off by editing
  350. Xthe Makefile, or by providing no access control tables. The install
  351. Xinstructions below describe the Makefile editing process.
  352. X
  353. X4.2 - Host name spoofing
  354. X------------------------
  355. X
  356. XWith some network applications, such as RSH or RLOGIN, the remote host
  357. Xname plays an important role in the authentication process. Host name
  358. Xinformation can be reliable when lookups are done from a _local_ hosts
  359. Xtable, provided that the client IP address can be trusted.
  360. X
  361. XWith _distributed_ name services, authentication schemes that rely on
  362. Xhost names become more problematic. The security of your system now may
  363. Xdepend on some far-away DNS (domain name server) outside your own
  364. Xcontrol. Paradoxically, running NIS (YP) can actually improve hostname
  365. Xsecurity because it provides you with the equivalent of a local hosts
  366. Xfile.
  367. X
  368. XThe wrapper programs verify the remote host name that is returned by
  369. Xthe address->name DNS server, by asking for a second opinion.  To this
  370. Xend, the programs look at the name and addresses that are returned by
  371. Xthe name->address DNS server. If any discrepancies are found, the
  372. Xwrappers conclude that at least one of the two name servers is lying,
  373. Xand assume that they are dealing with a host that pretends to have
  374. Xsomeone elses host name.
  375. X
  376. XWhen the wrappers are unable to verify the remote host name (the
  377. Xaddress->name lookup succeeds but the name->address lookup fails), they
  378. Xalso assume that the host name is wrong. 
  379. X
  380. XWhen the remote host name is unavailable (the address->name lookup
  381. Xfails) the wrappers just use the remote host address when logging the
  382. Xconnection and when consulting the optional access control tables.
  383. X
  384. XWhen the sources are compiled with -DPARANOID, the wrappers will drop
  385. Xthe connection in case of a host name/address mismatch. When the
  386. Xsources are not compiled with -DPARANOID, the wrappers just pretend
  387. Xthat the host name is unknown when logging the connection and when
  388. Xconsulting the optional access control tables.
  389. X
  390. XParanoid mode is enabled by default. It can be turned off by editing
  391. Xthe Makefile. The configuration and installation below describes the
  392. XMakefile editing process.
  393. X
  394. X4.3 - Host address spoofing
  395. X---------------------------
  396. X
  397. XWhile host name spoofing can be found out by asking a second opinion,
  398. Xit is much harder to find out that a host claims to have someone elses
  399. Xnetwork address. And since host names are deduced from network
  400. Xaddresses, address spoofing is at least as effective as name spoofing.
  401. X
  402. XThe wrapper programs can give additional protection against hosts that
  403. Xclaim to have an address that lies outside their own network.  For
  404. Xexample, some far-away host that claims to be a trusted host within
  405. Xyour own network. Such things are possible even while the impersonated
  406. Xsystem is up and running.
  407. X
  408. XThis additional protection is not an invention of my own; it has been
  409. Xpresent for at least five years in the BSD rsh and rlogin daemons.
  410. XUnfortunately, that feature was added *after* 4.3 BSD came out, so that
  411. Xvery few, if any, UNIX vendors have adopted it.  Our site, and many
  412. Xother ones, has been running these enhanced daemons for several years,
  413. Xand without any ill effects.
  414. X
  415. XWhen the programs are compiled with -DKILL_IP_OPTIONS, source routing
  416. Xwill be disabled for all TCP connections that are handled by the
  417. Xwrapper programs.
  418. X
  419. XThe feature is enabled by default. It can be turned off by editing the
  420. XMakefile.  The configuration and installation section below describes
  421. Xthe Makefile editing process.
  422. X
  423. XUDP services do not benefit from this additional protection. With UDP,
  424. Xall you can be certain of is the network packet's destination address.
  425. X
  426. X4.4 - Remote username lookups
  427. X-----------------------------
  428. X
  429. XThe protocol proposed in RFC 931 provides a means to get the remote
  430. Xuser name from the client host.  The requirement is that the client
  431. Xhost runs an RFC 931-compliant daemon. The information provided by such
  432. Xa daemon is not intended to be used for authentication purposes, but it
  433. Xcan provide additional information about the owner of a TCP connection.
  434. X
  435. XRemote user name lookups are enabled when the wrappers are compiled
  436. Xwith -DRFC931.  There are some limitations: the number of hosts that
  437. Xrun an RFC 931 (or compatible) daemon is small (but growing); remote
  438. Xuser name lookups do not work for datagram (UDP) connections. More
  439. Xseriously, remote user name lookups can cause noticeable delays with
  440. Xconnections from non-UNIX PCs. The wrappers use a 30-second timeout for
  441. XRFC931 lookups, to accommodate slow networks and slow hosts. 
  442. X
  443. XBy default, remote username lookups are not enabled. You can enable
  444. Xthem by editing the Makefile. The remote username lookup timeout period
  445. X(30 seconds default) can also be changed by editing the Makefile. The
  446. Xinstallation sections below describe the Makefile editing process.
  447. X
  448. XThe RFC 931 protocol has diverged into different directions (IDENT and
  449. XTAP). To add to the confusion, both protocols use the same network
  450. Xport.  The daemon wrappers implement a common subset of the protocols.
  451. X
  452. X4.5 - Language extension hooks
  453. X------------------------------
  454. X
  455. XThe wrappers sport only a limited number of features. This is for a
  456. Xgood reason: programs that are run at high privilege levels must be
  457. Xeasy to verify.
  458. X
  459. XHowever, some sites have very specific needs.  The options.c file
  460. Xprovides a framework for adding extensions to the access control
  461. Xlanguage. It comes with sample extensions that:  (1) switch to another
  462. Xuser or group id; (2) perform remote user name lookups; (3) run an
  463. Xalternate server program (this allows you to produce customized bounce
  464. Xmessages or to do really nasty stuff); (4) set arbitrary environment
  465. Xvariables; (5) change the default file protection mask.
  466. X
  467. XThe language extension hook is not enabled by default because it
  468. Xintroduces an incompatible change to the access control language
  469. Xsyntax. Instructions to enable the extensions are given in the
  470. XMakefile.
  471. X
  472. X5 - Other works
  473. X---------------
  474. X
  475. X5.1 - Related documents
  476. X-----------------------
  477. X
  478. XThe war story behind the wrapper tools is described in:
  479. X
  480. X    W.Z. Venema, "TCP WRAPPER, network monitoring, access control and
  481. X    booby traps", UNIX Security Symposium III Proceedings (Baltimore),
  482. X    September 1992. 
  483. X
  484. X    ftp.win.tue.nl:/pub/security/tcp_wrapper.ps.Z (postscript)
  485. X    ftp.win.tue.nl:/pub/security/tcp_wrapper.txt.Z (flat text)
  486. X
  487. XThe same cracker is also described in:
  488. X
  489. X    W.R. Cheswick, "An Evening with Berferd, In Which a Cracker is
  490. X    Lured, Endured, and Studied", Proceedings of the Winter USENIX
  491. X    Conference (San Francisco), January 1992.
  492. X
  493. X    research.att.com:/dist/internet_security/berferd.ps
  494. X
  495. X5.2 - Related software
  496. X----------------------
  497. X
  498. XNetwork daemons etc. with enhanced logging capabilities can generate
  499. Xmassive amounts of information: our 100+ workstations generate several
  500. Xhundred kbytes each day. egrep-based filters can help to suppress some
  501. Xof the noise.  A more powerful tool is the Swatch monitoring system by
  502. XStephen E. Hansen and E. Todd Atkins. Swatch can process log files in
  503. Xreal time and can associate arbitrary actions with patterns; its
  504. Xapplications are by no means restricted to security.  Swatch is
  505. Xavailable from sierra.stanford.edu, directory /pub/sources.
  506. X
  507. XSocks, described in the UNIX Security III proceedings, can be used to
  508. Xcontrol network traffic from hosts on an internal network, through a
  509. Xfirewall host, to the outer world. Socks consists of a daemon that is
  510. Xrun on the firewall host, and of a library with routines that redirect
  511. Xapplication socket calls through the firewall daemon.  Socks is
  512. Xavailable from s1.gov in /pub/socks.tar.Z.
  513. X
  514. XVersions of rshd and rlogind, modified to report the remote user name
  515. Xin addition to the remote host name, are available for anonymous ftp
  516. X(ftp.win.tue.nl:/pub/security/logdaemon-2.tar.Z).  These programs are
  517. Xdrop-in replacements for SunOS 4.x, Ultrix 4.x, and SunOS 5.x.
  518. X
  519. XThe securelib shared library by William LeFebvre can be used to control
  520. Xaccess to network daemons that are not run under control of the inetd,
  521. Xsuch as the RPC daemons that run until the machine goes down.
  522. XAvailable from eecs.nwu.edu, file /pub/securelib.tar.
  523. X
  524. XWhere shared libraries or router-based packet filtering are not an
  525. Xoption, an alternative portmap daemon can help to improve RPC security,
  526. Xin particular that of NFS and of the NIS (YP) information service.
  527. Xftp.win.tue.nl:/pub/security/portmap.shar.Z was tested with SunOS 4.1.1
  528. Xand 4.1.2, Ultrix 3.0 and Ultrix 4.x, HP-UX 8.x and AIX. The protection
  529. Xis less effective than that of the securelib library because portmap is
  530. Xmostly a dictionary service.  SunOS 4.x users should install the latest
  531. Xrevision of the portmap and NIS daemons instead, or adopt NIS+ which
  532. Xhas access control built in.
  533. X
  534. XSource for a portable RFC 931 (TAP, IDENT)-compatible daemon by Peter
  535. XEriksson is available from ftp.lysator.liu.se:/pub/ident/servers.
  536. X
  537. XSome TCP/IP implementations come without syslog library. Some come with
  538. Xthe library but have no syslog daemon. A replacement can be found in
  539. Xftp.win.tue.nl:/pub/security/surrogate-syslog.tar.Z.  The fakesyslog
  540. Xlibrary that comes with the nntp sources reportedly works well, too.
  541. X
  542. X6 - Limitations
  543. X---------------
  544. X
  545. X6.1 - Known wrapper limitations
  546. X-------------------------------
  547. X
  548. XSome UDP (and RPC) daemons linger around for a while after they have
  549. Xserviced a request, just in case another request comes in.  In the
  550. Xinetd configuration file these daemons are registered with the `wait'
  551. Xoption. Only the request that started such a daemon will be seen by the
  552. Xwrappers.  This restriction does not apply to connection-oriented (TCP)
  553. Xservices.
  554. X
  555. XTLI (transport level interface), the System V stream-based and
  556. Xprotocol-independent network programming interface, is not yet
  557. Xsupported, but we're working on it.
  558. X
  559. XThe wrappers do not work with RPC services over TCP. These services are
  560. Xregistered as rpc/tcp in the inetd configuration file. The only non-
  561. Xtrivial service that is affected by this limitation is rexd, which is
  562. Xused by the on(1) command. This is no great loss.  On most systems,
  563. Xrexd is less secure than a wildcard in /etc/hosts.equiv.
  564. X
  565. XRPC broadcast requests (for example: rwall, rup, rusers) always appear
  566. Xto come from the responding host. What happens is that the client
  567. Xbroadcasts its request to all portmap daemons on its network; each
  568. Xportmap daemon forwards the request to its own system. As far as the
  569. Xrwall etc.  daemons know, the request comes from the local host.
  570. X
  571. XPortmap and RPC (e.g. NIS and NFS) security is a topic in itself. See
  572. Xthe section in this document on related software.
  573. X
  574. X6.2 - Known system software bugs
  575. X--------------------------------
  576. X
  577. XWorkarounds have been implemented for several bugs in system software.
  578. XThey are described in the Makefile. Unfortunately, some system software
  579. Xbugs cannot be worked around. The result is loss of functionality.
  580. X
  581. XOlder ConvexOS versions come with a broken recvfrom(2) implementation.
  582. XThis makes it impossible for the daemon wrappers to look up the
  583. Xremote host address (and hence, the name) in case of UDP requests.
  584. XA patch is available for ConvexOS 10.1; later releases should be OK.
  585. X
  586. XOn some systems, the optional RFC 931 remote username lookups may
  587. Xtrigger a kernel bug.  When a client host connects to your system, and
  588. Xthe RFC 931 connection from your system to that client is rejected by a
  589. Xrouter, your kernel may drop all connections with that client.  This is
  590. Xnot a bug in the wrapper programs: complain to your vendor, and don't
  591. Xenable remote user name lookups until the bug has been fixed.
  592. X
  593. XReportedly, SunOS 4.1.1, Next 2.0a, ISC 3.0 with TCP 1.3, and AIX 3.2.2
  594. Xare OK.
  595. X
  596. XSony News/OS 4.51, HP-UX 8-something and Ultrix 4.3 still have the bug.
  597. XAt the time of writing, a fix for Ultrix is being field tested (CXO-8919).
  598. X
  599. XThe following procedure can be used (from outside the tue.nl domain) to
  600. Xfind out if your kernel has the bug. From the system under test, do:
  601. X
  602. X    % ftp 131.155.70.100
  603. X
  604. XThis command attempts to make an ftp connection to our anonymous ftp
  605. Xserver (ftp.win.tue.nl).  When the connection has been established, run
  606. Xthe following command from the same system under test, while keeping
  607. Xthe ftp connection open:
  608. X
  609. X    % telnet 131.155.70.100 111
  610. X
  611. XDo not forget the `111' at the end of the command. This telnet command
  612. Xattempts to connect to our portmap process.  The telnet command should
  613. Xfail with:  "host not reachable", or something like that. If your ftp
  614. Xconnection gets messed up, you have the bug. If the telnet command does
  615. Xnot fail, please let me know a.s.a.p.!
  616. X
  617. XFor those who care, the bug is that the BSD kernel code was not careful
  618. Xenough with incoming ICMP UNREACHABLE control messages (it ignored the
  619. Xlocal and remote port numbers). The bug is still present in the BSD
  620. XNET/1 source release (1989) but apparently has been fixed in BSD NET/2
  621. X(1991). You can see it with your own eyes, if you have the courage.
  622. X
  623. X7 - Configuration and installation
  624. X----------------------------------
  625. X
  626. X7.1 - Easy configuration and installation
  627. X-----------------------------------------
  628. X
  629. XThe "easy" recipe requires no changes to existing software or
  630. Xconfiguration files.  Basically, you move the daemons that you want to
  631. Xprotect to a different directory and plug the resulting holes with
  632. Xcopies of the wrapper programs.
  633. X
  634. XIf you don't run Ultrix, you won't need the miscd wrapper program.  The
  635. Xmiscd daemon implements among others the SYSTAT service, which produces
  636. Xthe same output as the the WHO command.
  637. X
  638. XCopy the file Makefile.dist to Makefile, edit the Makefile according to
  639. Xthe instructions at the beginning of that file, and type `make'. 
  640. X
  641. XWhen the `make' succeeds the result is two executables (maybe three in
  642. Xcase of Ultrix). The `try' program can be used to play with host access
  643. Xcontrol tables and is described in a later section.
  644. X
  645. XThe tcpd program can be used to monitor the telnet, finger, ftp, exec,
  646. Xrsh, rlogin, tftp, talk, comsat and other tcp or udp services that have
  647. Xa one-to-one mapping onto executable files.
  648. X
  649. XThe tcpd program can also be used for services that are marked as
  650. Xrpc/udp in the inetd configuration file, but not for rpc/tcp services
  651. Xsuch as rexd.  You probably do not want to run rexd anyway. On most
  652. Xsystems it is even less secure than a wildcard in /etc/hosts.equiv.
  653. X
  654. XThe wrappers are not yet able to deal with TLI-based services.
  655. X
  656. XDecide which services you want to monitor. Move the corresponding
  657. Xvendor-provided daemon programs to the location specified by the
  658. XREAL_DAEMON_DIR constant in the Makefile, and fill the holes with
  659. Xcopies of the tcpd wrapper. That is, one copy of (or link to) the tcpd
  660. Xprogram for each service that you want to monitor. For example, to
  661. Xmonitor the use of your finger service:
  662. X
  663. X    # mkdir REAL_DAEMON_DIR
  664. X    # mv /usr/etc/in.fingerd REAL_DAEMON_DIR
  665. X    # cp tcpd /usr/etc/in.fingerd
  666. X
  667. XThe example applies to SunOS 4. With other UNIX implementations the
  668. Xnetwork daemons live in /usr/libexec or /usr/sbin, or have no "in."
  669. Xprefix to their names, but you get the idea.
  670. X
  671. XUltrix only:  If you want to monitor the SYSTAT service, move the
  672. Xvendor-provided miscd daemon to the location specified by the
  673. XREAL_MISCD macro in the Makefile, and install the miscd wrapper into
  674. Xthe original miscd location.
  675. X
  676. XIn the absence of any access-control tables, the daemon wrappers
  677. Xwill just maintain a record of network connections made to your system.
  678. X
  679. X7.2 - Advanced configuration and installation
  680. X---------------------------------------------
  681. X
  682. XThe advanced recipe leaves your daemon executables alone, but involves
  683. Xsimple modifications to the inetd configuration file.
  684. X
  685. XCopy the file Makefile.dist to Makefile.  In the Makefile, define the
  686. XREAL_DAEMON_DIR macro (if you run Ultrix, the REAL_MISCD macro, too) to
  687. Xreflect the path to your existing network daemons. Don't panic when
  688. Xsome daemons live elsewhere; we'll deal with that later.  Have a look
  689. Xat the other instructions in the Makefile and type `make'.
  690. X
  691. XWhen the `make' succeeds the result is two executables (maybe three in
  692. Xcase of Ultrix). The `try' program can be used to play with host access
  693. Xcontrol tables and is described in a later section.
  694. X
  695. XThe tcpd program can be used to monitor the telnet, finger, ftp, exec,
  696. Xrsh, rlogin, tftp, talk, comsat and other tcp or udp services that have
  697. Xa one-to-one mapping onto executable files.
  698. X
  699. XThe tcpd program can also be used for services that are marked as
  700. Xrpc/udp in the inetd configuration file, but not for rpc/tcp services
  701. Xsuch as rexd.  You probably do not want to run rexd anyway. On most
  702. Xsystems it is even less secure than a wildcard in /etc/hosts.equiv.
  703. X
  704. XThe wrappers are not yet able to deal with TLI-based services.
  705. X
  706. XInstall the tcpd command in a suitable place. Apollo UNIX users will
  707. Xwant to install it under a different name because the name "tcpd" is
  708. Xalready taken; a suitable name for the wrapper program would be
  709. X"frontd".  Then perform the following edits on the inetd configuration
  710. Xfile (usually /etc/inetd.conf or /etc/inet/inetd.conf):
  711. X
  712. X    finger  stream  tcp     nowait  nobody  /usr/etc/in.fingerd     in.fingerd
  713. X
  714. Xbecomes:
  715. X
  716. X    finger  stream  tcp     nowait  nobody  /usr/etc/tcpd           in.fingerd
  717. X
  718. XSend a `kill -HUP' to the inetd process to make the change effective.
  719. X
  720. XThe example applies to SunOS 4. With other UNIX implementations the
  721. Xnetwork daemons live in /usr/libexec or /usr/sbin, the network daemons
  722. Xhave no "in." prefix to their names, or the username field in the inetd
  723. Xconfiguration file may be missing.
  724. X
  725. XWhen the finger service works as expected you can perform similar
  726. Xchanges for other network services. Do not forget the `kill -HUP'.
  727. X
  728. XThe miscd daemon that comes with Ultrix implements several network
  729. Xservices. It decides what to do by looking at its process name. One of
  730. Xthe services is systat, which is a kind of limited finger service.  If
  731. Xyou want to monitor the systat service, install the miscd wrapper in
  732. Xa suitable place and update the inetd configuration file:
  733. X
  734. X    systat  stream  tcp     nowait  /suitable/place/miscd      systatd
  735. X
  736. XUltrix 4.3 allows you to specify a user id under which the daemon will
  737. Xbe executed. This feature is not documented in the manual pages.  Thus,
  738. Xthe example would become:
  739. X
  740. X    systat  stream  tcp     nowait  nobody /suitable/place/miscd    systatd
  741. X
  742. XOlder Ultrix systems still run all their network daemons as root.
  743. X
  744. XIn the absence of any access-control tables, the daemon wrappers
  745. Xwill just maintain a record of network connections made to your system.
  746. X
  747. X7.3 - Daemons with arbitrary path names
  748. X---------------------------------------
  749. X
  750. XThe above tcpd examples work fine with network daemons that live in a
  751. Xcommon directory, but sometimes that is not practical. Having soft
  752. Xlinks all over your file system is not a clean solution, either.
  753. X
  754. XInstead you can specify, in the inetd configuration file, an absolute
  755. Xpath name for the daemon process name.  For example,
  756. X
  757. X    ntalk   dgram   udp     wait    root    /usr/etc/tcpd /usr/local/lib/ntalkd
  758. X
  759. XWhen the daemon process name is an absolute path name, tcpd ignores the
  760. Xvalue of the REAL_DAEMON_DIR constant, and uses the last path component
  761. Xof the daemon process name for logging and for access control.
  762. X
  763. X7.4 - Building and testing the access control rules
  764. X---------------------------------------------------
  765. X
  766. XIn order to support access control the wrappers must be compiled with
  767. Xthe -DHOSTS_ACCESS option. The access control policy is given in the
  768. Xform of two tables (default: /etc/hosts.allow and /etc/hosts.deny).
  769. XAccess control is disabled when there are no access control tables, or
  770. Xwhen the tables are empty.
  771. X
  772. XIf you haven't used the wrappers before I recommend that you first run
  773. Xthem a couple of days without any access control restrictions. The
  774. Xlogfile records should give you an idea of the process names and of the
  775. Xhost names that you will have to build into your access control rules.
  776. X
  777. XThe syntax of the access control rules is documented in the file
  778. Xhosts_access.5, which is in `nroff -man' format. This is a lengthy
  779. Xdocument, and no-one expects you to read it right away from beginning
  780. Xto end.  Instead, after reading the introductory section, skip to the
  781. Xexamples at the end so that you get a general idea of the language.
  782. XThen you can appreciate the detailed reference sections near the
  783. Xbeginning of the document.
  784. X
  785. XThe examples in the hosts_access.5 document show two specific types of
  786. Xaccess control policy:  1) mostly closed (only permitting access from a
  787. Xlimited number of systems) and 2) mostly open (permitting access from
  788. Xeveryone except a limited number of trouble makers). You will have to
  789. Xchoose what model suits your situation best. Implementing a mixed
  790. Xpolicy should not be overly difficult either.
  791. X
  792. XThe `try' command can be used to try out your local access control
  793. Xfiles.  The command syntax is:
  794. X
  795. X    ./try process_name hostname    (e.g.: ./try in.tftpd localhost)
  796. X
  797. X    ./try process_name address    (e.g.: ./try in.tftpd 127.0.0.1)
  798. X
  799. XIn order to find out what process name to use, just use the service and
  800. Xwatch the process name that shows up in the logfile.  Alternatively,
  801. Xyou can look up the name from the inetd configuration file. Coming back
  802. Xto the tftp example in the tutorial section above:
  803. X
  804. X    tftp  dgram  udp  wait  root  /usr/etc/tcpd  in.tftpd -s /tftpboot
  805. X
  806. XThis entry causes the inetd to run the wrapper program (tcpd) with a
  807. Xprocess name `in.tftpd'.  This is the name that the wrapper will use
  808. Xwhen scanning the access control tables. Therefore, `in.tftpd' is the
  809. Xprocess name that should be given to the `try' command. On your system
  810. Xthe actual inetd.conf entry may differ (tftpd instead of in.tftpd, and
  811. Xno `root' field), but you get the idea.
  812. X
  813. XWhen you specify a host name, the `try' program will use both the host
  814. Xname and address. This way you can simulate the most common case where
  815. Xthe wrappers know both the host address and the host name.  The `try'
  816. Xprogram will iterate over all addresses that it can find for the given
  817. Xhost name.
  818. X
  819. XWhen you specify a host address instead of a host name, the `try'
  820. Xprogram will pretend that the host name is unknown, so that you can
  821. Xsimulate what happens when the wrapper is unable to look up the remote
  822. Xhost name.
  823. X
  824. XSerious errors in the configuration file syntax will be reported via
  825. Xthe syslog daemon.  Run a `tail -f' on the logfile while playing with
  826. Xthe `try' command. The tutorial section at the beginning of this file
  827. Xdescribes where to look for your logfile.
  828. X
  829. X7.5 - Other applications
  830. X------------------------
  831. X
  832. XThe access control routines can easily be integrated with other
  833. Xprograms.  The hosts_access.3 manual page (`nroff -man' format)
  834. Xdescribes the external interface of the libwrap.a library.
  835. X
  836. XThe tcpd wrapper can even be used to control access to the smtp port.
  837. XIn that case, sendmail should not be run as a stand-alone daemon, but
  838. Xit should be registered in the inetd configuration file. For example:
  839. X
  840. X    smtp    stream  tcp     nowait  root    /usr/etc/tcpd /usr/lib/sendmail -bs
  841. X
  842. XYou will periodically want to run sendmail to process queued-up
  843. Xmessages. A crontab entry like:
  844. X
  845. X    0,15,30,45 * * * * /usr/lib/sendmail -q
  846. X
  847. Xshould take care of that. When you are going to "protect" your sendmail
  848. Xdaemon this way, you should realize that there are many "unprotected"
  849. Xsendmail daemons all over the network that can still be abused.
  850. X
  851. X8 - Acknowledgements
  852. X--------------------
  853. X
  854. XMany people contributed to the evolution of the programs, by asking
  855. Xinspiring questions, by suggesting features or bugfixes, or by
  856. Xsubmitting source code.  Nevertheless, all mistakes and bugs in the
  857. Xwrappers are my own.
  858. X
  859. XThanks to Brendan Kehoe (brendan@cs.widener.edu), Heimir Sverrisson
  860. X(heimir@hafro.is) and Dan Bernstein (brnstnd@kramden.acf.nyu.edu) for
  861. Xfeedback on an early release of this product.  The host name/address
  862. Xcheck was suggested by John Kimball (jkimball@src.honeywell.com).
  863. XApollo's UNIX environment has some peculiar quirks: Willem-Jan Withagen
  864. X(wjw@eb.ele.tue.nl), Pieter Schoenmakers (tiggr@es.ele.tue.nl) and
  865. XCharles S. Fuller (fuller@wccs.psc.edu) provided assistance.  Hal R.
  866. XBrand (BRAND@addvax.llnl.gov) told me how to get the remote IP address
  867. Xin case of datagram-oriented services, and suggested the optional shell
  868. Xcommand feature.  Shabbir Safdar (shabby@mentor.cc.purdue.edu) provided
  869. Xa first version of a much-needed manual page.  Granville Boman Goza, IV
  870. X(gbg@sei.cmu.edu) suggested to use the remote IP address even when the
  871. Xhost name is available.  Casper H.S. Dik (casper@fwi.uva.nl) provided
  872. Xadditional insight into DNS spoofing techniques.  The bogus daemon
  873. Xfeature was inspired by code from Andrew Macpherson (BNR Europe Ltd).
  874. XSteve Bellovin (smb@research.att.com) confirmed some of my suspicions
  875. Xabout the darker sides of TCP/IP insecurity.
  876. X
  877. XIn no particular order, Howard Chu (hyc@hanauma.jpl.nasa.gov), John P.
  878. XRouillard (rouilj@cs.umb.edu), Darren Reed (avalon@coombs.anu.edu.au),
  879. XIcarus Sparry (I.Sparry@gdr.bath.ac.uk), Scott Schwartz (schwartz@
  880. Xcs.psu.edu), John A. Kunze (jak@violet.berkeley.edu), Daniel Len
  881. XSchales (dan@engr.latech.edu), Chris Turbeville <turbo@cse.uta.edu>,
  882. XPaul Kranenburg <pk@cs.few.eur.nl>, and many, many others provided
  883. Xfixes, code fragments, or other improvements to the wrappers.
  884. X
  885. X    Wietse Venema (wietse@wzv.win.tue.nl)
  886. X    Department of Mathematics and Computing Science
  887. X    Eindhoven University of Technology
  888. X    P.O. Box 513
  889. X    5600 MB Eindhoven
  890. X    The Netherlands
  891. END_OF_README
  892. if test 34604 -ne `wc -c <README`; then
  893.     echo shar: \"README\" unpacked with wrong size!
  894. fi
  895. # end of overwriting check
  896. fi
  897. if test -f clean_exit.c -a "${1}" != "-c" ; then 
  898.   echo shar: Will not over-write existing file \"clean_exit.c\"
  899. else
  900. echo shar: Extracting \"clean_exit.c\" \(1268 characters\)
  901. sed "s/^X//" >clean_exit.c <<'END_OF_clean_exit.c'
  902. X /*
  903. X  * clean_exit() cleans up and terminates the program. It should be called
  904. X  * instead of exit when for some reason the real network daemon will not or
  905. X  * cannot be run. Reason: in the case of a datagram-oriented service we must
  906. X  * discard the not-yet received data from the client. Otherwise, inetd will
  907. X  * see the same datagram again and again, and go into a loop.
  908. X  * 
  909. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  910. X  */
  911. X
  912. X#ifndef lint
  913. Xstatic char sccsid[] = "@(#) clean_exit.c 1.1 92/06/11 22:21:52";
  914. X#endif
  915. X
  916. X#include <sys/types.h>
  917. X#include <sys/socket.h>
  918. X#include <stdio.h>
  919. X
  920. Xextern void exit();
  921. X
  922. X#include "log_tcp.h"
  923. X
  924. X/* clean_exit - clean up and exit */
  925. X
  926. Xvoid    clean_exit(client)
  927. Xstruct from_host *client;
  928. X{
  929. X    char    buf[BUFSIZ];
  930. X    struct sockaddr sa;
  931. X    int     size = sizeof(sa);
  932. X
  933. X    /*
  934. X     * Eat up the not-yet received packet. Some systems insist on a non-zero
  935. X     * source address argument in the recvfrom() call below.
  936. X     */
  937. X
  938. X    if (client->sock_type == FROM_UNCONNECTED)
  939. X    (void) recvfrom(0, buf, sizeof(buf), 0, &sa, &size);
  940. X
  941. X    /*
  942. X     * Be kind to the inetd. We already reported the problem via the syslogd,
  943. X     * and there is no need for additional garbage in the logfile.
  944. X     */
  945. X
  946. X    exit(0);
  947. X}
  948. END_OF_clean_exit.c
  949. if test 1268 -ne `wc -c <clean_exit.c`; then
  950.     echo shar: \"clean_exit.c\" unpacked with wrong size!
  951. fi
  952. # end of overwriting check
  953. fi
  954. if test -f fix_options.c -a "${1}" != "-c" ; then 
  955.   echo shar: Will not over-write existing file \"fix_options.c\"
  956. else
  957. echo shar: Extracting \"fix_options.c\" \(1315 characters\)
  958. sed "s/^X//" >fix_options.c <<'END_OF_fix_options.c'
  959. X /*
  960. X  * Routine to disable IP-level socket options. This code was taken from 4.4BSD
  961. X  * rlogind source, but all mistakes in it are my fault.
  962. X  *
  963. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  964. X  */
  965. X
  966. X#ifndef lint
  967. Xstatic char sccsid[] = "@(#) fix_options.c 1.1 93/03/07 22:48:02";
  968. X#endif
  969. X
  970. X#include <sys/types.h>
  971. X#include <sys/param.h>
  972. X#include <netinet/in.h>
  973. X#include <netdb.h>
  974. X#include <stdio.h>
  975. X#include <syslog.h>
  976. X
  977. X#include "log_tcp.h"
  978. X
  979. X/* fix_options - get rid of IP-level socket options */
  980. X
  981. Xfix_options(client)
  982. Xstruct from_host *client;
  983. X{
  984. X#ifdef IP_OPTIONS
  985. X    unsigned char optbuf[BUFSIZ / 3], *cp;
  986. X    char    lbuf[BUFSIZ], *lp;
  987. X    int     optsize = sizeof(optbuf), ipproto;
  988. X    struct protoent *ip;
  989. X
  990. X    if ((ip = getprotobyname("ip")) != 0)
  991. X    ipproto = ip->p_proto;
  992. X    else
  993. X    ipproto = IPPROTO_IP;
  994. X
  995. X    if (getsockopt(0, ipproto, IP_OPTIONS, (char *) optbuf, &optsize) == 0
  996. X    && optsize != 0) {
  997. X    lp = lbuf;
  998. X    for (cp = optbuf; optsize > 0; cp++, optsize--, lp += 3)
  999. X        sprintf(lp, " %2.2x", *cp);
  1000. X    syslog(LOG_NOTICE,
  1001. X           "connect from %s with IP options (ignored):%s",
  1002. X           hosts_info(client), lbuf);
  1003. X    if (setsockopt(0, ipproto, IP_OPTIONS, (char *) 0, optsize) != 0) {
  1004. X        syslog(LOG_ERR, "setsockopt IP_OPTIONS NULL: %m");
  1005. X        clean_exit(client);
  1006. X    }
  1007. X    }
  1008. X#endif
  1009. X}
  1010. END_OF_fix_options.c
  1011. if test 1315 -ne `wc -c <fix_options.c`; then
  1012.     echo shar: \"fix_options.c\" unpacked with wrong size!
  1013. fi
  1014. # end of overwriting check
  1015. fi
  1016. if test -f hosts_access.3 -a "${1}" != "-c" ; then 
  1017.   echo shar: Will not over-write existing file \"hosts_access.3\"
  1018. else
  1019. echo shar: Extracting \"hosts_access.3\" \(2018 characters\)
  1020. sed "s/^X//" >hosts_access.3 <<'END_OF_hosts_access.3'
  1021. X.TH HOSTS_ACCESS 3
  1022. X.SH
  1023. Xhosts_access, hosts_ctl \- access control library
  1024. X.SH SYNOPSIS
  1025. X.nf
  1026. X#include "log_tcp.h"
  1027. X
  1028. Xint hosts_access(daemon, client)
  1029. Xchar *daemon;
  1030. Xstruct from_host *client;
  1031. X
  1032. Xint hosts_ctl(daemon, client_name, client_addr, client_user)
  1033. Xchar *daemon;
  1034. Xchar *client_host;
  1035. Xchar *client_addr;
  1036. Xchar *client_user;
  1037. X.fi
  1038. X.SH DESCRIPTION
  1039. XThe routines described in this document are part of the \fIlibwrap.a\fR
  1040. Xlibrary. They implement a pattern-based access control language with
  1041. Xoptional shell commands that are executed when a pattern fires.
  1042. X.PP
  1043. XIn all cases, the daemon argument should specify a daemon process name
  1044. X(argv[0] value).  The client host address should be a valid address, or
  1045. XFROM_UNKNOWN if address lookup failed. The client host name and user
  1046. Xname should be empty strings if no information is available,
  1047. XFROM_UNKNOWN if lookup failed, or an actual host or user name.
  1048. X.PP
  1049. Xhosts_access() consults the access control tables described in the
  1050. X\fIhosts_access(5)\fR manual page.  If a match is found, an optional
  1051. Xshell command is executed and the search terminates. hosts_access()
  1052. Xreturns zero if access should be denied.
  1053. X.PP
  1054. Xhosts_ctl() is a wrapper around the hosts_access() routine with a
  1055. Xperhaps more convenient interface.  hosts_ctl() returns zero if access
  1056. Xshould be denied.
  1057. X.SH DIAGNOSTICS
  1058. XProblems are reported via the syslog daemon.
  1059. X.SH SEE ALSO
  1060. Xhosts_access(5), format of the access control tables.
  1061. X.SH FILES
  1062. X/etc/hosts.access, /etc/hosts.deny, access control tables.
  1063. X.SH BUGS
  1064. XThe functions described here do not make copies of their string-valued
  1065. Xarguments.  Beware of data from functions that overwrite their results
  1066. Xupon each call.
  1067. X.sp
  1068. Xhosts_access() uses the strtok() library function. This may interfere
  1069. Xwith other code that relies on strtok().
  1070. X.SH AUTHOR
  1071. X.na
  1072. X.nf
  1073. XWietse Venema (wietse@wzv.win.tue.nl)
  1074. XDepartment of Mathematics and Computing Science
  1075. XEindhoven University of Technology
  1076. XDen Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands
  1077. X\" @(#) hosts_access.3 1.1 92/06/11 22:21:45
  1078. END_OF_hosts_access.3
  1079. if test 2018 -ne `wc -c <hosts_access.3`; then
  1080.     echo shar: \"hosts_access.3\" unpacked with wrong size!
  1081. fi
  1082. # end of overwriting check
  1083. fi
  1084. if test -f hosts_ctl.c -a "${1}" != "-c" ; then 
  1085.   echo shar: Will not over-write existing file \"hosts_ctl.c\"
  1086. else
  1087. echo shar: Extracting \"hosts_ctl.c\" \(969 characters\)
  1088. sed "s/^X//" >hosts_ctl.c <<'END_OF_hosts_ctl.c'
  1089. X /*
  1090. X  * hosts_ctl() combines the most common applications of the host access
  1091. X  * control library. routine. It bundles its arguments into a from_host
  1092. X  * structure, then calls the hosts_access() access control checker. The host
  1093. X  * name and user name arguments should be empty strings, "unknown" or real
  1094. X  * data. if a match is found, the optional shell command is executed.
  1095. X  * 
  1096. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  1097. X  */
  1098. X
  1099. X#ifndef lint
  1100. Xstatic char sccsid[] = "@(#) hosts_ctl.c 1.1 92/06/11 22:21:48";
  1101. X#endif
  1102. X
  1103. X#include <stdio.h>
  1104. X
  1105. X#include "log_tcp.h"
  1106. X
  1107. X/* hosts_ctl - general interface for the hosts_access() routine */
  1108. X
  1109. Xint     hosts_ctl(daemon, name, addr, user)
  1110. Xchar   *daemon;
  1111. Xchar   *name;
  1112. Xchar   *addr;
  1113. Xchar   *user;
  1114. X{
  1115. X    struct from_host client;
  1116. X    static struct from_host zeros;
  1117. X
  1118. X    client = zeros;
  1119. X    client.name = name;
  1120. X    client.addr = addr;
  1121. X    client.user = user;
  1122. X
  1123. X    return (hosts_access(daemon, &client));
  1124. X}
  1125. END_OF_hosts_ctl.c
  1126. if test 969 -ne `wc -c <hosts_ctl.c`; then
  1127.     echo shar: \"hosts_ctl.c\" unpacked with wrong size!
  1128. fi
  1129. # end of overwriting check
  1130. fi
  1131. if test -f hosts_info.c -a "${1}" != "-c" ; then 
  1132.   echo shar: Will not over-write existing file \"hosts_info.c\"
  1133. else
  1134. echo shar: Extracting \"hosts_info.c\" \(788 characters\)
  1135. sed "s/^X//" >hosts_info.c <<'END_OF_hosts_info.c'
  1136. X /*
  1137. X  * hosts_info() returns a string with as much information about the origin
  1138. X  * of a connection as we have: the user name, if known, and the host name,
  1139. X  * or the host address if the name is not available.
  1140. X  * 
  1141. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  1142. X  */
  1143. X
  1144. X#ifndef lint
  1145. Xstatic char sccsid[] = "@(#) hosts_info.c 1.1 92/06/11 22:21:44";
  1146. X#endif
  1147. X
  1148. X#include <stdio.h>
  1149. X
  1150. X#include "log_tcp.h"
  1151. X
  1152. X/* hosts_info - return string with as much about the client as we know */
  1153. X
  1154. Xchar   *hosts_info(client)
  1155. Xstruct from_host *client;
  1156. X{
  1157. X    static char buf[BUFSIZ];        /* XXX */
  1158. X
  1159. X    if (client->user[0] && strcmp(client->user, FROM_UNKNOWN)) {
  1160. X    sprintf(buf, "%s@%s", client->user, FROM_HOST(client));
  1161. X    return (buf);
  1162. X    } else {
  1163. X    return (FROM_HOST(client));
  1164. X    }
  1165. X}
  1166. END_OF_hosts_info.c
  1167. if test 788 -ne `wc -c <hosts_info.c`; then
  1168.     echo shar: \"hosts_info.c\" unpacked with wrong size!
  1169. fi
  1170. # end of overwriting check
  1171. fi
  1172. if test -f inet_addr_fix -a "${1}" != "-c" ; then 
  1173.   echo shar: Will not over-write existing file \"inet_addr_fix\"
  1174. else
  1175. echo shar: Extracting \"inet_addr_fix\" \(552 characters\)
  1176. sed "s/^X//" >inet_addr_fix <<'END_OF_inet_addr_fix'
  1177. X#ifndef lint
  1178. Xstatic char sccsid[] = "@(#) inet_addr_fix 1.1 93/03/07 22:48:04";
  1179. X#endif
  1180. X
  1181. X /*
  1182. X  * Some inet_addr() versions return a struct/union instead of a long. You
  1183. X  * have this problem when the compiler complains about illegal lvalues or
  1184. X  * something like that. The following code fixes this mutant behaviour.
  1185. X  * 
  1186. X  * Bug reported by ben@piglet.cr.usgs.gov (Rev. Ben A. Mesander).
  1187. X  */
  1188. X
  1189. Xstatic long fix_inet_addr(string)
  1190. Xchar   *string;
  1191. X{
  1192. X    struct in_addr addr = inet_addr(string);
  1193. X
  1194. X    return (addr.s_addr);
  1195. X}
  1196. X
  1197. X#define inet_addr fix_inet_addr
  1198. END_OF_inet_addr_fix
  1199. if test 552 -ne `wc -c <inet_addr_fix`; then
  1200.     echo shar: \"inet_addr_fix\" unpacked with wrong size!
  1201. fi
  1202. # end of overwriting check
  1203. fi
  1204. if test -f log_tcp.h -a "${1}" != "-c" ; then 
  1205.   echo shar: Will not over-write existing file \"log_tcp.h\"
  1206. else
  1207. echo shar: Extracting \"log_tcp.h\" \(1448 characters\)
  1208. sed "s/^X//" >log_tcp.h <<'END_OF_log_tcp.h'
  1209. X/* @(#) log_tcp.h 1.3 93/03/07 22:47:41 */
  1210. X
  1211. X/* Location of the access control files. */
  1212. X
  1213. X#ifndef HOSTS_ALLOW
  1214. X#define HOSTS_ALLOW    "/etc/hosts.allow"
  1215. X#endif
  1216. X
  1217. X#ifndef HOSTS_DENY
  1218. X#define HOSTS_DENY    "/etc/hosts.deny"
  1219. X#endif
  1220. X
  1221. X /* Structure filled in by the fromhost() routine. */
  1222. X
  1223. Xstruct from_host {
  1224. X    int     sock_type;            /* socket type, see below */
  1225. X    char   *name;            /* host name */
  1226. X    char   *addr;            /* host address */
  1227. X    char   *user;            /* user name */
  1228. X    struct sockaddr_in *sin;        /* their side of the link */
  1229. X};
  1230. X
  1231. X#define FROM_UNKNOWN    "unknown"    /* name or address lookup failed */
  1232. X#define FROM_HOST(f) \
  1233. X    (((f)->name[0] && strcmp((f)->name, FROM_UNKNOWN)) ? (f)->name : (f)->addr)
  1234. X
  1235. X#define FROM_ADDRLEN    (4*3+3+1)    /* string with IP address */
  1236. X
  1237. X/* Socket types: 0 means unknown. */
  1238. X
  1239. X#define FROM_CONNECTED        1    /* connection-oriented */
  1240. X#define FROM_UNCONNECTED    2    /* non connection-oriented */
  1241. X
  1242. X/* Global functions. */
  1243. X
  1244. Xextern int fromhost();            /* get/validate remote host info */
  1245. Xextern int hosts_access();        /* access control */
  1246. Xextern void refuse();            /* refuse request */
  1247. Xextern void shell_cmd();        /* execute shell command */
  1248. Xextern void percent_x();        /* do %<char> expansion */
  1249. Xextern char *rfc931_name();        /* remote name from RFC 931 daemon */
  1250. Xextern char *hosts_info();        /* show origin of connection */
  1251. Xextern void clean_exit();        /* clean up and exit */
  1252. X
  1253. X/* Global variables. */
  1254. X
  1255. Xextern int log_severity;        /* for connection logging */
  1256. END_OF_log_tcp.h
  1257. if test 1448 -ne `wc -c <log_tcp.h`; then
  1258.     echo shar: \"log_tcp.h\" unpacked with wrong size!
  1259. fi
  1260. # end of overwriting check
  1261. fi
  1262. if test -f miscd.c -a "${1}" != "-c" ; then 
  1263.   echo shar: Will not over-write existing file \"miscd.c\"
  1264. else
  1265. echo shar: Extracting \"miscd.c\" \(2602 characters\)
  1266. sed "s/^X//" >miscd.c <<'END_OF_miscd.c'
  1267. X /*
  1268. X  * Front end to the ULTRIX miscd service. The front end logs the remote host
  1269. X  * name and then invokes the real miscd daemon. Install as "/usr/etc/miscd",
  1270. X  * after moving the real miscd daemon to the "/usr/etc/..." directory.
  1271. X  * Connections and diagnostics are logged through syslog(3).
  1272. X  * 
  1273. X  * The Ultrix miscd program implements (among others) the systat service, which
  1274. X  * pipes the output from who(1) to stdout. This information is potentially
  1275. X  * useful to systems crackers.
  1276. X  * 
  1277. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  1278. X  */
  1279. X
  1280. X#ifndef lint
  1281. Xstatic char sccsid[] = "@(#) miscd.c 1.4 93/03/07 22:47:28";
  1282. X#endif
  1283. X
  1284. X/* System libraries. */
  1285. X
  1286. X#include <sys/types.h>
  1287. X#include <sys/param.h>
  1288. X#include <sys/stat.h>
  1289. X#include <stdio.h>
  1290. X#include <syslog.h>
  1291. X
  1292. X/* Local stuff. */
  1293. X
  1294. X#include "patchlevel.h"
  1295. X#include "log_tcp.h"
  1296. X
  1297. X/* The following specifies where the vendor-provided daemon should go. */
  1298. X
  1299. X#ifndef REAL_MISCD
  1300. X#define REAL_MISCD    "/usr/etc/.../miscd"
  1301. X#endif
  1302. X
  1303. Xint     log_severity = SEVERITY;    /* run-time adjustable */
  1304. X
  1305. Xmain(argc, argv)
  1306. Xint     argc;
  1307. Xchar  **argv;
  1308. X{
  1309. X    struct from_host from;
  1310. X    int     from_stat;
  1311. X
  1312. X    /* Attempt to prevent the creation of world-writable files. */
  1313. X
  1314. X#ifdef DAEMON_UMASK
  1315. X    umask(DAEMON_UMASK);
  1316. X#endif
  1317. X
  1318. X    /*
  1319. X     * Open a channel to the syslog daemon. Older versions of openlog()
  1320. X     * require only two arguments.
  1321. X     */
  1322. X
  1323. X#ifdef LOG_MAIL
  1324. X    (void) openlog(argv[0], LOG_PID, FACILITY);
  1325. X#else
  1326. X    (void) openlog(argv[0], LOG_PID);
  1327. X#endif
  1328. X
  1329. X    /*
  1330. X     * Find out and verify the remote host name. Sites concerned with
  1331. X     * security may choose to refuse connections from hosts that pretend to
  1332. X     * have someone elses host name.
  1333. X     */
  1334. X
  1335. X    from_stat = fromhost(&from);
  1336. X#ifdef PARANOID
  1337. X    if (from_stat == -1)
  1338. X    refuse(&from);
  1339. X#endif
  1340. X
  1341. X    /*
  1342. X     * The BSD rlogin and rsh daemons that came out after 4.3 BSD disallow
  1343. X     * socket options at the IP level. They do so for a good reason. Let's
  1344. X     * follow their example.
  1345. X     */
  1346. X
  1347. X#ifdef KILL_IP_OPTIONS
  1348. X    fix_options(&from);
  1349. X#endif
  1350. X
  1351. X    /*
  1352. X     * Check whether this host can access the service in argv[0]. The
  1353. X     * access-control code invokes optional shell commands as specified in
  1354. X     * the access-control tables.
  1355. X     */
  1356. X
  1357. X#ifdef HOSTS_ACCESS
  1358. X    if (!hosts_access(argv[0], &from))
  1359. X    refuse(&from);
  1360. X#endif
  1361. X
  1362. X    /* Report remote client and invoke the real daemon program. */
  1363. X
  1364. X    syslog(log_severity, "connect from %s", hosts_info(&from));
  1365. X    (void) execv(REAL_MISCD, argv);
  1366. X    syslog(LOG_ERR, "%s: %m", REAL_MISCD);
  1367. X    clean_exit(&from);
  1368. X    /* NOTREACHED */
  1369. X}
  1370. END_OF_miscd.c
  1371. if test 2602 -ne `wc -c <miscd.c`; then
  1372.     echo shar: \"miscd.c\" unpacked with wrong size!
  1373. fi
  1374. # end of overwriting check
  1375. fi
  1376. if test -f patchlevel.h -a "${1}" != "-c" ; then 
  1377.   echo shar: Will not over-write existing file \"patchlevel.h\"
  1378. else
  1379. echo shar: Extracting \"patchlevel.h\" \(70 characters\)
  1380. sed "s/^X//" >patchlevel.h <<'END_OF_patchlevel.h'
  1381. X#ifndef lint
  1382. Xstatic char patchlevel[] = "@(#) patchlevel 5.0";
  1383. X#endif
  1384. END_OF_patchlevel.h
  1385. if test 70 -ne `wc -c <patchlevel.h`; then
  1386.     echo shar: \"patchlevel.h\" unpacked with wrong size!
  1387. fi
  1388. # end of overwriting check
  1389. fi
  1390. if test -f refuse.c -a "${1}" != "-c" ; then 
  1391.   echo shar: Will not over-write existing file \"refuse.c\"
  1392. else
  1393. echo shar: Extracting \"refuse.c\" \(737 characters\)
  1394. sed "s/^X//" >refuse.c <<'END_OF_refuse.c'
  1395. X /*
  1396. X  * refuse() reports a refused connection, and takes the consequences: in
  1397. X  * case of a datagram-oriented service, the unread datagram is taken from
  1398. X  * the input queue (or inetd would see the same datagram again and again);
  1399. X  * the program is terminated.
  1400. X  * 
  1401. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  1402. X  */
  1403. X
  1404. X#ifndef lint
  1405. Xstatic char sccsid[] = "@(#) refuse.c 1.2 92/06/11 22:21:34";
  1406. X#endif
  1407. X
  1408. X/* System libraries. */
  1409. X
  1410. X#include <syslog.h>
  1411. X
  1412. X/* Local stuff. */
  1413. X
  1414. X#include "log_tcp.h"
  1415. X
  1416. X/* refuse - refuse request from bad host */
  1417. X
  1418. Xvoid    refuse(client)
  1419. Xstruct from_host *client;
  1420. X{
  1421. X    syslog(LOG_WARNING, "refused connect from %s", hosts_info(client));
  1422. X    clean_exit(client);
  1423. X    /* NOTREACHED */
  1424. X}
  1425. END_OF_refuse.c
  1426. if test 737 -ne `wc -c <refuse.c`; then
  1427.     echo shar: \"refuse.c\" unpacked with wrong size!
  1428. fi
  1429. # end of overwriting check
  1430. fi
  1431. if test -f setenv.c -a "${1}" != "-c" ; then 
  1432.   echo shar: Will not over-write existing file \"setenv.c\"
  1433. else
  1434. echo shar: Extracting \"setenv.c\" \(931 characters\)
  1435. sed "s/^X//" >setenv.c <<'END_OF_setenv.c'
  1436. X /*
  1437. X  * Some systems do not have setenv(). This one is modeled after 4.4 BSD, but
  1438. X  * is implemented in terms of portable primitives only: getenv(), putenv()
  1439. X  * and malloc(). It should therefore be safe to use on every UNIX system.
  1440. X  * 
  1441. X  * If clobber == 0, do not overwrite an existing variable.
  1442. X  * 
  1443. X  * Returns nonzero if memory allocation fails.
  1444. X  * 
  1445. X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  1446. X  */
  1447. X
  1448. X#ifndef lint
  1449. Xstatic char sccsid[] = "@(#) setenv.c 1.1 93/03/07 22:47:58";
  1450. X#endif
  1451. X
  1452. X/* setenv - update or insert environment (name,value) pair */
  1453. X
  1454. Xint     setenv(name, value, clobber)
  1455. Xchar   *name;
  1456. Xchar   *value;
  1457. Xint     clobber;
  1458. X{
  1459. X    char   *malloc();
  1460. X    char   *getenv();
  1461. X    char   *cp;
  1462. X
  1463. X    if (clobber == 0 && getenv(name) != 0)
  1464. X    return (0);
  1465. X    if ((cp = malloc(strlen(name) + strlen(value) + 2)) == 0)
  1466. X    return (1);
  1467. X    sprintf(cp, "%s=%s", name, value);
  1468. X    return (putenv(cp));
  1469. X}
  1470. END_OF_setenv.c
  1471. if test 931 -ne `wc -c <setenv.c`; then
  1472.     echo shar: \"setenv.c\" unpacked with wrong size!
  1473. fi
  1474. # end of overwriting check
  1475. fi
  1476. echo shar: End of archive 1 \(of 3\).
  1477. cp /dev/null ark1isdone
  1478. MISSING=""
  1479. for I in 1 2 3 ; do
  1480.     if test ! -f ark${I}isdone ; then
  1481.     MISSING="${MISSING} ${I}"
  1482.     fi
  1483. done
  1484. if test "${MISSING}" = "" ; then
  1485.     echo You have unpacked all 3 archives.
  1486.     rm -f ark[1-9]isdone
  1487. else
  1488.     echo You still need to unpack the following archives:
  1489.     echo "        " ${MISSING}
  1490. fi
  1491. ##  End of shell archive.
  1492. exit 0
  1493.  
  1494. exit 0 # Just in case...
  1495.