|
COMMAND cfsd buffer overflow SYSTEMS AFFECTED cfsd versions 1.3.3-8 and others PROBLEM In Debian advisory [DSA 116-1] [http://www.debian.org/security/] : Zorgon found several buffer overflows in cfsd, a daemon that pushes encryption services into the Unix(tm) file system. No more details where provided yet, see diff below. SOLUTION Diff is 1.3.3-8.1, for other versions check your vendor : --- cfs-1.3.3.orig/debian/README.debian +++ cfs-1.3.3/debian/README.debian @@ -0,0 +1,64 @@ +cfs for DEBIAN +---------------------- + +This is the Debian GNU/Linux prepackaged version of cfs, the UNIX +Cryptographic File System. + + + +<Extract from notes.ms> + +CFS pushes encryption services into the Unix(tm) file system. +It supports secure storage at the system level through a standard +Unix file system interface to encrypted files. Users associate a +cryptographic key with the directories they wish to protect. +Files in these directories (as well as their pathname components) +are transparently encrypted and decrypted with the specified key +without further user intervention; cleartext is never stored on a +disk or sent to a remote file server. CFS employs a novel combi- +nation of DES stream and codebook cipher modes to provide high +security with good performance on a modern workstation. CFS can +use any available file system for its underlying storage without +modification, including remote file servers such as NFS. System +management functions, such as file backup, work in a normal man- +ner and without knowledge of the key. + +<SNIP> + +CFS runs entirely at user level, as a local NFS server running on +the clients machine\'s \"loopback\" interface. The system consists +of cfsd (the CFS server daemon), and a small suite of tools +(cmkdir, cattach, cdetach and ssh<--DEBIAN--removed> that create +encrypted directories and manage keys as they are used. CFS, and +the motivation and principles behind it, is described in detail +in: Matt Blaze, \"A Cryptographic File System for Unix.\" Proc. 1st +ACM Conference on Computer and Communication Security, Fairfax, +VA, November 1993. + +<SNIP> + +Basically, CFS provides a mechanism to associate \"real\" director- +ies (on other file systems) that contain encrypted data with tem- +porary \"virtual\" names through which which users can read and +write cleartext. These virtual names appear under the CFS mount +point, which is usually called /crypt (this document assumes that +convention). + +Users create encrypted directories on regular file systems (e.g. +in their home directories) using the cmkdir command, which crea- +tes the directory and assigns to it a cryptographic \"passphrase\" +which will be used to encrypt its contents. To actually use an +encrypted directory, it must be \"attached\" to CFS using the com- +mand cattach, which asks for the passphrase and installs an ass- +ociation between the \"real\" directory and a temporary name under +/crypt. Cleartext is read and written under the virtual direct- +ory in /crypt, but the files are stored in encrypted form (with +encrypted names) in the real directory. When the directory is not +in use, the association is removed with the cdetatch command, +which deletes the cleartext virtual directory under /crypt (but +not the ciphertext files, or course). + +</Extract from notes.ms> + + +Chris Leishman <masklin@debian.org>, Fri, 30 Oct 1998 23:21:12 +1100 --- cfs-1.3.3.orig/debian/cfsconfig +++ cfs-1.3.3/debian/cfsconfig @@ -0,0 +1,90 @@ +#!/bin/sh + +CFSFS=/.cfsfs +CRYPT=/crypt + +echo -n \"Configure cfs now [Y/n]? \" +read input +if expr \"$input\" : \'[Nn]\' > /dev/null +then + exit 0; +fi + +echo -n \"Use default Cryptographic Filesystem Configuration [Y/n]? \" +read input +if expr \"$input\" : \'[Nn]\' > /dev/null +then + if ! grep -q \'^CFSFS=$\' /etc/init.d/cfsd + then + CRYPT=`grep \'^CRYPT=\' /etc/init.d/cfsd | sed -e \"s/^CRYPT=\\(.*\\)$/\\1/\"` + CFSFS=`grep \'^CFSFS=\' /etc/init.d/cfsd | sed -e \"s/^CFSFS=\\(.*\\)$/\\1/\"` + fi + echo -n \"Enter server mount point [$CFSFS] \" + read input + if [ ! -z $input ] + then + CFSFS=$input + fi + echo -n \"Enter client mount point [$CRYPT] \" + read input + if [ ! -z $input ] + then + CRYPT=$input + fi +fi + +OLDCRYPT=\"\" +OLDCFSFS=\"\" +if ! grep -q \'^CFSFS=$\' /etc/init.d/cfsd +then + OLDCRYPT=`grep \'^CRYPT=\' /etc/init.d/cfsd | sed -e \"s/^CRYPT=\\(.*\\)$/\\1/\"` + OLDCFSFS=`grep \'^CFSFS=\' /etc/init.d/cfsd | sed -e \"s/^CFSFS=\\(.*\\)$/\\1/\"` +fi + +/etc/init.d/cfsd stop + +mv /etc/init.d/cfsd /etc/init.d/cfsd_tmp$$ +sed -e \"s!^CFSFS=.*\\$!CFSFS=$CFSFS!;s!^CRYPT=.*\\$!CRYPT=$CRYPT!\" /etc/init.d/cfsd_tmp$$ > /etc/init.d/cfsd +rm /etc/init.d/cfsd_tmp$$ +chmod 755 /etc/init.d/cfsd + +if [ \"$OLDCRYPT\" != \"$CRYPT\" -o \"$OLDCFSFS\" != \"$CFSFS\" ] +then + echo + echo \"Old directories $OLDCRYPT and $OLDCFSFS not automatically removed.\" + echo \"Please remove by hand.\" + echo +fi + +if [ ! -e $CFSFS ] +then + echo \"Creating directory $CFSFS\" + mkdir -p -m 0 $CFSFS +fi +if [ ! -e $CRYPT ] +then + echo \"Creating directory $CRYPT\" + mkdir -p -m 755 $CRYPT +fi + +if grep -q \"Cryptographic Filesystem export\" /etc/exports +then + mv /etc/exports /etc/exports_tmp$$ + sed -e \"/^# Automatically added for use by cfs\\$/ d;/^.*localhost(rw).*#.*Cryptographic Filesystem export.*\\$/ d;\" /etc/exports_tmp$$ > /etc/exports + chmod 644 /etc/exports + rm /etc/exports_tmp$$ +fi + +echo \"# Automatically added for use by cfs\" >> /etc/exports +echo \"$CFSFS localhost(rw) # Cryptographic Filesystem export\" >> /etc/exports + +if [ -x /etc/init.d/nfs-server ]; then + echo \"Restarting nfs-server\" + /etc/init.d/nfs-server restart > /dev/null +fi +if [ -x /etc/init.d/nfs-kernel-server ]; then + echo \"Restarting nfs-kernel-server\" + /etc/init.d/nfs-kernel-server restart > /dev/null +fi + +/etc/init.d/cfsd start --- cfs-1.3.3.orig/debian/changelog +++ cfs-1.3.3/debian/changelog @@ -0,0 +1,57 @@ +cfs (1.3.3-8.1) stable; urgency=high + + * bug: buffer overflows in cfsd server daemon code: cvs_adm.c, cvs_fh.c + (thx Zorgon for pointing at this). + Some careless strcpy()\'s in the server code caused cfsd to die with + segfault when attaching crypto directories with long pathnames and + on filehandle operations in attached crypto directories with long + pathnames, see bug #135903 for details (closes: #135903). + + -- Gerrit Pape <pape@smarden.org> Mon, 25 Feb 2002 15:48:59 +0100 + +cfs (1.3.3-8) frozen unstable; urgency=low + + * Fixed typo in dependancies + * Made CFS silent on startup + + -- Chris Leishman <masklin@debian.org> Mon, 15 May 2000 09:29:34 +1000 + +cfs (1.3.3-7) frozen unstable; urgency=low + + * Fixed bug in rules which was causing cfsconfig to lose permissions. + + -- Chris Leishman <masklin@debian.org> Mon, 1 May 2000 13:29:34 +1000 + +cfs (1.3.3-6) frozen unstable; urgency=low + + * Changes to refect name change of knfs server to nfs-kernel-server + + -- Chris Leishman <masklin@debian.org> Sun, 30 Apr 2000 16:16:54 +1000 + +cfs (1.3.3-5) unstable; urgency=low + + * Fixed some errors in prerm script + + -- Chris Leishman <masklin@debian.org> Sun, 22 Aug 1998 23:01:19 +1000 + +cfs (1.3.3-4) unstable; urgency=low + + * Reassigned dependancies to nfs-server | knfs + + * Added support for restarting /etc/init.d/knfs-server if available + + -- Chris Leishman <masklin@debian.org> Mon, 16 Aug 1998 10:56:23 +1000 + +cfs (1.3.3-3) unstable; urgency=low + + * Initial Release. + + * Repackaged by Chris Leishman. Removed installation of esm. Ported + to libc6. Fixed bugs and rewrote debian/ scripts. + + -- Chris Leishman <masklin@debian.org> Fri, 30 Oct 1998 23:21:12 +1100 + +Local variables: +mode: debian-changelog +add-log-mailing-address: \"masklin@debian.org\" +End: --- cfs-1.3.3.orig/debian/conffiles +++ cfs-1.3.3/debian/conffiles @@ -0,0 +1 @@ +/etc/init.d/cfsd --- cfs-1.3.3.orig/debian/control +++ cfs-1.3.3/debian/control @@ -0,0 +1,24 @@ +Source: cfs +Section: non-us/otherosfs +Priority: optional +Maintainer: Chris Leishman <masklin@debian.org> +Standards-Version: 2.4.0.0 + +Package: cfs +Architecture: any +Depends: ${shlibs:Depends} +Depends: nfs-server | nfs-kernel-server +Description: Cryptographic Filesystem + CFS pushes encryption services into the Unix(tm) file system. It + supports secure storage at the system level through a standard + Unix file system interface to encrypted files. Users associate a + cryptographic key with the directories they wish to protect. + Files in these directories (as well as their pathname components) + are transparently encrypted and decrypted with the specified key + without further user intervention. + . + CFS emplys a novel combination of DES stream and codebook cipher + modes to provide high security with good performance on a modern + workstation. CFS can use any available file system for its unde- + rlying storage without modification, i ncluding remote file ser- + vers such as NFS. --- cfs-1.3.3.orig/debian/copyright +++ cfs-1.3.3/debian/copyright @@ -0,0 +1,27 @@ +This package was debianized by Chris Leishman masklin@debian.org on +Fri, 30 Oct 1998 22:52:10 +1100. + +Original download site is unknown. + +Upstream Author(s): Matt Blaze AT&T + +Copyright: + +This is version 1.3.1 of CFS + + * The author of this software is Matt Blaze. + * Copyright (c) 1992, 1993, 1994, 1995 by AT&T. + * Permission to use, copy, and modify this software without fee + * is hereby granted, provided that this entire notice is included in + * all copies of any software which is or includes a copy or + * modification of this software and in all copies of the supporting + * documentation for such software. + * + * This software is subject to United States export controls. + * + * THIS SOFTWARE IS BEING PROVIDED \"AS IS\", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + + --- cfs-1.3.3.orig/debian/dirs +++ cfs-1.3.3/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin --- cfs-1.3.3.orig/debian/docs +++ cfs-1.3.3/debian/docs @@ -0,0 +1 @@ +README README.esm README.history README.install README.irix README.linux notes.ms --- cfs-1.3.3.orig/debian/init.d +++ cfs-1.3.3/debian/init.d @@ -0,0 +1,43 @@ +#! /bin/sh +# +# This file was automatically customized by debmake on Fri, 30 Oct 1998 22:52:10 +1100 +# +# Written by Miquel van Smoorenburg <miquels@drinkel.ow.org>. +# Modified for Debian GNU/Linux by Ian Murdock <imurdock@gnu.ai.mit.edu>. +# Modified for Debian by Christoph Lameter <clameter@debian.org> + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DAEMON=/usr/sbin/cfsd +CRYPT= +CFSFS= +# The following value is extracted by debstd to figure out how to generate +# the postinst script. Edit the field to change the way the script is +# registered through update-rc.d (see the manpage for update-rc.d!) +FLAGS=\"defaults 50\" + +test -f $DAEMON || exit 0 +test \"$CRYPT\" != \"\" || exit 0 +test \"$CFSFS\" != \"\" || exit 0 + +case \"$1\" in + start) + start-stop-daemon --start --verbose --exec $DAEMON + mount -o port=3049,intr localhost:$CFSFS $CRYPT + ;; + stop) + start-stop-daemon --stop --verbose --exec $DAEMON + umount $CRYPT > /dev/null + ;; + restart|force-reload) + start-stop-daemon --stop --verbose --exec $DAEMON + umount $CRYPT > /dev/null + start-stop-daemon --start --verbose --exec $DAEMON + mount -o port=3049,intr localhost:$CFSFS $CRYPT + ;; + *) + echo \"Usage: /etc/init.d/cfs {start|stop|restart}\" + exit 1 + ;; +esac + +exit 0 --- cfs-1.3.3.orig/debian/postinst +++ cfs-1.3.3/debian/postinst @@ -0,0 +1,9 @@ +#!/bin/sh + +#DEBHELPER# + +/usr/sbin/cfsconfig + +echo +echo \'Use \"cfsconfig\" to (re)configure at a future date.\' +echo --- cfs-1.3.3.orig/debian/prerm +++ cfs-1.3.3/debian/prerm @@ -0,0 +1,32 @@ +#!/bin/sh + +#DEBHELPER# + +CRYPT=`grep \'^CRYPT=\' /etc/init.d/cfsd | sed -e \"s/^CRYPT=\\(.*\\)$/\\1/\"` +CFSFS=`grep \'^CFSFS=\' /etc/init.d/cfsd | sed -e \"s/^CFSFS=\\(.*\\)$/\\1/\"` + +if [ ! -z $CFSFS ]; then + rmdir $CFSFS +fi +if [ ! -z $CRYPT ]; then + rmdir $CRYPT +fi + +mv /etc/init.d/cfsd /etc/init.d/cfsd_tmp$$ +sed -e \"s!^CFSFS=.*\\$!CFSFS=!;s!^CRYPT=.*\\$!CRYPT=!\" /etc/init.d/cfsd_tmp$$ > /etc/init.d/cfsd +rm /etc/init.d/cfsd_tmp$$ +chmod 755 /etc/init.d/cfsd + +mv /etc/exports /etc/exports_tmp$$ +sed -e \"/^# Automatically added for use by cfs\\$/ d;/^.*localhost(rw).*#.*Cryptographic.*\\$/ d;\" /etc/exports_tmp$$ > /etc/exports +chmod 644 /etc/exports +rm /etc/exports_tmp$$ + +if [ -x /etc/init.d/nfs-server ]; then + /etc/init.d/nfs-server restart > /dev/null +fi +if [ -x /etc/init.d/nfs-kernel-server ]; then + /etc/init.d/nfs-kernel-server restart > /dev/null +fi + +exit 0; --- cfs-1.3.3.orig/debian/rules +++ cfs-1.3.3/debian/rules @@ -0,0 +1,76 @@ +#!/usr/bin/make -f +# MAde with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +build: build-stamp +build-stamp: + dh_testdir + + + # Add here commands to compile the package. + $(MAKE) cfs + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp install-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp. + $(MAKE) install_cfs BINDIR=`pwd`/debian/tmp/usr/bin ETCDIR=`pwd`/debian/tmp/usr/sbin + install -m755 debian/cfsconfig debian/tmp/usr/sbin + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install +# dh_testversion + dh_testdir + dh_testroot + dh_installdocs + dh_installexamples + dh_installmenu +# dh_installemacsen + dh_installinit --init-script=cfsd --update-rcd-params=\"defaults 30 20\" + dh_installcron + dh_installmanpages ssh.1 esm.1 + cd debian/tmp/usr/share/man/man1 && ln -s ../man7/undocumented.7.gz cfsconfig.1.gz +# dh_undocumented + dh_installchangelogs + dh_strip + dh_compress + dh_fixperms + dh_suidregister + dh_installdeb + dh_shlibdeps + dh_gencontrol +# dh_makeshlibs + dh_md5sums + dh_builddeb + +source diff: + @echo >&2 \'source and diff are obsolete - use dpkg-source -b\'; false + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary --- cfs-1.3.3.orig/Makefile +++ cfs-1.3.3/Makefile @@ -108,10 +108,10 @@ ## use these for recent versions of Linux with rpcgen-from-hell # See NOTE TO LINUX USERS above, and also README.linux, # if you can\'t make things work. -CFLAGS=$(COPT) -U__OPTIMIZE__ -traditional -Dd_fileno=d_ino -I$(RINCLUDES) +CFLAGS=$(COPT) -U__OPTIMIZE__ -Dd_fileno=d_ino LIBS= COMPAT= -RPCOPTS= -k -b +RPCOPTS= ## use these for older versions Linux (Slackware 1.1.2) # See NOTE TO LINUX USERS above, and also README.linux, @@ -209,7 +209,7 @@ SRCS=Makefile admproto.x mount.x nfsproto.x cfs.c cfs_adm.c cfs_nfs.c cfs.h \\ cfs_fh.c cfs_des.c cfs_cipher.c mcg.c mcgsbox.c mcg.h shs.c shs.h cattach.c \\ - getpass.c cdetach.c cmkdir.c adm.c cname.c ccat.c cpasswd.c truerand.c \\ + getpass.c cdetach.c cmkdir.c adm.c cname.c ccat.c cpasswd.c \\ safer.c safer.h ver.c i o ssh make_with_bad_rpcgen ESRCS=esm.c esm_cipher.c esm_gen.c dhparams.c esm.h MANS=cattach.1 cdetach.1 cmkdir.1 ssh.1 cfsd.8 cname.8 ccat.8 cpasswd.1 \\ @@ -218,10 +218,10 @@ OBJS= cfs.o nfsproto_xdr.o nfsproto_svr.o admproto_xdr.o admproto_svr.o \\ cfs_adm.o cfs_nfs.o cfs_fh.o cfs_des.o cfs_cipher.o adm.o ver.o mcgsbox.o \\ mcg.o safer.o -EOBJS=dhparams.o truerand.o esm_gen.o esm.o esm_cipher.o +EOBJS=dhparams.o esm_gen.o esm.o esm_cipher.o COBJS=admproto_clnt.o cfs_des.o cfs_cipher.o cattach.o getpass.o cmkdir.o \\ cdetach.o ver.o cname.o ccat.o mcgsbox.o mcgsbox.o mcg.o shs.o cpasswd.o \\ - truerand.o safer.o + safer.o OTHERS = nfsproto.h nfsproto_svr.c nfsproto_xdr.c admproto.h admproto_svr.c \\ admproto_xdr.c admproto_clnt.c @@ -245,14 +245,14 @@ ver.o $(LIBS) -o cdetach cmkdir: getpass.o adm.o cfs_des.o cfs_cipher.o cmkdir.o ver.o mcg.o \\ - mcgsbox.o safer.o shs.o truerand.o + mcgsbox.o safer.o shs.o $(CC) cmkdir.o cfs_des.o cfs_cipher.o getpass.o adm.o ver.o mcg.o \\ - mcgsbox.o safer.o shs.o truerand.o $(COMPAT) -o cmkdir + mcgsbox.o safer.o shs.o $(COMPAT) -o cmkdir cpasswd: getpass.o cfs_des.o cfs_cipher.o cpasswd.o ver.o mcg.o \\ - mcgsbox.o safer.o shs.o truerand.o + mcgsbox.o safer.o shs.o $(CC) cpasswd.o cfs_des.o cfs_cipher.o getpass.o ver.o mcg.o \\ - mcgsbox.o safer.o shs.o truerand.o $(COMPAT) -o cpasswd + mcgsbox.o safer.o shs.o $(COMPAT) -o cpasswd cname: cname.o getpass.o cfs_des.o cfs_cipher.o cfs_adm.o cfs_fh.o \\ cfs_nfs.o ver.o mcg.o mcgsbox.o safer.o shs.o @@ -270,10 +270,6 @@ $(COBJS): nfsproto.h admproto.h cfs.h mcg.h safer.h shs.h -# truerand is a special case, no -O -truerand.o: - $(CC) -c truerand.c - nfsproto_xdr.c: nfsproto.x rpcgen $(RPCOPTS) -c -o nfsproto_xdr.c nfsproto.x @@ -297,7 +293,7 @@ clean: rm -f $(OBJS) $(COBJS) $(OTHERS) - rm -f cfsd cmkdir cattach cpassed cdetach cname ccat + rm -f cfsd cmkdir cattach cpasswd cdetach cname ccat rm -f $(EOBJS) esm cfs.shar: $(SRCS) $(ESRCS) $(MANS) @@ -307,25 +303,27 @@ $(PRINTCMD) $(SRCS) cfs.h mcg.h safer.h admproto.h nfsproto.h install_cfs: cfsd cattach cdetach cmkdir + install -d -o root $(ETCDIR) + install -d -o root $(BINDIR) install -m 0755 -c -o root cfsd $(ETCDIR) - install -m 0755 -c -o root cattach cdetach cmkdir cpasswd ssh \\ + install -m 0755 -c -o root cattach cdetach cmkdir cpasswd \\ cname ccat $(BINDIR) # install -m 0755 i o $(BINDIR) - @echo \"Kill any running cfsd prior to restarting.\" - @echo \"See the README file for more information.\" - @echo \"Don\'t forget to install the man pages (*.[18]).\" +# @echo \"Kill any running cfsd prior to restarting.\" +# @echo \"See the README file for more information.\" +# @echo \"Don\'t forget to install the man pages (*.[18]).\" $(EOBJS): esm.h -esm: esm.o cfs_des.o esm_cipher.o dhparams.o truerand.o shs.o - $(CC) -o esm esm.o cfs_des.o esm_cipher.o dhparams.o truerand.o shs.o $(RSALIB) +esm: esm.o cfs_des.o esm_cipher.o dhparams.o shs.o + $(CC) -o esm esm.o cfs_des.o esm_cipher.o dhparams.o shs.o $(RSALIB) # to generate your own dhparams, remove the existing dhparams.c and # remake esm. You shouldn\'t do this if you want to remain interoperable. # esm_gen takes a long time. -esm_gen: esm_gen.o esm_cipher.o cfs_des.o truerand.o - $(CC) -o esm_gen esm_gen.o esm_cipher.o cfs_des.o truerand.o $(RSALIB) +esm_gen: esm_gen.o esm_cipher.o cfs_des.o + $(CC) -o esm_gen esm_gen.o esm_cipher.o cfs_des.o $(RSALIB) dhparams.c: make esm_gen @@ -336,4 +334,4 @@ esm.shar: shar README.esm Makefile esm.c *.x cfs_des.c esm_cipher.c esm_gen.c \\ - dhparams.c truerand.c shs.c esm.h esm.1> esm.shar + dhparams.c shs.c esm.h esm.1> esm.shar --- cfs-1.3.3.orig/cfs.c +++ cfs-1.3.3/cfs.c @@ -202,7 +202,7 @@ perror(\"cfsd: fork\\n\"); exit(1); } - printf(\"cfs ready [%d]\\n\",pid); +/* printf(\"cfs ready [%d]\\n\",pid); */ exit(0); } #else --- cfs-1.3.3.orig/cfs_adm.c +++ cfs-1.3.3/cfs_adm.c @@ -36,14 +36,12 @@ } void * -admproc_null_2() +admproc_null_2_svc(void *a, struct svc_req *r) { } cfsstat * -admproc_attach_2(ap,rp) - cfs_attachargs *ap; - SR *rp; +admproc_attach_2_svc(cfs_attachargs *ap, struct svc_req *rp) { static cfsstat ret; int i; @@ -154,9 +152,7 @@ } cfsstat * -admproc_detach_2(ap,rp) - cfs_detachargs *ap; - SR *rp; +admproc_detach_2_svc(cfs_detachargs *ap, struct svc_req *rp) { static cfsstat ret; int i; @@ -217,8 +213,11 @@ FILE *fp; char fn[1024]; char buf[9]; + int l; - sprintf(fn,\"%s/...\",path); + l =snprintf(fn, NFS_MAXPATHLEN, \"%s/...\",path); + if (l < 0 || l >= NFS_MAXPATHLEN) + return CFSERR_BADNAME; if ((fp=fopen(fn,\"r\"))==NULL) return CFSERR_NODIR; if (fread(buf,8,1,fp)!=1) { --- cfs-1.3.3.orig/cfs_fh.c +++ cfs-1.3.3/cfs_fh.c @@ -835,6 +835,7 @@ char linkname[NFS_MAXPATHLEN+1]; char vect[NFS_MAXPATHLEN+1]; struct stat sb; + int l; if (p==NULL) { cfserrno=NFSERR_STALE; @@ -848,12 +849,20 @@ } if ((p->parent==0) && (!strcmp(comp,\"..\"))) return fhrootlook(p->ins->name,h); - sprintf(path,\"%s/%s\",p->name,comp); + l =snprintf(path, NFS_MAXPATHLEN, \"%s/%s\",p->name,comp); + if (l < 0 || l >= NFS_MAXPATHLEN) { + cfserrno =NFSERR_NAMETOOLONG; + return -2; + } if (lstat(path,&sb)<0) { return -1; /* just need the inode */ } /* check for a linkfile */ - sprintf(linkname,\"%s/.pvect_%s\",p->name,comp); + l =snprintf(linkname, NFS_MAXPATHLEN, \"%s/.pvect_%s\",p->name,comp); + if (l < 0 || l >= NFS_MAXPATHLEN) { + cfserrno =NFSERR_NAMETOOLONG; + return -2; + } if (readlink(linkname,vect,9) != 8) { bcopy((char *)zerovect,(char *)vect,8); strcpy(linkname,\"/NOWHERE/null\"); --- cfs-1.3.3.orig/cfs_nfs.c +++ cfs-1.3.3/cfs_nfs.c @@ -58,9 +58,7 @@ } void * -nfsproc_null_2(ap,rp) - void *ap; - SR rp; +nfsproc_null_2_svc(void *ap, struct svc_req *rp) { static int ret=0; return ((void*) &ret); @@ -72,9 +70,7 @@ readdirres *rootreaddir(); attrstat * -nfsproc_getattr_2(ap,rp) - nfs_fh *ap; - SR rp; +nfsproc_getattr_2_svc(nfs_fh *ap, struct svc_req *rp) { static attrstat ret; int uid; @@ -118,9 +114,7 @@ } attrstat * -nfsproc_setattr_2(ap,rp) - sattrargs *ap; - SR rp; +nfsproc_setattr_2_svc(sattrargs *ap, struct svc_req *rp) { static attrstat ret; int uid; @@ -168,9 +162,7 @@ } void * -nfsproc_root_2(ap,rp) - void *ap; - SR rp; +nfsproc_root_2_svc(void *ap, struct svc_req *rp) { static int ret=0; @@ -179,9 +171,7 @@ /* fix this to deal w/ fs root (instance root should be ok) */ diropres * -nfsproc_lookup_2(ap,rp) - diropargs *ap; - SR rp; +nfsproc_lookup_2_svc(diropargs *ap, struct svc_req *rp) { static diropres ret; diropres *retp; @@ -258,9 +248,7 @@ } readlinkres * -nfsproc_readlink_2(ap,rp) - nfs_fh *ap; - SR rp; +nfsproc_readlink_2_svc(nfs_fh *ap, struct svc_req *rp) { static readlinkres ret; int uid; @@ -309,9 +297,7 @@ readres * -nfsproc_read_2(ap,rp) - readargs *ap; - SR rp; +nfsproc_read_2_svc(readargs *ap, struct svc_req *rp) { static readres ret; static char buffer[8192]; @@ -370,9 +356,7 @@ void * -nfsproc_writecache_2(ap,rp) - void *ap; - SR rp; +nfsproc_writecache_2_svc(void *ap, struct svc_req *rp) { static int ret; @@ -381,9 +365,7 @@ attrstat * -nfsproc_write_2(ap,rp) - writeargs *ap; - SR rp; +nfsproc_write_2_svc(writeargs *ap, struct svc_req *rp) { static attrstat ret; int fd; @@ -442,9 +424,7 @@ diropres * -nfsproc_create_2(ap,rp) - createargs *ap; - SR rp; +nfsproc_create_2_svc(createargs *ap, struct svc_req *rp) { static diropres ret; static nfs_fh handle; @@ -545,9 +525,7 @@ nfsstat * -nfsproc_remove_2(ap,rp) - diropargs *ap; - SR rp; +nfsproc_remove_2_svc(diropargs *ap, struct svc_req *rp) { static nfsstat ret; char *s; @@ -587,9 +565,7 @@ nfsstat * -nfsproc_rename_2(ap,rp) - renameargs *ap; - SR rp; +nfsproc_rename_2_svc(renameargs *ap, struct svc_req *rp) { static nfsstat ret; int uid; @@ -643,9 +619,7 @@ nfsstat * -nfsproc_link_2(ap,rp) - linkargs *ap; - SR rp; +nfsproc_link_2_svc(linkargs *ap, struct svc_req *rp) { static nfsstat ret; int uid; @@ -694,9 +668,7 @@ nfsstat * -nfsproc_symlink_2(ap,rp) - symlinkargs *ap; - SR rp; +nfsproc_symlink_2_svc(symlinkargs *ap, struct svc_req *rp) { static nfsstat ret; int uid; @@ -743,9 +715,7 @@ } diropres * -nfsproc_mkdir_2(ap,rp) - createargs *ap; - SR rp; +nfsproc_mkdir_2_svc(createargs *ap, struct svc_req *rp) { static diropres ret; nfs_fh handle; @@ -817,9 +787,7 @@ nfsstat * -nfsproc_rmdir_2(ap,rp) - diropargs *ap; - SR rp; +nfsproc_rmdir_2_svc(diropargs *ap, struct svc_req *rp) { static nfsstat ret; char *s; @@ -864,9 +832,7 @@ /* #define cfsclosedir(x) fhclosedir(x) */ readdirres * -nfsproc_readdir_2(ap,rp) - readdirargs *ap; - SR rp; +nfsproc_readdir_2_svc(readdirargs *ap, struct svc_req *rp) { static readdirres ret; int uid; @@ -991,9 +957,7 @@ } statfsres * -nfsproc_statfs_2(ap,rp) - nfs_fh *ap; - SR rp; +nfsproc_statfs_2_svc(nfs_fh *ap, struct svc_req *rp) { static statfsres ret; --- cfs-1.3.3.orig/cmkdir.c +++ cfs-1.3.3/cmkdir.c @@ -18,6 +18,10 @@ /* * client cfs mkdir - 1.3.2 */ +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include <stdio.h> #include <rpc/rpc.h> #include <sys/time.h> @@ -50,6 +54,7 @@ unsigned char ek1[128]; unsigned int l; int keycheck=1; + int rfd; /* File descriptor for /dev/random.*/ while (--argc && (**++argv == \'-\')) { for (flg= ++*argv; *flg; ++flg) @@ -131,6 +136,11 @@ if (smsize != LARGESMSIZE) sprintf(pw,\"%s%d\",pword,smsize); k.cipher=ciph; + rfd = open(\"/dev/random\", O_RDONLY); + if (rfd < 0) { + perror (\"/dev/random\"); + exit (1); + } if (cfmt==0) { if (old_pwcrunch(pw,&k)!=0) { fprintf(stderr,\"Invalid key\\n\"); @@ -145,7 +155,13 @@ /* now we xor in some truerand bytes for good measure */ bcopy(&k,ekey,32); /* assumes key material < 32 bytes */ for (i=0; i<32; i++) { - ekey[i] ^= randbyte(); + char b; /* Random byte */ + if (1 != read (rfd, &b, 1)) + { + perror (\"/dev/random read 1\"); + exit (1); + } + ekey[i] ^= b; } encrypt_key(&k,ekey); bcopy(ekey,ek1,32); @@ -159,7 +175,12 @@ sprintf(path,\"%s/...\",argv[0]); strcpy(str,\"qua!\"); /* now randomize the end of str.. */ - r = trand32(); + if (sizeof (r) != read (rfd, &r, sizeof(r))) + { + perror (\"/dev/random read long\"); + exit (1); + } + (void) close (rfd); for (i=0; i<4; i++) str[i+4]=(r<<(i*8))&0377; copykey(&k,&kt);