Setuid Sandbox主要基于Linux Kernel所提供的安全机制来实现。简单地说,就是利用 random uid/gid + chroot() + capability 来达到限制不可信进程的访问权限。Setuid Sandbox的设计主要考虑以下几方面:

1. Setuid

Linux中每个进程都会有一个uid,uid=0则为root用户进程(privileged),uid>0则为普通用户进程(unprivileged)。不同uid进程之间(不包括root进程)是相互隔离的,各自都有自己独立的权限,互不干扰。而root进程具有特权,它能干任何事情。Linux uid/gid机制主要是用于进程的权限隔离。如果你打算执行不可信的程序,那么你可以在启动该程序时为其分配一个random uid。一个可能的执行流程如下:

fork() -> setuid() -> {设置相关的进程资源限制, eg, RLIMIT_NPROC (0,0)} -> execve()

注意,setuid()只能由root权限(或拥有 CAP_SETUID capability的普通用户权限)才能成功调用,所以这个执行流程需要借助某个拥有root权限的helper程序。比如,将helper程序设置为setuid root。

2. Chroot

Chroot是Linux kernel提供的另一个安全功能,它用于修改进程的根目录。比如执行chroot("/tmp/sandbox/1/")则可以设置当前进程的根目录为"/tmp/sandbox/1/",那么该进程的文件操作将被限制在"/tmp/sandbox/1/"中。注意,chroot()只能由root权限(或拥有CAP_SYS_CHROOT capability的普通用户权限)才能成功调用。也许你马上会想到按如下方式修改上面的执行流程:

fork() ->chroot() -> setuid() -> {...} -> execve(),

但注意这样做是行不通的,因为在chroot()之后,execve()本要执行的binary文件已经不可用了(进程的根目录已经被重定位了)。一个解决此问题的简单方法如下:

(1) helper创建一个子进程H,注意要用clone()和CLONE_FS,使得helper和H可以共享根目录、当前目录、等等;
(2) helper降权后执行execve("worker");
(3) worker(原helper进程)请求H去执行chroot();
(4) H执行chroot(),新的根目录会对H和worker同时生效。
(5) H退出。

这个方法工作的前提是Helper需要设置RLIMIT_NOFILE为(0,0),并且对于不可信的Worker进程来说,在执行第4步之前应是可控的。

此外,对于Helper程序来说,由于它是以root身份运行,那么就可能会成为攻击点,即存在所谓的 "Confused Deputy Problem"。这个问题是说,因为Helper进程是root身份运行,它能干所有特权操作;而实际我们在设计上是希望它只能做两件事,即setuid和chroot,不希望它有更多的特权。一个进程的特权太多了,就会成为坏人攻击的焦点,甚至有时是在无知的情况下,不经意地就帮坏人干了坏事。为了解决这个问题,我们就可以在设计上引入Linux Capability机制。

3. Linux Capability

Linux支持Capability的主要目的是细化root的特权,使一个进程能够以“最小权限原则”去执行任务。比如拿ping程序来说,它需要使用原始套接字(raw_sockets),如果没有Capability,那么它就需要使用root特权才能运行;如果有了Capability机制,由于该程序只需要一个CAP_NET_RAW的Capability即可运行,那么根据最小权限原则,该程序运行时可以丢弃所有多余的Capability,以防止被误用或被攻击。所以,Capability机制可以将root特权进行很好的细分,当前kernel(2.6.18)已支持30多种不同的Capability。注意在之前的kernel实现中,Capability只能由root进程持有,非root进程是不能保持任何Capability的。但是在2.6.24及以上的kernel版本中一个普通用户进程也将可以持有capability。

小结

Setuid Sandbox实现起来比较简单,无需修改Kernel,对线上的生产系统来说没有什么负面影响,在一定程度上可以用于隔离不可信代码的运行,目前它已被用作Google Chromium系统的隔离屏障之一。由于它完全依赖于kernel所提供的安全机制,除非攻击者能找到kernel的0-day漏洞并通过攻击获得root权限,否则setuid sandbox所提供的安全隔离是可以保证的。

//欢迎技术交流!seccloud@126.com

Linux沙箱技术 - Setuid Sandbox相关推荐

  1. linux沙箱隔离_Linux沙箱技术介绍

    在计算机安全领域,沙箱(Sandbox)是一种程序的隔离运行机制,其目的是限制不可信进程的权限.沙箱技术经常被用于执行未经测试的或不可信的客户程序.为了避免不可信程序可能破坏其它程序的运行,沙箱技术通 ...

  2. Sandbox——沙箱技术,来自chromium开发文档

    沙箱技术早在Windows2000的时候就已经出现了,但是因为大部分的人都不会接触到也没有机会应用这种技术,导致大部分的人根本就对这个没有印象.而在一本讲到沙箱技术的书上,上面的翻译是'沙框',当然这 ...

  3. 一文说透安全沙箱技术

    在数字经济的东风中,数据安全至关重要.目前已经颁布了包括<数据安全法>.<个人信息保护法>和<数据安全管理办法>在内的国家政策,以促进整个数据要素的发展. 而近年来 ...

  4. 什么是安全沙箱技术?如何评估应用程序安全性?

    近年来,随着移动应用程序的普及和小程序技术的崛起,安全沙箱技术也逐渐受到了广泛的关注和应用,尤其是前端安全沙箱技术(桌面操作系统,浏览器,App,小程序等)快速实践和推进.它们都在不同程度上采用了封闭 ...

  5. linux 中级 教程pdf,Linux初中级学习者指导Linux操作系统技术合集.pdf

    红联的个人空间 Linux操作系统技术合集 作者:红联 Linux操作系统技术合 集 ─────Linux初, 中级学习者教程 Linux有些神奇,有人就这么说,Linux有些意思,我想尝尝,尚末安装 ...

  6. Android系统篇之—-Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

    一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题 ...

  7. 什么是“沙箱”技术?

    jueee 2009-01-14 12:23:13 221.2.147.* 所谓的沙箱技术,其实就是Sandboxie,360仅仅是挂名,这项核心技术并不是360自主研发的.更加不是首创,因为Sand ...

  8. Android系统篇之----Android中的run-as命令引出升降权限的安全问题 Linux中的setuid和se

    一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题 ...

  9. 预测汽车级Linux专业技术的需求

    预测汽车级Linux专业技术的需求 Anticipating need for Automotive Grade Linux expertise 在听了多年汽车级Linux(AGL)及其所有潜力之后, ...

最新文章

  1. 一文读懂产业互联网的前世今生!
  2. Jquery 获取对象的几种方式介绍
  3. 电脑关机慢是什么原因_为什么电脑无法关机?电脑无法正常关机的解决方案
  4. C++多线程编程(3) 异步操作类 std::future std::promise std::async
  5. Hadoop社区正式支持腾讯云COS,全球大数据开发者将无缝使用中国云存储
  6. ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
  7. 从零开始实现霍夫变换检测图像直线算法 python
  8. oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...
  9. 来电振铃时按音量键静音
  10. 在Code First中自动创建Entity模型
  11. 【冬瓜哥论文】浅析固态介质在存储系统中的应用方式
  12. PyTorch源码解读之torchvision.models
  13. 数据库优化——慢查询MySQL定位优化流程
  14. C++中UTF-8, Unicode, GB2312转换及有无BOM相关问题
  15. 日常无用功之windows把整个D盘改成了桌面还原
  16. 调度增益控制基础概念Gain Scheduling Basics学习笔记
  17. useSSL=false和true的区别
  18. 网页股票期货历史数据(API)
  19. Linux下编译Opencv和contrib
  20. idea2018 2020_新生2020级数字艺术系学生作品展

热门文章

  1. 因子分析 二元logistic回归
  2. DataGrip数据库配置导出步骤
  3. 共享办公室租赁和传统写字楼之间,如何抉择
  4. 数字信号处理7——点到向量的距离
  5. 点到线段的最短距离算法
  6. NoSQL与SQL:选择数据管理解决方案
  7. java 连接不上数据库
  8. 06 ,拉格朗日函数 :
  9. 【CAN】CAN总线要点
  10. Java序列化 ObjectInputStream源码解析