정보보안심화 · 16분 읽기

명령 주입·XXE·역직렬화와 실행 경계

외부 입력이 shell, XML resolver, 객체 복원기, 템플릿 처리기에 전달될 때 어떤 권한과 동작을 얻는지 설명합니다. 수업의 RCE·Command Injection·OWASP 메모를 원리별로 연결합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 입력이 데이터에서 실행 구조로 바뀌는 지점을 찾는다.
  2. shell 제거·인자 검증·XML 외부 자원 제한·안전한 자료형 복원을 구분한다.
  3. RCE 결과와 취약점 원인, 실제 실행 권한을 분리해 설명한다.

01개념과 구성 요소

  • 외부 자료가 ·XML ·객체 복원기·템플릿 등 해석기의 기능을 제어할 때 문제가 생긴다.
  • 지원 기능·호출 방식·권한·노출된 자원이 실제 영향을 결정한다.
  • 원격 코드 실행은 가능한 결과이며 모든 주입·역직렬화 문제가 같은 조건으로 를 만드는 것은 아니다.

02외부 파일 검사를 안전한 실행 경로로 바꾸는 순서

  1. 사용자에게 파일 경로·명령 구문 대신 허용된 자료의 ID를 받도록 설계한다.
  2. ID를 형식·길이·권한 기준으로 검증하고 서버가 관리하는 파일 목록에서 실제 대상을 선택한다.
  3. 가능하면 언어의 라이브러리로 처리한다. 외부 프로그램이 필요하면 고정 실행 파일과 인자를 분리해 해석을 피한다.
  4. , PATH·환경·작업 디렉터리, timeout·출력 크기·최소권한을 별도로 제한한다.
  5. 반환 코드·파일 변화·자식 를 원래 요청과 연결하고 예상한 자료 처리만 발생했는지 확인한다.

03RCE는 원인 하나가 아니라 실행 결과의 범위

  • 는 원격 입력이 실행 경계에 도달하여 대상 권한으로 코드를 실행하는 결과를 뜻한다. OS ·코드 평가··템플릿 처리·실행 가능한 업로드는 서로 다른 원인으로 실행에 도달할 수 있다.
  • 어느 기능이든 실제 실행은 권한·샌드박스·접근 가능한 자원에 제한된다.
  • Reverse ·web ·특정 프레임워크 세션은 실행 이후 가능한 도구나 통신 형태이며 와 같은 분류 축의 취약점 이름은 아니다. 원격 코드 실행이 있다고 항상 관리자 권한이나 전체 네트워크 제어를 얻는다는 뜻도 아니다.
  • 인증 전후·사용자 상호작용·기능 활성화 같은 성립 조건을 함께 기술한다.

04Shell 문자열에 연결하면 구문을 공유한다

  • 프로그램이 inspect-file 같은 외부 도구에 파일명을 넘길 때 문자열을 만들면 이 공백·메타문자·확장·리다이렉트 등을 다시 해석한다. 애플리케이션은 이름 하나를 전달한다고 생각하지만 에는 여러 명령 또는 다른 구조로 보일 수 있다.
  • 입력과 명령 문법을 같은 문자열에 합친 것이 경계의 문제다.
  • 가장 직접적인 개선은 외부 명령 없이 언어의 파일·네트워크 라이브러리를 사용하는 것이다. 꼭 외부 프로그램이 필요하면 실행 파일과 인자를 배열로 분리하여 을 거치지 않도록 한다.
  • 단, 제거는 다음 절의 까지 자동 해결하지 않는다.
# 취약 구조의 개념 예: 실행하지 않음
command = "inspect-file " + user_value
run_shell(command)

# 개선 설계
validated_id = validate_allowed_id(user_value)
path = server_owned_file_table[validated_id]
inspect_with_library(path)

원리를 설명하는 가상 학습 예시입니다.

LEARN THROUGH PRACTICE

웹의 Ping 기능을 입력·프로세스·출력으로 분해하기

입력 문자열이 셸 문법으로 해석되는 경계를 찾고 안전한 인자 전달 방식으로 바꾼다.

실습 구성과 전제

  • 격리된 교육용 Ping 폼과 폐기 가능한 만 사용한다.
  • 아래 웹 출력과 터미널 출력은 기능의 대응 관계를 비교하는 자료이며 지연 수치가 같은 연속 실행은 아니다.
  1. 웹 입력이 만드는 정상 프로세스를 추적한다

    • 폼의 주소 입력은 ping 프로그램에 전달되는 데이터여야 한다. 웹 서버가 주소를 셸 명령 문자열에 붙이면 데이터와 셸 구문이 같은 문맥에 놓인다.
    • 정상 주소 하나로 제한하고 응답에서 전송 수·수신 수·손실률을 읽는다.
    command injection · 실습·개념 참고 화면 5원본 크기로 보기 ↗
    • 웹 화면에는 Ping for FREE와 주소 입력칸이 있으며 3 packets transmitted, 3 received가 표시된다.
    • 0% packet loss는 해당 ICMP 시험 결과다. 입력 검증이나 명령 주입 방어가 구현됐다는 뜻은 아니다.
    확인 기준

    정상 기능이 실제로 어떤 실행 파일과 옵션을 사용하는지 코드에서 확인한다.

  2. 웹 결과와 프로그램 출력을 연결한다

    • 터미널 출력의 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를 가져온 후 사용하며 실제 실행은 자신의 실습 장비로 제한한다.

    command injection · 명령·상태 출력 6원본 크기로 보기 ↗
    • 터미널 명령은 ping -c 3이며 결과에 세 개의 응답과 요약 통계가 있다.
    • 웹 화면과 출력 형식은 비슷하지만 RTT 값은 다르다. 이를 동일 실행의 앞뒤 증거로 합치지 않는다.
    확인 기준

    허용 주소 형식과 프로그램 옵션을 서버가 고정하는지 본다.

  3. 실행 전 거부와 실행 실패를 나누어 시험한다

    • 주소 형식 오류는 를 만들기 전에 거부한다. 정상 주소의 응답 없음·시간 초과는 실행 단계의 실패로 구분한다.
    • 출력 길이·동시 실행 수·권한도 제한한다. 셸을 쓰지 않는 것과 서비스 자원 소진 방지는 서로 다른 조건이다.
    확인 기준

    잘못된 입력에서 가 생성되지 않고, 타임아웃 뒤 작업이 정리돼야 한다.

실습에서 확인한 동작 원리

  • 의 경계는 데이터가 셸 문법으로 넘어가는 지점이다.
  • 정상 기능의 옵션·권한·시간·출력까지 제한해야 한다.

설정·출력 추가로 확인하기 36장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 2장
7/30 - 발표 · 실습·개념 참고 화면 6원본 크기로 보기 ↗
  • 「로그」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
7/30 - 발표 · 실습·개념 참고 화면 7원본 크기로 보기 ↗
  • 「/var/log/audit/audit.log」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 1장
Command Injection 관찰 · 시나리오원본 크기로 보기 ↗
  • 수업 원본 자료 · 격리된 웹 실습의 명령 주입 요청과 패킷. 원문에서 「시나리오」에 배치된 그림 또는 화면이다.
실습 화면 묶음 03 4장
FTP · 실습·개념 참고 화면 10원본 크기로 보기 ↗
  • 「COMMAND EXEC」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 실습·개념 참고 화면 12원본 크기로 보기 ↗
  • 「COMMAND EXEC」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 패킷 캡처 11원본 크기로 보기 ↗
  • 「COMMAND EXEC」 문맥에 삽입된 원본 패킷 캡처이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
FTP · 패킷 캡처 9원본 크기로 보기 ↗
  • 「COMMAND EXEC」 문맥에 삽입된 원본 패킷 캡처이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 04 1장
XML 처리와 인증 요청 실습원본 크기로 보기 ↗
  • 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 05 1장
XML 처리와 인증 요청 실습원본 크기로 보기 ↗
  • 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 06 1장
XML 처리와 인증 요청 실습원본 크기로 보기 ↗
  • 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 07 1장
XML 처리와 인증 요청 실습원본 크기로 보기 ↗
  • 학습 원본 · XML 처리와 인증 요청 실습의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 08 14장
command injection · 명령·상태 출력 1원본 크기로 보기 ↗
  • 「Netcat(nc)이란?」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 명령·상태 출력 10원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 명령·상태 출력 15원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 명령·상태 출력이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 설정·관리 화면 8원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 설정·관리 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 11원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 12원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 13원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 14원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 16원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 3원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 4원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 7원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
command injection · 실습·개념 참고 화면 9원본 크기로 보기 ↗
  • 「n」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 09 1장
격리 웹 환경의 명령 주입 실습 · Command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 Command injection에 수록된 화면·도식이다.
실습 화면 묶음 10 1장
격리 웹 환경의 명령 주입 실습 · Command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 Command injection에 수록된 화면·도식이다.
실습 화면 묶음 11 1장
격리 웹 환경의 명령 주입 실습 · injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 12 1장
격리 웹 환경의 명령 주입 실습 · injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 13 1장
격리 웹 환경의 명령 주입 실습 · injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 14 1장
격리 웹 환경의 명령 주입 실습 · injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 injection에 수록된 화면·도식이다.
실습 화면 묶음 15 1장
격리 웹 환경의 명령 주입 실습 · 리버스쉘 실습1-command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 16 1장
격리 웹 환경의 명령 주입 실습 · 리버스쉘 실습1-command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 17 1장
격리 웹 환경의 명령 주입 실습 · 리버스쉘 실습1-command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 18 1장
격리 웹 환경의 명령 주입 실습 · 리버스쉘 실습1-command injection원본 크기로 보기 ↗
  • 학습 원본 · 격리 웹 환경의 명령 주입 실습의 리버스쉘 실습1-command injection에 수록된 화면·도식이다.
실습 화면 묶음 19 1장
보고서 · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. 명령 주입·XXE·역직렬화와 실행 경계 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서

05Argument Injection은 새 명령이 없어도 성립한다

  • 외부 프로그램은 전달받은 인자를 자체 옵션 문법으로 해석한다. 파일명 자리에 --help 같은 값이 들어가면 없이도 프로그램 동작이 달라질 수 있다.
  • 더 위험한 옵션을 지원하는 프로그램에서는 쓰기 위치·설정 파일·외부 연결 같은 기능이 선택될 수도 있다.
  • 고정된 실행 파일 경로와 허용 옵션, 입력 값의 형식·길이·범위를 따로 검증한다. 해당 도구가 지원한다면 --로 옵션 종료를 표시할 수 있지만 모든 프로그램이 같은 규칙을 사용한다고 가정하지 않는다.
  • PATH·환경변수·작업 디렉터리도 실행 파일 선택과 동작에 영향을 주므로 서비스의 실행 문맥을 함께 통제한다.

06정상 명령 실행에도 자원·출력 경계가 있다

  • 명령 이름이 고정되어 있어도 입력이 큰 파일·느린 주소·복잡한 변환을 선택하게 하면 CPU·메모리·worker를 오래 점유할 수 있다. timeout, 출력 크기 제한, , 파일·네트워크 범위 제한은 주입 예방과 별도로 실행 기능의 피해 범위를 줄인다.
  • 관찰 자료는 웹 요청 ID, 부모·자식 , 실행 파일, 인자, 반환 코드, 파일·연결 변화를 연결한다. 자식 가 하나 생겼다는 사실만으로 공격을 확정하지 않고 원래 기능이 생성하는 정상 와 비교한다.
  • 입력 한 개가 어떤 행위를 바꾸었는지 설명하는 것이 핵심이다.

07XML에서 Entity와 외부 Resolver

  • XML 파서는 태그 구조뿐 아니라 설정에 따라 와 를 처리할 수 있다. 내부 는 이름을 텍스트로 치환하는 구조를 보여 준다.
  • 외부 해석이 허용된 파서가 신뢰하지 않는 선언을 따라가면 파일이나 네트워크 자원을 읽을 수 있어 XML 입력이 서버 권한의 외부 접근으로 바뀐다.
  • 의 결과는 로컬 자료 노출··자원 소모 등이며 파서·설정·권한·응답 노출 조건에 따라 달라진다. 아래는 외부 접근을 하지 않는 내부 의 단순 학습 예다.
  • 이를 지원한다는 사실만으로 외부 도 허용되는 것은 아니다.
  1. 파서가 XML 구조와 지원 설정에 따라 DOCTYPE·· 선언을 읽는다.
  2. 내부 는 정의된 텍스트로 치환한다. 외부 해석이 허용되면 가 파일·네트워크 자원에 접근할 수 있다.
  3. 해석 결과가 응답 또는 후속 처리에 사용된다. 자료 노출··자원 소모의 실제 영향은 파서·권한·반환 경로에 달려 있다.
xml
<!DOCTYPE note [
  <!ENTITY lesson "training-marker">
]>
<note>&lesson;</note>

개념상 치환 결과: <note>training-marker</note>
보안 정책이 DTD를 금지하면 이 입력 자체가 거부될 수 있다.

원리를 설명하는 가상 학습 예시입니다.

08XXE 방어는 실제 파서의 기능을 제한한다

  • 기능에 가 필요 없다면 DOCTYPE을 거부하는 구성이 가장 단순하다. 필요하다면 외부 와 외부 로딩을 제한하고 확장량·깊이·크기를 제한한다.
  • XInclude· 검증·스타일시트 변환 등 다른 외부 자원 해석 경로도 별도 설정을 가질 수 있다.
  • 네트워크 송신만 막아도 로컬 파일 읽기나 내부 의 과도한 확장은 남을 수 있다. 반대로 기능 하나를 껐다고 모든 XML 관련 외부 접근이 꺼지는 것도 아니다.
  • 라이브러리·버전에 맞는 보안 옵션을 적용하고 지원하지 않는 옵션 오류를 무시한 채 파싱을 계속하지 않는다. 학습에서는 정상 문서와 외부 참조가 거부되는 결과를 각각 관찰한다.
원리 심화

09파서 설정·자료 스키마·자원 예산의 세 경계

  • XML 외부 ··XInclude· 외부 참조는 서로 다른 기능일 수 있다. 한 옵션을 끈 사실만으로 모든 외부 읽기가 차단됐다고 가정하지 않는다.
  • 업무상 참조가 필요하면 허용 자료를 명시적으로 제공하는 정책을 둔다. 사용자 입력이 임의 파일·네트워크 대상이 되지 않게 한다.
  • JSON처럼 자료 전용 형식도 필드 타입·필수값·허용 범위·중첩·총크기를 검증해야 한다. 코드 실행 방지와 자원 고갈 방지는 별도 요구다.
  • 서명된 바이트를 안전하게 확인한 뒤 허용 형식으로 해석한다. 서명은 발신·무결성을 확인하지만 자료가 업무 규칙에 맞거나 무해함을 자동 증명하지 않는다.
  • 파서와 변환기가 접근할 수 있는 파일·네트워크· 권한을 줄이면 기능 제한 실패의 영향을 제한할 수 있다.
예제로 추적

10가상 JSON 작업 요청의 타입·범위 판정

  1. 교육용 요청은 quantity라는 정수 하나를 요구하고 허용 범위는 1~10이라고 가정한다. 추가 필드는 거부하는 정책이다.
  2. quantity=3이면 정수 타입과 범위를 모두 통과한다. 이 뒤에도 해당 작업을 요청할 권한은 따로 검사한다.
  3. quantity가 문자열 "3"이면 엄격한 에서는 타입 오류다. 자동 변환을 허용할지 업무 정책에서 명시하지 않고 조용히 바꾸지 않는다.
  4. quantity=11은 정수이지만 범위 조건에서 거부한다. 타입 검사만 통과했다고 업무 입력이 유효해지는 것은 아니다.
  5. 본문 크기·파싱→·범위→→작업 실행 순으로 경계를 적용한다. 검증 전에 파일·를 생성하면 거부해도 부수 효과가 남는다.
검증·예외

11안전한 API를 썼는데도 외부 효과가 생길 때

  • 처음에는 =False여도 하위 프로그램이나 스크립트가 다시 셸 문자열을 만드는지 본다. 전체 호출 경로의 해석기를 추적한다.
  • 인수 배열은 셸 문법을 피하지만 프로그램 자체의 옵션 문법은 남는다. 파일명 자리에 옵션처럼 해석되는 값을 허용하는지 확인한다.
  • XML 파싱 이후 XSLT· 검증·이미지 변환 등 후속 처리에서 외부 참조가 다시 활성화되는지 확인한다.
  • 깊이·노드 수·CPU·메모리·출력 한도를 넘었을 때 작업을 중단하고 잔여 파일·자식 를 정리하는 정책을 둔다.

12직렬화는 표현, 역직렬화는 복원

  • 는 객체·값을 저장·전송할 표현으로 바꾸는 작업이고 역직렬화는 그 표현을 다시 메모리 구조로 복원하는 과정이다. 단순 JSON 값과 언어별 객체 는 같은 능력을 가지지 않는다.
  • 어떤 복원기는 클래스 선택·특수 메서드·상태 복구 코드를 실행할 수 있다.
  • 는 신뢰하지 않는 입력이 이런 기능을 통제할 때 발생한다. 은 객체 복원 과정에서 호출 관계로 연결될 수 있는 기존 코드 조각을 가리킨다.
  • 모든 역직렬화가 는 아니며 자료 변조·권한 속성 조작·자원 소모처럼 다른 영향도 가능하다.

13Pickle과 자료 전용 형식

  • 은 신뢰할 수 없는 바이트를 안전하게 읽는 일반 데이터 포맷이 아니다. 복원 중 코드 실행이 가능하므로 외부 입력에 .load/loads를 사용하는 설계는 피한다.
  • 포렌식에서 메모리를 수집하는 기능과 객체 도 서로 다른 작업이다.
  • 자료 전용 JSON을 선택해도 user.role 같은 속성을 그대로 권한에 반영하면 업무 무결성 문제가 남는다. 허용 필드·타입·길이·중첩 깊이를 검증하고 서버가 결정해야 할 값은 입력에서 받지 않는다.
  • JSON의 값들을 다시 eval·동적 객체 생성에 넣으면 처음의 안전한 자료 경계가 다시 사라진다.
import json

data = json.loads('{"item":"lesson-42","quantity":2}')
if not isinstance(data, dict) or set(data) != {"item", "quantity"}:
    raise ValueError("unexpected fields")
if not isinstance(data["item"], str):
    raise ValueError("invalid item")
if type(data["quantity"]) is not int or not 1 <= data["quantity"] <= 10:
    raise ValueError("invalid quantity")
# 가격·소유자·권한은 서버 자료와 현재 세션에서 결정

가상 자료의 필드·타입·범위를 검사하는 학습 예입니다.

14템플릿 입력과 템플릿의 값

  • 템플릿 엔진은 작성자가 정한 표현식·조건·반복과 자료 값을 결합한다. 사용자 이름을 템플릿의 데이터 값으로 전달하는 것과 사용자 문자열을 새로운 템플릿 소스로 컴파일하는 것은 다르다.
  • 후자는 사용자가 엔진의 표현식 문법에 영향을 줄 수 있다.
  • SSTI의 실제 영향은 엔진이 노출한 함수·객체·sandbox·권한에 따라 달라진다. 템플릿 표현식이 평가되었다는 관찰과 OS 명령 실행을 증명했다는 결론을 구분한다.
  • 사용자에게 서식 기능이 필요하면 허용하는 언어와 접근 객체를 제한하고, 일반 텍스트 입력은 코드가 아닌 값으로 다룬다.

15검증·서명·권한은 서로 다른 방어층

  • 서명이나 MAC은 신뢰한 생산자가 만든 바이트인지 검증하는 데 도움이 되지만 생산자가 위험한 내용을 만들 수 있거나 검증 전에 역직렬화하면 목적을 달성하지 못한다. 형식 검증·출처 검증·실행 권한 제한을 서로 대체할 수 없다.
  • 한 문자열 필터로 ··XML·HTML의 다른 문법을 모두 막는 접근도 정확하지 않다.
  • 정상 입력의 기대 결과와 거부해야 할 구조, 오류 시 정리되는 자원, 로그에 남는 원인을 연결한다. 파서가 어떤 문법과 자원 접근을 지원하는지에 따라 입력 한 개의 의미가 달라지므로, 겉으로 같은 문자열이라도 ··XML·템플릿에서 다른 검증 기준을 적용해야 한다.
학습 확인

이해했는지 확인하기

  • 외부 입력이 전달되는 처리기와 그 권한을 구분했는가?
  • 정상 값이 유지되고 실행 구조·외부 자원 참조가 제한되는가?
  • 파서 오류·시간 초과·부분 처리 후 안전한 상태와 증거가 남는가?

함께 확인할 공식 자료