시큐어코딩

시큐어코딩 (5) - CH 02-1 String Vulnerabilities(문자열 취약점)

vitamin3000 2025. 4. 13. 20:58

 

이번 포스트에서는 문자열 취약점에 대해 알아보고자 한다.

 

 

목차는 다음과 같다. Issues

  • 컴파일러
  • 문자열
    • 배경 및 일반적인 문제
  • 일반적인 문자열 조작 오류
  • 문자열 취약점
  • 완화 전략

1. 컴파일러

 

우선, 컴파일러는 다음의 절차를 수행한다

 

 

 

최종 사용자와 소프트웨어 시스템 간에 교환되는 대부분의 데이터는 아래 항목을 포함한다

  • 명령줄 인수
  • 환경 변수
  • 콘솔 입력

소프트웨어 취약점과 악용은 다음 항목의 취약점으로 인해 발생한다

  • 문자열 표현
  • 문자열 관리
  • 문자열 조작

2. C-Style Strings

 

문자열은 소프트웨어 엔지니어링의 기본 개념이지만 C나 C++에 내장된 유형은 아니다.

 

char 문자배열의 예시 끝에 종료를 알리는 \0이 포함

  • C-Style 문자열은 널 문자를 포함하여 끝난는 연속적인 문자 시퀀스로 구성된다
  • 문자열 포인터는 해당 문자열의 시작문자(h)를 가리킨다
  • 문자열 길이는 널 문자 앞의 바이트 수이다
  • 문자열 값은 포함된 문자 값의 순서이다
  • 문자열을 저장하는데 필요한 바이트 수는 문자 수에 1을 더한 값(각 문자의 크기 x값) 이다. 

C++는 C와 다르게 다음의 표준화를 적용했다

  • 표준 템플릿 클래스 std::basic_string
  • char 인스턴스화 std::string
  • basic_string 클래스는 C 스타일 문자열보다 보안 취약점에 덜 취약하다

C-Style 문자열은 C++ 프로그램에서 여전히 일반적인 데이터 유형이다

 

C++ 프로그램에서 여러 문자열 유형을 사용하는 것은 불가능하다

 

C스타일 문자열만 사용된다

 

3. 일반적인 문자열 조작 오류

 

C 또는 C++에서 C-Style 문자열을 사용한 프로그래밍은 오류가 발생하기 쉽다

 

일반적인 오류는 다음과 같다.

  • 무제한 문자열 복사(길이체크)
  • NULL 종류 오류(끝에 '\0'이 포함 안됨)
  • 잘림(문자열을 자르거나 붙이는 경우)
  • 배열 경계를 벗어난 쓰기(길이 계산)
  • 1 초과 오류(한끝차이)
  • 부적절한 데이터 정리(데이터 초기화)

 

 

여기까지 이론에 대한 내용을 살펴보고, 다음 포스트에서 직접 코드를 보며 일반적인 오류들에 대한 예시를 살펴보자