누군가 워드프레스 플러그인 30개를 구매하고 그 모든 플러그인에 백도어를 심었음

3 hours ago 1
  • 동일한 공격자가 30개 이상의 WordPress 플러그인을 매입한 뒤, 첫 커밋에서 백도어 코드를 삽입해 공급망을 감염시킴
  • 악성 코드는 약 8개월간 잠복하다가 2026년 4월 초 활성화되어 다수의 사이트에 스팸 링크와 리디렉션을 주입
  • WordPress.org는 2026년 4월 7일 하루 만에 관련 31개 플러그인을 영구 폐쇄하고 강제 업데이트를 배포
  • 공격자는 Flippa에서 ‘Essential Plugin’ 포트폴리오를 6자리 금액에 인수한 뒤, Ethereum 스마트 컨트랙트를 이용해 C2 도메인을 은폐
  • 이번 사건은 2017년 ‘Display Widgets’ 사례와 유사한 대규모 공급망 공격 재현으로, WordPress 플러그인 생태계의 신뢰 관리 부재가 드러남

WordPress 플러그인 공급망 공격 사례

  • 30개 이상의 WordPress 플러그인이 동일한 공격자에 의해 인수된 후 백도어가 심어진 사건 발생
  • 공격자는 Flippa에서 ‘Essential Plugin’ 포트폴리오를 6자리 금액에 매입한 뒤, 첫 커밋에서 악성 코드를 추가
  • 백도어는 8개월간 비활성 상태로 잠복하다가 2026년 4월 초에 활성화되어 수많은 사이트를 감염
  • WordPress.org는 2026년 4월 7일 하루 만에 관련 플러그인 31개를 영구 폐쇄
  • 이번 사건은 2017년 ‘Display Widgets’ 사건과 유사한 공급망 공격 패턴의 재현으로 평가됨

공격 발견과 초기 대응

  • 한 클라이언트 사이트의 wp-admin 보안 경고를 통해 최초 감염이 확인됨
    • WordPress.org 플러그인 팀은 “Countdown Timer Ultimate” 플러그인에 무단 접근 가능 코드가 포함되었다고 경고
    • WordPress.org는 강제 업데이트(v2.6.9.1)를 배포했으나, 이미 일부 사이트는 손상된 상태였음
  • 보안 점검 결과, 플러그인의 wpos-analytics 모듈이 analytics.essentialplugin.com에 접속해 wp-comments-posts.php 파일을 다운로드하고, 이를 통해 wp-config.php에 대규모 PHP 코드 주입이 이루어짐

악성코드의 작동 방식

  • 주입된 코드는 스팸 링크, 리디렉션, 가짜 페이지를 C2 서버에서 받아와 Googlebot에만 노출
  • 공격자는 Ethereum 스마트 컨트랙트를 이용해 C2 도메인을 동적으로 관리
    • 블록체인 RPC 엔드포인트를 통해 도메인을 조회하므로, 일반적인 도메인 차단으로는 차단 불가
  • WordPress.org의 강제 업데이트는 플러그인의 전화 홈 기능만 중단시켰으며, wp-config.php의 악성 코드는 그대로 남아 있었음

백업 분석을 통한 감염 시점 추적

  • CaptainCore의 restic 백업을 이용해 8개의 시점별 wp-config.php 파일 크기를 비교
    • 2026년 4월 6일 04:22~11:06 UTC 사이에 파일 크기가 3,345바이트에서 9,540바이트로 증가
    • 감염이 이 6시간 44분 사이에 발생한 것으로 확인됨

백도어의 삽입 시점과 코드 구조

  • 플러그인 버전 2.6.7(2025년 8월 8일)에서 191줄의 신규 코드가 추가되며 백도어 삽입
    • 변경 로그에는 “WordPress 6.8.2 호환성 확인”이라고 기재되어 있었음
  • 추가된 코드의 주요 기능
    1. fetch_ver_info()가 공격자 서버의 데이터를 @unserialize()로 처리
    2. version_info_clean()이 원격 데이터에서 받은 함수명을 실행
    3. 인증 없이 호출 가능한 REST API 엔드포인트 생성 (permission_callback: __return_true)
  • 이 구조는 임의 함수 실행(RCE) 을 가능하게 하며, 8개월간 비활성 상태로 유지되다 2026년 4월 5~6일에 활성화됨

플러그인 인수 과정

  • 원래 개발팀은 인도 기반의 WP Online Support로, 2015년부터 플러그인을 개발
    • 이후 Essential Plugin으로 리브랜딩하고 30개 이상의 무료·유료 플러그인을 운영
  • 2024년 말 매출이 35~45% 감소하자 Flippa에 전체 사업을 매물로 등록
  • 2025년 초, ‘Kris’라는 인물이 SEO·암호화폐·온라인 도박 마케팅 경력을 가진 상태로 인수
    • Flippa는 2025년 7월 이 거래를 성공 사례로 블로그에 게재
  • 인수 후 첫 SVN 커밋(2025년 8월 8일)에서 바로 백도어 코드가 추가됨
  • 2026년 4월 5~6일, analytics.essentialplugin.com이 모든 사이트에 악성 페이로드를 배포 시작
  • 2026년 4월 7일, WordPress.org가 Essential Plugin의 모든 플러그인(31개)을 영구 폐쇄

폐쇄된 플러그인 목록

  • Accordion and Accordion Slider, Countdown Timer Ultimate, Popup Anything on Click, WP Blog and Widgets, WP Team Showcase and Slider 등 30개 이상 플러그인
  • WordPress.org에서 해당 작성자 검색 시 결과 없음
  • analytics.essentialplugin.com은 현재 {"message":"closed"} 응답 반환

과거 유사 사례

  • 2017년, ‘Daley Tias’라는 인물이 Display Widgets 플러그인(20만 설치)을 $15,000에 매입 후 스팸 코드 삽입
  • 이후 9개 이상의 플러그인을 같은 방식으로 감염
  • 이번 사건은 동일한 수법을 더 큰 규모(30개 이상) 로 재현한 사례로 확인됨

피해 복구 및 패치 작업

  • WordPress.org의 강제 업데이트는 임시 조치에 불과
    • wpos-analytics 모듈 자체는 여전히 존재
  • 자체적으로 백도어 모듈을 완전히 제거한 패치 버전 제작
    • 22개 고객 사이트 중 12개에서 Essential Plugin 플러그인 발견, 10개를 직접 패치
    • 패치 버전은 wpos-analytics 디렉터리 삭제, 로더 함수 제거, 버전명에 -patched 추가
  • 예시: Countdown Timer Ultimate, Popup Anything on Click, WP Testimonial with Widget 등

직접 패치 방법

  • wpos-analytics/ 디렉터리 삭제
  • 메인 플러그인 파일에서 “Plugin Wpos Analytics Data Starts” 또는 wpos_analytics_anl 블록 제거
  • Version: 헤더에 -patched 추가 후 재압축
  • wp plugin install your-plugin-patched.zip --force로 설치
  • wp-config.php 파일 크기가 약 6KB 증가했다면 활성 감염 상태로 간주하고 전체 복구 필요

WordPress 플러그인 생태계의 신뢰 문제

  • 최근 2주간 공급망 공격이 연속 발생
    • 신뢰받는 플러그인을 인수 후 악성 코드 삽입
    • WordPress.org 커밋 권한을 그대로 승계받아 검증 없이 배포
  • WordPress.org에는 소유권 변경 감시나 코드 재검토 절차가 없음
    • 새로운 커미터 등록 시 사용자 알림이나 자동 리뷰 기능 부재
  • 플러그인 팀의 대응은 신속했으나, 백도어 삽입 후 8개월간 탐지되지 않음
  • WordPress 사이트 운영자는 플러그인 목록을 점검하고, Essential Plugin 계열 플러그인을 즉시 제거 또는 패치, wp-config.php 파일도 반드시 확인 필요
Read Entire Article