
PHP 8.1.0-dev User-Agentt 백도어 원격 코드 실행 (RCE)
User-Agentt 백도어 원격 코드 실행 (RCE)심각도: 치명적 (CVSS 등가 점수: 10.0)
취약점 유형: 공급망 백도어 / 원격 코드 실행 (RCE)
영향받는 소프트웨어: PHP 8.1.0-dev (개발 빌드에만 해당)
공격 경로: 원격 (인증 불필요)
인증 요구: 없음
사용자 상호작용: 없음
영향: 전체 시스템 장악
PHP 8.1.0-dev User-Agentt 백도어는 오픈소스 소프트웨어 역사상 가장 악명 높은 공급망 손상 사례 중 하나입니다. 프로그래밍 실수에서 비롯된 일반적인 취약점과 달리, 이 문제는 악성 코드가 공식 PHP 소스 코드 저장소에 의도적으로 삽입된 결과였습니다.
백도어는 2021년 3월 공격자가 PHP Git 인프라를 성공적으로 침해한 후 PHP 8.1.0-dev 개발 스냅샷에 나타났습니다. 악성 커밋은 신뢰받는 PHP 유지관리자로 위장했으며, 특수하게 조작된 HTTP 헤더를 수신할 때마다 임의의 PHP 코드를 실행할 수 있는 숨은 메커니즘을 도입했습니다.
백도어는 발견되어 제거되기까지 잠시만 존재했지만, 손상된 개발 빌드 중 하나를 배포한 모든 서버는 즉시 인증 없는 원격 코드 실행 (RCE) 에 취약해졌습니다.
이 사건은 PHP의 개발 워크플로를 근본적으로 변화시켰고, 결국 PHP 소스 저장소가 자체 호스팅 Git 인프라에서 이전되는 결과를 낳았습니다. :contentReference[oaicite:0]{index=0}
대부분의 원격 코드 실행 취약점은 다음에서 비롯됩니다:
하지만 이 취약점은 달랐습니다.
코딩 버그가 아니었습니다.
합법적인 PHP 소스 코드 안에 의도적으로 심어진 백도어였습니다.
공격자는 기존의 약점을 악용하는 대신, HTTP 요청을 보내는 누구라도 제공한 임의의 PHP 코드가 실행되도록 PHP 자체를 수정했습니다.
그래서 이 사건은 소프트웨어 공급망 공격의 가장 잘 알려진 사례 중 하나가 되었습니다.
2021년 3월 28일, PHP의 Git 저장소에 두 건의 수상한 커밋이 나타났습니다.
두 커밋 모두 잘 알려진 PHP 유지관리자가 작성한 것으로 보였습니다.
처음에는 무해해 보였습니다.
커밋 메시지는 평범한 오타 수정과 비슷했습니다.
그러나 연구자들은 PHP 인터프리터에 추가된 수상한 코드를 재빨리 발견했습니다.
삽입된 코드는 수신된 HTTP 요청에서 사용자 지정 헤더를 검색했습니다:
User-Agentt
추가된 **"t"**에 주목하세요.
이 미묘한 철자 차이는 가볍게 검토하는 동안 백도어를 숨기는 데 도움이 되었습니다.
헤더가 트리거 문자열로 시작하면:
zerodium
PHP는 그 뒤에 오는 모든 내용을 다음을 사용해 즉시 실행했습니다:
zend_eval_string()
이를 통해 사실상 누구나 원격으로 임의의 PHP 코드를 실행할 수 있었습니다.
악성 커밋은 발견된 후 몇 시간 안에 제거되었습니다. 이후 조사에서는 공격자가 유지관리자의 서명 키를 합법적으로 획득한 것이 아니라 PHP Git 인프라를 침해한 것으로 나타났습니다. :contentReference[oaicite:1]{index=1}
삽입된 코드는 대략 다음과 같은 로직을 수행했습니다:
Incoming HTTP Request
│
▼
Read User-Agentt Header
│
▼
Does header start with "zerodium"?
│
Yes ▼
Execute remaining text as PHP
│
▼
Attacker gains Remote Code Execution
PHP는 헤더를 무해한 메타데이터로 취급하는 대신, 이를 실행 가능한 PHP 코드로 직접 평가했습니다.
일반적으로 HTTP 요청에는 다음과 유사한 헤더가 포함됩니다:
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla Firefox
손상된 PHP 버전은 추가로 다음을 처리했습니다:
User-Agentt:
그 값이 다음으로 시작하면:
zerodium
PHP는 다음을 호출했습니다:
zend_eval_string()
나머지 내용은 실행 가능한 PHP가 되었습니다.
개념적으로:
User-Agentt:
zerodium
│
▼
zend_eval_string(payload)
│
▼
Remote Code Execution
Attacker
│
│ HTTP Request
▼
GET /
User-Agentt: zerodiumsystem("id");
│
▼
PHP 8.1.0-dev
│
▼
Backdoor Triggered
│
▼
system("id")
│
▼
Command Executed
│
▼
Output Returned
인증 없음.
세션 없음.
자격 증명 없음.
HTTP 요청 하나면 충분했습니다.
공격자들은 의도적으로
User-Agentt
대신
User-Agent
를 선택했습니다. 이유는 다음과 같습니다:
이 작은 오타는 완전한 원격 코드 실행 백도어를 숨기고 있었습니다.
오직:
PHP 8.1.0-dev
구체적으로 2021년 3월 사건 당시 게시된 손상된 개발 스냅샷입니다.
다음과 같은 안정적인 릴리스:
는 절대 영향을 받지 않았습니다.
공격자에게 필요한 것은 다음과 같습니다:
인증 없음.
무차별 대입 없음.
로그인 없음.
사전 접근 없음.
성공적인 악용 시 공격자는 다음을 할 수 있습니다:
실질적으로 이 취약점은 서버 전체 장악으로 이어집니다.
관리자는 다음을 노출하는 시스템을 즉시 조사해야 합니다:
PHP/8.1.0-dev
다음과 같은 응답 헤더 내에서:
X-Powered-By:
PHP/8.1.0-dev
HTTP 로그에서도 다음을 포함하는 수상한 요청이 있는지 검토해야 합니다:
User-Agentt
또는
zerodium
많은 침입 탐지 시스템과 IPS 제품에는 이제 이 공격 패턴에 특화된 시그니처가 포함되어 있습니다. :contentReference[oaicite:2]{index=2}
가능한 지표는 다음과 같습니다:
User-Agentt를 포함하는 요청zerodium으로 시작하는 헤더 값| 속성 | 값 |
|---|---|
| 인증 | 없음 |
| 사용자 상호작용 | 없음 |
| 복잡성 | 매우 낮음 |
| 필요한 권한 | 없음 |
| 원격 | 예 |
공격자가 조작된 HTTP 요청을 보내기만 하면 되기 때문에, 이는 악용하기 가장 쉬운 원격 코드 실행 취약점 중 하나로 간주됩니다.
프로덕션 시스템에는 절대 PHP 개발 스냅샷을 배포하지 마세요.
서버가 손상된 빌드를 실행 중인 것으로 발견된 경우:
이 사건은 몇 가지 중요한 교훈을 보여주었습니다:
이번 손상은 PHP 개발 인프라의 변화를 가속화했으며, 업계 전반에서 소프트웨어 공급망 보안의 중요성이 점점 더 커지고 있음을 부각시켰습니다. :contentReference[oaicite:3]{index=3}
PHP 8.1.0-dev User-Agentt 백도어는 주요 오픈소스 프로젝트에 영향을 미친 소프트웨어 공급망 공격의 가장 중요한 사례 중 하나로 남아 있습니다. 공격자는 프로그래밍 결함을 악용하는 대신, 특수하게 조작된 User-Agentt HTTP 헤더를 통해 인증 없이 임의의 PHP 코드를 원격으로 실행할 수 있게 하는 숨은 백도어를 언어의 소스 코드에 직접 삽입했습니다. 손상된 개발 스냅샷은 빠르게 제거되었고 안정적인 PHP 릴리스는 영향을 받지 않았지만, 이 사건은 소프트웨어 개발 인프라 보안 확보, 코드 출처 검증, 프로덕션 환경에서의 개발 빌드 배포 회피가 얼마나 중요한지를 강력히 일깨워 주었습니다. 오늘날 이 취약점은 공급망 보안의 획기적인 사례로 널리 연구되고 있으며, 소프트웨어 빌드 프로세스의 무결성이 코드 자체의 보안만큼 중요하다는 사실을 상기시켜 줍니다.
| 기법 | 설명 |
|---|
| T1195 | 공급망 손상 |
| T1059 | 명령 및 스크립팅 인터프리터 |
| T1505 | 서버 소프트웨어 구성 요소 |
| T1105 | 수신 도구 전송 |
| T1071 | 애플리케이션 계층 프로토콜 |
| T1106 | 네이티브 API |
| T1055 | 프로세스 주입 (익스플로잇 후 가능) |
| T1027 | 난독화된 파일 또는 정보 |