英文原文:https://blog.jse.li/posts/pyc/
 译者:穆胜亮

摘要:缓存控制着我周围的所有事物。pyc文件包含机密信息,因此不应该包含在源代码控制系统中。可以使用Python标准的.gitignore文件,移除源代码控制系统对pyc文件的包含。

当你第一次导入Python文件时,Python解释器将编译该文件并将产生的字节码缓存到.pyc文件中,这样以后导入时就避免了再解析或编译代码产生新的开销。

对于Python项目来说,将配置、密钥和密码(统称为“机密”)存储在名为secret.py,config.py或者settings.py之类的gitignored Python文件中也是一种常见的实践,这些机密信息在项目的其他部分导入使用。这在机密信息和源代码之间提供了一个很好的分离,在大多数情况下,这种设置工作得很好。而且由于它复用了语言的导入机制,这些项目不必在文件I/O或JSON之类的格式上浪费时间。

但是在这种模式快速且方便的同时,它也可能是不安全的。因为它重用了语言的导入机制(该机制有创建和缓存.pyc文件的习惯),所以这些机密也存在于编译的字节码中!使用GitHub API进行的一些初步研究显示,数千个GitHub代码仓库的字节码中隐藏着机密。

用于在代码仓库中查找机密的现有工具(我最喜欢的是trufflehog)跳过了像.pyc这样的二进制文件,而是只扫描纯文本文件,如源代码或配置文件。

缓存来源的速成课程

Python的早期版本将这些文件存储在原始源文件旁边,但是从Python 3.2开始,这些文件都位于导入模块根目录的一个名为__pycache__的文件夹中。

假设我们有一个包含下面密码的Python文件:

这行代码的字节码是这样的:

注意,变量名和字符串是完全复制的!而且,Python字节码通常包含足够的信息来恢复代码的原始结构。像uncompyle6这样的工具可以将.pyc文件转换回它们的原始形式。

缓存泄漏机密

为了调查这个问题到底有多普遍,我编写了一个简短的脚本来搜索GitHub上的.pyc文件并对其进行反编译以寻找秘密。最后我找到了数千个Twitter密钥、条带标记、AWS证书和社交媒体密码。我通知了被我用这种方式破解密钥的相关机构。

你自己试试吧!

这篇文章附带了一个小的夺旗风格的实验,你可以自己尝试这种风格的攻击。

代码地址:https://github.com/veggiedefender/pyc-secret-lab/

额外说明

缓存的字节码是一种底层的内部性能优化,Python的这种优化为我们带来了方便!如果没有像反汇编或反编译这样的特殊工具,.pyc文件的内容是难以理解的。当这些文件被隐藏在__pycache__(双下划线代表仅供内部使用)中时,它们很容易被忽视。许多文本编辑器和IDE将这些文件夹和文件从源代码目录树中隐藏起来,以避免弄乱屏幕,从而很容易忘记它们的存在。

也就是说,对于一个有经验的程序员来说,无意中泄漏他们的机密是很容易的,而且初学者更容易犯这样的错误。要避免这种情况,要么需要有足够的gitignore知识,要么需要对git和Python内部有一定的了解。

你可以做的事情:

  • 在你的代码仓库中查找松散的.pyc文件,并删除它们

  • 如果你有.pyc文件并且它们包含机密,那么可以撤销和轮换你的机密

  • 使用标准的gitignore来防止检入.pyc文件

  • 使用JSON文件或环境变量进行配置

- End -
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:(1)点击页面最上方“小詹学Python”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。

你的pyc文件,泄露了你的秘密!相关推荐

  1. Python Pyc文件

    c 是 compiled 编译过的意思 pyc文件是由Python解释器将模块的源码 转换为字节码 Python 这样保存字节码是作为一种启动 速度的优化 字节码 Python在解释源程序是分成两个步 ...

  2. python py生成及调用pyc文件

    本文仅供学习交流使用,如侵立删!demo下载见文末 python py文件中调用pyc文件 1.生成pyc文件 # 目录下所有py文件生成pyc import compileall compileal ...

  3. .py与.pyc文件区别

    原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候.将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了 ...

  4. pyc文件反编译为py文件

    近期时不时需要把工程里的 pyc 文件反编译出来,查看接口函数的逻辑.此前有师兄安利了uncompyle6工具,我使用了几次,发现反编译出来的代码逻辑很清晰,此处我也不能打包票 uncompyle6 ...

  5. 【漏洞实战】某网站JS文件泄露导致拿到服务器权限

    某站点JS文件泄露后台接口导致Get Shell 1.首页是这样子滴,爆破弱口令无果后. 技术资料 2.开始审计js代码:这一步我不知道新手会不会.一般右击网页->点击检查就会出现下面这种界面. ...

  6. Python 中的pyc文件的用途

    什么是pyc文件 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的 ...

  7. Python 中的Pyc文件

    Python 中的Pyc文件 分类: Python 2011-04-22 16:52 4055人阅读 评论(0) 收藏 举报 pythonimport虚拟机跨平台googlebyte 首先我申明,我不 ...

  8. Python源码剖析[16] —— Pyc文件解析

    Python源码剖析[16] -- Pyc文件解析 2008-02-28 18:29:55|  分类: Python |举报 |字号 订阅 Python源码剖析 --Pyc文件解析 本文作者: Rob ...

  9. python程序编译之后、找不到生成的pyc文件_为什么主要的可运行的Python脚本没有被编译为pyc文件,如模块?...

    当模块加载时,py文件被"字节编译"为pyc文件.时间戳记记录在pyc文件中. 这样做不会使其运行速度更快,但加载速度更快. 因此,当您加载它们时,"字节编译" ...

最新文章

  1. HDU-3746-Cyclic Nacklace
  2. 【译】How to create your own Question-Answering system easily with python
  3. docker选择安装位置_监控摄像机的安装位置选择和焦距选择
  4. 【微软官方文档】Windows终端(Windows Terminal)
  5. 易语言html实现报表打印,易语言报表统计功能例程可打印
  6. 不采用服务器虚拟化的优缺点,为什么要进行虚拟化部署?虚拟化的缺点是什么?...
  7. 设计模式之单实例模式(Singleton)
  8. 【疑问】互联网公募基金的销售是繁荣,还是乱象?
  9. Cadence PSpice 基于代码生成仿真模型
  10. Jtag接口定义及含义
  11. 嵌入式硬件:电子元器件(1)电阻电容电感
  12. 什么是弹性公网IP?
  13. 总谐波失真计算公式_知识学习:谐波的危害
  14. iP138版 iP地址 离线iP数据库 ip.dat详解
  15. 独立显卡与集成显卡的区别
  16. 电脑开不了机的原因和解决办法
  17. 选择合适的垃圾收集器
  18. 数据库的基本命令 创建数据库 创建表 插入数据
  19. 动态(视频)图像拼接和EDF景深融合解决方案(源码分享)
  20. 关键词短语生成的无监督方法01——综述

热门文章

  1. 专精开发还是转管理?程序员的职业规划选择,没有想象中那么难
  2. linux 解决man命令输出到文档打开乱码问题
  3. WeChat微信小程序image组件aspectFill:保留中部 等比例变化 Widthfix:宽度为指定的  高度依据原图的宽高比进行变化
  4. jQuery遇见的转化关联数组为json的坑
  5. linux 条件变量函数,Linux线程同步之条件变量
  6. 拼装sql_SQL优化最干货总结(2020最新版)
  7. java调用c写的dll jna_jna调用c编写的dll
  8. vs java调试_基于VSCode的Java编程语言的构建调试环境搭建指南(作业三)
  9. python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
  10. java和mysql中md5+base64的执行结果