보안 세미나

5. 시큐어코딩

sun88 2026. 7. 11. 21:32

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