이번 포스트에서는 문자열 취약점에 대해 알아보고자 한다.
목차는 다음과 같다. Issues
- 컴파일러
- 문자열
- 배경 및 일반적인 문제
- 일반적인 문자열 조작 오류
- 문자열 취약점
- 완화 전략
1. 컴파일러
우선, 컴파일러는 다음의 절차를 수행한다
최종 사용자와 소프트웨어 시스템 간에 교환되는 대부분의 데이터는 아래 항목을 포함한다
- 명령줄 인수
- 환경 변수
- 콘솔 입력
소프트웨어 취약점과 악용은 다음 항목의 취약점으로 인해 발생한다
- 문자열 표현
- 문자열 관리
- 문자열 조작
2. C-Style Strings
문자열은 소프트웨어 엔지니어링의 기본 개념이지만 C나 C++에 내장된 유형은 아니다.
- 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 초과 오류(한끝차이)
- 부적절한 데이터 정리(데이터 초기화)
여기까지 이론에 대한 내용을 살펴보고, 다음 포스트에서 직접 코드를 보며 일반적인 오류들에 대한 예시를 살펴보자
'시큐어코딩' 카테고리의 다른 글
시큐어코딩 (7) - CH 02-3 프로그램은 메모리에 어떻게 저장되는가 (0) | 2025.04.13 |
---|---|
시큐어코딩 (6) - CH 02-2 일반적인 오류 코드로 살펴보기 (0) | 2025.04.13 |
시큐어코딩 (4) - CH 01-3 (0) | 2025.04.13 |
시큐어 코딩 (3) - CH 01-2 (0) | 2025.04.13 |
시큐어 코딩 (2) - CH 01-1 (0) | 2025.04.13 |