WordPress 플러그인 공급망 공격과 EtherHiding 백도어 분석
Essential Plugin 공급망 공격의 PHP 역직렬화 백도어, EtherHiding C&C 은닉 방식과 WordPress 방어 전략을 분석한다.
2026-08-14 · 최초 발행 2026-04-19
2026년 4월 초, 전 세계 20만 개 이상의 WordPress 사이트에서 악성코드가 동시에 활성화됐다. 공격 코드는 8개월 전에 배포된 플러그인 업데이트에 이미 포함돼 있었고, C&C 주소는 Ethereum 스마트 컨트랙트에 숨겨져 있었다.
플러그인 소유권 인수에서 시작된 침해
공격자는 Flippa에서 WP Online Support가 운영하던 Essential Plugin 포트폴리오를 6자리(달러) 금액에 인수했다. 포트폴리오에는 WordPress.org에서 수년간 검증된 30개 이상의 플러그인이 있었고, 누적 설치 수는 수십만에 달했다.
소유권이 넘어가자 공격자는 플러그인 SVN 커밋 권한도 확보했다. 첫 악성 커밋은 2025년 8월 8일 버전 2.6.7에서 이뤄졌다. 체인지로그는 "WordPress 6.8.2 호환성 확인"만을 알렸지만, 실제 변경에는 기존 analytics 모듈 안에 삽입된 191줄의 악성 코드가 포함돼 있었다.
외부 응답을 코드 실행으로 연결한 PHP 역직렬화
PHP의 unserialize()는 직렬화된 객체 문자열을 PHP 객체로 되돌린다. 이 변환 과정에서는 PHP 매직 메서드가 자동으로 호출될 수 있다.
공격자가 제어하는 직렬화 페이로드가 unserialize()로 전달되면 애플리케이션에 존재하는 클래스의 __wakeup, __destruct, __toString 같은 매직 메서드가 연쇄 실행될 수 있다. 이런 연결을 **가젯 체인(Gadget Chain)**이라 부른다. 각각은 무해해 보일 수 있지만, 조합 결과는 원격 코드 실행(RCE)에 이를 수 있다.
OWASP는 이를 PHP Object Injection으로 분류하며, 코드 인젝션, SQL 인젝션, 경로 탐색, 서비스 거부 등으로 발전할 수 있다고 경고한다.
악성 로직은 합법적인 analytics opt-in 모듈인 wpos-analytics에 숨겨져 있었다. 취약 함수와 REST API 엔드포인트의 구조는 다음과 같았다.
fetch_ver_info():
(1) file_get_contents()로 공격자 서버(analytics.essentialplugin.com)에 접속
(2) 서버 응답을 @unserialize()로 역직렬화
(3) version_info_clean()으로 임의 함수 실행
REST API 엔드포인트:
permission_callback: __return_true ← 인증 없이 누구나 호출 가능
@unserialize() 앞의 @ 연산자는 오류를 억제한다. 역직렬화에 실패해도 경고 메시지가 출력되지 않으므로, 이 경로는 탐지하기 더 어려워진다.
최종 페이로드는 루트 디렉터리에 wp-comments-posts.php라는 위장 파일을 만들고, wp-config.php에 SEO 스팸 코드를 주입했다. Googlebot에는 스팸 콘텐츠를 노출하면서 실제 사이트 관리자가 볼 때는 정상 페이지처럼 보이게 하는 방식이다.
스마트 컨트랙트에 숨긴 C&C 주소
EtherHiding은 블록체인 스마트 컨트랙트를 분산형 C&C 서버처럼 사용하는 기법이다. 이 WordPress 공격의 악성 코드는 공개 Ethereum RPC 엔드포인트를 통해 스마트 컨트랙트를 조회하고, 그 결과에서 현재 C&C 도메인 주소를 얻었다.
스마트 컨트랙트 데이터에는 Base64 인코딩과 XOR 암호화가 적용돼 있어, 온체인 데이터만 분석해서 C&C 주소를 즉시 확인하기 어렵다.
| 속성 | 전통적 C&C | 블록체인 C&C |
|---|---|---|
| 인프라 위치 | 단일 서버/도메인 | 전 세계 분산 노드 |
| 차단 방법 | 도메인/IP 블랙리스트 | 불가능 (블록체인 자체를 차단해야) |
| 업데이트 비용 | 새 도메인 등록 필요 | 컨트랙트 호출 ~$1 (MATIC 기준) |
| 추적 가능성 | 서버 압수, 도메인 등록자 조회 | 익명 지갑 주소만 존재 |
| 가동률 | 서버 다운 가능 | 블록체인 네트워크 유지되는 한 100% |
Endor Labs의 분석에 따르면 이 기법은 Ethereum뿐 아니라 BNB Smart Chain, Polygon, Solana 등으로 확산되고 있다. 일반 사이버 범죄 조직부터 북한 UNC5342와 같은 국가 지원 위협 행위자까지 폭넓게 활용하고 있다.
잠복 기간이 만든 대규모 배포 기반
공격은 백도어를 심은 즉시 실행하지 않았다. 8개월 동안 정상 업데이트를 계속 배포하며 설치 기반과 신뢰 기록을 쌓은 뒤 활성화했다.
잠복의 목적은 탐지 회피에만 있지 않았다. 이 기간에 악성 버전은 자동 업데이트를 통해 더 많은 사이트로 배포됐고, WordPress.org의 업데이트 검토 기록도 축적됐다. 최신 버전을 적용한다고 믿었던 사용자는 백도어가 포함된 버전을 설치하게 됐다.
Patchstack은 WordPress.org 통계를 기준으로 감염 사이트가 20만 개를 넘었다고 분석했고, Rescana는 40만 개 이상으로 추산했다.
오픈소스 신뢰 경로를 노리는 공급망 공격
이 사건은 오픈소스 공급망 공격의 여러 진입점 가운데 소유권 인수가 어떻게 악용될 수 있는지 보여준다. Sonatype의 2025년 보고서에 따르면 한 해에만 45만 개 이상의 악성 패키지가 발견됐다.
The Next Web과 Open Source For You의 분석은 WordPress.org 마켓플레이스의 구조적 문제를 지적한다. 플러그인 소유자가 바뀌어도 코드 서명이나 추가 검토 없이 기존 신뢰 수준이 유지되고, 이전 이후 업데이트를 더 엄격히 살피는 신뢰 초기화 정책도 없다. 자동 업데이트가 켜진 환경에서는 악성 버전이 즉시 적용될 수 있으며, 변경 로그와 실제 코드 변경의 불일치를 자동으로 찾는 SVN 커밋 감사 체계도 없다.
소유권 변화를 운영 신호로 다루기
플러그인 소유권 변경은 공급망 침해를 의심해야 하는 신호다. Patchstack, WPScan, Wordfence 같은 취약점 피드에서 플러그인 폐쇄나 권고 등의 상태 변경 알림을 구독하고, 사용 중인 플러그인 목록을 기준으로 필터링하면 대응 시간을 줄일 수 있다.
WordPress 플러그인은 SVN 저장소로 관리된다. 플러그인별 SVN 피드를 구독하거나 WordPress.org API로 버전 변경 이력과 마지막 업데이트 날짜를 정기적으로 확인할 수 있다.
https://api.wordpress.org/plugins/info/1.0/<plugin-slug>.json
→ last_updated, author, versions 필드 모니터링
소유권 변경이 확인된 플러그인은 자동 업데이트를 일시 비활성화하고, 코드를 수동 검토한 뒤 적용하는 정책이 필요하다. WordPress.org 플러그인 페이지의 author, author_profile 값이 이전 스냅샷과 달라졌는지도 함께 비교해야 한다. 이 정보를 주기적으로 저장해 비교하는 자동화는 조기 탐지에 활용할 수 있다.
파일과 네트워크에서 확인하는 무결성 징후
소프트웨어 공급망 무결성 검증에는 Google이 주도하는 SLSA(Supply-chain Levels for Software Artifacts) 프레임워크와 Sigstore가 있다. SLSA는 소스 무결성, 빌드 출처(provenance), 의존성 관리를 위한 단계적 성숙도 모델을 제공한다. Sigstore의 cosign, Fulcio 인증기관, Rekor 투명성 로그를 결합하면 소스 코드부터 배포 아티팩트까지 신뢰 체인을 구성할 수 있다.
WordPress 생태계에 이를 직접 적용하기는 어렵다. 대신 운영 환경에서는 파일 무결성, 소스 비교, 아웃바운드 연결, 위험한 함수 조합을 함께 점검할 수 있다.
WordPress 코어와 플러그인 파일의 해시를 기록하고 변경 시 알림을 받는 파일 무결성 모니터링(FIM)이 기본 방어선이 된다. Wordfence와 iThemes Security는 관련 기능을 제공하며, 서버 레벨에서는 OSSEC와 Tripwire를 활용할 수 있다. 이 사건에서 생성된 wp-comments-posts.php와 변조된 wp-config.php는 FIM으로 즉시 탐지 가능했다.
설치된 플러그인 소스는 WordPress.org SVN 원본과 정기적으로 비교할 수 있다. diff 또는 git 기반 비교 도구로 예상하지 못한 변경을 식별한다. 또한 file_get_contents()나 curl이 알 수 없는 도메인에 연결하는 패턴을 감시해야 한다. Ethereum RPC 엔드포인트인 infura.io, alchemy.com 등으로의 비정상 연결도 탐지 규칙에 포함해야 한다.
unserialize()와 file_get_contents()가 함께 사용되는 플러그인 코드는 별도로 스캔한다.
grep -r "unserialize" /var/www/html/wp-content/plugins/ | grep -v ".git"
grep -r "file_get_contents" /var/www/html/wp-content/plugins/ | grep "unserialize"
이 조합이 사용자 입력이나 외부 HTTP 응답과 연결된다면 즉시 상세 검토가 필요하다.
PHP 실행 환경에서 allow_url_fopen과 allow_url_include를 비활성화하면 file_get_contents()를 통한 원격 데이터 패치 자체를 막을 수 있다. 이번 공격의 fetch_ver_info() 함수는 이 설정만으로도 무력화됐을 것이다.
; php.ini
allow_url_fopen = Off
allow_url_include = Off
이 사례에서 방어의 초점은 C&C 도메인 추적만으로 충분하지 않다. 블록체인 기반 C&C는 도메인 차단, 서버 압수, IP 블랙리스트 같은 기존 수단을 우회한다. 파일 생성, 코드 변조, 비정상 아웃바운드 연결처럼 호스트에서 남는 행위를 함께 분석해야 한다.
오픈소스 생태계는 기여자 평판과 소유권의 연속성을 신뢰 기반으로 삼는다. 소유권 변경 시 신뢰 리셋, 코드 서명 의무화, 자동 업데이트의 단계적 배포 같은 구조적 보완이 필요하다. 운영자는 사용 중인 플러그인의 소유자 변경 이력을 확인하고, allow_url_fopen 설정과 파일 무결성 모니터링을 점검할 수 있다.
Sources
- 30+ WordPress plugins bought on Flippa and backdoored in supply chain attack - The Next Web
- Critical Supply Chain Compromise on 20+ Plugins by EssentialPlugin - Patchstack
- Essential Plugin WordPress Backdoor - mySites.guru
- Hackers Hide Backdoor in Trusted WordPress Plugins for 8 Months Before Activating Malware - Cryptika
- Critical Supply Chain Attack on EssentialPlugin WordPress Suite - Rescana
- The Unkillable C2: How Attackers Are Moving Command and Control to the Blockchain - Endor Labs
- DPRK Adopts EtherHiding: Nation-State Malware Hiding on Blockchains - Google Cloud
- Ethereum smart contracts used to push malicious code on npm - ReversingLabs
- PHP Object Injection - OWASP Foundation
- Second Open Source Plugin Hijack Raises Alarm Across WordPress Ecosystem - Open Source For You
- SLSA Framework Guide 2026 - Practical DevSecOps
- Popular WordPress plugins backdoored after ownership change - TechSpot