[PATCH] sftp-server (secure) chroot patch, 3.7.1p2 update
Magnus F
magnus at mandarin.nu
Wed Oct 1 04:00:19 EST 2003
Is it ok now? Must've been my webmail that added those slashes.
--- openssh-3.7.1p2/sftp-server.c.org 2003-08-22 01:34:41.000000000 +0200
+++ openssh-3.7.1p2/sftp-server.c 2003-09-30 17:22:43.730402000 +0200
@@ -24,6 +24,7 @@
#include "includes.h"
RCSID("$OpenBSD: sftp-server.c,v 1.43 2003/06/25 22:39:36 miod Exp $");
+#define CHROOT
#include "buffer.h"
#include "bufaux.h"
#include "getput.h"
@@ -33,6 +34,15 @@
#include "sftp.h"
#include "sftp-common.h"
+#ifdef CHROOT
+#include "uidswap.h"
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <unistd.h>
+#endif /* CHROOT */
+
/* helper */
#define get_int64() buffer_get_int64(&iqueue);
#define get_int() buffer_get_int(&iqueue);
@@ -62,6 +72,49 @@
Attrib attrib;
};
+#ifdef CHROOT
+static void
+chroot_init(void)
+{
+ struct passwd *pw;
+ struct stat st;
+
+ /* Sanity checking before chroot */
+ if ((pw = getpwuid(getuid())) == NULL)
+ fatal("getpwuid failed for %u", (u_int)pw->pw_uid );
+
+ /* Sets passwd pointer to null */
+ memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));
+ endpwent();
+
+ if (geteuid() != 0)
+ fatal("must be SUID root to use chroot feature");
+
+ if ((stat(pw->pw_dir, &st)) == -1)
+ fatal("cannot stat chroot directory %s: %s", pw->pw_dir,
strerror(errno));
+
+ if (!S_ISDIR(st.st_mode))
+ fatal("%s is not a directory: %s", pw->pw_dir, strerror(errno));
+
+ /* Drop our privileges */
+ debug3("chroot user:group %u:%u", (u_int)pw->pw_uid, (u_int)pw->pw_gid);
+
+ /* Change our root directory */
+ if (chroot(pw->pw_dir) == -1)
+ fatal("chroot(\"%s\"): %s", pw->pw_dir, strerror(errno));
+
+ /* Change dir to prevent chroot break */
+ if (chdir("/") == -1)
+ fatal("chdir(\"/\"): %s", strerror(errno));
+
+ if (setgid(pw->pw_gid) < 0)
+ fatal("setgid failed for %u", (u_int)pw->pw_gid );
+
+ permanently_set_uid(pw);
+
+}
+#endif /* CHROOT */
+
static int
errno_to_portable(int unixerrno)
{
@@ -1028,15 +1081,19 @@
int in, out, max;
ssize_t len, olen, set_size;
+#ifdef DEBUG_SFTP_SERVER
+ log_init("sftp-server", SYSLOG_LEVEL_DEBUG1, SYSLOG_FACILITY_AUTH, 0);
+#endif
+
+#ifdef CHROOT
+ chroot_init();
+#endif
+
/* XXX should use getopt */
__progname = ssh_get_progname(av[0]);
handle_init();
-#ifdef DEBUG_SFTP_SERVER
- log_init("sftp-server", SYSLOG_LEVEL_DEBUG1, SYSLOG_FACILITY_AUTH, 0);
-#endif
-
in = dup(STDIN_FILENO);
out = dup(STDOUT_FILENO);
EOF
----- Original Message -----
From: "Ben Lindstrom" <mouring at etoh.eviladmin.org>
To: <magnus at mandarin.nu>
Cc: <openssh-unix-dev at mindrot.org>
Sent: Tuesday, September 30, 2003 5:57 PM
Subject: Re: [PATCH] sftp-server (secure) chroot patch, 3.7.1p2 update
>
>
> On Tue, 30 Sep 2003 magnus at mandarin.nu wrote:
>
> > Hello all,
> >
> > Here is an updated patch. I published the original patch published on
> > august 16.
> >
> > --- openssh-3.7.1p2/sftp-server.c.org 2003-08-22 01:34:41.000000000
> > +0200
> > +++ openssh-3.7.1p2/sftp-server.c 2003-09-30 17:22:43.730402000 +0200
> > @@ -24,6 +24,7 @@
> > #include \"includes.h\"
> ^^^^^^^^^^^^^
>
> Your patch is corrupted.
>
> - Ben
>
>
More information about the openssh-unix-dev
mailing list