본문 바로가기

Education/[AWS] Cloud Hacking

[AWS] Chapter4. 서버&서버리스 진단 - 4

5. Command Injection


01. 개요
Command Injection
- 취약한 애플리케이션을 통해 호스트 운영 체제에서 임의 명령을 실행
    -> 양식, 쿠키, HTTP 헤더 등의 인자를 조작하여 시스템 쉘에 전달
- 실행되었을 때 명령은 애플리케이션 권한으로 동작
- 불충분한 입력 유효성 검사가 원인

02. 취약점 발생 원리
Faas 환경에서 사용자 관리 범위와 서비스 제공자 관리 범위의 차이 존대
- FaaS 환경에서 사용자는 호스트 운영 체제에 관여할 수 없음
   -> AWS에서 가상 환경을 구성하며 Amazon Linux, Amazon Liunx 2 사용
- 사용자가 지정한 런타임 가상환경에서 임의 명령을 실행
   -> Node, Python, Ruby, Java, Go 등 런타임 가상환경 사용 가능
- 실행되었을 때 명령은 애플리케이션을 실행한 IAM 권한으로 동작
   -> 함수 실행 시점에 IAM 권한을 부여하기 위해 환경 변수에 인증 정보 저장


03. 영향
- Lambda 인증정보 획득
  -> lambda 런타임 시 인증정보가 환경변수에 포함되어 업로드되므로 명령 실행을 통해 인증 정보를 가져 올 수 있음
  -> 인증정보를 이용하여 부여된 권한에 따라 AWS 서비스를 조회, 사용 가능
- Lambda 함수 소스코드 획득
  -> lambda 실행 시 쓰기 권한은 부여되지 않음
  -> 하지만 코드 내에 포함된 중요 정보(키, 패스워드)를 획득 및 추가 공격 가능

04. 진단 방법
격리된 런타임 환경에서 명령어 실행 가능 여부 확인
- Lambda 는 격리된 런타임 환경을 제공하는 실행 환경에서 함수 호출
- 인스턴스에서 코드를 실행하는 것이 아닌, 코드를 컨테이너에 업로드하여 코드 실행

구 분 내 용
설명 검증되지 않은 사용자 입력 값이 OS 명령어 실행에 영향을 주어 개발자가 의도하지 않은 기능 실행
판단 기준 개발자가 의도하지 않은 명령어를 실행, 중요정보 획득 가능
영향 IAM 권한 탈취, 다른 서비스 권한 획득 가능

-> Lambda는 웹 어플리케이션과 바로 연결되지 않으며 API Gateway를 통해서 이벤트 객체를 전달받고 결과를 리턴
 
사용자의 입력 값이 시스템 명령어로 사용되는 경우
- 파라미터 뒤에 "&", "&&", "|", "||" 등 특수문자를 이용하여 추가 입력 가능
   -> 실행된 명령어의 결과 값이 출력된다면, & cat /etc/passwd, ifconfig 등 정보출력 시도
    -> 결과값을 볼 수 없다면 Time-Delay 방식 사용
         -> &ping -c 10 270.0.0.1


- 언어별 OS Command 함수


Lambda 실행 시 예약된 환경변수


 Lambda 실행 시 확장 가능한 환경변수



05. 실습
- Lambda Command Injection 취약 코드

- Python, lambda_function.py 실행
- Python, lambda_handler(event, context)
   -> 이벤트 핸들러
   -> API Gateway로부터 파라미터 전달

- 시스템 함수 호출 등 취약한 설계로 취약성 발생


06. 진단 주의사항

- Lambda 함수 별 Timeout 존재
   -> 기본 값 3초, 최대 15분까지 설정 가능
   -> Timeout 초과 실행 시 500에러 발생
   -> Time-Delay 방식 진단 시 유의

- Lambda 실행 권한 존재
  -> AWS 인증정보 획득 시 전체 권한을 획득한 것이 아님
  -> 추가로 접근, 사용가능한 인스턴스가 있는지 확인 필요(IAM Role)
  -> 웹 내엣 어떤 기능을 하는지 파악 후 권한 유추 -> DB접근, 이메일 전송 등



07. 보안대책
민감한 작업에 직접 사용되는 사용자 입력 값은 검증 후 사용
- 외부 입력 값을 OS 명령어를 직접 사용하지 않도록 함
- 외부 입력 값을 OS 명령어의 생성이나 선택이 필요한 경우
   -> 명렁어 생성에 필요한 값들을 미리 지정해 놓고 외부 입력에 따라 선택
- 명령어를 직접 호출하는 것이 필요한 경우
   -> OS 명렁어 해석기에 전달되지 않도록 검증/확인하도록 구현
- 입력 값에 대한 파라미터 데이터의 “&”, “|”, ” “,”, “.” 문자에 대한 필터링 처리

특수문자
&    - 명렁어 해석기에서 첫 번째 명령이 성공했을 경우에만 두 번째 명령어 실행
|     - 첫 번째 명령어가 성공하는지 여부에 상관없이 두 번째 명령어 싫애
`     - 명령어를 계속 실행하기 전에 역 작은따음표로 둘러쌓인 명령어 우선 실행