Secure Coding
- Secure Coding은 소프트웨어 개발 단계에서부터 보안 취약점이 발생하지 않도록 안전하게 코드를 작성하는 방법이다.
- 개발 과정에서 보안을 고려하면 공격 가능성을 줄이고, 소프트웨어의 안정성과 신뢰성을 높일 수 있다.
필요한 이유
- 대부분의 보안 사고는 코드의 작은 실수에서 시작된다.
- 개발 단계에서 취약점을 제거하는 것이 운영 후 수정하는 것보다 비용과 시간이 훨씬 적게 든다.
Secure Coding의 목적
Secure Coding의 목적은 다음과 같다.
- 보안 취약점 예방
- 프로그램의 안정성 향상
- 유지보수 용이성 향상
- 안전한 소프트웨어 개발
즉, 프로그램이 예상하지 못한 입력이나 공격에도 안전하게 동작하도록 만드는 것이 목적이다.
Secure Coding과 자동차
자동차는 ECU에서 C/C++ 언어를 많이 사용한다.
따라서 코드의 작은 오류도
- 차량 오작동
- 시스템 장애
- 안전사고
로 이어질 수 있으므로 Secure Coding이 매우 중요하다.
대표적인 보안 취약점
자동차 임베디드 프로그램에서 자주 발생하는 취약점
- Buffer Overflow
- Use After Free
- Null Pointer Dereference
- Integer Overflow
- Format String
이러한 취약점은 메모리 오류나 프로그램 오작동의 주요 원인이 된다.
취약점
취약점은 공격자가 악용할 수 있는 프로그램의 약점이다.
원인
- 입력값 검증 부족
- 메모리 관리 실수
- 포인터 사용 오류
- 정수 계산 오류
CWE
- MITRE에서 제공하는 소프트웨어 취약점 분류 체계이다.
- 취약점을 번호(CWE)로 관리하여 개발자들이 동일한 기준으로 이해할 수 있도록 한다.
사용하는 이유
- 취약점 분류를 표준화하기 위해
- 보안 도구와 연계하기 위해
Secure Coding 표준
대표적인 Secure Coding 표준
- MISRA C
- MISRA C++
- AUTOSAR C++14
- SEI CERT C/C++
- ISO 26262
- ISO/SAE 21434
각 표준은 안전하고 일관된 코드 작성을 위한 규칙을 제공한다.
MISRA C
- 자동차 임베디드 소프트웨어를 위한 C 언어 코딩 규칙이다.
목적
- 위험한 C 문법 사용 제한
- 오류 발생 가능성 감소
- 코드의 안전성 향상
자동차 산업에서 가장 널리 사용되는 코딩 표준이다.
AUTOSAR C++14
- AUTOSAR에서 제정한 C++ 코딩 규칙이다.
- MISRA를 기반으로 현대 C++ 기능까지 반영하였다.
목적
- 안전한 객체지향 프로그래밍
- 자동차 소프트웨어의 품질 향상
SEI CERT C/C++
- Carnegie Mellon University(SEI)에서 만든 Secure Coding 규칙이다.
목적
- 보안 취약점 예방
- 안전한 메모리 사용
- 안전한 입력 처리
보안 관점에서 코드 작성 방법을 제시한다.
ISO 26262
- 자동차 기능 안전 국제 표준이다.
목적
- 시스템 고장으로 인한 사고 예방
- 안전한 자동차 개발
보안보다 안전을 중심으로 한다.
ISO/SAE 21434
- 자동차 사이버보안 국제 표준이다.
목적
- 차량 개발 전 과정에서 보안을 고려하도록 하는 것
- 위험 분석 및 보안 관리 수행
UN R155와 함께 자동차 보안의 핵심 표준이다.
Secure Coding과 표준의 관계
각 표준의 역할은 다음과 같다.
- MISRA : 안전한 C/C++ 코드 작성
- AUTOSAR : 자동차 C++ 개발 규칙
- CERT : 보안 중심의 코딩 규칙
- ISO 26262 : 기능 안전
- ISO/SAE 21434 : 사이버보안
Secure Coding의 핵심 원칙
안전한 코드를 작성하기 위해
- 입력값 검증
- 메모리 안전성 확보
- 포인터 안전하게 사용
- 정수 연산 검증
- 위험 함수 사용 최소화
등의 원칙을 지켜야 한다.
Buffer Overflow
- 버퍼의 크기를 초과하여 데이터를 저장하는 취약점이다.
- 배열의 경계를 넘어 메모리를 덮어쓰면서 프로그램이 비정상적으로 동작하거나 공격자가 악용할 수 있다.
발생 이유
- 입력 크기를 확인하지 않음
- strcpy(), gets(), sprintf() 등 위험 함수 사용
대응 방법
- 입력 길이 검사
- snprintf() 등 안전한 함수 사용
- 배열 크기 확인
Buffer Overflow의 위험성
버퍼 오버플로우가 발생하면
- 프로그램 비정상 종료
- 메모리 손상
- 악성 코드 실행
- 시스템 권한 탈취
등의 문제가 발생할 수 있다.
Use After Free
- 메모리를 해제한 후에도 해당 메모리를 계속 사용하는 취약점이다.
발생 이유
- 해제된 포인터를 다시 사용
- 포인터를 NULL로 초기화하지 않음
위험성
- 프로그램 오작동
- 메모리 손상
- 공격 코드 실행
대응 방법
- free() 후 포인터를 NULL로 설정
- 해제된 메모리에 접근하지 않기
Null Pointer Dereference
- NULL 포인터를 역참조하는 취약점이다.
발생 이유
- NULL 여부를 확인하지 않고 접근
위험성
- 프로그램 종료
- 시스템 오류
대응 방법
- 포인터 사용 전 NULL 검사
- 예외 처리 추가
Integer Overflow
- 정수형이 표현할 수 있는 범위를 초과하여 계산되는 취약점이다.
발생 이유
- 자료형의 최대값을 고려하지 않음
- 큰 값을 더하거나 곱하는 연산 수행
위험성
- 잘못된 계산 결과
- 메모리 오류
- 보안 취약점 발생
대응 방법
- 연산 전 범위 검사
- 더 큰 자료형 사용
- 오버플로우 여부 확인
Division by Zero
- 0으로 나누는 연산이 수행되는 오류이다.
발생 이유
- 분모가 0인지 확인하지 않음
위험성
- 프로그램 비정상 종료
대응 방법
- 연산 전 분모 검사
- 예외 처리 수행
Format String Vulnerability
- 사용자 입력을 그대로 printf() 등의 형식 문자열 함수에 사용하는 취약점이다.
예)
printf(user_msg);
위험성
- 메모리 정보 유출
- 프로그램 조작
- 임의 코드 실행
대응 방법
printf("%s", user_msg);
항상 형식 문자열을 명시한다.
메모리 관련 취약점
PPT에서는 다음 메모리 취약점을 주요 위험으로 설명한다.
- Buffer Overflow
- Use After Free
- Null Pointer
이들은 대부분 메모리 관리 실수에서 발생한다.
정수 관련 취약점
대표적인 정수 오류
- Integer Overflow
- Division by Zero
정수 계산 결과를 신뢰하지 말고 항상 범위를 확인해야 한다.
입력값 검증
입력값 검증은 Secure Coding의 기본 원칙이다.
확인해야 할 사항
- 입력 길이
- 입력 범위
- 데이터 형식
- NULL 여부
올바르지 않은 입력은 처리하지 않아야 한다.
위험 함수 사용 제한
PPT에서 예시로 제시하는 위험 함수
- strcpy()
- sprintf()
- gets()
이 함수들은 버퍼 크기를 검사하지 않으므로 사용을 지양해야 한다.
안전한 함수 사용
위험 함수를 대신하여
- snprintf()
- strncpy()
등과 같이 크기를 제한하는 함수를 사용한다.
Secure Coding 표준과 취약점
각 취약점은 Secure Coding 표준과 연결된다.
- MISRA
- CERT
- CWE
- AUTOSAR
정적분석 도구는 이러한 표준을 기준으로 코드의 문제점을 검사한다.
취약점 예방 원칙
취약점을 예방하기 위해
- 경계 검사
- NULL 검사
- 메모리 수명 관리
- 입력값 검증
- 안전한 함수 사용
을 수행해야 한다.
코드 리뷰의 중요성
Secure Coding은 코드 작성만으로 끝나지 않는다.
추가적으로
- 코드 리뷰
- 정적분석
- 동적분석
을 통해 취약점을 발견하고 수정해야 한다.
취약 코드와 수정 코드 비교
PPT에서는 취약 코드(vuln.c)와 수정 코드(fixed.c)를 비교하여 설명한다.
공통적인 수정 원칙은
- 경계 검사
- NULL 확인
- 메모리 안전성 확보
- 안전한 함수 사용
이다.
Secure Coding 규칙
- Secure Coding은 취약점이 발생하지 않도록 코드를 작성하는 규칙이다.
- 위험한 코드 작성을 방지하고 프로그램의 안전성과 신뢰성을 높이는 것이 목적이다.
MISRA 규칙
- 자동차 임베디드 C/C++ 개발을 위한 코딩 규칙이다.
- 위험한 문법과 코딩 방식을 제한하여 오류 발생 가능성을 줄인다.
CERT 규칙
- 보안 취약점을 예방하기 위한 Secure Coding 규칙이다.
- 메모리 관리, 입력값 검증, 포인터 사용 등 보안 중심의 규칙을 제공한다.
CWE
- 소프트웨어 취약점을 분류하는 표준이다.
- 정적분석 도구에서 발견한 취약점을 CWE 번호로 표시한다.
AUTOSAR C++14
- 자동차 소프트웨어 개발을 위한 C++ 코딩 규칙이다.
- MISRA를 기반으로 C++ 기능을 확장하여 정의하였다.
Secure Coding 표준 비교
- MISRA : 안전한 코드 작성
- CERT : 보안 취약점 예방
- CWE : 취약점 분류
- AUTOSAR : 자동차 C++ 개발 규칙
각 표준은 목적은 다르지만 모두 안전한 소프트웨어 개발을 위해 사용된다.
코드 리뷰
- 다른 개발자가 코드를 검토하여 오류와 취약점을 발견하는 과정이다.
- 자동 분석 도구가 찾지 못하는 문제를 확인할 수 있다.
Secure Coding 적용 방법
Secure Coding은 다음 과정을 반복하여 적용한다.
- 코드 작성
- 코드 리뷰
- 정적분석
- 동적분석
- 수정 및 재검증
정적분석
- 프로그램을 실행하지 않고 코드를 분석하여 취약점을 찾는 방법이다.
장점
- 빠르게 많은 코드 검사 가능
- 개발 단계에서 취약점 발견
단점
- 실제 실행 여부는 확인하지 못함
- 오탐이 발생할 수 있다.
동적분석
- 프로그램을 실행하면서 오류를 검사하는 방법이다.
장점
- 실제 발생하는 오류 확인
- 정확한 오류 위치 파악
단점
- 실행한 코드만 검사 가능
- 테스트 환경이 필요하다.
'보안 세미나' 카테고리의 다른 글
| 6. 보안적합성 검사 (1) | 2026.07.11 |
|---|---|
| 4. 자동차 사이버보안 (0) | 2026.07.11 |
| 3. PQC II (0) | 2026.07.11 |
| 2. 양자시대의공개키암호 (0) | 2026.07.11 |
| 1. 깨지는 암호의 해부학 (0) | 2026.07.04 |