명령어 주입: git ls-remote
Second-Order Command Injection (git ls-remote)
설명
사용자 입력이 그대로 git ls-remote의 원격 URL 자리에 들어가면, 입력이 옵션으로 해석되어 --upload-pack=<exec> 등 임의 실행 파일을 실행하도록 유도될 수 있습니다. execFile/spawn처럼 셸을 사용하지 않더라도, git 하위 명령의 인자 파싱 로직을 악용해 명령 실행이 가능하기 때문에 "두 번째 단계" 명령어 주입이라 부릅니다. 공격자는 원격 인자에 '-'로 시작하는 값을 주거나 특수 옵션을 포함시켜 서버에서 임의 코드를 실행할 수 있습니다.
잠재적 영향
원격 코드 실행 (RCE): git이 --upload-pack 등으로 지정된 프로그램을 실행하면서 서버에서 임의 명령이 수행될 수 있음
정보 유출: 프로세스 권한으로 접근 가능한 환경변수, 토큰, 소스 코드, 설정 파일 등이 노출될 수 있음
서비스 거부(DoS): 무한 대기/과도한 프로세스 생성 등으로 서버 자원이 고갈되어 서비스 중단 가능
해결 방법
사용자 입력을 git ls-remote의 원격 인자로 직접 전달하지 말 것
사전 등록(매핑) 방식 사용: 클라이언트로부터는 키(id)만 받게 하고, 서버에서 신뢰된 URL로 매핑
허용 목록 검증: https://, ssh://, git@만 허용. '-'로 시작하거나 공백/제어문자 포함, '--upload-pack'/'-u' 등의 위험 옵션 문자열이 보이면 즉시 거부
인자 경계 강제: 항상 ['ls-remote', '--', remote]처럼 '--'를 사용해 옵션 파싱이 원격 인자에 미치지 못하게 함
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력을 검증 없이 git ls-remote의 원격 인자로 전달했습니다. 공격자는 '-'로 시작하는 값이나 '--upload-pack='를 넣어 git이 임의 실행 파일을 수행하도록 만들 수 있어 서버에서 임의 코드 실행이 가능합니다.
안전한 코드: - 사전 등록된 리모트 키만 받거나, 프로토콜/형식 기반 허용 목록으로 검증해 악성 인자를 차단했습니다.
'--'를 사용해 인자 경계를 명확히 하여, 원격 인자가 git 옵션으로 해석되지 않도록 했습니다.
타임아웃 등 방어적 옵션을 추가해 오남용 시 리스크를 추가로 줄였습니다.
참조
Last updated