Linux下有没有沙盒工具?

224 views
Skip to first unread message

WindyWinter

unread,
Oct 3, 2012, 2:41:45 AM10/3/12
to ustc...@googlegroups.com
像Sandboxie一样的东西。有个软件不能多进程,windows的话可以用sandboxie解决,linux下用什么办法?

Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at

Guo, Jiahua

unread,
Oct 3, 2012, 4:57:17 AM10/3/12
to ustc...@googlegroups.com
伪造出以一个或多个一下的内容,应该就可以骗过去了:
环境变量
文件系统(fakeroot,fakechroot,CLONE_NEWNS,换一个uid运行程序)
pid空间(CLONE_NEWPID,换一个uid运行程序)
IPC空间(CLONE_NEWIPC)
网络(iptables,CLONE_NEWNET)

其中,CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWIPC、CLONE_NEWNET等是clone系统调用或unshare命令或unshare系统调用的相关参数。

2012/10/3 WindyWinter <wi...@ream.at>:

> -- 来自USTC LUG
> 请使用gmail订阅,不要灌水。
> 更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en

wzyboy

unread,
Oct 3, 2012, 7:47:17 AM10/3/12
to ustc...@googlegroups.com
直接用 chroot 或 schroot 不行吗?
~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/3 WindyWinter <wi...@ream.at>
-- 来自USTC LUG

Bojie Li

unread,
Oct 3, 2012, 8:12:38 AM10/3/12
to ustc...@googlegroups.com
chroot只是隔离了文件系统空间,pid空间仍然是共享的。当然,chroot之后/proc不能访问了,不能获取进程列表。Windows中一些“单例模式”的程序就是获取当前进程列表,看看有没有同名进程,来保证只有一个程序实例在运行的。我没有想到如何利用共享的pid空间来知道系统中是否有同一个进程,也就是说chroot可能已经足够了,可以试试。

此外,要在sandbox中运行的程序一定不能有root权限,否则它可以再chroot一次以跳出来。实在不行,插入一个内核模块就没有什么东西能防得住了。

http://www.bpfh.net/simes/computing/chroot-break.html

我不知道linux中是否有现成的sandbox解决方案。我觉得setuid、chroot、ptrace可以结合起来用。当然如果针对一个特定的程序,先试试setuid+chroot能不能行。

事实上相对安全的保证程序只有一个实例的方法是利用网络,每次启动时向指定的服务器发送包括MAC地址、系统时间在内的系统信息,从服务器获取token,再在软件里检查token是否正确。这样要运行多个实例,只有两种办法:(1)虚拟机(2)用反向工程修改程序的二进制文件。(确实,MAC地址可以伪造,但很难确切获知程序使用了哪些系统信息作验证)

2012/10/3 wzyboy <wzyb...@gmail.com>:

Guo, Jiahua

unread,
Oct 3, 2012, 8:16:50 AM10/3/12
to ustc...@googlegroups.com
这个和fakechroot的意思差不多(只不过没有fake)。
如果程序是通过文件系统判断是否运行了多次,那么chroot就可以骗过去。
虽然使用文件系统来判断的可能性应该比较大,但不排除有其他可能。

2012/10/3 wzyboy <wzyb...@gmail.com>:

Bojie Li

unread,
Oct 3, 2012, 9:00:36 AM10/3/12
to ustc...@googlegroups.com
2012/10/3 Guo, Jiahua <gjh...@gmail.com>:
> 如果程序是通过文件系统判断是否运行了多次,那么chroot就可以骗过去。

通过文件系统判断,会不会有这样的问题:程序启动时touch /tmp/xxx.lock,中途Segmentation
error或者进程被kill了,于是这个程序不能再启动了。
当然,可以在创建lock文件之后马上unlink,这样文件恰好能保持到进程退出的时刻。

我早先以为Windows开发者没有办法用这种文件系统特性,刚查了一下,CreateFile竟然有一个参数可以指定FILE_FLAG_DELETE_ON_CLOSE,即所有打开文件句柄关闭后删除文件;另有一个参数可以指定FILE_SHARE_DELETE,即允许这个已经打开的文件在句柄释放之前被删除或重命名。此外,刚发现WIndows的文件名竟然有保留字,在linux里建立一个以COM1命名的文件或目录,到Windows里既打不开又删不掉。

Guo, Jiahua

unread,
Oct 3, 2012, 9:03:02 AM10/3/12
to ustc...@googlegroups.com
2012/10/3 Bojie Li <boj...@gmail.com>:
erase .\COM1 呢?

Bojie Li

unread,
Oct 3, 2012, 9:55:20 AM10/3/12
to ustc...@googlegroups.com
2012/10/3 Guo, Jiahua <gjh...@gmail.com>:
> 2012/10/3 Bojie Li <boj...@gmail.com>:

>> 此外,刚发现WIndows的文件名竟然有保留字,在linux里建立一个以COM1命名的文件或目录,到Windows里既打不开又删不掉。
> erase .\COM1 呢?

我在Windows 7里的实验结果:
(1)Windows资源管理器、命令行下的del和erase均提示文件名有误(文件不存在),无法打开、创建、删除COM1文件。
(2)Windows资源管理器和命令行下均可在D:\COM2\目录下创建/删除文件/目录,然而无法删除或重命名D:\COM2目录。
(3)Cygwin可以无障碍操作以保留字命名的文件和目录。
(4)写了个测试C++程序(用fopen标准库函数),用Dev-C++编译(g++.exe编译器),与Windows资源管理器的情况相同。
(5)同样的C++程序,用Cygwin里的gcc编译,可以无障碍操作。运行时会输出提示,建议使用POSIX风格路径代替Windows风格路径。
结论:
(1)保留字不是文件系统层面的,而是Windows API的限制。
(2)Cygwin是神器。

Yan Wang

unread,
Oct 3, 2012, 10:56:13 AM10/3/12
to ustc...@googlegroups.com

而且在Win98里开始->运行c:\con\con会直接蓝屏。。。(差了一个字母这种事情我会告诉你吗)

Best Regards,
Yan




2012/10/3 Bojie Li <boj...@gmail.com>

Bojie Li

unread,
Oct 3, 2012, 11:56:40 AM10/3/12
to ustc...@googlegroups.com
好吧,让我想起了前几天网上流传的一个网页让三星galaxy恢复出厂设置……非沙盒化的运行环境后患无穷啊。

Yuanchong Zhu

unread,
Oct 3, 2012, 1:31:39 PM10/3/12
to ustc...@googlegroups.com

起daemon的时候不就是利用锁文件来控制的嘛?

wzyboy

unread,
Oct 3, 2012, 10:21:05 PM10/3/12
to ustc...@googlegroups.com
这篇文章我以前查 chroot 的资料的时候看过,还是要利用一些已知漏洞的,既然已经知道如此了,那防住它也不难吧?(我是编程小白……

~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



wzyboy

unread,
Oct 3, 2012, 10:26:41 PM10/3/12
to ustc...@googlegroups.com
在 cmd.exe 里也可以建立保留字文件名的,比如 foobar.. 这样一个文件名,可以在 cmd.exe 里建立,但是在 explorer.exe 里就完全奈何不了它了。

倒是像 aux 这样的文件名,貌似是文件系统层面的,用 Linux 也无法在一块 NTFS 分区上建立。(如果我没记错的话。以前试过,现在没有 ntfs 分区,不好测试)

其实 Windows 的文件名限制最让我受不了的是半角冒号。电影名里面用冒号还是很常见的,比如 Mission: Impossilbe.mkv 这样。以前把类似这样的文件复制给同学的 NTFS 硬盘,结果她告诉我说这文件打不开,删不掉,不能重命名……没办法,只能插回我的电脑上把 : 改成 _ 才解决。

不过据说 chkdsk 能修正这个问题。

~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/3 Bojie Li <boj...@gmail.com>

Bojie Li

unread,
Oct 4, 2012, 12:55:37 AM10/4/12
to ustc...@googlegroups.com
Windows里其实可以建立保留字文件,保留字文件之所以无法访问是因为Windows文件路径有命名空间,这部分保留字直接被映射到设备去了。\\.\是设备前缀,在包括盘符的完整路径前面加上这个前缀就能访问,例如\\.\C:\COM1。在MSDN上可以查到有关Windows文件命名空间的更详细信息(昨天我查到的)。

Xilin Sun

unread,
Oct 4, 2012, 7:00:42 AM10/4/12
to ustc...@googlegroups.com
。。。错的。当然能建立……

2012/10/4 wzyboy <wzyb...@gmail.com>:


> 倒是像 aux 这样的文件名,貌似是文件系统层面的,用 Linux 也无法在一块 NTFS 分区上建立。(如果我没记错的话。以前试过,现在没有 ntfs
> 分区,不好测试)

--
May the source be with you.

wzyboy

unread,
Oct 4, 2012, 9:51:07 AM10/4/12
to ustc...@googlegroups.com
是吗?刚才开虚拟机试了下, aux, con 这样的文件名、目录名都无法建立……

~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/4 Xilin Sun <s.sn.g...@gmail.com>
。。。错的。当然能建立……

Xilin Sun

unread,
Oct 4, 2012, 9:55:18 AM10/4/12
to ustc...@googlegroups.com
你是怎么操作的…………

2012/10/4 wzyboy <wzyb...@gmail.com>:


> 是吗?刚才开虚拟机试了下, aux, con 这样的文件名、目录名都无法建立……

--

May the source be with you.

孙锡麟,SUN Xilin, undergraduate student at HKPolyU

Bojie Li

unread,
Oct 4, 2012, 10:07:41 AM10/4/12
to ustc...@googlegroups.com
mkdir \\.\C:\aux
echo test >> \\.\C:\COM1
不能建立吗?

2012/10/4 wzyboy <wzyb...@gmail.com>:

wzyboy

unread,
Oct 4, 2012, 10:26:42 AM10/4/12
to ustc...@googlegroups.com
在 explorer.exe 里是直接无法更名。在 cmd.exe 中是这样:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Sascha Weaver>mkdir con
The directory name is invalid.

C:\Documents and Settings\Sascha Weaver>mkdir aux
The directory name is invalid.
~~~~
wzyboy
Link:
http://wzyboy.im/
Twitter: @wzyboy
Chatback:
http://wzyboy.im/chat



2012/10/4 Xilin Sun <s.sn.g...@gmail.com>
你是怎么操作的…………

Xilin Sun

unread,
Oct 4, 2012, 10:29:14 AM10/4/12
to ustc...@googlegroups.com
怎么又扯到 Windows 上去了。我说的错了是说这一句 “倒是像 aux 这样的文件名,貌似是文件系统层面的,用 Linux 也无法在一块
NTFS 分区上建立。(如果我没记错的话。以前试过,现在没有 ntfs 分区,不好测试)”

On 4 October 2012 22:26, wzyboy <wzyb...@gmail.com> wrote:
> 在 explorer.exe 里是直接无法更名。在 cmd.exe 中是这样:

--

Zhang Cheng

unread,
Oct 4, 2012, 11:27:41 AM10/4/12
to ustc...@googlegroups.com
我见过的Win/Linux下常见的“单实例”程序,常用三种方法来实现。

1、lock file,这个方法比较简单,但是不够“原子”,当连续启动间隔很小时,可能会重复启动。而且文件有可能被误删除。但是不用担心一个进程创建lock文件之后意外退出的情况,一般会在lockfile里面写上当前进程的pid,第二个进程起来时,不仅会检查lockfile是否存在,还会检查其中的pid是否存在。这种隔离很方便,用chroot就可以。

2、共享内存。
3、监听一个端口。
这两种似乎都很难简单的隔离(也许我不太了解相关的方案)。
在Win下用共享内存做单一实例化比较多,在Linux下见过的用监听端口做单一实例化的比较多。

不知道楼主期望什么样的隔离效果?我敢觉最不济用openvz开个虚拟机。但用什么方案,还是得看具体需求了。


2012/10/3 Bojie Li <boj...@gmail.com>
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en



--
Cheng,
Best Regards

Guo, Jiahua

unread,
Oct 4, 2012, 12:36:17 PM10/4/12
to ustc...@googlegroups.com
2012/10/4 Zhang Cheng <steph...@gmail.com>:

> 我见过的Win/Linux下常见的“单实例”程序,常用三种方法来实现。
>
> 1、lock
> file,这个方法比较简单,但是不够“原子”,当连续启动间隔很小时,可能会重复启动。而且文件有可能被误删除。但是不用担心一个进程创建lock文件之后意外退出的情况,一般会在lockfile里面写上当前进程的pid,第二个进程起来时,不仅会检查lockfile是否存在,还会检查其中的pid是否存在。这种隔离很方便,用chroot就可以。
>
> 2、共享内存。
> 3、监听一个端口。
> 这两种似乎都很难简单的隔离(也许我不太了解相关的方案)。
> 在Win下用共享内存做单一实例化比较多,在Linux下见过的用监听端口做单一实例化的比较多。
共享内存可以通过CLONE_NEWIPC隔离
如果不需要联网,监听端口可以通过CLONE_NEWNET隔离

Zhang Cheng

unread,
Oct 4, 2012, 12:38:33 PM10/4/12
to ustc...@googlegroups.com
这个原理是啥?比如我一个程序监听了0.0.0.0:1234,另外一个进程起来发现这个ip:port已经被监听了,就拒绝启动。CLONE_NEWNET如何实现隔离?如何让两个进程监听同一个ip:port?

2012/10/5 Guo, Jiahua <gjh...@gmail.com>
如果不需要联网,监听端口可以通过CLONE_NEWNET隔离



--
Cheng,
Best Regards

Guo, Jiahua

unread,
Oct 4, 2012, 12:43:49 PM10/4/12
to ustc...@googlegroups.com
这是内核实现的,CLONE_NEWNET会产生一个新的网络空间。
在新的网络空间中,默认只有一个lo,没有其他网卡。而且这个lo和外面的lo是相互独立的。

2012/10/5 Zhang Cheng <steph...@gmail.com>:

Guo, Jiahua

unread,
Oct 4, 2012, 12:45:57 PM10/4/12
to ustc...@googlegroups.com
测试:
$ sudo unshare --net /bin/bash
# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
# ifconfig -a
lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

2012/10/5 Guo, Jiahua <gjh...@gmail.com>:

Bojie Li

unread,
Oct 4, 2012, 2:05:16 PM10/4/12
to ustc...@googlegroups.com
kernel code: include/linux/nsproxy.h, struct nsproxy
才知道linux内核有命名空间。可以用来做轻量级的虚拟化。早先只知道windows内核对每个登录session有命名空间。

刚查到cgroups,从Wikipedia看来很强大。LXC这个操作系统级虚拟化就是基于cgroups的。我觉得楼主可能需要的是一个操作系统级虚拟化工具吧,可以参看Wikipedia的“Operating
System-Level Virtualization”。

Bojie Li

unread,
Oct 5, 2012, 12:08:56 AM10/5/12
to ustc...@googlegroups.com
其实共享内存也不一定需要隔离,共享内存的一种方法是首先用ftok(path,
id)来生成一个key,然后用这个key来shmget,进而用shmctl获取共享内存区创建进程的pid。但这一切的关键是要有相同的key,如果两个进程在不同的chroot环境下,同一path对应的设备id和inode号不同,因而key也很可能不同。当然程序也可以使用hardcoded的key。

我没编过共享内存的程序,如何处理key已被占用的情况?key已被占用有两种可能,一是被其他无关进程占用(巧合),二是被另一个程序实例占用。难道要在共享内存区保存一个magic
number,然后shmat上去看看?有没有比较和谐的办法来实现这种单例模式?(不考虑tux所说的克隆IPC空间)

Bojie Li

unread,
Oct 5, 2012, 12:17:11 AM10/5/12
to ustc...@googlegroups.com
对于监听端口的方案,会不会这个端口已经被其他服务监听了,而造成误杀?端口只有几万个,概率还是不小的啊。这跟共享内存中巧合key的问题一样。难道要建立一个连接,读取几字节的magic
number才算可靠?如果要建立连接的话,程序就不能是单线程(或顺序执行模式)的了,对程序复杂度有较大的影响。

On 10/4/12, Zhang Cheng <steph...@gmail.com> wrote:

Zhang Cheng

unread,
Oct 5, 2012, 12:20:26 AM10/5/12
to ustc...@googlegroups.com

不用考虑误伤的情况。一般共享内存也用hard code作key。如果有跟其他程序误伤,那就双方协商一下改端口/key好了,不需要完全精确的控制的。

(sent from mobile device)

Bojie Li

unread,
Oct 5, 2012, 1:59:24 AM10/5/12
to ustc...@googlegroups.com
也就是说,我们自己写共享内存的程序时,也可以随意hardcode一个IPC
key,出了问题再说?IPC用的key一般也是hardcode的吗?这样说不定哪天就与一个没听说过的软件冲突了,共享的内存互相修改,问题很严重啊。

Zhang Cheng

unread,
Oct 5, 2012, 2:03:50 AM10/5/12
to ustc...@googlegroups.com

冲突的概率非常小,除非你故意想要根别人冲突,否则你在key里面随便加个东西,例如加个自己的邮箱,或者随便生成个uuid就行了。

(sent from mobile device)

Bojie Li

unread,
Oct 5, 2012, 4:53:46 AM10/5/12
to ustc...@googlegroups.com
IPC里的key是一个32位整数啊,随机数发生碰撞的概率还是不能忽略的。

2012/10/5 Zhang Cheng <steph...@gmail.com>:

Bojie Li

unread,
Aug 18, 2014, 2:23:24 PM8/18/14
to USTC_LUG

挖个坟。翻 paper 看到一个 Linux 下的绿色软件制作器 CDE
http://www.pgbovine.net/cde.html
看起来挺靠谱的。当然,绿色软件的效果也可以用 LXC 虚拟机来实现,不过对依赖关系不复杂、没有“自我保护”功能的软件,CDE 比 LXC 轻量多了。

2012年10月3日 下午2:42于 "WindyWinter" <wi...@ream.at>写道:
像Sandboxie一样的东西。有个软件不能多进程,windows的话可以用sandboxie解决,linux下用什么办法?

Soli Deo gloria.

WindyWinter
Email: wi...@ream.at
梦.:如此短暂: http://d.ream.at

yi lu

unread,
Aug 19, 2014, 12:51:46 AM8/19/14
to ustc...@googlegroups.com
弱问docker是个什么东西


--
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Sudo Nohup

unread,
Aug 19, 2014, 1:08:25 AM8/19/14
to ustc...@googlegroups.com
https://www.docker.com/

Application level Virtualization

Zhang Cheng

unread,
Aug 19, 2014, 1:32:33 AM8/19/14
to USTC LUG
这个坟挖的真老,两年前的又见了。。。

话说我当时在deepin时也想做一个这样的东西,将软件所需的依赖等打成一个包,即插即用绿色版。只是当时没有实际去做,后来也就再没想过这个事情。没想到其实早就有人做了这个事了(那个时候比较naive,不会搜索,不知道去找是否已经有人在做一件事了)。


2014-08-19 2:23 GMT+08:00 Bojie Li <boj...@gmail.com>:
--
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en

---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Cheng,
Best Regards

Zhuoyun Wei

unread,
Aug 19, 2014, 5:39:04 AM8/19/14
to ustc...@googlegroups.com
2014-08-19 13:32 GMT+08:00 Zhang Cheng <steph...@gmail.com>:
> 这个坟挖的真老,两年前的又见了。。。


啊,这个主题竟然两年了。

啊,我订阅 USTC LUG 竟然两年了……

--
wzyboy
Link: https://wzyboy.im/
Twitter: @wzyboy
Reply all
Reply to author
Forward
0 new messages