在传统安全视角聚焦于显式漏洞时
一种被称为“类污染”的攻击手法
正沿着对象的内置属性链悄然蔓延
本文从_class_回溯类到
利用_globals_篡改全局命名空间
揭秘如何绕过常规防御
通过合法的属性访问链实现“类污染”
最终达成远程代码执行(RCE)
揭示Python对象模型中被忽视的安全盲区
Python世界的基本法则:万物皆对象,对象皆可溯在Python的世界里,整数、字符串、函数,乃至“ 类 ”本身,都是对象。
每个对象都内置了一个属性:_class_
python
print(type(emp)) # <class '__main__.Employee'>print(emp.__class__) # <class '__main__.Employee'>print(emp.__class__.__base__) # <class 'object'>这意味着,从一个简单的实例(比如一个员工对象emp)出发,我们就能通过emp._class_回溯到它的类(Employee),甚至可以继续向上通过 _base_或 _bases_ 追溯到其父类,从而触及整个继承体系。
在访问 emp.company 时,其属性查找机制遵循以下顺序:
查找所属类:若未找到,则搜索其类(Employee)的 _dict_
沿继承链向上:若仍无果,则遵循方法解析顺序(MRO),在父类链中逐级查找
在上述链条中,类属性处于一个共享的、全局的位置。因此,修改一个类属性(例如 Employee.company =“New Corp”),会立即影响所有没有定义同名实例属性的该类的实例。
这是Python面向对象设计中一个基础且强大的特性,它既方便了共享状态的维护,也要求在修改时需谨慎评估其影响范围。
类污染攻击依赖于一系列特殊属性,它们是攻击链中的关键跳板:
1. 起点:攻击者控制或能够访问某个Python对象实例。
2. 定位类:通过实例_class_找到其所属的类。
3. 遍历继承树:通过_bases_向上或_subclasses_()向下遍历,寻找包含有用(或危险)子类的类。
4. 跳向函数空间:在找到的目标子类中,通过目标子类._init_访问到这个函数对象。
5. 夺取控制权:通过目标子类._init_._globals_获取该函数所在模块的全局命名空间字典。攻击者可在此字典中修改或插入键值,例如覆盖 _builtins_ 或植入恶意函数,最终实现任意代码执行(RCE)。
这个过程,本质上是对Python对象模型和属性解析机制的一种滥用。攻击者不需要直接调用危险函数,而是通过合法的属性访问链,“借道”抵达最终目标。
Python类继承链与 JavaScript 原型链的
结构对比
| |
instance -> _class_ -> Class -> _base_ (父类) -> object | obj -> _proto_ -> Constructor.prototype -> Object.prototype -> null |
这是一种区别于传统漏洞的新型攻击手法。攻击者无需直接调用危险函数,而是利用 Python 合法的属性访问链,沿着对象关系网“借道”抵达目标。这种对语言原生特性的滥用,使其具有极强的隐蔽性和绕过能力。
Python 的属性查找遵循“实例 → 类 → 父类链(MRO)”的路径,且类属性为所有实例共享。这一设计在提供便利的同时,也将类属性变成了攻击者的“公共内存区”。一旦获得对象控制权,攻击者即可通过 _class_ 回溯类定义,或通过_bases_ 横向遍历继承树,寻找高危跳板。
攻击通常始于对一个普通对象实例的操控:首先通过 _class_定位其类,再利用_subclasses_() 或_bases_ 遍历继承体系;随后以类中的函数对象(如 _init_ )为支点,最终通过函数对象的 _globals_属性夺取模块的全局命名空间。
至此,覆盖 _builtins_ 或植入恶意函数,实现任意代码执行(RCE)便水到渠成。
_globals_ 属性带来的全局命名空间劫持风险:在所有攻击环节中,应特别警惕对函数对象 _globals_ 属性的访问与篡改。
这是连接对象链与代码执行的最后一道关口,一旦该属性指向的模块全局字典被污染,意味着程序的执行环境和内置功能(如open、eval)可能被完全替换,从而导致彻底的沦陷。
开发者需严格限制不可信输入对函数对象及其 _globals_ 属性的访问权限。
以上就是本篇文章的技术细节。
其实,每次写这类分析时,我都在想
“单篇文章就像一张漏洞快照,有价值,但也相对孤立。
真正的行业敏锐度,来自于漏洞背后的持续观察;海量告警的讨论分析;以及在真实环境中无数次历练形成的直觉。”
很难通过阅读单篇文章积累。
因此,我们构建了一个
”注重实战交流“与“深度共享”的
「知识星球」社区
目前星球已聚集了[52]名安全工程师、研究员和团队负责人。
我们刻意控制规模,并设有加入门槛,只为维持聚焦、务实、互信的交流氛围。

“安全是一个对抗性极强的领域,一个人闭门造车,视角终究有限。
如果你已不满足于碎片信息,渴望在一个高质量的环境中,构建可迁移的实战知识体系,并连接一群值得信赖的同行者,这里或许适合你。
PS.:为了确保大家目标一致,请务必阅读星球置顶的《社区公约》。
这是一个为深度学习和有效连接付费的社区。
更多内容
欢迎加入「网络安全技术交流群」免费分享>>我们专注漏洞研究、攻防实战与代码审计。
群内定期分享技术动态、实战资源与本文相关的工具资料,
让大家一起讨论、共同成长。

添加好友,备注「网络安全」获取入群邀请
更多问题1v1解答>>