Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Python exec()的安全风险与变量操控深度解析_创想鸟

Python exec()的安全风险与变量操控深度解析

Python exec()的安全风险与变量操控深度解析

本文深入探讨了python `exec()`函数在尝试构建受控执行环境时所面临的固有安全风险。通过一个具体示例,我们揭示了即使在严格限制全局和局部变量的情况下,外部代码仍能轻易绕过限制,直接修改非局部变量(如闭包中的变量)。文章强调了`exec()`的本质不安全性,并指出任何试图通过简单字典限制来“保护”执行环境的做法都将失效,因为执行代码总能找到途径访问解释器状态,从而带来严重的安全隐患,远超简单的变量修改。

理解exec()的受控执行尝试

在Python中,exec()函数允许执行动态生成的代码字符串。开发者有时会尝试利用其globals和locals参数来创建一个“受控”的执行环境,以限制被执行代码的权限。考虑以下controlled_exec函数:

def controlled_exec(code):  x = 0  def increment_x():    nonlocal x    x += 1  globals = {"__builtins__": {}} # 移除所有全局变量,包括内置函数  locals = {"increment_x": increment_x} # 只暴露 increment_x 函数  exec(code, globals, locals)  return x

这个函数的设计初衷是提供一个受限的API,其中变量x只能通过调用increment_x()函数来增加。例如,执行controlled_exec(“increment_x()nincrement_x()”)会返回2,符合预期。然而,这种看似“安全”的隔离实际上是极其脆弱的。

绕过控制:直接修改非局部变量

尽管controlled_exec函数试图通过清空globals和只暴露increment_x来限制代码行为,但被执行的代码仍然有能力绕过这些限制,直接修改变量x的值。其关键在于利用Python闭包的内部机制。

当increment_x函数被定义时,它捕获了外部作用域(即controlled_exec函数内部)的变量x。这个被捕获的变量x实际上存储在一个称为“cell”的对象中,并且可以通过increment_x函数的__closure__属性访问。__closure__是一个元组,包含所有闭包变量的cell对象。每个cell对象都有一个cell_contents属性,可以直接读写其内部存储的值。

立即学习“Python免费学习笔记(深入)”;

因此,被执行的代码可以通过以下方式修改x的值:

increment_x.__closure__[0].cell_contents = -100

这里,increment_x.__closure__[0]访问了increment_x闭包中第一个(也是唯一一个)非局部变量x的cell对象,然后通过.cell_contents直接将其值设置为-100。

示例代码与输出

为了更清晰地展示这一漏洞,我们修改increment_x函数,使其在每次调用时打印x的值:

百度GBI 百度GBI

百度GBI-你的大模型商业分析助手

百度GBI 104 查看详情 百度GBI

def controlled_exec(code):  x = 0  def increment_x():    nonlocal x    x += 1    print(f"{x=}") # 添加打印语句以观察变化  globals = {"__builtins__": {}}  locals = {"increment_x": increment_x}  exec(code, globals, locals)  return x# 执行包含攻击代码的字符串controlled_exec("""increment_x()increment_x.__closure__[0].cell_contents = -100increment_x()""")

执行上述代码将产生以下输出:

x=1x=-99

从输出中可以看出,第一次调用increment_x()后x变为1。接着,increment_x.__closure__[0].cell_contents = -100将x的值直接修改为-100。最后一次调用increment_x()时,x在-100的基础上加1,变为-99。这证明了即使在尝试隔离的情况下,变量x也未能得到保护。

exec()的固有不安全性与更广泛的威胁

这个例子只是冰山一角,揭示了exec()函数在安全沙箱方面存在的根本性缺陷。无论你如何尝试限制globals和locals字典,被执行的代码总能找到途径访问Python解释器的内部状态。

例如,尽管我们尝试从globals中移除所有内置函数,但攻击者仍然可以通过increment_x.__globals__[‘__builtins__’]来重新访问它们。这只是众多绕过安全限制的技巧之一。

更严重的是,能够修改一个变量的值只是一个相对“温和”的例子。如果将不受信任的代码传递给exec(),它将拥有与你的程序相同的权限。这意味着被执行的代码可以:

访问文件系统: 读取、写入、删除任意文件。执行系统命令: 调用os.system()或subprocess.run()来执行外部程序。网络操作: 发送网络请求,下载恶意软件,或将敏感数据上传到远程服务器。修改程序逻辑: 篡改内存中的对象,甚至改变程序的行为。

简而言之,将不受信任的代码传递给exec(),等同于授予该代码完全控制你的计算机的权限。

结论与注意事项

exec()不适用于安全沙箱: Python的exec()函数从设计上就不是为了安全地执行不受信任的代码。任何试图通过简单地限制globals和locals来创建安全沙箱的尝试都注定会失败。理解闭包机制: 开发者应了解Python闭包的内部工作原理,尤其是__closure__和cell_contents属性,这对于理解一些高级的Python特性和潜在的漏洞至关重要。避免执行不可信代码: 最重要的安全原则是永远不要执行来自不可信源的代码。考虑替代方案: 如果确实需要执行动态代码,且这些代码可能来自不可信源,应考虑更安全的替代方案:专用沙箱环境: 使用像PyPy的沙箱模式,或者在独立的、受限的容器(如Docker)中执行代码。代码审查: 对所有即将执行的动态代码进行严格的安全审查。白名单方法: 仅允许执行预定义、受信任的代码片段,而不是任意字符串。

总之,Python的强大和灵活性也带来了潜在的安全风险。在使用exec()等功能时,必须充分理解其安全含义,并采取严格的预防措施,以避免将系统暴露于严重威胁之下。

以上就是Python exec()的安全风险与变量操控深度解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/598158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
从分布式到云原生——使用Swoole构建高性能微服务
上一篇 2025年11月10日 19:10:45
百度:文小言累计调用量超 35 亿次,月活用户破千万
下一篇 2025年11月10日 19:11:02

相关推荐

  • Windows10重置此电脑卡住不动了怎么办_Windows10重置电脑卡住修复方法

    重置电脑卡住时,先等待2-4小时观察硬盘灯是否闪烁,确认系统是否仍在运行;若无响应,可尝试断开网络避免更新下载、调整BIOS关闭Secure Boot并启用Legacy模式;或使用Windows安装U盘启动,进入修复模式执行启动修复、chkdsk磁盘检查,以及通过三次强制关机触发恢复环境重试重置。 …

    2026年9月21日
    000
  • mysql如何实现后台管理系统

    答案:基于MySQL的%ignore_a_1%需设计用户、权限、日志等表结构,通过后端语言实现安全的CRUD接口与JWT认证,前端展示数据并控制权限,确保系统安全稳定。 实现一个基于 MySQL 的后台管理系统,核心是构建一个安全、稳定、可扩展的系统架构,将数据库作为数据存储层,配合后端语言和前端界…

    2026年9月21日
    000
  • 如何为VSCode设置自定义的代码高亮颜色?

    答案:通过settings.json中的editor.tokenColorCustomizations可自定义VSCode代码高亮颜色,支持全局或特定主题下修改关键字、字符串等元素颜色,结合textMateRules和作用域精确控制,提升代码可读性。 为 VSCode 设置自定义的代码高亮颜色,可以…

    2026年9月21日
    000
  • 压力测试(Benchmark)Swoole服务的工具与方法

    进行swoole服务的压力测试是为了确保服务在高负载下稳定运行。1. 选择工具:apache jmeter、wrk、locust。2. 使用方法:jmeter通过脚本配置,wrk通过命令行,locust通过python脚本。3. 注意事项:环境隔离、数据监控、脚本设计。4. 优化点:内存泄漏、连接池…

    2026年9月21日
    000
  • Windows11内存占用率过高怎么解决_Windows11内存占用过高修复方法

    1、通过任务管理器结束高内存占用进程;2、禁用Superfetch(SysMain)服务以降低内存负担;3、优化启动项减少后台负载;4、升级物理内存条提升系统性能。 如果您发现Windows 11系统运行缓慢,并且任务管理器显示内存占用率持续处于高位,这可能是由于后台进程过多、系统服务占用资源或硬件…

    2026年9月21日
    100
  • 利用蝴蝶号搭建多账号无人直播系统的完整方案

    利用蝴蝶号搭建多账号无人直播系统的完整方案利用蝴蝶号搭建多账号无人直播系统的完整方案利用蝴蝶号搭建多账号无人直播系统的完整方案利用蝴蝶号搭建多账号无人直播系统的完整方案

    搭建多账号无人直播系统并非一键操作,而是通过“蝴蝶号”实现自动化流程。首先,“蝴蝶号”负责多账号的生命周期管理,包括登录、状态维护、ip代理分配和设备指纹模拟;其次,内容调度系统决定直播内容及播放时间,可为预录视频或动态生成流;再次,推流引擎将内容实时推送至平台,推荐使用ffmpeg结合python…

    2026年9月21日 用户投稿
    100
  • 数据库运维开发环境的调试模式演进

    数据库运维开发环境的调试模式演进数据库运维开发环境的调试模式演进数据库运维开发环境的调试模式演进数据库运维开发环境的调试模式演进

    这是学习笔记的第2393篇文章。 昨日,同事反馈了一个问题,原本的办公机环境中的虚拟机可以将办公机的IP暴露出来,提供数据库运维的API服务。例如,办公机的IP为192.168.10.100,而使用VirtualBox的虚拟机采用主机模式,其IP可能为192.168.56.100,那么192.168…

    2026年9月21日 用户投稿
    100
  • MySQL数据库日志审计与合规性实现_保护敏感数据与满足法规需求

    MySQL数据库日志审计与合规性实现_保护敏感数据与满足法规需求MySQL数据库日志审计与合规性实现_保护敏感数据与满足法规需求MySQL数据库日志审计与合规性实现_保护敏感数据与满足法规需求MySQL数据库日志审计与合规性实现_保护敏感数据与满足法规需求

    mysql日志审计是合规性的基石,因为它提供了数据库操作的完整证据链,记录用户身份、操作类型和时间戳等关键信息,满足gdpr、hipaa等法规要求,并支持事后追溯与事前震慑。1. mysql自身提供错误日志、通用查询日志、慢查询日志和二进制日志,其中通用查询日志记录所有sql语句,二进制日志用于数据…

    2026年9月21日 用户投稿
    100
  • VSCode编写Java代码方法_VSCode搭建Java开发环境实战教程

    答案:在VSCode中配置Java开发环境需安装JDK并设置环境变量,再安装VSCode及Java扩展包,即可实现Java项目的创建、编写、运行与调试。它轻量、启动快,支持多语言和丰富扩展,集成Maven/Gradle,适合日常开发。 在VSCode里编写Java代码,说白了,就是把这个轻量级的代码…

    2026年9月21日
    100
  • 如何通过tracert命令追踪数据包从本地到目标服务器的完整路径?

    打开命令提示符,输入cmd并回车;2. 执行tracert 目标地址命令追踪路径;3. 查看每跳响应时间与IP,分析延迟变化定位网络瓶颈;4. 注意部分节点可能因防火墙不响应导致超时。 使用 tracert(Windows 系统)命令可以追踪数据包从你的计算机到目标服务器所经过的每一跳网络节点,帮助…

    2026年9月21日
    1000
  • win10连接打印机错误0x00000709怎么办_win10打印机连接错误修复方法

    错误代码0x00000709通常因权限不足、系统更新冲突或服务异常导致共享打印机连接失败。可使用专业工具一键修复,或通过修改注册表权限、卸载KB5005569等特定更新、重启Print Spooler及相关服务,以及添加Windows凭据(如IP地址和guest账户)解决该问题。 当您在Window…

    2026年9月21日
    200
  • MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    最小权限原则是mysql用户权限配置的核心,确保每个用户仅拥有必要权限以提升安全性与可维护性。1.明确需求:根据用户角色分配如只读、增删改查或结构修改权限;2.创建用户并编写sql脚本进行权限管理,替代手动输入命令,提高效率与一致性;3.使用sublime text等编辑器提升脚本编写效率,利用语法…

    2026年9月21日 用户投稿
    100
  • 升级X86架构性能大提升!极空间Z2 Ultra图赏

    升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏

    10月23日,极空间正式推出全新双盘位nas产品——极空间z2 ultra,官方售价为1899元,参与国家补贴后仅需1457元,性价比进一步提升。 此次发布的Z2 Ultra最大的亮点在于采用X86架构处理器,相较以往使用的ARM平台,性能实现飞跃式提升,运行速度显著加快。更重要的是,新架构对Doc…

    2026年9月21日 用户投稿
    300
  • VSCode的代码折叠功能好用吗?

    VSCode代码折叠功能支持多种方式:点击箭头、快捷键、命令面板及按区域类型折叠;可自定义基于缩进的折叠、默认层级和提示装饰器;集成语言服务后能智能识别JSX、Vue组件等结构,提升大型文件编辑效率。 VSCode 的代码折叠功能非常实用,尤其在处理大型文件或复杂结构时能显著提升阅读和编辑效率。 支…

    2026年9月21日
    100
  • win10无法创建新的分区提示空间不足怎么办 _Win10 无法创建分区空间不足解决方法

    首先检查磁盘是否存在未分配空间,若无则通过压缩卷释放空间;使用磁盘管理或第三方工具如EaseUS创建新分区;必要时清理磁盘或转换MBR为GPT格式以突破分区限制。 如果您在使用Windows 10系统时尝试创建新的磁盘分区,但系统提示“无法创建新分区”或“空间不足”,这通常是因为当前磁盘未分配的空间…

    2026年9月21日
    200
  • Laravel应用的安全审计(Security Audit)方法

    进行安全审计对laravel应用至关重要,因为它能发现并修复安全漏洞,提升整体安全性和用户信任度。具体方法包括:1. 代码审查,确保无未过滤输入和弱密码;2. 配置文件安全性,保护敏感信息;3. 依赖管理,更新第三方包;4. 用户认证和授权,防止未授权访问;5. 日志和监控,检测异常行为。 在讨论L…

    2026年9月21日
    200
  • 怎样使用VSCode的调试控制台执行表达式并实时监控变量状态?

    在VSCode调试时,通过调试控制台可直接执行表达式并查看变量状态;2. 启动调试并暂停在断点后,打开“调试控制台”输入表达式如10*5或user.getName()即时求值;3. 使用“监视”面板添加如count等表达式持续跟踪变量变化;4. 通过“作用域”面板查看局部变量、闭包中的上下文信息,支…

    2026年9月21日
    100
  • Guava Multimap:高效获取并打印指定键的所有关联值

    guava multimap是处理一键多值映射关系的强大工具。要获取特定键的所有关联值,应直接使用其提供的`multimap#get(k)`方法。该方法会返回一个包含所有匹配值的`collection`,即使键不存在,也会返回一个空集合而非`null`,从而简化了值检索和空值处理逻辑,是比手动迭代键…

    2026年9月21日
    100
  • 控制台命令(Console Command)开发

    控制台命令是程序员日常工作中不可或缺的工具,它提高了开发效率并帮助理解和控制程序运行。1) 通过简单的文本输入,完成复杂任务,如文件管理和系统监控。2) 控制台命令可用于快速调试、测试代码和自动化重复工作。3) 开发控制台命令时需注意安全性和兼容性问题。4) 控制台命令可实现有趣功能,如监控服务器资…

    2026年9月21日
    200
  • Linux如何恢复被删除的用户数据

    恢复Linux被删数据需立即停用磁盘并使用photorec或extundelete等工具,结合快照或备份可提高恢复成功率。 恢复Linux中被删除的用户数据,并非易事,但并非完全不可能。可能性取决于数据被删除的方式、删除后系统是否被继续使用,以及是否采取了合适的预防措施。核心在于理解数据删除的机制,…

    2026年9月21日
    300

发表回复

登录后才能评论
关注微信