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 명렁어 해석기에 전달되지 않도록 검증/확인하도록 구현
- 입력 값에 대한 파라미터 데이터의 “&”, “|”, ” “,”, “.” 문자에 대한 필터링 처리
특수문자
& - 명렁어 해석기에서 첫 번째 명령이 성공했을 경우에만 두 번째 명령어 실행
| - 첫 번째 명령어가 성공하는지 여부에 상관없이 두 번째 명령어 싫애
` - 명령어를 계속 실행하기 전에 역 작은따음표로 둘러쌓인 명령어 우선 실행
[AWS] Chapter4. 서버&서버리스 진단 - 3
[AWS] Network - 퍼블릭 서브넷 VPC 생성