💻 운영체제 명령어 주입 (Command Injection) - 실습 시뮬레이터

CWE-78: Improper Neutralization of Special Elements used in an OS Command

✅ 학습 진행도
  • 진단 시작
  • 커맨드 인젝션 식별
  • 정규식 Whitelist 검증
✏️ Java 코드 에디터 취약한 코드
PingController.java 💡 정규표현식(matches)으로 IP 형식을 검증하세요.
public void ping(String ip) throws IOException {
    // [취약한 코드] 입력값 ip를 검증 없이 명령어에 연결
    // 공격자 입력: "8.8.8.8; cat /etc/passwd"
    String cmd = "ping -c 3 " + ip;
    Runtime.getRuntime().exec(cmd);
}
💡 수정 가이드 (KISA 가이드 기준)
1. 입력값 검증 (Whitelist 방식)

입력값이 허용된 패턴(IP 주소 등)과 일치하는지 정규표현식으로 검사합니다.

if (!ip.matches("^[0-9\\.]+$")) { throw new IllegalArgumentException("Invalid IP"); } String cmd = "ping -c 3 " + ip; Runtime.getRuntime().exec(cmd);
📊 분석 결과 및 설명
🎯 목표

외부 입력값이 운영체제 명령어로 전달될 때, ;, |, & 등의 메타문자를 사용하여 추가 명령어가 실행되는 것을 차단해야 합니다.

⚠️ 현재 취약점

OS Command Injection

입력값을 단순히 문자열 연결로 처리하고 있어 메타문자 주입에 취약합니다.

✅ 학습 진행도
  • 진단 시작
  • os.system 위험성 파악
  • subprocess 리스트 방식 적용
🐍 Python 코드 에디터 취약한 코드
utils.py 💡 subprocess.run()과 리스트 형태 인자를 사용하세요
import os

def ping_host(ip):
    # [취약한 코드] os.system은 쉘을 호출하므로 메타문자 해석이 일어남
    # 입력값: "127.0.0.1; rm -rf /"
    command = "ping -c 3 " + ip
    os.system(command)
💡 수정 가이드 (Python 가이드 기준)
1. subprocess 모듈 사용 (shell=False)

명령어와 인자를 리스트로 전달하면 쉘을 거치지 않고 실행되어 메타문자가 작동하지 않습니다.

import subprocess subprocess.run(["ping", "-c", "3", ip])
📊 분석 결과 및 설명
🎯 목표

os.system 대신 안전한 API를 사용하고, 입력값을 명령어의 일부가 아닌 인자로만 처리하도록 해야 합니다.

⚠️ 현재 취약점

Shell Injection

os.system은 내부적으로 /bin/sh -c를 호출하므로 쉘 메타문자 사용이 가능합니다.