開(kāi)源PHPMailer庫(kù)被披露存有一個(gè)嚴(yán)重的遠(yuǎn)程代碼執(zhí)行漏洞。這個(gè)漏洞在被修補(bǔ)后,又進(jìn)行了二次修復(fù),因?yàn)榈谝淮螞](méi)有充分解決問(wèn)題。那么,這個(gè)漏洞是如何工作的?為什么原始補(bǔ)丁沒(méi)有解決問(wèn)題?
Michael Cobb:代碼庫(kù)和框架大大減少了構(gòu)建新應(yīng)用程序所需的時(shí)間,保存了一些通用組件,因而開(kāi)發(fā)團(tuán)隊(duì)不需要再為每個(gè)新項(xiàng)目從頭開(kāi)始構(gòu)建。
絕大多數(shù)Web服務(wù)都是使用流行的第三方框架和庫(kù)構(gòu)建的。這種重復(fù)使用代碼的最大問(wèn)題是,如果在受歡迎的庫(kù)中發(fā)現(xiàn)了一個(gè)漏洞,那么它會(huì)影響成千上萬(wàn)的應(yīng)用程序、站點(diǎn)和服務(wù)。
這種情況非常頻繁,最近又再次出現(xiàn),前不久Dawid Golunski發(fā)現(xiàn)開(kāi)源運(yùn)輸類PHPMailer中的遠(yuǎn)程代碼執(zhí)行漏洞。利用該漏洞,攻擊者能夠在Web服務(wù)器帳戶的上下文中訪問(wèn)目標(biāo)服務(wù)器,可能導(dǎo)致Web應(yīng)用程序受損。
PHPMailer被許多開(kāi)源項(xiàng)目所使用,如WordPress、Drupal和Joomla,全球約有900萬(wàn)用戶。網(wǎng)上有數(shù)千個(gè)代碼段和示例,顯示了如何使用PHPMailer從各種形式(如聯(lián)系人或注冊(cè)表單)發(fā)送電子郵件,但其中大多數(shù)包含不安全的代碼行,這讓該漏洞得以被利用,因?yàn)樗试S任何人偽造From和發(fā)件人地址。
PHPMailer使用PHP郵件功能作為發(fā)送郵件的默認(rèn)方法。雖然PHPMailer使用的所有電子郵件地址在使用前都已先行進(jìn)行驗(yàn)證,但Golunski發(fā)現(xiàn)了“生成一個(gè)包含可執(zhí)行命令的有效‘發(fā)件人’電子郵件地址的方式”。雖然“發(fā)件人”電子郵件地址應(yīng)由開(kāi)發(fā)人員設(shè)置,但通常都是由用戶自行設(shè)置,這非常不好,用戶能夠提交他們選擇的任何電子郵件地址。另外,如果開(kāi)發(fā)人員未對(duì)發(fā)件人的屬性進(jìn)行明確的設(shè)置,則使用發(fā)件人地址。此發(fā)件人值將添加到傳遞給PHP郵件功能的第五個(gè)參數(shù),該函數(shù)無(wú)法過(guò)濾掉一些可能包含的字符串字面值轉(zhuǎn)義字符。這樣一來(lái),攻擊者能夠注入包含發(fā)送郵件時(shí)執(zhí)行命令的其他參數(shù)。
這個(gè)漏洞被標(biāo)記為CVE-2016-10033,PHPMailer開(kāi)發(fā)人員認(rèn)為在發(fā)布的PHPMailer 5.2.18版本時(shí)已修復(fù)了該漏洞。他們?cè)趥鬟f給PHP郵件功能之前,添加了escapeshellarg轉(zhuǎn)義函數(shù)來(lái)清理發(fā)件人地址值。
但Golunski注意到,當(dāng)escapeshellarg函數(shù)與現(xiàn)有的轉(zhuǎn)義函數(shù)escapeshellcmd組合使用時(shí),發(fā)件人值仍然沒(méi)有得到正確的轉(zhuǎn)義。通過(guò)向原始攻擊代碼添加額外的引用,仍然可以逃避補(bǔ)丁所提供的保護(hù)。這個(gè)新的漏洞是CVE-2016-10045,補(bǔ)丁在PHPMailer 5.2.20中被發(fā)布。
PHPMailer團(tuán)隊(duì)已經(jīng)在GitHub上發(fā)布了如何正確處理網(wǎng)站表單中使用的電子郵件地址的示例。它需要向網(wǎng)站域內(nèi)的有效地址發(fā)送表單數(shù)據(jù),并由開(kāi)發(fā)人員設(shè)置。
這被認(rèn)為是一個(gè)非常關(guān)鍵的漏洞,它顯示出開(kāi)發(fā)人員和Web管理員保持對(duì)最新安全威脅以及使用任何共享組件、包或庫(kù)訂閱保持警惕的重要性。
開(kāi)發(fā)人員應(yīng)該審查使用PHPMailer郵件功能的所有腳本,還要研究PHP的各種轉(zhuǎn)義功能的工作機(jī)制,以及它們對(duì)不同類型字符串的影響,因?yàn)殄e(cuò)誤的轉(zhuǎn)義字符串也可能導(dǎo)致SQL注入。