2What — C의 자유도와 그 대가
3- C는 하드웨어에 가장 가까운 고급 언어 — 포인터로 메모리 주소를 직접 조작하고, 타입 캐스팅에 제한이 거의 없다
4- 이 자유도는 곧 위험: 컴파일러가 막아주지 않는 실수가 실행 시점에 치명적 결과를 낳는다
5- 핵심 역설: "프로그래머를 신뢰한다"는 C의 설계 철학이 곧 "프로그래머의 실수를 방치한다"는 의미가 된다 (Ritchie, 1993)
6Why — 작은 버그가 국가 단위 보안 사고로
7- Microsoft 보안팀 발표: 자사 CVE 취약점의 약 70%가 메모리 안전성 오류 (Miller, 2019)
8- 운영체제(Linux 커널), 네트워크 스택(OpenSSL), 임베디드 펌웨어 — 전 세계 핵심 인프라가 C로 작성됨
9- Heartbleed(2014): OpenSSL의 버퍼 오버리드 한 줄이 전 세계 서버 66%의 비밀키를 노출시킨 사례
10- 단순 크래시가 아니라 원격 코드 실행(RCE), 권한 상승, 데이터 유출로 직결됨
11How — 정의되지 않은 동작(Undefined Behavior, UB)
12- UB란: C 표준이 "이 경우 어떤 일이 일어나도 컴파일러의 책임이 아니다"라고 명시한 동작
13- 예시: 널 포인터 역참조, 배열 범위 초과 접근, 부호 있는 정수 오버플로우, 해제된 메모리 사용(use-after-free)
14- UB가 위험한 이유: 컴파일러가 UB를 "절대 발생하지 않는다"고 가정하고 최적화 → 디버깅 불가능한 동작 발생
15- 예: x + 1 > x 를 항상 참으로 최적화 (오버플로우는 UB이므로 없다고 가정)
16핵심 통계 요약
17- CVE 메모리 오류 비율: ~70% (Microsoft, 2019; Google Chrome팀도 유사 수치 보고)
18- 주요 취약점 유형: 버퍼 오버플로우, use-after-free, 이중 해제(double free), 포맷 스트링 공격
19- 대안 언어(Rust 등)가 등장한 이유: 컴파일 타임에 메모리 안전성을 보장하기 위함 (Matsakis & Klock, 2014)
20한 문장 요약
21- C에서 "버그"는 단순히 틀린 출력이 아니라, 언어 명세가 모든 가능성을 열어둔 정의되지 않은 동작이며, 이것이 공격자에게 악용될 때 시스템 전체가 무너진다.