你的pyc文件,泄露了你的秘密!

英文原文:https://blog.jse.li/posts/pyc/
?譯者:穆勝亮
摘要:緩存控制著我周圍的所有事物。pyc文件包含機(jī)密信息,因此不應(yīng)該包含在源代碼控制系統(tǒng)中。可以使用Python標(biāo)準(zhǔn)的.gitignore文件,移除源代碼控制系統(tǒng)對(duì)pyc文件的包含。
?????當(dāng)你第一次導(dǎo)入Python文件時(shí),Python解釋器將編譯該文件并將產(chǎn)生的字節(jié)碼緩存到.pyc文件中,這樣以后導(dǎo)入時(shí)就避免了再解析或編譯代碼產(chǎn)生新的開(kāi)銷。
?????對(duì)于Python項(xiàng)目來(lái)說(shuō),將配置、密鑰和密碼(統(tǒng)稱為“機(jī)密”)存儲(chǔ)在名為secret.py,config.py或者settings.py之類的gitignored Python文件中也是一種常見(jiàn)的實(shí)踐,這些機(jī)密信息在項(xiàng)目的其他部分導(dǎo)入使用。這在機(jī)密信息和源代碼之間提供了一個(gè)很好的分離,在大多數(shù)情況下,這種設(shè)置工作得很好。而且由于它復(fù)用了語(yǔ)言的導(dǎo)入機(jī)制,這些項(xiàng)目不必在文件I/O或JSON之類的格式上浪費(fèi)時(shí)間。
?????但是在這種模式快速且方便的同時(shí),它也可能是不安全的。因?yàn)樗赜昧苏Z(yǔ)言的導(dǎo)入機(jī)制(該機(jī)制有創(chuàng)建和緩存.pyc文件的習(xí)慣),所以這些機(jī)密也存在于編譯的字節(jié)碼中!使用GitHub API進(jìn)行的一些初步研究顯示,數(shù)千個(gè)GitHub代碼倉(cāng)庫(kù)的字節(jié)碼中隱藏著機(jī)密。
?????用于在代碼倉(cāng)庫(kù)中查找機(jī)密的現(xiàn)有工具(我最喜歡的是trufflehog)跳過(guò)了像.pyc這樣的二進(jìn)制文件,而是只掃描純文本文件,如源代碼或配置文件。
緩存來(lái)源的速成課程
????
???? Python的早期版本將這些文件存儲(chǔ)在原始源文件旁邊,但是從Python 3.2開(kāi)始,這些文件都位于導(dǎo)入模塊根目錄的一個(gè)名為_(kāi)_pycache__的文件夾中。
???? 假設(shè)我們有一個(gè)包含下面密碼的Python文件:

? ? ?這行代碼的字節(jié)碼是這樣的:

?????注意,變量名和字符串是完全復(fù)制的!而且,Python字節(jié)碼通常包含足夠的信息來(lái)恢復(fù)代碼的原始結(jié)構(gòu)。像uncompyle6這樣的工具可以將.pyc文件轉(zhuǎn)換回它們的原始形式。

緩存泄漏機(jī)密
????
???? 為了調(diào)查這個(gè)問(wèn)題到底有多普遍,我編寫了一個(gè)簡(jiǎn)短的腳本來(lái)搜索GitHub上的.pyc文件并對(duì)其進(jìn)行反編譯以尋找秘密。最后我找到了數(shù)千個(gè)Twitter密鑰、條帶標(biāo)記、AWS證書和社交媒體密碼。我通知了被我用這種方式破解密鑰的相關(guān)機(jī)構(gòu)。

你自己試試吧!
????
??? 這篇文章附帶了一個(gè)小的奪旗風(fēng)格的實(shí)驗(yàn),你可以自己嘗試這種風(fēng)格的攻擊。
? ? 代碼地址:https://github.com/veggiedefender/pyc-secret-lab/
額外說(shuō)明
???
?? ?緩存的字節(jié)碼是一種底層的內(nèi)部性能優(yōu)化,Python的這種優(yōu)化為我們帶來(lái)了方便!如果沒(méi)有像反匯編或反編譯這樣的特殊工具,.pyc文件的內(nèi)容是難以理解的。當(dāng)這些文件被隱藏在__pycache__(雙下劃線代表僅供內(nèi)部使用)中時(shí),它們很容易被忽視。許多文本編輯器和IDE將這些文件夾和文件從源代碼目錄樹(shù)中隱藏起來(lái),以避免弄亂屏幕,從而很容易忘記它們的存在。
?????也就是說(shuō),對(duì)于一個(gè)有經(jīng)驗(yàn)的程序員來(lái)說(shuō),無(wú)意中泄漏他們的機(jī)密是很容易的,而且初學(xué)者更容易犯這樣的錯(cuò)誤。要避免這種情況,要么需要有足夠的gitignore知識(shí),要么需要對(duì)git和Python內(nèi)部有一定的了解。
?????你可以做的事情:
在你的代碼倉(cāng)庫(kù)中查找松散的.pyc文件,并刪除它們
如果你有.pyc文件并且它們包含機(jī)密,那么可以撤銷和輪換你的機(jī)密
使用標(biāo)準(zhǔn)的gitignore來(lái)防止檢入.pyc文件
使用JSON文件或環(huán)境變量進(jìn)行配置
- End -
由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
(1)點(diǎn)擊頁(yè)面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁(yè)。
(2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁(yè)面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝支持,比心。
