O diretório de trabalho atual e a raiz são redefinidos para o sistema de arquivos raiz do namespace de montagem inserido.
Por exemplo, testei que posso escapar de chroot
executando nsenter -m --target $$
.
(Lembrete: chroot
é fácil de escapar quando você ainda é root. man chroot
documenta a maneira mais conhecida de fazer isso).
Fonte
static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns)
{
struct fs_struct *fs = current->fs;
Nota: current
significa a tarefa atual - o segmento / processo atual.
->fs
serão os dados do sistema de arquivos dessa tarefa - isso é compartilhado entre tarefas que são encadeamentos dentro do mesmo processo. Por exemplo. você verá abaixo que mudar o diretório de trabalho é uma operação em ->fs
.
Por exemplo Alterar o diretório de trabalho afeta todos os threads do mesmo processo. Threads compatíveis com POSIX como este são implementados usando o sinalizador CLONE_FS do clone ().
struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns;
struct path root;
int err;
...
/* Find the root */
err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt,
"/", LOOKUP_DOWN, &root);
aqui está a linha em questão:
/* Update the pwd and root */
set_fs_pwd(fs, &root);
set_fs_root(fs, &root);
...
}
...
const struct proc_ns_operations mntns_operations = {
.name = "mnt",
.type = CLONE_NEWNS,
.get = mntns_get,
.put = mntns_put,
.install = mntns_install,
.owner = mntns_owner,
};