雪城大学信息安全讲义 3.4 最小权限原则
4 最小权限原则
最小权限原则(最早由 Saltzer 和 Schroeder 提出):
每个程序和系统用户都应该具有完成任务所必需的最小权限集合。
限制代码运行所需的安全权限,有一个非常重要的原因,就是降低你的代码在被恶意用户利用时,造成的损失。如果你的代码仅仅使用最小权限来执行,恶意用户就难以使用它造成损失。如果你需要用户使用管理员权限来执行代码,任何代码中的安全缺陷,都会通过利用该缺陷的恶意用户,潜在造成更大的损失。
编写特权程序时的问题:
- 程序需要该权限吗?
- 如果程序不需要任何特殊权限来运行,它不应该是个特权程序。
- 程序需要所有权限吗?
- 我们只给予程序完成任务所需的最小权限集合。
- 许多操作系统不向我们提供多种选择;我们可以选择包含所有 Root 权限的集合,或者不包含任何权限的集合。多数 Unix 系统就是这样,你要么是 Root 要么不是,没有中间值。
- 多数现代 Unix 系统(和 Windows)引入了更多选择。这些系统将 Root 权限划分为多种字权限。使用这种自粒度,我们就可以更好应用最小权限原则。
- 程序现在需要权限吗?
- 程序通常偶尔不需要特定权限,它们在这个时候就变得不必要了。我们应该暂时禁用它们来满足最小权限原则。这么做的好处就是,放置程序犯下意外的错误,使之不能对需要禁用权限的事情造成损失。下面的图像展示了这个要点。
- 稍后,禁用的权限可能就必要了,我们之后可以开启它。
- 要记住,开启或禁用权限可以在特定场景下降低损失,当攻击者不能像漏洞程序注入代码的时候。如果攻击者可以向漏洞程序注入代码,注入的代码自己就能够开启权限。
- 程序在未来需要权限吗?
- 如果权限不再需要了,它就是不必要的,应该永久溢出,所以最小权限集合应基于未来的需求来调整。
Unix 为我们提供了什么机制,来实现最小权限原则?
- 实用的系统调用:
setuid()
,seteuid()
,setgid()
,和setegid()
。 seteuid(uid)
:它为调用进程设置有效 UID。- 如果调用进程的有效 UID 是超级用户,
uid
参数可以是任何东西。这通常由超级用户用来暂时让渡/获取权限。但是,进程的超级用户权限并没有丢失,进程可以拿回来。 - 如果调用进程的有效 UID 不是超级用户,UID 参数只能是有效 UID,真实 UID,以及保存的 UID。这通常由特权程序使用来恢复他的权限(原始的特权有效 UID 保存在保存的 UID 中)。
- 如果调用进程的有效 UID 是超级用户,
setuid(uid)
:它设置了当前进程的有效 UID。如果调用者的有效 UID 是 Root,也会设置真实和保存的 UID。- 如果调用进程的有效 UID 是超级用户,真实、有效和保存的 UID 全部会设为
uid
参数。之后,程序就不能够拿回 Root 权限(假设 UID 不是 Root)。这用于永久让渡高权限的访问权。 - 想要暂时放弃 Root 权限的 Set-Root-UID 程序,假设身份是非 Root 用户,之后不能使用
setuid
来拿回权限。你可以使用seteuid
调用来完成它。 - 如果调用进程的有效 UID 不是超级用户,但是 UID 是调用进程的真实 UID 或者保存的 UID,那么有效 UID 会设置为
uid
。这类似于seteuid
。
- 如果调用进程的有效 UID 是超级用户,真实、有效和保存的 UID 全部会设为
- 示例(在 Fedora 中):进程使用有效 UID = 0 来运行,真实 UID= 500,在调用它们之后,有效和真实 UID 是什么?
setuid(500); setuid(0);
:答案:500/500(第一个调用生成 500/500,第二个调用失败)。seteuid(500); setuid(0);
:答案:0/500(第一个调用生成 500/500,第二个调用生成 0/500)。seteuid(600); setuid(500);
:答案:500/500(第一个调用生成 600/500,第二个调用生成 500/500)。seteuid(600); setuid(500); setuid(0);
:答案:0/500(第一个调用生成 600/500,第二个调用生成 500/500,第三个调用生成 0/500)。
雪城大学信息安全讲义 3.4 最小权限原则相关推荐
- 雪城大学信息安全讲义 五、竞态条件
五.竞态条件 原文:Race Condition Vulnerability 译者:飞龙 1 竞态条件漏洞 下面的代码段属于某个特权程序(即 Set-UID 程序),它使用 Root 权限运行. 1: ...
- 雪城大学信息安全讲义 4.1~4.2
四.缓冲区溢出漏洞和攻击 原文:Buffer-Overflow Vulnerabilities and Attacks 译者:飞龙 1 内存 这个讲义的"区域"(Area)和&quo ...
- 雪城大学信息安全讲义 3.1 Set-UID 机制如何工作
三.Set-UID 特权程序 原文:Set-UID Programs and Vulnerabilities 译者:飞龙 这个讲义的主要目标就是来讨论特权程序,为什么需要他们,他们如何工作,以及它们有 ...
- 雪城大学信息安全讲义 3.3 提升 Set-UID 程序的安全性
3 提升 Set-UID 程序的安全性 exec函数 exec函数系列通过将当前进程映像包装为新的,来运行紫禁城.有许多exec函数的版本,工作方式不同.它们可以归类为: 使用/不适用 Shell 来 ...
- 雪城大学信息安全讲义 七、格式化字符串漏洞
七.格式化字符串漏洞 原文:Format String Vulnerability 译者:飞龙 printf ( user_input ); 上面的代码在 C 程序中十分常见.这一章中,我们会发现如果 ...
- 雪城大学信息安全讲义 六、输入校验
六.输入校验 原文:Input Validation 译者:飞龙 1 环境变量(隐藏的输入) 环境变量是隐藏的输入.它们存在并影响程序行为.在编程中忽略它们的存在可能导致安全隐患. PATH 在 Sh ...
- 雪城大学信息安全讲义 4.5
5 堆或 BSS 的缓冲区溢出 堆或 BSS 的内容 字符串常量 全局变量 静态变量 动态分配的内存 示例:覆盖文件指针 /* The following variables are stored i ...
- 雪城大学信息安全讲义 4.3~4.4
3 对抗措施 3.1 应用安全工程原则 使用强类型语言,例如 Java.C#,以及其他.使用这些语言,可以避免缓冲区溢出. 使用安全的库函数 可能拥有缓冲区溢出问题的函数:gets.strcpy.st ...
- 雪城大学信息安全讲义 3.2 Set-UID 程序的漏洞
2 Set-UID 程序的漏洞 2.1 隐藏的输入:环境变量 特权程序必须对所有输入进行安全检查.输入检查实际上是访问控制的一部分,特权程序必须这么做,来确保程序的安全.很多安全问题都是输入检查的错误 ...
最新文章
- MySQLWorkbench里的稀奇事之timestamp的非空默认值
- SCOI 2014 new :未来展望
- 大文件及文件夹上传(续)
- (三)SpringBoot之配置文件详解:Properties和YAML
- 解放你的双手-Sql Server 2000智能提示工具[破解版]
- 电商促销类插画素材,适合各种活动banner设计
- 上传相关js和jquery对象
- mysql 2.71828_Picasso 2.71828 用法
- BIO,NIO的区别,使用场景。
- 使用Visual Studio 2013编写Windows程序
- java 性能调优案例_java性能调优实战,java性能调优
- 计算机功能自定义,电脑鼠标自定义按键设置方法
- 西工大第三届“探索·解密”趣味密码比赛-个人WriteUp
- 下载dns linux命令,linux dns 部署命令(示例代码)
- 8000字干货:那些很厉害的人是怎么构建知识体系的
- 【每日最爱一句】2013.07.10
- html怎么设置页脚注释,Word写论文时怎么插入页脚注释?
- woo 语言最简单的生成验证码方式,是个人都能看懂,反正比py简单多了
- python求两个数的最大公约数穷举法_求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法...
- linux qq远程桌面连接,还在用QQ远程桌面?这款软件还能用手机控制电脑!
热门文章
- Fastone api provided for SMIC
- Cadence基础操作:Schematic编辑
- 公司文档数据如何才能做到防泄密
- Tegra_Multimedia API 例程学习之--00_video_decode
- 教师ppt计算机培训心得,教师多媒体教学培训心得体会范文
- open ssl android编译,aosp 编译过程中Jack server SSL error 错误解决方法
- 用Python计算利率,告诉你亏了多少?
- 趣头条们何以成就“无米之炊”
- 医用电子体温计开发方案
- 羊毛党如何撸MORE.ONE 的糖果(图文教程)类似candy one