翻车了!pyc 文件居然曝光了我的密码

Python知识圈

共 1848字,需浏览 4分钟

 · 2020-06-03

点击上方Python知识圈设为星标

回复1024获取Python资料


f7f0acae56a658779654863417819d1d.webp


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

阅读文本大概需要 3 分钟


点击「阅读原文」查看pk哥原创精品视频。

当你第一次导入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文件:

95850aaae08816807d5ee666925dab41.webp

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

401d90f80def871678669fbf5cd1dc66.webp

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

0788a7ba620849adc7bcc8e91958c72a.webp

缓存泄漏机密

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

e59c48df6690db31c3f60598dbe0cee2.webp

额外说明

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

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

你可以做的事情:

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

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

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

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





2feffc01dcd49a6c65249613fbde356e.webp
-----------------------公众号:Python知识圈博客:www.pyzhishiquan.com知乎Python知识圈微信视频号:菜鸟程序员 (分享有趣的编程技巧、Python技巧)bilibili:菜鸟程序员的日常(目前原创视频:16,累计播放量:55万)


 

一个学习Python的人,喜欢分享,喜欢搞事情!

长按下图二维码关注,和你一起领悟Python的魅力


 

 

 



 


Python知识圈公众号的交流群已经建立,群里可以领取 Python 和人工智能学习资料,大家可以一起学习交流,效率更高,如果是想发推文、广告、砍价小程序的敬请绕道一定记得备注「交流学习」,我会尽快通过好友申请哦!通过好友后私聊我「学习资料」或者「进群」都可以。

扫码添加,备注:交流学习




往期推荐01

公众号所有文章汇总导航(2-10更新)

02

玩会这 15 款编程游戏,就算是入门了!

03

我用Python一键保存了半佛老师所有的骚气表情包


我就知道你“在看” fa91cbd381515336c2aab74222d11cb5.webp
浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报