
C 언어 strcpy 오버플로 취약점
C 언어에서 가장 오래되고 위험한 보안 취약점 중 하나가 strcpy() 기반 버퍼 오버플로입니다.
1️⃣ strcpy()가 왜 위험한가
strcpy()는 문자열을 복사할 때
대상 버퍼의 크기를 전혀 확인하지 않습니다.
소스 문자열이 대상 버퍼보다 크면,
메모리는 제한 없이 덮어쓰이게 됩니다.
char buf[16];
strcpy(buf, user_input);
이 상황에서 user_input이 16바이트를 초과하면,
버퍼 경계를 넘어 인접한 메모리 영역까지 침범하게 됩니다.
2️⃣ “마지막 return 전에 덮어버리면” 왜 치명적인가
함수 스택 구조상, 지역 변수 뒤에는 다음과 같은 정보들이 위치합니다.
- 저장된 프레임 포인터(Frame Pointer)
- 리턴 주소(Return Address)
- strcpy()로 스택을 넘쳐쓰면
- 리턴 주소를 공격자가 원하는 값으로 덮을 수 있음
- 함수가 return 되는 순간, 공격자가 지정한 코드로 점프
즉, “마지막 return 전에 메모리를 덮는다”는 것은 제어 흐름(Control Flow)을 탈취할 수 있다는 의미이며, 이는 단순 크래시가 아니라 원격 코드 실행(RCE)으로 이어질 수 있습니다.
3️⃣ 보안적으로 어떤 위협이 되는가
- 임의 코드 실행(Shellcode 실행)
- 권한 상승(프로세스 권한 탈취)
- 서비스 거부(DoS)
- 백도어 설치
실제로 과거 수많은 웜·익스플로잇이 strcpy()/gets()/sprintf() 계열 함수에서 출발했습니다.
4️⃣ 그래서 strncpy()를 쓰는 이유
strncpy()는 복사할 최대 길이를 지정할 수 있어
버퍼 크기 초과를 방지하는 목적의 함수입니다.
strncpy(buf, user_input, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
- 지정한 길이 이상 복사하지 않음
- 스택/힙 경계 침범 차단
- 리턴 주소 덮어쓰기 원천 봉쇄
단, strncpy()는 자동으로 NULL 종료를 보장하지 않기 때문에 마지막에 명시적 종료 처리가 필요합니다.
5️⃣ strncpy()도 만능은 아니다
strncpy() 역시 오용되면 문제가 됩니다.
- NULL 종료 누락 시 문자열 처리 오류
- 불필요한 zero padding으로 성능 저하
그래서 현대 보안 코딩에서는 다음 계열을 더 권장합니다.
- strlcpy() (BSD 계열, 길이+NULL 종료 보장)
- snprintf() (형식 문자열 포함 안전 복사)
- memcpy() + 길이 검증(바이너리 데이터)
6️⃣ 보안 대응 전략 정리
- strcpy, strcat, gets, sprintf 사용 금지
- strncpy, snprintf, strlcpy 사용
- Stack Canary
- ASLR
- NX(DEP)
- 정적 분석으로 위험 함수 탐지
- Fuzzing으로 오버플로 경로 검증
7️⃣ 결론
strcpy() 취약점의 본질은
“문자열 복사”가 아니라
메모리 경계 검증 부재에 있습니다.
마지막 return 전에 메모리를 덮을 수 있다면,
이는 단순 버그가 아니라 치명적인 보안 취약점입니다.
따라서 보안 관점에서의 대응은
“strcpy를 strncpy로 바꾼다” 수준이 아니라,
안전한 API 선택 + 컴파일러 보호 + 코드 리뷰가 함께 이루어져야 합니다.
'IT 소식 뉴스 > IT 소식' 카테고리의 다른 글
| 클로드 코드 밋업 서울 (0) | 2025.12.23 |
|---|---|
| 하이퍼스레딩 기술 정리 (0) | 2025.12.22 |
| XSS CSRF 차이와 보안 비교 (1) | 2025.12.21 |
| 개인정보보호법과 전당포법 (0) | 2025.12.21 |
| AI 백틱 설명과 사용 가능 AI (0) | 2025.12.21 |
