
Pipenv의 requirements.txt 파싱에서 발견된 치명적인 RCE 취약점인 CVE-2022-21668에 대한 상세 분석으로, 버그 코드, 익스플로잇 메커니즘, 수정 검증을 포함합니다.
이 문서에서는 Pipenv 취약점(CVE-2022-21668)에 대해 자세히 논의합니다. 다음 섹션에서는 다양한 RCE 공격의 문을 여는 pipenv/utils.py 파일의 버그 코드와 SSL/TLS 연결을 검증하고 호스트 이름을 신뢰할 수 있는 호스트 목록과 대조하는 최근 수정 사항에 대해 다룹니다.
Pipenv Pipenv는 프로젝트의 virtualenv를 자동으로 생성하고 관리하는 도구일 뿐만 아니라 패키지를 설치/제거할 때 Pipfile에 패키지를 추가/제거하는 도구입니다.
자세한 내용은 여기를 클릭하세요.
복잡한 시스템을 다룰 때마다 requirements.txt 파일이 필요합니다. 이 텍스트 파일은 애플리케이션을 다른 환경으로 포팅할 때도 유용합니다. 이 파일에는 애플리케이션을 성공적으로 실행하는 데 필요한 모든 패키지/의존성과 해당 버전 번호가 들어 있습니다.
샘플 requirements.txt 파일:
이미지 출처: https://www.idkrtm.com/what-is-the-python-requirements-txt/
requirements.txt 파일이 없으면 패키지 버전 간 호환성 문제가 발생할 수 있으므로 애플리케이션을 다른 시스템으로 성공적으로 포팅하지 못할 수도 있습니다.
Pipenv 버전 2018.10.9부터 2022.1.8 이전 버전까지, pipenv의 requirements 파일 구문 분석 결함으로 인해 공격자가 requirements.txt 파일 내 어디든 주석 안에 특수하게 조작된 문자열을 삽입할 수 있으며, 이로 인해 해당 requirements 파일을 pipenv로 설치하는 피해자는 공격자가 제어하는 패키지 인덱스 서버에서 의존성을 다운로드하게 됩니다. 이러한 매우 취약한 시스템에서는 RCE 공격이 매우 실현 가능합니다.
cvedetails는 이 취약점을 치명적 / 심각 수준으로 평가합니다.
cvedetails의 CVSS 점수:
(출처: https://www.cvedetails.com/cve/CVE-2022-21668/)
이 함수는 requirements 파일의 각 줄에 대해 반복적으로 호출되며 argparse 모듈을 사용하여 --index-url, --extra-index-url 및 --trusted-host 옵션을 찾아 처리합니다.
그러나 이러한 옵션이 주석에 나타날 때는 무시하지 않습니다. 코드의 문제는 파일 어디에서든 "--index-url, --extra-index-url, --trusted-host"로 시작하는 문자열을 구문 분석한다는 것입니다. 이 기능으로 인해 더욱 취약해집니다.
자세한 내용은 여기를 클릭하세요.
원격 코드 실행(RCE) 공격을 통해 공격자는 컴퓨터에서 악성 코드를 원격으로 실행할 수 있습니다. RCE 취약점의 영향은 악성코드 실행부터 공격자가 손상된 머신에 대한 완전한 제어권을 얻는 것까지 다양합니다.
공격자가 피해자가 pipenv로 설치하는 requirements 파일에 악성 --index-url 옵션을 숨길 수 있다면, 공격자는 악성 인덱스 서버에서 제공되는 패키지에 임의의 악성 코드를 포함시킬 수 있으며, 이 코드는 설치 중에 피해자의 호스트에서 실행됩니다(원격 코드 실행/RCE). 이 기술을 사용한 악용은 Python에 대한 기본 지식이 있는 공격자에게 비교적 간단합니다. 공격자는 requirements 파일에 지정된 패키지 중 하나에 대해 소스 배포판을 만들고 setup.py 파일에 임의의 악성 코드를 포함시키기만 하면 되기 때문입니다. pip가 소스 배포판에서 설치할 때 setup.py의 모든 코드는 설치 프로세스에 의해 실행됩니다.
자세한 내용은 여기를 클릭하세요.
버전 2022.1.8 이상에서 이 문제가 수정되었습니다. pipenv/utils.py 파일에 "get_host_and_port(url)"라는 새 함수가 추가되었습니다. 이 함수는 requirements.txt 파일에 제출된 URL의 호스트와 포트를 검색합니다. 검색된 호스트 주소는 urllib3를 사용하여 구문 분석되며, urllib3는 내부적으로 SSL/TLS 연결을 검증합니다. 또한 호스트 주소는 신뢰할 수 있는 호스트 주소 목록과 대조됩니다.
자세한 정보는 여기에서 확인하세요.
기본적인 공격은 피해자가 공격자의 악성 패키지를 설치할 때 트리거되는 초기 RCE를 사용하여 피해자 호스트의 자격 증명을 탈취하거나, 호스트 리소스를 암호화폐 채굴에 사용하거나, 익스플로잇 킷 또는 기타 악성코드를 설치할 수 있습니다. 더 정교한 공격자는 고급 기술을 사용하여 피해자 호스트에 대한 접근을 유지하거나, pipenv가 생성한 Pipfile 및 Pipfile.lock에서 악성 인덱스 서버에 대한 참조 또는 기타 잠재적 침해 지표를 삭제하여 공격 증거를 숨기거나 제거할 수 있습니다. 매우 정교한 공격자는 초기 손상된 호스트에서 추가 대상으로 피벗을 시도할 수 있으며, 손상된 호스트 환경에 노출된 자격 증명이나 호스트에 부여된 암시적 권한을 활용하여 소스 저장소나 패키지 레지스트리와 같은 다른 시스템 또는 리소스에 대한 권한 있는 접근 권한을 얻을 수 있습니다. (출처: https://github.com/pypa/pipenv/security/advisories/GHSA-qc9x-gjcv-465w)
주석을 제대로 구문 분석하지 않는 구문 분석 오류로 인해 심각한 취약점이 발생했습니다.
이러한 취약점을 손에 넣으면 정교하지 않은 공격자라도 손상된 패키지 버전을 제공하는 악성 인덱스 서버를 설정하는 것이 비교적 간단합니다.