翻車了!pyc 文件居然曝光了我的密碼
點擊上方Python知識圈,設為星標
回復1024獲取Python資料

譯者:穆勝亮
英文原文:https://blog.jse.li/posts/pyc/
閱讀文本大概需要 3 分鐘
點擊「閱讀原文」查看pk哥原創(chuàng)精品視頻。
當你第一次導入Python文件時,Python解釋器將編譯該文件并將產(chǎn)生的字節(jié)碼緩存到.pyc文件中,這樣以后導入時就避免了再解析或編譯代碼產(chǎn)生新的開銷。
對于Python項目來說,將配置、密鑰和密碼(統(tǒng)稱為“機密”)存儲在名為secret.py,config.py或者settings.py之類的gitignored Python文件中也是一種常見的實踐,這些機密信息在項目的其他部分導入使用。這在機密信息和源代碼之間提供了一個很好的分離,在大多數(shù)情況下,這種設置工作得很好。而且由于它復用了語言的導入機制,這些項目不必在文件I/O或JSON之類的格式上浪費時間。
但是在這種模式快速且方便的同時,它也可能是不安全的。因為它重用了語言的導入機制(該機制有創(chuàng)建和緩存.pyc文件的習慣),所以這些機密也存在于編譯的字節(jié)碼中!使用GitHub API進行的一些初步研究顯示,數(shù)千個GitHub代碼倉庫的字節(jié)碼中隱藏著機密。
用于在代碼倉庫中查找機密的現(xiàn)有工具(我最喜歡的是trufflehog)跳過了像.pyc這樣的二進制文件,而是只掃描純文本文件,如源代碼或配置文件。
緩存來源的速成課程
Python的早期版本將這些文件存儲在原始源文件旁邊,但是從Python 3.2開始,這些文件都位于導入模塊根目錄的一個名為pycache的文件夾中。
假設我們有一個包含下面密碼的Python文件:
這行代碼的字節(jié)碼是這樣的:
注意,變量名和字符串是完全復制的!而且,Python字節(jié)碼通常包含足夠的信息來恢復代碼的原始結(jié)構(gòu)。像uncompyle6這樣的工具可以將.pyc文件轉(zhuǎn)換回它們的原始形式。
緩存泄漏機密
為了調(diào)查這個問題到底有多普遍,我編寫了一個簡短的腳本來搜索GitHub上的.pyc文件并對其進行反編譯以尋找秘密。最后我找到了數(shù)千個Twitter密鑰、條帶標記、AWS證書和社交媒體密碼。我通知了被我用這種方式破解密鑰的相關機構(gòu)。
額外說明
緩存的字節(jié)碼是一種底層的內(nèi)部性能優(yōu)化,Python的這種優(yōu)化為我們帶來了方便!如果沒有像反匯編或反編譯這樣的特殊工具,.pyc文件的內(nèi)容是難以理解的。當這些文件被隱藏在pycache(雙下劃線代表僅供內(nèi)部使用)中時,它們很容易被忽視。許多文本編輯器和IDE將這些文件夾和文件從源代碼目錄樹中隱藏起來,以避免弄亂屏幕,從而很容易忘記它們的存在。
也就是說,對于一個有經(jīng)驗的程序員來說,無意中泄漏他們的機密是很容易的,而且初學者更容易犯這樣的錯誤。要避免這種情況,要么需要有足夠的gitignore知識,要么需要對git和Python內(nèi)部有一定的了解。
你可以做的事情:
在你的代碼倉庫中查找松散的.pyc文件,并刪除它們
如果你有.pyc文件并且它們包含機密,那么可以撤銷和輪換你的機密
使用標準的gitignore來防止檢入.pyc文件
使用JSON文件或環(huán)境變量進行配置
-----------------------公眾號:Python知識圈博客:www.pyzhishiquan.com知乎:Python知識圈微信視頻號:菜鳥程序員 (分享有趣的編程技巧、Python技巧)bilibili:菜鳥程序員的日常(目前原創(chuàng)視頻:16,累計播放量:55萬)
一個學習Python的人,喜歡分享,喜歡搞事情!
長按下圖二維碼關注,和你一起領悟Python的魅力。
Python知識圈公眾號的交流群已經(jīng)建立,群里可以領取 Python 和人工智能學習資料,大家可以一起學習交流,效率更高,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!通過好友后私聊我「學習資料」或者「進群」都可以。
掃碼添加,備注:交流學習
往期推薦01 02 03
