Ключевые слова:chroot, patch, (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Vitaly E.Lavrov 2:5030/580 08 Apr 99 11:09:28
Subj : chroot-в-chroot
________________________________________________________________________________
From: "Vitaly E.Lavrov" <[email protected]>
Alex Korchmar <[email protected]> wrote:
> Solar Designer <[email protected]> wrote:
> SD> нужен именно root (в wu.ftpd он, конечно, и есть), тогда как для ptrace
> SD> достаточно, чтобы вне chroot'а было что-то под тем же UID'ом (правда,
> т.е. на самом-то деле нужен опять root, поскольку все не-рутовые демоны
> норовят (и в том числе по этой причине) запускать от специального юзера,
> а не от одного nobody на всю систему.
> SD> А так, да, года два назад я о возможности chroot-в-chroot не подумал.
> SD> (Прямо "cd ..", как ты сказал, при правильно поставленном chroot'е,
> я, естественно, пошутил.
> Исправлять-то этот маразм кто-нибудь собирается?
Я у себя такую заплатку поставил.Идея такова - из указанного fd должен
быть доступен корень процесса. Hу и если после chroot() cwd указывает
не туда куда надо, то его насильно устанавливают == root
---------------
- --- linux-2.2.1/fs/open.c Mon Mar 1 22:16:36 1999
+++ linux-2.2.3/fs/open.c Mon Mar 29 22:40:09 1999
@@ -364,7 +364,10 @@
goto out_putf;
if (!(inode = dentry->d_inode))
goto out_putf;
-
+ if(d_rootpath(dentry)) {
+ error = -EBADF;
+ goto out_putf;
+ }
error = -ENOTDIR;
if (!S_ISDIR(inode->i_mode))
goto out_putf;
@@ -414,7 +417,12 @@
current->fs->root = dentry;
dentry = tmp;
error = 0;
-
+ if (d_rootpath(current->fs->pwd)) {
+ struct dentry *tmp1 = current->fs->pwd;
+ current->fs->pwd = dget(current->fs->root);
+ dput(tmp1);
+ printk(__FUNCTION__":pid %d: pwd not valid!\n",current->pid);
+ }
dput_and_out:
dput(dentry);
out:
- --- linux1/fs/dcache.c Sun Jan 31 00:48:28 1999
+++ linux/fs/dcache.c Mon Mar 29 20:46:56 1999
@@ -787,6 +788,27 @@
dentry = parent;
}
return retval;
+}
+int d_rootpath(struct dentry *dentry)
+{
+ struct dentry * root = current->fs->root;
+
+ if (dentry->d_parent != dentry && list_empty(&dentry->d_hash)) {
+ return 1;
+ }
+
+ for (;;) {
+ struct dentry * parent;
+
+ if (dentry == root)
+ return 0;
+ dentry = dentry->d_covers;
+ parent = dentry->d_parent;
+ if (dentry == parent)
+ return 1;
+ dentry = parent;
+ }
+ return 1;
}
/*
- --- linux1/include/linux/dcache.h Sun Jan 31 00:47:53 1999
+++ linux/include/linux/dcache.h Mon Mar 29 20:46:40 1999
@@ -175,6 +175,7 @@
/* write full pathname into buffer and return start of pathname */
extern char * d_path(struct dentry * entry, char * buf, int buflen);
+extern int d_rootpath(struct dentry * entry);
/* Allocation counts.. */
static __inline__ struct dentry * dget(struct dentry *dentry)
-------------------
Виталий
.
--- ifmail v.2.14 * Origin: SPb State University of Aerospace Instrumentati (2:5030/580@fidonet)