ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 将特权作为沙盒的常规非root用户删除?

2019-07-02 19:38:50  阅读:238  来源: 互联网

标签:security c-3 linux sandbox privileges


是否可以使用一组C库或系统调用来删除POSIX上的所有用户权限,或者至少在Linux上?请注意,我不会询问如何删除root权限,这是所有其他StackOverflow搜索结果似乎都在询问和回答的问题.

我想要切换到用户nobody的效果相同,但如果可能的话更强.也就是说,我希望我的C应用程序执行以下操作:

>以普通用户身份运行,而不是root用户,并且没有setuid文件权限位
>保留访问特定文件和打开传出网络连接的能力
>自愿且永久地失去在指定(或所有)目录中读取和写入文件的能力,尤其是$HOME
>如果可能的话,放弃或沙箱所有其他不必要的能力,比如用accept打开一个监听套接字

到目前为止我考虑的事情不符合要求:

>使用setuid / setgid切换到用户nobody

>普通用户被禁止切换到其他用户(如无人),应用程序不应该只需要root来切换到nobody.

> Linux/POSIX.1e Capabilities

>功能只添加类似root的权限,而不是剥夺普通用户权限

>传统seccomp

>我的应用程序需要的不仅仅是退出,sigreturn,读取和写入

看起来很有趣但却找不到文档的东西似乎没有维护,或者似乎是不可移植的:

> seccomp-bpf
> AppArmor
> grsecurity RBAC/role-based access control

那么是否有一个记录良好,最好是可移植的方式来删除不必要的用户权限和沙箱流程而不必先成为root用户?

解决方法:

任何解决方案都不可能适用于所有POSIX,因为POSIX没有定义您正在寻找的机制.

仅仅考虑需求和Linux,可能最简单的方法是通过安全模块来实现. apparmor,selinux,RBAC中的任何一个都可以满足您的需求,但只能通过外部配置文件 – 而不是内置于您应用中的内容.问题可能是在所有这些情况下添加配置文件需要root用户执行此操作(但配置文件也适用于用户进程).

几乎满足要求的更复杂的解决方案是seccomp.虽然它根本不理解路径(你只能看到指针),但有一些方法可以限制访问:可以为每个线程定义seccomp策略,因此你可以重新设计你的系统以获得一个“路径验证线程”,这不会除了读取路径和返回套接字(如果它们符合您的规范)之外,我们不做任何事情.然后将该线程限制为recv(),open()和send().执行其他工作的线程可以删除open()并使用其他服务.

或者,如果您可以在程序启动时配置路径,您可以将它们放入一个数组中,将该页面标记为只读,并设置seccomp策略,该策略只接受来自该数组的文件名的open()(这只是一个指针比较)那个案子).

在某种程度上,将应用程序拆分为具有非常有限责任的单独进程的方法是您可以在其他系统上复制的方法,但没有与Linux相同的保证.例如,qmail是一种非常小的进程系统,可用作数据管道(简化).在Linux上你仍然可以将seccomp应用于它们,在Solaris上只删除exec和其他功能,在其他系统上…我不知道,但可能你可以做点什么.

标签:security,c-3,linux,sandbox,privileges
来源: https://codeday.me/bug/20190702/1359063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有