AWS - Lambda Layers Persistence
Lambda Layers
Lambda 레이어는 추가 코드 또는 다른 콘텐츠를 포함할 수 있는 .zip 파일 아카이브입니다. 레이어에는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일을 포함할 수 있습니다.
함수 당 다섯 개의 레이어를 포함할 수 있습니다. 함수에 레이어를 포함하면 콘텐츠가 실행 환경의 /opt
디렉토리로 추출됩니다.
기본적으로 생성하는 레이어는 AWS 계정에 대해 비공개입니다. 레이어를 다른 계정과 공유하거나 레이어를 공개로 만들 수 있습니다. 다른 계정이 게시한 레이어를 함수가 사용하는 경우, 함수는 삭제된 레이어 버전을 계속 사용하거나 레이어에 대한 액세스 권한이 취소된 후에도 사용할 수 있습니다. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.
컨테이너 이미지로 배포된 함수는 레이어를 사용하지 않습니다. 대신 이미지를 빌드할 때 선호하는 런타임, 라이브러리 및 기타 종속성을 컨테이너 이미지에 패키징합니다.
Python 로드 경로
람다에서 Python이 사용할 로드 경로는 다음과 같습니다:
두 번째와 세 번째 위치가 람다 레이어가 파일을 압축 해제하는 디렉토리로 차지하는지 확인하십시오: /opt/python/lib/python3.9/site-packages
및 /opt/python
공격자가 사용 중인 람다 레이어에 백도어를 설치하거나 실행 중에 일반 라이브러리가 로드될 때 임의의 코드를 실행하는 레이어를 추가한다면, 각 람다 호출마다 악성 코드를 실행할 수 있게 될 것입니다.
따라서 요구 사항은 다음과 같습니다:
피해자 코드에서 로드된 라이브러리를 확인합니다.
람다 레이어로 프록시 라이브러리를 생성하여 사용자 정의 코드를 실행하고 원래 라이브러리를 로드합니다.
사전로드된 라이브러리
이 기술을 남용할 때 어려움을 겪었습니다: 일부 라이브러리는 파이썬 런타임에서 코드가 실행될 때 이미 로드되어 있습니다. os
나 sys
와 같은 것들을 찾을 것으로 예상했지만 json
라이브러리조차 로드되어 있었습니다.
이 지속성 기술을 남용하려면 코드가 실행될 때 로드되지 않은 새 라이브러리를 로드해야 합니다.
다음과 같은 파이썬 코드로 람다에서 사전로드된 라이브러리 목록을 얻을 수 있습니다:
그리고 이것이 목록입니다 (라이브러리들이 이미 있는지 확인하십시오. os
나 json
과 같은 라이브러리들이 있는지 확인).
그리고 이것은 lambda에 기본으로 설치된 라이브러리 목록입니다: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Layer Backdooring
이 예에서는 대상 코드가 **csv
**를 가져오고 있다고 가정합니다. csv
라이브러리의 가져오기를 백도어할 것입니다.
이를 위해, 우리는 csv 디렉토리를 만들 것이며, 그 안에 __init__.py
파일을 만들 것입니다. 이 디렉토리는 lambda에서 로드되는 경로에 있어야 합니다: /opt/python/lib/python3.9/site-packages
그런 다음, 람다가 실행되고 csv를 로드하려고 시도할 때, 우리의 __init__.py
파일이 로드되고 실행될 것입니다.
이 파일은 다음을 수행해야 합니다:
페이로드 실행
원래 csv 라이브러리 로드
우리는 다음과 같이 둘 다 수행할 수 있습니다:
그럼, 이 코드를 python/lib/python3.9/site-packages/__init__.py
경로에 넣은 후 람다 레이어로 추가하세요.
이 코드는 https://github.com/carlospolop/LambdaLayerBackdoor에서 찾을 수 있습니다.
통합된 페이로드는 람다 컨테이너의 재설정(코드 변경 또는 콜드 람다) 후 처음으로 호출될 때 IAM 자격 증명을 서버로 전송하지만 다른 기술도 통합될 수 있습니다:
pageAWS - Steal Lambda Requests외부 레이어
람다 레이어를 외부 계정에서 사용할 수 있음에 유의하십시오. 또한 람다는 권한이 없어도 외부 계정에서 레이어를 사용할 수 있습니다. 또한 람다가 가질 수 있는 최대 레이어 수는 5개입니다.
따라서 이 기술의 다양성을 향상시키기 위해 공격자는 다음을 수행할 수 있습니다:
사용자의 기존 레이어에 백도어 설치 (외부 요소 없음)
자신의 계정에서 레이어를 생성하고 피해 계정에 레이어 사용 권한 부여, 피해자의 람다에서 레이어 구성 및 권한 제거.
람다는 여전히 레이어를 사용할 수 있고 피해자는 레이어 코드를 다운로드하는 쉬운 방법이 없을 것입니다(람다 내에서 rev 쉘을 획들하는 것 외).
피해자는 **
aws lambda list-layers
**를 사용하여 외부 레이어를 볼 수 없을 것입니다.
最終更新