SHARE
Facebook X Pinterest WhatsApp

FreeBSD Security Advisory: FreeBSD-SA-00:02.procfs

Written By
thumbnail
Web Webster
Web Webster
Jan 28, 2000

Date: Fri, 28 Jan 2000 02:01:36 -0700 (MST)
From: FreeBSD Security Officer security-officer@FreeBSD.ORG

Subject: FreeBSD Security Advisory: FreeBSD-SA-00:02.procfs

—–BEGIN PGP SIGNED MESSAGE—–


FreeBSD-SA-00:01 Security Advisory

FreeBSD, Inc.

Topic: Old procfs hole incompletely filled

Category: core
Module: make
Announced: 2000-01-24
Affects: All versions before the correction date.
Corrected: 2000-01-20
FreeBSD only: NO

Patches:
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-00:02/procfs.patch

I. Background

procfs provides access to other processes memory spaces. This is
intended to be used in debugging and has many safeguards built into
it to prevent abuse.

II. Problem Description

In January 1997 a fatal flaw in *BSD procfs code (leading to a
local root compromise) was discussed on various security forums.
The exploit code dealt with /proc/pid/mem interface. Since then
*BSD kernels contained a simple fix which was meant to close this
hole.

Unfortunately, throughout these three years it was still
possible to abuse /proc/pid/mem in a similar, though more
complicated fashion, which could lead to local root compromise.

III. Impact

Local users can gain root access.

IV. Workaround

You can unmount /proc. In both 3.x-stable and 4.0-current this
will break truss and gcore. In 3.x-stable systems only it will
reduce the amount of information ps reports.

V. Solution

Apply the following patch

Index: sys/filedesc.h
===================================================================
RCS file: /base/FreeBSD-CVS/src/sys/sys/filedesc.h,v
retrieving revision 1.15.2.1
diff -u -r1.15.2.1 filedesc.h
--- filedesc.h      1999/08/29 16:32:22     1.15.2.1
+++ filedesc.h      2000/01/20 21:39:29
@@ -139,6 +139,7 @@
int        fsetown __P((pid_t, struct sigio **));
void       funsetown __P((struct sigio *));
void       funsetownlst __P((struct sigiolst *));
+void       setugidsafety __P((struct proc *p));
#endif

#endif
Index: kern/kern_descrip.c
===================================================================
RCS file: /base/FreeBSD-CVS/src/sys/kern/kern_descrip.c,v
retrieving revision 1.58.2.3
diff -u -r1.58.2.3 kern_descrip.c
--- kern_descrip.c  1999/11/18 08:09:08     1.58.2.3
+++ kern_descrip.c  2000/01/20 21:40:00
@@ -984,6 +984,62 @@
}

/*
+ * For setuid/setgid programs we don't want to people to use that setuidness
+ * to generate error messages which write to a file which otherwise would
+ * otherwise be off limits to the proces.
+ *
+ * This is a gross hack to plug the hole.  A better solution would involve
+ * a special vop or other form of generalized access control mechanism.  We
+ * go ahead and just reject all procfs file systems accesses as dangerous.
+ *
+ * Since setugidsafety calls this only for fd 0, 1 and 2, this check is
+ * sufficient.  We also don't for setugidness since we know we are.
+ */
+static int
+is_unsafe(struct file *fp)
+{
+   if (fp->f_type == DTYPE_VNODE &&
+       ((struct vnode *)(fp->f_data))->v_tag == VT_PROCFS)
+           return (1);
+   return (0);
+}
+
+/*
+ * Make this setguid thing safe, if at all possible.
+ */
+void
+setugidsafety(p)
+   struct proc *p;
+{
+   struct filedesc *fdp = p->p_fd;
+   struct file **fpp;
+   char *fdfp;
+   register int i;
+
+   /* Certain daemons might not have file descriptors. */
+   if (fdp == NULL)
+           return;
+
+   fpp = fdp->fd_ofiles;
+   fdfp = fdp->fd_ofileflags;
+   for (i = 0; i <= fdp->fd_lastfile; i++, fpp++, fdfp++) {
+           if (i > 2)
+                   break;
+           if (*fpp != NULL && is_unsafe(*fpp)) {
+                   if (*fdfp & UF_MAPPED)
+                           (void) munmapfd(p, i);
+                   (void) closef(*fpp, p);
+                   *fpp = NULL;
+                   *fdfp = 0;
+                   if (i < fdp->fd_freefile)
+                           fdp->fd_freefile = i;
+           }
+   }
+   while (fdp->fd_lastfile > 0 && fdp->fd_ofiles[fdp->fd_lastfile] == NULL)
+           fdp->fd_lastfile--;
+}
+
+/*
* Close any files on exec?
*/
void
Index: kern/kern_exec.c
===================================================================
RCS file: /base/FreeBSD-CVS/src/sys/kern/kern_exec.c,v
retrieving revision 1.93.2.3
diff -u -r1.93.2.3 kern_exec.c
--- kern_exec.c     1999/08/29 16:25:58     1.93.2.3
+++ kern_exec.c     2000/01/20 21:39:29
@@ -281,6 +281,7 @@
              if (attr.va_mode & VSGID)
                      p->p_ucred->cr_gid = attr.va_gid;
              setsugid(p);
+           setugidsafety(p);
      } else {
              if (p->p_ucred->cr_uid == p->p_cred->p_ruid &&
                  p->p_ucred->cr_gid == p->p_cred->p_rgid)

VI. Credits

We are republishing a heavily edited FEAR security advisory
(number 1) entitled “*BSD procfs vulnerability”. More information
about FEAR can be found at http://www.fear.pl. We would like to
thank nergal@idea.avet.com.pl for sending a preliminary version of
the advisory to us in time to correct the problem.


FreeBSD, Inc.

Web Site: http://www.freebsd.org/
Confidential contacts: security-officer@freebsd.org

Security notifications: security-notifications@freebsd.org

Security public discussion: freebsd-security@freebsd.org

PGP Key: ftp://ftp.freebsd.org/pub/FreeBSD/CERT/public_key.asc

Notice: Any patches in this document may not apply cleanly due
to modifications caused by digital signature or mailer software.
Please reference the URL listed at the top of this document for
original copies of all patches if necessary.


-----BEGIN PGP SIGNATURE-----
Version: 2.6.3ia
Charset: noconv
Comment: Processed by Mailcrypt 3.4, an Emacs/PGP interface

iQCVAwUBOJFWeFUuHi5z0oilAQHo2AP+N4GDREEmjxy6RUvt+G3cRe1Sx4yxr/Jd
q70D5Icp3JlcJgxGfWFqGGvt8yx9xMm6d57mFDltdvPKr0TY0n0bY39BJlRAto9n
gn8BJJvQ0WQ15ctOQKIsGwGJqHvA+p4qAHYFE3sUIZn6oMz5//C5OmaC7mFtrycY
TI64bNR+0F8=
=/F89
-----END PGP SIGNATURE-----

This is the moderated mailing list freebsd-announce. The list
contains announcements of new FreeBSD capabilities, important
events and project milestones. See also the FreeBSD Web pages at
http://www.freebsd.org

To Unsubscribe: send mail to majordomo@FreeBSD.org with
“unsubscribe freebsd-announce” in the body of the message

thumbnail
Web Webster

Web Webster

Web Webster has more than 20 years of writing and editorial experience in the tech sector. He’s written and edited news, demand generation, user-focused, and thought leadership content for business software solutions, consumer tech, and Linux Today, he edits and writes for a portfolio of tech industry news and analysis websites including webopedia.com, and DatabaseJournal.com.

Recommended for you...

A Thorough Approach to Improve the Privacy and Security of Your Linux PC
Damien
Oct 24, 2024
Several Russian Maintainers Removed From Linux Kernel Due To Compliance Concerns
Senthil Kumar
Oct 23, 2024
OpenSSH Splits Again: New Authentication Binary Unveiled
Bobby Borisov
Oct 16, 2024
13 Best Free and Open Source Anti-Malware Tools
webmaster
Oct 14, 2024
Linux Today Logo

LinuxToday is a trusted, contributor-driven news resource supporting all types of Linux users. Our thriving international community engages with us through social media and frequent content contributions aimed at solving problems ranging from personal computing to enterprise-level IT operations. LinuxToday serves as a home for a community that struggles to find comparable information elsewhere on the web.

Property of TechnologyAdvice. © 2025 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.