你的pyc文件,泄露了你的秘密!
英文原文:https://blog.jse.li/posts/pyc/
?譯者:穆勝亮
摘要:緩存控制著我周圍的所有事物。pyc文件包含機密信息,因此不應該包含在源代碼控制系統中??梢允褂肞ython標準的.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文件或環境變量進行配置
總結
以上是生活随笔為你收集整理的你的pyc文件,泄露了你的秘密!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货|且看Pyecharts如何制作多个
- 下一篇: 磁盘里竟然还有这个东西!多亏这个1.5M