📝 포맷 스트링 삽입 - 실습 시뮬레이터

CWE-134: Use of Externally-Controlled Format String

✅ 학습 진행도
  • 진단 시작
  • 포맷 스트링 위험 식별
  • 안전한 printf 사용
✏️ Java 코드 에디터 취약한 코드
LogService.java 💡 printf의 첫 번째 인자로는 고정 문자열을, 값은 두 번째 인자부터 전달하세요.
public void printLog(String userInput) {
    // [취약한 코드] 외부 입력값을 포맷 문자열로 직접 사용
    // userInput에 "%x %x" 등이 포함되면 메모리 정보가 노출될 수 있음
    System.out.printf(userInput);
}
💡 수정 가이드
1. 포맷 스트링과 인자 분리

포맷 문자열 위치에는 고정된 형식("%s")을 사용하고, 외부 입력은 인자로 전달합니다.

System.out.printf("%s", userInput);
📊 분석 결과 및 설명
🎯 목표

포맷 문자열을 처리하는 함수 사용 시, 사용자 입력값이 포맷 문자열(Format String)로 해석되지 않도록 해야 합니다.

⚠️ 현재 취약점

Format String Injection

입력값에 포함된 포맷 지정자(%s, %x 등)가 실행되어 메모리 내용을 읽거나 프로그램 동작을 방해할 수 있습니다.

✅ 학습 진행도
  • 진단 시작
  • 포맷팅 취약점 식별
  • 안전한 포맷팅 사용
🐍 Python 코드 에디터 취약한 코드
formatter.py 💡 사용자 입력을 포맷 스트링으로 쓰지 말고, 인자로 넘기세요.
def format_message(user_input, value):
    # [취약한 코드] 사용자 입력을 포맷 스트링으로 사용
    # "{0.__class__.__init__.__globals__}".format(...) 와 같은 입력 시 내부 속성 접근 가능
    return user_input.format(value)
💡 수정 가이드
1. 정적 포맷 스트링 사용

포맷 템플릿을 코드 내에 고정하고, 입력값은 데이터로만 처리합니다.

return "User Input: {}".format(value) # 또는 f-string (Python 3.6+) return f"User Input: {value}"
📊 분석 결과 및 설명
🎯 목표

Python의 `format()` 메소드를 사용할 때, 포맷 문자열 자체를 외부 입력으로 받으면 내부 속성 접근 등의 위험이 있으므로 이를 방지해야 합니다.

⚠️ 현재 취약점

Format String Vulnerability

신뢰할 수 없는 포맷 문자열은 정보 유출이나 예기치 않은 동작을 유발할 수 있습니다.