From: Ram <linuxram@us.ibm.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: jamie@shareable.org, ericvh@gmail.com, 7eggert@gmx.de,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
smfrench@austin.rr.com, hch@infradead.org
Subject: Re: [RCF] [PATCH] unprivileged mount/umount
Date: Thu, 12 May 2005 18:10:20 -0700 [thread overview]
Message-ID: <1115946620.6248.299.camel@localhost> (raw)
In-Reply-To: <E1DWIms-0005nC-00@dorka.pomaz.szeredi.hu>
On Thu, 2005-05-12 at 11:51, Miklos Szeredi wrote:
> > > I'm not sure passing directory file descriptors is the right semantic
> > > we want - but at least it provides a point of explicit control (in
> > > much the same way as a bind). Are you sure the clone + open("/") +
> > > pass-to-parent scenario you allows the parent to traverse the child's
> > > private name space through that fd?
> >
> > Pretty sure.
>
> Yup. Attached a little program that can be used to try this out. It
> creates a new namespace in the child, does a bind mount (so the
> namespaces can be differentiated), then sends the file descriptor of
> "/" to the parent. The parent does fchdir(fd), then starts a shell.
> So the result is that CWD is under the child namespace, while root is
> under the initial namespace.
>
r u sure, this program works? Sorry if I am saying something dumb here.
Correct me. When a file descriptor is sent from one process to other,
arn't they referring to different files in each of the processes.
fd=5 may be pointing to file 'xyz' in parent process,
where as fd=5 will be pointing to 'abc' in the child process.
This program did not work for me, and I was wondering if adding
CLONE_FILES in clone() would help. Because that would make sure
that both
the processes share the same file descriptor. It did not work too.
What am I understanding wrong?
In any case my opinion is if this program works than the hole should
be closed instead of exploting it to access different namespace. I
know Jamie is going to pounce at me. ;)
RP
> I also tried bind mounting from the child's namespace to the parent's,
> and that works too. But the new mount's mnt_namespace is copied from
> the old, which makes the mount un-removable. This is most likely not
> intentional, IOW a bug.
>
> Miklos
>
> === newns.c =========================================================
> #define _GNU_SOURCE
>
> #include <stdio.h>
> #include <unistd.h>
> #include <stdlib.h>
> #include <signal.h>
> #include <sched.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <unistd.h>
> #include <sys/un.h>
> #include <sys/socket.h>
>
> static int socks[2];
>
> static int send_fd(int sock_fd, int fd)
> {
> int retval;
> struct msghdr msg;
> struct cmsghdr *p_cmsg;
> struct iovec vec;
> char cmsgbuf[CMSG_SPACE(sizeof(fd))];
> int *p_fds;
> char sendchar = 0;
>
> msg.msg_control = cmsgbuf;
> msg.msg_controllen = sizeof(cmsgbuf);
> p_cmsg = CMSG_FIRSTHDR(&msg);
> p_cmsg->cmsg_level = SOL_SOCKET;
> p_cmsg->cmsg_type = SCM_RIGHTS;
> p_cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
> p_fds = (int *) CMSG_DATA(p_cmsg);
> *p_fds = fd;
> msg.msg_controllen = p_cmsg->cmsg_len;
> msg.msg_name = NULL;
> msg.msg_namelen = 0;
> msg.msg_iov = &vec;
> msg.msg_iovlen = 1;
> msg.msg_flags = 0;
> /* "To pass file descriptors or credentials you need to send/read at
> * least one byte" (man 7 unix) */
> vec.iov_base = &sendchar;
> vec.iov_len = sizeof(sendchar);
> while ((retval = sendmsg(sock_fd, &msg, 0)) == -1 && errno == EINTR);
> if (retval != 1) {
> perror("sending file descriptor");
> return -1;
> }
> return 0;
> }
>
> static int receive_fd(int fd)
> {
> struct msghdr msg;
> struct iovec iov;
> char buf[1];
> int rv;
> int connfd = -1;
> char ccmsg[CMSG_SPACE(sizeof(connfd))];
> struct cmsghdr *cmsg;
>
> iov.iov_base = buf;
> iov.iov_len = 1;
>
> msg.msg_name = 0;
> msg.msg_namelen = 0;
> msg.msg_iov = &iov;
> msg.msg_iovlen = 1;
> /* old BSD implementations should use msg_accrights instead of
> * msg_control; the interface is different. */
> msg.msg_control = ccmsg;
> msg.msg_controllen = sizeof(ccmsg);
>
> while(((rv = recvmsg(fd, &msg, 0)) == -1) && errno == EINTR);
> if (rv == -1) {
> perror("recvmsg");
> return -1;
> }
> if(!rv) {
> /* EOF */
> return -1;
> }
>
> cmsg = CMSG_FIRSTHDR(&msg);
> if (!cmsg->cmsg_type == SCM_RIGHTS) {
> fprintf(stderr, "got control message of unknown type %d\n",
> cmsg->cmsg_type);
> return -1;
> }
> return *(int*)CMSG_DATA(cmsg);
> }
>
> int childfn(void *p)
> {
> int fd;
>
> (void) p;
> mkdir("/tmp/clonetest", 755);
> mkdir("/tmp/clonetest/dir1", 755);
> mkdir("/tmp/clonetest/dir1/subdir1", 755);
> mkdir("/tmp/clonetest/mnt", 755);
> system("mount --bind /tmp/clonetest/dir1 /tmp/clonetest/mnt");
> fd = open("/", O_RDONLY | O_DIRECTORY);
> send_fd(socks[0], fd);
> sleep(1000);
> return 1;
> }
>
> int main()
> {
> char buf[10000];
> pid_t pid;
> int res;
> int childfd;
>
> res = socketpair(AF_UNIX, SOCK_STREAM, 0, socks);
> if (res == -1) {
> perror("socketpair");
> return 1;
> }
>
> pid = clone(childfn, buf+5000, CLONE_NEWNS | SIGCHLD, NULL);
> if ((int) pid == -1) {
> perror("clone");
> exit(1);
> }
>
> childfd = receive_fd(socks[1]);
> res = fchdir(childfd);
> if (res == -1) {
> perror("fchdir");
> return 1;
> }
> execl("/bin/bash", "/bin/bash", NULL);
>
> return 0;
> }
next prev parent reply other threads:[~2005-05-13 1:19 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <406SQ-5P9-5@gated-at.bofh.it>
[not found] ` <40rNB-6p8-3@gated-at.bofh.it>
[not found] ` <40t37-7ol-5@gated-at.bofh.it>
[not found] ` <42VeB-8hG-3@gated-at.bofh.it>
[not found] ` <42WNo-1eJ-17@gated-at.bofh.it>
2005-05-11 16:41 ` [RCF] [PATCH] unprivileged mount/umount Bodo Eggert <harvested.in.lkml@posting.7eggert.dyndns.org>
2005-05-11 17:07 ` Jamie Lokier
2005-05-11 18:49 ` Miklos Szeredi
2005-05-11 19:05 ` serue
2005-05-11 19:46 ` Bodo Eggert
2005-05-11 20:40 ` Miklos Szeredi
2005-05-11 21:11 ` Jamie Lokier
2005-05-12 3:05 ` serue
2005-05-11 19:35 ` Ram
2005-05-11 20:31 ` Miklos Szeredi
2005-05-11 21:28 ` Jamie Lokier
2005-05-11 22:42 ` Ram
2005-05-11 22:58 ` Eric Van Hensbergen
2005-05-12 1:02 ` Jamie Lokier
2005-05-12 2:18 ` Eric Van Hensbergen
2005-05-12 6:45 ` Jamie Lokier
2005-05-12 13:23 ` Eric Van Hensbergen
2005-05-12 13:47 ` serue
2005-05-12 15:16 ` Jamie Lokier
2005-05-12 12:51 ` serue
2005-05-12 18:51 ` Miklos Szeredi
2005-05-12 19:56 ` Jamie Lokier
2005-05-13 8:55 ` Miklos Szeredi
2005-05-13 1:10 ` Ram [this message]
2005-05-13 6:06 ` Miklos Szeredi
2005-05-13 7:25 ` Ram
2005-05-13 8:59 ` Ram
2005-05-13 9:10 ` Miklos Szeredi
2005-05-13 16:53 ` Ram
2005-05-13 17:14 ` Miklos Szeredi
2005-05-13 18:44 ` Alan Cox
2005-05-13 20:56 ` Bryan Henderson
2005-05-12 0:59 ` Jamie Lokier
2005-05-13 6:41 ` Ram
2005-05-11 21:09 ` Jamie Lokier
2005-05-11 21:20 ` Miklos Szeredi
2005-05-11 21:32 ` Jamie Lokier
2005-05-11 19:32 ` Bodo Eggert
2005-05-11 21:23 ` Jamie Lokier
2005-05-11 21:34 ` Miklos Szeredi
2005-05-11 21:36 ` Jamie Lokier
2005-05-12 3:08 ` serue
2005-05-03 14:31 Miklos Szeredi
2005-05-03 17:30 ` Bill Davidsen
2005-05-04 13:08 ` Eric Van Hensbergen
2005-05-04 14:21 ` Miklos Szeredi
2005-05-04 14:51 ` Eric Van Hensbergen
2005-05-04 15:21 ` Miklos Szeredi
2005-05-11 8:51 ` Christoph Hellwig
2005-05-11 10:31 ` Miklos Szeredi
2005-05-12 21:08 ` Bryan Henderson
2005-05-13 5:47 ` Miklos Szeredi
2005-05-13 7:19 ` Jan Hudec
2005-05-13 8:33 ` Miklos Szeredi
2005-05-13 23:09 ` Bryan Henderson
2005-05-14 6:58 ` Miklos Szeredi
2005-05-16 18:35 ` Bryan Henderson
2005-05-14 11:49 ` Jamie Lokier
2005-05-04 13:47 ` Martin Waitz
2005-05-04 14:34 ` Miklos Szeredi
2005-05-11 8:53 ` Christoph Hellwig
2005-05-11 8:48 ` Christoph Hellwig
2005-05-11 10:20 ` Miklos Szeredi
2005-05-16 9:34 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1115946620.6248.299.camel@localhost \
--to=linuxram@us.ibm.com \
--cc=7eggert@gmx.de \
--cc=ericvh@gmail.com \
--cc=hch@infradead.org \
--cc=jamie@shareable.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=smfrench@austin.rr.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.