当前位置: 首页 > news >正文

chroot 命令小记

什么是 chroot

chroot 最早是作为系统调用引入 1979 年的 Unix V7 系统,目的是为了将当前进程及其子进程的 root 目录重定向到某个指定目录。1982 年,chroot 功能被加入到 BSD 中,后经 20 多年,FreeBSD 团队引入虚拟化技术的概念,在原本的 chroot 机制上,开发了新的 jail 机制。

简单来说:一个正在运行的进程经过 chroot 操作后,其根目录将被显式映射为某个指定目录,它将不能够对该指定目录之外的文件进行访问动作。这是一种非常简单的资源隔离化操作,类似于现在 Linux 的 Mount Namespace 功能。当年 Docker 刚开源的时候,有个人就利用 Linux 下 chroot 命令,用 100 多行的 Bash 代码实现了一个模拟版的 Docker。

chroot 的使用

在现今的 Linux 上,chroot 既是一个 CLI 工具(chroot(8)),又是一个系统调用(chroot(2))。

  • 使用 chroot(8) 命令

    我们可以利用 Linux 下的 chroot(8) 命令来创建出一种类似于进入某个隔离容器内部的效果。

    chroot(8) 的用法很简单,格式如下所示:

    chroot [OPTION] NEWROOT [COMMAND [ARGS]...]
    复制代码

    COMMAND 指的是切换 root 目录后需要执行的命令,如果没有指定,默认是 ${SHELL} -i,大部分情况是 /bin/bash。执行 chroot(8) 需要使用 root 权限。

    简单地,我们可以这样使用:

    $ sudo chroot /path/to/new/root /bin/bash
    复制代码

    下面就让我们来建造我们的监狱(jail)(备注:基于 Ubuntu 16.04)。

    1. 创建对应的新的根目录

      $ J=$HOME/jail
      $ mkdir -p $J
      $ mkdir -p $J/{bin,lib/x86_64-linux-gnu,lib64,etc,var}
      复制代码
    2. 将几个必要的命令工具 copy 到 bin/

      $ sudo cp -vf /bin/{bash,ls} $J/bin
      复制代码
    3. 将步骤 2 中可执行命令依赖的动态库 copy 到 jail/

      $ list=`ldd /bin/ls | egrep -o '/lib.*\.[0-9]'`
      $ for i in $list; do sudo cp -vf $i $J/$i; done
      
      $ list=`ldd /bin/bash | egrep -o '/lib.*\.[0-9]'`
      $ for i in $list; do sudo cp $i -vf $J/$i; done
      复制代码
    4. 执行 chroot 命令

      $ sudo chroot $J /bin/bash
      bash-4.3# ls
      bin  etc  lib  lib64  var
      bash-4.3# cd /
      bash-4.3# ls
      bin  etc  lib  lib64  var
      bash-4.3# cd ..
      bash-4.3# ls
      bin  etc  lib  lib64  var
      复制代码

      无论我们如何改变目录,其根目录都被隔离在 $J 中,执行 exit 命令可退出这一环境;

  • 使用 chroot(2) 系统调用

    chroot(2) 的原型是:

    #include <unistd.h>
    
    int chroot(const char *path);
    复制代码

    chroot() 将调用进程及其子进程的根目录指定为 path。执行该调用需要使用 root 权限。

    如以下代码所示:

    #include <stdio.h>
    #include <error.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    char *const patv[] = "/home/test/jail"; # 如上文实验所述目录
    char *const argv[] = {"/bin/bash", NULL};
    
    int
    main(void) {
        if (chroot(path) != 0) {
            perror("chroot error");
        	  exit(1);
        }
        chdir("/");                 // 忽略返回值
        execvp("/bin/bash", argv);  // 忽略返回值
        return 0;
    }
    复制代码

    编译和运行代码:

    $ gcc test_chroot.c -o test_chroot
    $ ./test_chroot # 非 root 用户执行命令
    chroot error: Operation not permitted
    $ sudo ./test_chroot
    bash-4.3#
    复制代码
  • 如何获知某个进程是否处于 chroot 监禁

    可通过查看进程的 /proc/<pid>/root 来查看对应进程是否处于 chroot 监禁中,如上文,其 chroot 下 bash 的执行进程为 15768,则有:

    $ sudo ls -ld /proc/15768/root
    lrwxrwxrwx 1 root root 0 Apr 17 22:47 /proc/15768/root -> /home/test/jail
    复制代码

    可见其根目录已经被修改为 /home/test/jail

chroot 的安全问题

chroot 机制从一开始就并非安全,存在很多安全漏洞,有不少「越狱」(jailbreak)的手段。

参考文档

  • chroot wikipedia
  • chroot(1) man pages
  • chroot(2) man pages
  • Linux / Unix: chroot Command Examples
  • How to break out of a chroot() jail

转载于:https://juejin.im/post/5ad6118651882555894a5314

相关文章:

  • Bugzilla安装问题总结-神奇
  • js 原型链(转)
  • 理解PHP中会话控制
  • LAMP架构应用实战—Apache服务介绍与安装01
  • asp.net向页面注册脚本
  • Unity 3D调用Windows打开、保存窗口、文件浏览器
  • Snapchat为Mac、Windows平台推出AR新工具,方便用户创造实景物体
  • 2003系统创建软RAID磁盘阵列完全手册
  • 如何解决临时空间暴增导致磁盘满问题?
  • 网络负载平衡
  • Linux的基本指令--目录和文件和文件属性和文件用户组
  • Hessian解析及应用(整合Spring)
  • 用Qemu运行/调试arm linux【转】
  • OpenCV 2.4+ C++ SVM文字识别
  • 深入剖析 iOS 性能优化
  • Angular数据绑定机制
  • CSS3 变换
  • If…else
  • js正则,这点儿就够用了
  • Mysql优化
  • Spring Cloud中负载均衡器概览
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 订阅Forge Viewer所有的事件
  • 前端之Sass/Scss实战笔记
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 网络应用优化——时延与带宽
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • #android不同版本废弃api,新api。
  • #Linux(帮助手册)
  • (2)Java 简介
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)logging(日志模块)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (未解决)macOS matplotlib 中文是方框
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转) 深度模型优化性能 调参
  • .chm格式文件如何阅读
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET MVC第五章、模型绑定获取表单数据
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net操作Excel出错解决
  • .net反编译的九款神器
  • .NET关于 跳过SSL中遇到的问题
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET中的Exception处理(C#)
  • [C/C++随笔] char与unsigned char区别
  • [C++]18:set和map的使用
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [GN] DP学习笔记板子