상세 컨텐츠

본문 제목

Zend 프레임워크에서 원격 코드 실행 취약점 발견돼

국내외 보안동향

by 알약4 2021. 1. 5. 14:15

본문

 

 

Zend Framework remote code execution vulnerability revealed

 

이번 주, Zend Framework에서 신뢰할 수 없는 역직렬화 취약점을 공개했습니다. 공격자가 이 취약점을 악용할경우 PHP 사이트에서 원격 코드 실행이 가능한 것으로 나타났습니다.

 

이 취약점은 CVE-2021-3007로 등록되었으며, Laminas Project의 일부 인스턴스에도 영향을 미칠 수 있습니다.

 

Zend Framework5.7억회 이상 설치된 PHP 패키지로 구성되어 있습니다. 해당 프레임워크는 객체 지향 웹 애플리케이션을 빌드하는데 사용됩니다.

 

신뢰할 수 없는 역직렬화에서 원격 코드 실행까지

 

보안 연구원인 Ling Yizhou는 이번 주 Zend Framework 3.0.0에서 신뢰할 수 없는 역직렬화 취약점을 발견했습니다.

 

이 취약점이 악용될 경우 특정 환경에서 원격 공격자가 취약한 PHP 애플리케이션에서 원격으로 코드를 실행할 수 있게 됩니다.

 

MITRECVE-2021-3007용 보안 권고에서 아래와 같이 밝혔습니다.

 

“Zend Framework 3.0.0Stream.php에있는 Zend\Http\Response\Stream 클래스의 __destruct 메서드와 관련된 콘텐츠가 제어가 가능한 경우 원격 코드 실행으로 이어질 수 있는 역직렬화 취약점이 존재하는 것으로 나타났습니다.”

 

신뢰할 수 없는 역 직렬화 취약점은 애플리케이션이 사용자나 시스템으로부터 수신한 암호화된 데이터가 복호화되기 전 적절히 검증되지 않았을 때 발생합니다.

 

취약한 애플리케이션은 수신한 적절하지 않은 형식의 데이터를 역직렬화 및 처리할 수 있으며, 이로써 애플리케이션 충돌(DoS) 발생 및 공격자가 애플리케이션의 콘텍스트에서 임의 명령을 실행하는 등 다양한 결과를 일으킬 수 있습니다.

 

Zend의 경우, 이 취약점은 Stream 클래스의 소멸자로 인해 발생합니다.

 

객체 지향 프로그래밍에서 생성자와 소멸자는 새로운 클래스 객체가 생성 및 소멸될 때 각각 메서드 입니다.

 

예를 들어, 이 경우에는 새로 생성된 Stream 객체가 생성자를 통해 계획에 따라 일련의 명령을 실행합니다.

 

해당 객체가 프로그램 실행 워크플로우 전체의 목적을 달성하면, PHP 인터프리터는 해당 객체의 소멸자를 호출하고 다른 명령 시퀀스에 따라 메모리를 확보하고, 정리 작업을 수행하고, 임시 파일을 삭제합니다.

 

YizhouStream의 소멸자가 호출한 unlink() 메서드가 파일을 삭제하기 위해 파일 이름을 문자열 데이터 타입인 파라미터로 받는다는 점을 지적했습니다.

 

 

< 이미지 출처 : https://github.com/laminas/laminas-http/blob/2.15.x/src/Response/Stream.php#L285>

<Zend Framework Laminas Project의 취약한 소멸자>

 

 

streamName 객체는 문자열 유형이 아닐 경우에도 애플리케이션 실행이 끝나면 여전히 소멸자에게 전달됩니다.

 

따라서 문자열 값만 예상하는 소멸자는 해당 객체의 문자열 값을 얻기 위해  __toString 메서드를 호출하려고 시도할 것입니다.

 

하지만 객체의 작성자 또는 객체가 인스턴스화하는 클래스의 작성자는 __toString 메서드를 쉽게 변경할 수 있습니다.

 

해당 연구원은 직렬화된 객체를 Zend로 전달할 수 있는 시나리오 최소 2개를 시연할 수 있었습니다. 이는 PHP 애플리케이션이 파싱할 경우 렌더링된 웹페이지에서 공격자의 명령을 렌더링합니다.

 

해당 연구원은 PoC 익스플로잇에서 해당 웹 애플리케이션의 phpinfo 페이지가 직렬화된 HTTP 요청을 통해 전달된 그의 시스템 명령인 "whoami"를 어떻게 성공적으로 파싱했는지, 그리고 "nt authority\system" 윈도우 계정명을 리턴했는지 시연해 보였습니다.

 

 

<이미지 출처 : https://github.com/Ling-Yizhou/zendframework3-/blob/main/zend%20framework3%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20rce.md>

<데모 PoC를 통해 “whoami” 명령을 실행하고 "nt authority\system" 아웃풋을 얻어냄>

 

 

Laminas로 빌드된 앱들 또한 영향 받을 수 있어

 

20201, Zend FrameworkLaminas 프로젝트로 이동되었으며 많은 양의 코드는 새로운 코드베이스로 단순히 재배치 되었습니다.

 

예를 들면, 앞서 언급한 소멸자를 포함한 Zend Stream.php는 일부 버전의 Laminas에 계속해서 남아있습니다.

 

해당 코드는 Laminas Project laminas-http와 관련이 있을 가능성이 있습니다. Zend Framework는 더 이상 지원되지 않습니다. 하지만 Laminas Project에 모든 Zend Framework 3.0.0의 취약점이 존재하는 것은 아닙니다.”

 

따라서 Laminas 프로젝트로 구축된 모든 애플리케이션이 취약하지는 않지만, 이를 이용하는 개발자들은 조사를 진행해볼 것을 권장합니다.

 

애플리케이션에 대한 철저한 보안 감사를 수행하면 제로데이와 개발자의 환경에 특정된 취약점을 찾아낼 수 있습니다.

 

 

 

  

 

출처:

https://www.bleepingcomputer.com/news/security/zend-framework-remote-code-execution-vulnerability-revealed/

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3007

https://github.com/Ling-Yizhou/zendframework3-/blob/main/zend%20framework3%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20rce.md

관련글 더보기

댓글 영역