Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 1 | From: Ricardo Cerqueira <rmcc@clix.pt> |
| 2 | |
| 3 | A patch to cause sshd to chroot when it encounters the magic token |
| 4 | '/./' in a users home directory. The directory portion before the |
| 5 | token is the directory to chroot() to, the portion after the |
| 6 | token is the user's home directory relative to the new root. |
| 7 | |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 8 | Index: session.c |
| 9 | =================================================================== |
| 10 | RCS file: /var/cvs/openssh/session.c,v |
| 11 | retrieving revision 1.4 |
| 12 | diff -u -r1.4 session.c |
| 13 | --- session.c 2000/04/16 02:31:51 1.4 |
| 14 | +++ session.c 2000/04/16 02:47:55 |
| 15 | @@ -27,6 +27,8 @@ |
| 16 | #include "ssh2.h" |
| 17 | #include "auth.h" |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 18 | |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 19 | +#define CHROOT |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 20 | + |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 21 | /* types */ |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 22 | |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 23 | #define TTYSZ 64 |
| 24 | @@ -783,6 +785,10 @@ |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 25 | extern char **environ; |
| 26 | struct stat st; |
| 27 | char *argv[10]; |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 28 | +#ifdef CHROOT |
| 29 | + char *user_dir; |
| 30 | + char *new_root; |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 31 | +#endif /* CHROOT */ |
| 32 | |
| 33 | #ifndef USE_PAM /* pam_nologin handles this */ |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 34 | f = fopen("/etc/nologin", "r"); |
| 35 | @@ -799,6 +805,26 @@ |
| 36 | /* Set login name in the kernel. */ |
| 37 | if (setlogin(pw->pw_name) < 0) |
| 38 | error("setlogin failed: %s", strerror(errno)); |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 39 | + |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 40 | +#ifdef CHROOT |
| 41 | + user_dir = xstrdup(pw->pw_dir); |
| 42 | + new_root = user_dir + 1; |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 43 | + |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 44 | + while((new_root = strchr(new_root, '.')) != NULL) { |
| 45 | + new_root--; |
| 46 | + if(strncmp(new_root, "/./", 3) == 0) { |
| 47 | + *new_root = '\0'; |
| 48 | + new_root += 2; |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 49 | + |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 50 | + if(chroot(user_dir) != 0) |
| 51 | + fatal("Couldn't chroot to user directory %s", user_dir); |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 52 | + |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 53 | + pw->pw_dir = new_root; |
| 54 | + break; |
| 55 | + } |
| 56 | + new_root += 2; |
| 57 | + } |
Damien Miller | 8b1c22b | 2000-03-15 12:13:01 +1100 | [diff] [blame] | 58 | +#endif /* CHROOT */ |
| 59 | |
Damien Miller | dd034da | 2000-04-16 12:50:52 +1000 | [diff] [blame] | 60 | /* Set uid, gid, and groups. */ |
| 61 | /* Login(1) does this as well, and it needs uid 0 for the "-h" |