国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Python常見安全漏洞及修復(fù)方法

2018-09-10 06:14:13姜唐
關(guān)鍵詞:序列化調(diào)用漏洞

姜唐

編寫安全的代碼很困難,當(dāng)學(xué)習(xí)一門編程語(yǔ)言、一個(gè)模塊或框架時(shí),會(huì)學(xué)習(xí)其使用方法。在考慮安全性時(shí),需要考慮如何避免代碼被濫用,Python也不例外,即使在標(biāo)準(zhǔn)庫(kù)中,也存在著許多糟糕的實(shí)例。然而,許多Python開發(fā)人員卻根本不知道這些。

以下總結(jié)10個(gè)Python常見安全漏洞,排名不分先后。

1.輸入注入

注入攻擊影響廣泛且很常見,注入有很多種類,它們影響所有的語(yǔ)言、框架和環(huán)境。

SQL注入是直接編寫SQL查詢(而非使用ORM)時(shí)將字符串與變量混合。我讀過(guò)很多代碼,其中“引號(hào)字符轉(zhuǎn)義”被認(rèn)為是一種修復(fù),但事實(shí)并非如此,可以通過(guò)SQL注入所有可能發(fā)生的方式。

命令注入有可能在使用popen,subprocess,os.system調(diào)用一個(gè)進(jìn)程并從變量中獲取參數(shù)時(shí)發(fā)生,當(dāng)調(diào)用本地命令時(shí),有人可能會(huì)將某些值設(shè)置為惡意值。

下面是個(gè)簡(jiǎn)單的腳本,使用用戶提供的文件名調(diào)用子進(jìn)程:

修復(fù)方法:

如果使用了Web框架,可以用附帶的實(shí)用程序?qū)斎脒M(jìn)行清理,除非有充分的理由,否則不要手動(dòng)構(gòu)建SQL查詢,大多數(shù)ORM都有內(nèi)置的清理方法。

對(duì)于shell,可以使用shlex模塊正確地轉(zhuǎn)義輸入。

2.解析XML

如果應(yīng)用程序加載并解析XML文件,可能你正在使用一個(gè)XML標(biāo)準(zhǔn)庫(kù)模塊。有一些針對(duì)XML的常見攻擊。大多數(shù)為DoS風(fēng)格(旨在破壞系統(tǒng)而不是盜取數(shù)據(jù))。這些攻擊很常見,特別是在解析外部(即不可信任的)XML文件時(shí)。

其中一種攻擊為“billion laughs”,因?yàn)榧虞d的文件包含了很多個(gè)(數(shù)十億)“l(fā)ols”。你可以加載XML實(shí)體文件,當(dāng)XML解析器試圖將這個(gè)XML文件加載到內(nèi)存中時(shí),會(huì)消耗很多個(gè)G的內(nèi)存。

另一種攻擊使用外部實(shí)體擴(kuò)展。XML支持從外部URL引用實(shí)體,XML解析器通常會(huì)直接獲取并加載該資源?!肮粽呖梢岳@開防火墻訪問(wèn)保密資源,因?yàn)樗姓?qǐng)求都是由內(nèi)部可信的IP地址創(chuàng)建的,請(qǐng)求不是來(lái)自于外部。”

需要考慮的另一種情況是要依賴于第三方軟件包來(lái)解碼XML,例如配置文件,遠(yuǎn)程API。有時(shí)甚至不知道自己的某個(gè)依賴包已經(jīng)暴露在攻擊之下。

那么在Python中會(huì)發(fā)生什么?標(biāo)準(zhǔn)庫(kù)模塊etree,DOM,xmlrpc都容易遭受這些類型的攻擊。

修復(fù)方法:

直接用defusedxml替換標(biāo)準(zhǔn)庫(kù)模塊。它增加了針對(duì)這類攻擊的安全防護(hù)。

3. Assert語(yǔ)句

不要使用assert語(yǔ)句來(lái)防止用戶訪問(wèn)特定代碼段。例如:

默認(rèn)情況下,Python以_debug _為true來(lái)執(zhí)行腳本,但在實(shí)際環(huán)境中,通常使用優(yōu)化運(yùn)行,這將會(huì)跳過(guò)assert語(yǔ)句并直接轉(zhuǎn)到安全代碼,而不管用戶是否是is_admin。

修復(fù)方法:

僅在單元測(cè)試中使用assert語(yǔ)句。

4.計(jì)時(shí)攻擊

計(jì)時(shí)攻擊本質(zhì)上是一種通過(guò)計(jì)算比較提供值所需時(shí)間來(lái)暴露行為和算法的方式。計(jì)時(shí)攻擊需要精確性,所以通常不能用于高延遲的遠(yuǎn)程網(wǎng)絡(luò)。由于大多數(shù)Web應(yīng)用程序涉及可變延遲,因此幾乎不可能針對(duì)HTTP Web服務(wù)器編寫計(jì)時(shí)攻擊。

但是,如果應(yīng)用程序有提示輸入密碼的命令行,攻擊者就可以編寫一個(gè)簡(jiǎn)單的腳本來(lái)計(jì)算將其值與實(shí)際密碼進(jìn)行比較所需的時(shí)間。

修復(fù)方法:

使用在Python 3.5中引入的secrets.compare_digest來(lái)比較密碼和其他私密值。

5.感染site-packages或?qū)肼窂?/p>

Python的導(dǎo)入系統(tǒng)非常靈活。當(dāng)為測(cè)試程序編寫猴子補(bǔ)丁,或者重載核心函數(shù)時(shí),會(huì)感覺非常方便。

但這也是Python最大的安全漏洞之一。

將第三方包安裝到site-packages中,無(wú)論是在虛擬環(huán)境中還是在全局site-packages中,你都將暴露在安全風(fēng)險(xiǎn)中。

有一些發(fā)布到PyPi的包與流行的包具有相似的名稱,但是卻執(zhí)行了任意代碼。幸運(yùn)的是,這很可能沒有太大危害,只會(huì)“明確表示”這個(gè)問(wèn)題沒有得到真正的解決。

需要考慮的另一種情況是多層依賴包。它們可能包含漏洞,它們也可以通過(guò)導(dǎo)入系統(tǒng)重寫Python默認(rèn)行為。

修復(fù)方法:

可以利用PyUp.io這個(gè)網(wǎng)站提供的工具檢查第三方包。使用虛擬環(huán)境,確保全局site-packages盡可能干凈,同時(shí)檢查包簽名。

6.臨時(shí)文件

要在Python中創(chuàng)建臨時(shí)文件,通常會(huì)使用mktemp()函數(shù)生成一個(gè)文件名,然后使用該名稱創(chuàng)建一個(gè)文件。“這是不安全的,因?yàn)榱硪粋€(gè)進(jìn)程可能會(huì)在調(diào)用mktemp()和隨后嘗試通過(guò)第一個(gè)進(jìn)程創(chuàng)建文件之間的空隙創(chuàng)建一個(gè)同名文件?!边@意味著應(yīng)用程序可能加載錯(cuò)誤的數(shù)據(jù)或暴露其他的臨時(shí)數(shù)據(jù)。

如果調(diào)用不正確,最新版本的Python會(huì)發(fā)出運(yùn)行警告。

修復(fù)方法:

如果需要生成臨時(shí)文件,請(qǐng)使用tempfile模塊并使用mkstemp。

7.使用yaml.load

引用PyYAML的說(shuō)明文檔:

警告:使用不可信源的數(shù)據(jù)調(diào)用yaml.load是不安全的!yaml.load和pickle.load一樣強(qiáng)大,所以可以調(diào)用任何Python函數(shù)。

在流行的Python項(xiàng)目Ansible中找到一個(gè)例子,可以將此值提供給Ansible Vault作為有效的YAML,它使用文件中提供的參數(shù)調(diào)用os.system。

所以,從用戶提供的值中加載YAML文件會(huì)讓應(yīng)用大門洞開,很容易遭受攻擊。

修復(fù)方法:

總是使用yaml.safe_load,除非有其他更好的方法。

8. Pickle漏洞

用pickle反序列化數(shù)據(jù)和YAML一樣糟糕。在pickle對(duì)象時(shí),Python類可以聲明一個(gè)名為_reduce_的魔術(shù)方法,該方法返回一個(gè)字符串、或一個(gè)元組。攻擊者可以使用它來(lái)引用其中一個(gè)子進(jìn)程模塊,在主機(jī)上運(yùn)行任意命令。

這有一個(gè)在Python2中pickle一個(gè)類并打開shell的例子。更多利用pickle漏洞的方法請(qǐng)看這個(gè)。

修復(fù)方法:

切勿用pickle反序列化不受信任或未經(jīng)身份驗(yàn)證的數(shù)據(jù)。改用另一種序列化模式,如JSON。

9.使用系統(tǒng)自帶的Python而不修補(bǔ)漏洞

大多數(shù)可移植操作系統(tǒng)都自帶Python2,通常還是舊版本。由于“Python”,即CPython是用C語(yǔ)言編寫的,所以Python解釋器本身存在漏洞。C語(yǔ)言中常見的安全問(wèn)題與內(nèi)存分配有關(guān),所以存在緩沖區(qū)溢出錯(cuò)誤。

多年來(lái)CPython出現(xiàn)了多個(gè)溢出漏洞,每個(gè)漏洞都在后續(xù)版本中進(jìn)行了修復(fù)。也就是說(shuō),如果你修補(bǔ)了Python本身的漏洞,你就是安全的。

修復(fù)方法:

安裝最新版本的Python并及時(shí)修補(bǔ)漏洞。

10.不修補(bǔ)依賴包的漏洞

類似于修補(bǔ)Python本身的漏洞,還需要定期修補(bǔ)依賴包漏洞。有人習(xí)慣于使用PyPi軟件包的“固定”版本,這種做法很可怕。他們認(rèn)為“這些是有用的版本”,所以每個(gè)人都對(duì)漏洞置若罔聞。

上面提到的所有漏洞如果存在于你使用的包中,它們同樣很致命,所以這些軟件包的開發(fā)人員無(wú)時(shí)無(wú)刻地在解決安全問(wèn)題。

修復(fù)方法:

使用類似于PyUP.io這個(gè)網(wǎng)站提供的服務(wù)去檢查更新,向應(yīng)用程序發(fā)送pull/merge請(qǐng)求,運(yùn)行測(cè)試,讓軟件包保持更新。使用InSpec這樣的工具來(lái)驗(yàn)證真實(shí)環(huán)境中的安裝版本,并確保修補(bǔ)了最小版本或多個(gè)連續(xù)版本的漏洞。

猜你喜歡
序列化調(diào)用漏洞
漏洞
如何建構(gòu)序列化閱讀教學(xué)
甘肅教育(2020年14期)2020-09-11 07:58:36
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
三明:“兩票制”堵住加價(jià)漏洞
漏洞在哪兒
Java 反序列化漏洞研究
高鐵急救應(yīng)補(bǔ)齊三漏洞
作文訓(xùn)練微格化、序列化初探
武平县| 射洪县| 石景山区| 迭部县| 蒙阴县| 思南县| 黔南| 林口县| 当阳市| 开阳县| 彝良县| 合川市| 武清区| 铜陵市| 凤山县| 嘉禾县| 定远县| 桦川县| 格尔木市| 永顺县| 新民市| 清原| 西充县| 漳州市| 霍林郭勒市| 中超| 长葛市| 苗栗县| 平和县| 琼海市| 高碑店市| 田东县| 射洪县| 丁青县| 乐都县| 日土县| 西昌市| 渭南市| 红原县| 调兵山市| 三明市|