
업데이트 2021.12.19: Log4j에서 계속해서 새로운 취약점과 이를 악용하는 새로운 방법이 발견되고 있습니다. 우리는 git 저장소에 세 가지 마인드맵을 추가했습니다. 각각 취약한 Log4j 버전, 취약 여부 확인 방법, 각 취약점 완화 방법을 설명합니다.
Log4j 2.x를 사용하는 소프트웨어 식별
Log4j 취약점 완화
위의 방법이 불가능한 경우
Pattern Layouts의 Context Lookups를 확인하는 것을 고려하십시오.Log4j 1.x를 사용하는 소프트웨어 식별
조직에서 Log4j 1.x를 사용하는 경우 공급업체와 협의하여 다음을 요구하십시오.
Log4j 취약점 중 가장 큰 늑대. ${jndi:ldap://\<공격코드>/a} 문자열 변형이 Log4j에 의해 로깅될 때 취약점이 악용됩니다. CVSS 10.0, RCE.
CVE-2021-44228만큼 크지는 않지만 마찬가지로 심각함. Log4j의 비표준 설정 필요. CVSS 9.0, RCE 및 DoS.
CVE-2021-44228만큼 크지는 않으며 약간 덜 심각함. CVSS 7.5, DoS
Log4j 1.x에만 해당. Log4j가 JMSAppender를 사용해야 함. CVSS 6.6, RCE 악용하려면 Log4j가 JMSAppender를 사용해야 함. JMSAppender가 직접 구성되거나(드문 경우) 공격자가 Log4j 구성에 추가하는 경우. 또한 공격자는 JMSAppender 구성을 변경할 수 있는 권한이 있어야 함. 이 경우 공격자는 일반적으로 이미 시스템에 접근 권한이 있음. 따라서 이 취약점은 관련성이 낮은 것으로 간주됨.
Log4j 1.x에만 해당. Log4j가 SocketServer를 사용해야 함. CVSS 9.8, RCE 해당 소켓에 네트워크 접근이 가능한 공격자에게 코드 실행 가능성을 제공함. 악용 코드는 공개적으로 이용 가능.
Java 8의 경우 Log4j v. 2.17.0이 최신 버전입니다. 위의 모든 취약점을 완화합니다.
버전 2.16.0은 가장 심각한 취약점을 완화합니다.
Java 7의 경우 Log4j가 버전 2.12.2로 제공됩니다. 이 버전은 CVE-2021-45105를 완화하지 않습니다. Log4j 팀은 Java 6 및 Java 7 모두 더 이상 지원되지 않는다고 밝혔습니다. Java 7용 Log4j에 또 다른 보안 업데이트가 제공될지는 불확실합니다.
'마인드맵 #1'은 각 취약점이 존재하는 조건에 대한 좋은 개요를 제공합니다.

Loïc Castel 제작. github에서 가져옴.
문제점 중 하나는 반드시 인터넷에 직접 노출된 서버만 취약한 것은 아니라는 점입니다. 취약점은 동일한 데이터를 수신하여 기록하는 '체인' 뒤쪽에 있는 서버에 있을 수 있습니다. 이로 인해 무엇이 노출되었는지 파악하기 어려울 수 있습니다.
'마인드맵 #2'는 자체 시스템에서 취약점을 확인하는 방법에 대한 좋은 개요를 제공합니다.
Loïc Castel 제작. github에서 가져옴.


- User-agent
- 검색 필드
- 사용자 이름
- ...
4. 카나리 히트를 추적하여 log4j가 실행되는 위치 파악.
참고: Florian Roth의 트윗
다음은 매핑된 네트워크 드라이브를 포함한 모든 디스크를 검사합니다:
Get-PSDrive -PSProvider FileSystem | foreach {(gci ($_.Root) -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
참고: https://twitter.com/0gtweet/status/1469661769547362305
로컬 디스크만 확인하려는 경우:
Get-CimInstance win32_volume | Where-Object { $_.DriveType -eq 3 -and $_.DriveLetter -ne $null} | ForEach-Object {(gci ($_.DriveLetter+"\") -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
참고: https://twitter.com/webmastir/status/1470386184052486155?s=20
추가로 시스템의 이벤트 로그를 확인하려는 경우:
Get-WinEvent -ListLog * |
foreach { get-winevent @{logname=$_.logname; } -ea 0 } |
where message -match 'jndi'
#!/bin/bash
find / -name '*log4j*.jar' -print0 2>/dev/null -print0 | while read -d $'\0' log4j; do
echo -en "${log4j}: "$(unzip -p "${log4j}" | strings | grep -Po '^Implementation-Version:\s+([0-9\.]+)' | awk '{ print $NF }')"\n"
done
exit 0
'마인드맵 #3'은 완화 옵션에 대한 개요를 제공합니다.
Loïc Castel 제작. github에서 가져옴.
아래에는 완화를 수행하기 위한 몇 가지 리소스를 나열했습니다.
Log4j를 v 2.17.0으로 업데이트
Log4j를 v 2.12.2로 업데이트 참고 CVE-2021-45105를 완화하지 않음
⚠️ 이 방법은 모든 상황에서 모든 취약점을 완화하지 않으므로 더 이상 완전한 해결책으로 간주되지 않습니다.
[Environment]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:SetEnvironmentVariable(%22LOG4J_FORMAT_MSG_NO_LOOKUPS%22,%22true%22,%22Machine%22)
참고: 재시작 필요
출처: https://twitter.com/CyberRaiju/status/1469505680138661890
"‐Dlog4j2.formatMsgNoLookups=True"
명령줄 예시:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" teku --network mainnet
또는 -Xmx 값 포함:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4g" teku
Systemd 구성 예시:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true"'
또는 -Xmx 값 포함:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" "-Xmx4g'
애플리케이션 재시작 시 로드됨 출처: https://github.com/ConsenSys/teku/security/advisories/GHSA-mwfw-vm54-g3p7
Jar 파일은 아카이브(zip 파일)이며 열 수 있습니다. 그런 다음 파일을 제거할 수 있습니다. 이 작업은 7-zip과 같은 도구(이미지 참조)를 사용하여 수동으로 수행하거나 스크립트를 사용하여 수행할 수 있습니다.
애플리케이션 재시작 필요
참고: https://mogwailabs.de/en/blog/2021/12/vulnerability-notes-log4shell/9

[Reflection.Assembly]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:LoadWithPartialName(%27System.IO.Compression%27)
$JarFilLokasjon = 'C:\temp\log4j-core-2.13.0-test.jar'
$Filnavn = 'JndiLookup.class' #이 파일이 삭제됩니다!
$Stream = New-Object IO.FileStream($JarFilLokasjon, [IO.FileMode]::Open)
$ZipMode = [IO.Compression.ZipArchiveMode]::Update
$Zip = New-Object IO.Compression.ZipArchive($stream, $ZipMode)
($zip.Entries | Where-Object { $Filnavn -contains $_.Name }) | ForEach-Object { $_.Delete() }
$zip.Dispose()
$stream.Close()
$stream.Dispose()
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
https://github.com/NCSC-NL/log4shell/tree/main/software
https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592
root로 실행
lsof | grep log4j-core