CVE-2014-2667解读

描述

这是 Python OS 模块一个关于权限的漏洞 描述如下:
Race condition in the _get_masked_mode function in Lib/os.py in Python 3.2 through 3.5, when exist_ok is set to true and multiple threads are used, might allow local users to bypass intended file permissions by leveraging a separate application vulnerability before the umask has been set to the expected value.

在使用Python 3.2到3.5中的Lib / os.py中的_get_masked_mode函数中的竞争条件,当exists_ok设置为true并且使用多个线程时,可能允许本地用户在umask出现之前利用单独的应用程序漏洞绕过预期的文件权限设置为预期值。

涉及版本

Python 3.5, Python 3.2, Python 3.3, Python 3.4

https://bugs.python.org/issue21082

CWE类型

CWE-362

Concurrent Execution using Shared Resource with Improper Synchronization (‘Race Condition’)
使用具有不正确同步的共享资源并发执行(‘竞争条件’)

The program contains a code sequence that can run concurrently with other code, and the code sequence requires temporary, exclusive access to a shared resource, but a timing window exists in which the shared resource can be modified by another code sequence that is operating concurrently.
该程序包含可以与其他代码并发运行的代码序列,并且代码序列需要对共享资源的临时、独占访问,但是存在时序窗口,其中共享资源可以由另一个并发操作的代码序列修改。

问题代码

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190420225224452.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5ODA4Mg==,size_16,color_FFFFFF,t_70

在这里插入图片描述

相关概念解释

当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。

umask –S 查看当前 umask设置

umask 022 默认值

linux中的 umask 函数主要用于:在创建新文件或目录时 屏蔽掉新文件或目录不应有的访问允许权限。
文件的访问允许权限共有9种,分别是:r w x r w x r w x
其实这个函数的作用,就是设置允许当前进程创建文件或者目录最大可操作的权限,
比如这里设置为0,它的意思就是0取反再创建文件时权限相与,也就是:(~0) & mode 等于八进制的值0777 & mode了,
这样就是给后面的代码调用函数mkdir给出最大的权限,避免了创建目录或文件的权限不确定性。

当我们从Python官方网站下载并安装好Python 后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

CPython是使用最广的Python解释器。

GIL Global Interpreter Lock

首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器
(Cpython)时所引入的一个概念。而Cpython是大部分环境下默认的python执行环境,要明确
一点:GIL并不是python的特性,python完全可以不依赖于GIL。

为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线
程间数据的一致性和状态同步的完整性
(例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2执行完成,
线程1仍然还在执行,这就是数据的同步性)

python为了利用多核,开始支持多线程,而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。

GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序

同一时间片就只能有一个线程获得GIL全局锁

只有获得GIL锁的线程才能真正在cpu上运行。所以,多线程在python中只能交替执行,即使100个线程跑在100核cpu上,也只能用到1核。

既然python的多线程在多核主机上这么鸡肋,那有什么更好的方式实现多并发吗?
用其他解析器
用进程+协程 代替 多线程的方式
在多进程中,由于每个进程都是独立的存在,所以每个进程内的线程都拥有独立的GIL锁,互不影响。

但是,由于进程之间是独立的存在,所以进程间通信就需要通过队列的方式来实现。

POC代码

在这里插入图片描述

结果

可以看到 test6334 这个文件权限是 +777 而其他的都是+755
在这里插入图片描述

原因

test1线程执行到 umask(0)时 时间片耗尽 此时系统创建文件的权限为 +777
而此时test2正创建文件 +755 变成了+777

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值