운영체제 명령 주입
OS Command Injection · 명령 삽입 · 명령 주입
은 외부 입력이 운영체제 명령의 구문이나 실행 인수 의미를 바꾸는 문제다. 셸을 제거해도 호출 프로그램의 옵션과 자원 접근 정책까지 자동으로 안전해지는 것은 아니다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 셸 문법과 데이터 인수를 분리한다.
- 실행 파일·허용 옵션·대상 경로를 서버 정책으로 제한한다.
- 시간·출력· 권한을 관리해 정상 호출의 피해 범위를 줄인다.
02어떤 순서로 동작하나
- 입력 의미 제한
사용자에게 파일 경로·명령 구문 대신 허용된 자료의 ID를 받도록 설계한다.
- 서버 자료로 해석
ID를 형식·길이·권한 기준으로 검증하고 서버가 관리하는 파일 목록에서 실제 대상을 선택한다.
- 실행 경계 선택
가능하면 언어의 라이브러리로 처리한다. 외부 프로그램이 필요하면 고정 실행 파일과 인자를 분리해 해석을 피한다.
- 옵션·자원 통제
, PATH·환경·작업 디렉터리, timeout·출력 크기·최소권한을 별도로 제한한다.
- 결과와 흔적 연결
반환 코드·파일 변화·자식 를 원래 요청과 연결하고 예상한 자료 처리만 발생했는지 확인한다.
03먼저 알아둘 용어와 구성요소
- 명령 문자열을 해석해 를 실행하는 프로그램.
- 프로그램에 전달되는 인수 배열.
- 새 명령 없이도 옵션 값으로 기존 프로그램의 행동을 바꾸는 문제.
- 실행 작업에 필요한 권한만 부여하는 원칙.
웹의 Ping 기능을 입력·프로세스·출력으로 분해하기
입력 문자열이 셸 문법으로 해석되는 경계를 찾고 안전한 인자 전달 방식으로 바꾼다.
실습 구성과 전제
- 격리된 교육용 Ping 폼과 폐기 가능한 만 사용한다.
- 아래 웹 출력과 터미널 출력은 기능의 대응 관계를 비교하는 자료이며 지연 수치가 같은 연속 실행은 아니다.
웹 입력이 만드는 정상 프로세스를 추적한다
- 폼의 주소 입력은 ping 프로그램에 전달되는 데이터여야 한다. 웹 서버가 주소를 셸 명령 문자열에 붙이면 데이터와 셸 구문이 같은 문맥에 놓인다.
- 정상 주소 하나로 제한하고 응답에서 전송 수·수신 수·손실률을 읽는다.
원본 크기로 보기 ↗- 웹 화면에는 Ping for FREE와 주소 입력칸이 있으며 3 packets transmitted, 3 received가 표시된다.
- 0% packet loss는 해당 ICMP 시험 결과다. 입력 검증이나 명령 주입 방어가 구현됐다는 뜻은 아니다.
확인 기준정상 기능이 실제로 어떤 실행 파일과 옵션을 사용하는지 코드에서 확인한다.
웹 결과와 프로그램 출력을 연결한다
- 터미널 출력의 ping -c 3은 세 번의 요청 횟수를 지정한다. 웹이 이 출력을 그대로 반환한다면 서버 명령 결과가 응답 경로에 들어간 것이다.
- 서버가 받은 입력을 안전한 인자 배열로 전달해도 실행 파일·옵션·시간 제한을 별도로 통제해야 한다.
address = str(ipaddress.ip_address(user_input)) result = subprocess.run(['ping', '-c', '3', address], shell=False, capture_output=True, text=True, timeout=5)전용 비교 예시. ipaddress와 subprocess를 가져온 후 사용하며 실제 실행은 자신의 실습 장비로 제한한다.
원본 크기로 보기 ↗- 터미널 명령은 ping -c 3이며 결과에 세 개의 응답과 요약 통계가 있다.
- 웹 화면과 출력 형식은 비슷하지만 RTT 값은 다르다. 이를 동일 실행의 앞뒤 증거로 합치지 않는다.
확인 기준허용 주소 형식과 프로그램 옵션을 서버가 고정하는지 본다.
실행 전 거부와 실행 실패를 나누어 시험한다
- 주소 형식 오류는 를 만들기 전에 거부한다. 정상 주소의 응답 없음·시간 초과는 실행 단계의 실패로 구분한다.
- 출력 길이·동시 실행 수·권한도 제한한다. 셸을 쓰지 않는 것과 서비스 자원 소진 방지는 서로 다른 조건이다.
확인 기준잘못된 입력에서 가 생성되지 않고, 타임아웃 뒤 작업이 정리돼야 한다.
실습에서 확인한 동작 원리
- 의 경계는 데이터가 셸 문법으로 넘어가는 지점이다.
- 정상 기능의 옵션·권한·시간·출력까지 제한해야 한다.
04예제로 따라가기
- 파일 크기를 구하는 작업은 외부 명령 문자열 대신 언어의 파일 API로 처리할 수 있다.
- 인수 배열로 파일명을 넘기더라도 파일명 앞부분이 옵션으로 해석되는 도구라면 옵션 종료와 허용 값 검사가 필요하다.
- 유효한 입력으로 시작한 도 무제한 출력이나 장시간 실행이 가능하므로 출력 크기와 마감 시간이 필요하다.
05혼동하기 쉬운 점과 확인 기준
- 특정 셸 문자를 이스케이프하는 처리 하나를 모든 운영체제와 호출 API에 공통 적용할 수는 없다.
- 명령 실행의 성공 종료코드는 결과의 업무상 적합성과 권한 검사를 대신하지 않는다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.