Replicated

구현 단계 개발 보안 - Secure Coding, 테스트, 분석 본문

학부/소프트웨어 보안개발방법론

구현 단계 개발 보안 - Secure Coding, 테스트, 분석

라구넹 2025. 6. 12. 21:57

Secure Coding 이란?

- 소프트웨어 개발 과정에서 보안 취약점을 사전에 방지하기 위해 안전한 코딩 기법과 원칙을 적용하는 것

- 소프트웨어가 해킹, 데이터 유출, 악성 코드 주입 등의 위협으로부터 안전하게 보호될 수 있도록 하는 것을 목표

 

Secure Coding 목적

보안 취약점 예방

- 소프트웨어 개발 초기 단계부터 보안을 고려하여 취약점이 발생할 가능성을 줄임

 

데이터 보호

- 민감한 정보(개인 정보, 금융 데이터 등)가 외부로 유출되지 않도록 보호

 

공격 방어

- SQL 주입, XSS등과 같은 해킹 공격을 방어

 

신뢰성 향상

- 안전한 코드는 소프트웨어의 안정성과 신뢰성을 높여 사용자 신뢰를 구축

 

Secure Coding 주요 원칙

입력 데이터 검증과 무결성

- 모든 사용자 입력은 신뢰할 수 없다고 가정하고 반드시 검증

- 허용된 문자, 길이, 형식만 받아들이도록 화이트 리스트 방식으로 검증

- SQL 인젝션, XSS 등 공격을 방지하기 위해 특수문자 이스케이프 처리

 

인증과 접근 제어

- 최소 권한의 원칙을 적용하여 필요한 최소한의 권한만 부여

- 중요 기능에 대해 접근 권한을 세밀하게 통제

- 세션 관리를 안전하게 구현하고 세션 하이재킹 방지

 

암호화와 키 관리

- 중요 데이터는 반드시 암호화하여 저장 및 전송

- 안전한 암호화 알고리즘과 충분한 키 길이 사용

- 암호화 키를 안전하게 보관하고 주기적으로 갱신

 

안전한 통신

- HTTPS 등 암호화된 통신 채널 사용

- 중요 데이터 전송 시 추가 암호화 적용

 

안전한 메모리 관리

- 버퍼 오버플로우 방지를 위한 경계 검사

- 사용이 끝난 메모리는 즉시 해제

- 중요 데이터가 담긴 메모리는 삭제 전 덮어쓰기

 

코드 난독화

- 공격자의 공격 비용을 높임

 

상대적으로 안전한 개발 언어 사용

- 메모리 관련 보안 취약성은 대부분 수동 메모리 관리와 내장 메모리 검사가 없는 프로그래밍 언러에서 발생

- 시스템 프로그래밍 기능이 필요하지 않다면 C/C++ 외 다른 개발 언어 검토

- 보안성이 강화된 API 사용 (~~~_s 함수)

 

서드 파티 모듈 보안성 검토

- 사용하는 라이브러리 및 프레임워크 최신 버전 검증

- 사용하는 라이브러리 및 프레임워크 취약성 항목 검증

 

Secure Coding 표준 및 모범 사례

CERT (C)

- 미국 카네기멜론 대학 CERT에서 제정한 C언어 시큐어 코딩 표준

- 버퍼 오버플로우, 포맷스트링 등 메모리 취약점 방지 규칙 제시

- 선언, 초기화, 표현식, 포인터 등 10개 주요 영역별 가이드라인 제공

- 개발 언어별 코딩 권장 사항 제공

 

OWASP (Open Wep Application Security Project)

- 웹 어플리케이션 보안을 위한 코딩 가이드라인

- 입력값 검증, 인증/인가, 세션 관리 등 핵심 보안 영역 포함

- 실제 구현 사례와 체크리스트 제공

 

CWE (Common Weakness Enumeration)

- MITRE가 관리하는 소프트웨어 보안 취약점 분류 체계

- 버퍼 오버플로우, SQL 인젝션 등 주요 보안 약점 세부 분류

- CVE와 연계되어 실제 취약점 사례 참고 가능

 

MISRA(Motor Industry Software Reliability Association) C

- 자동차 산업 중심의 C 언어 코딩 표준

- C언어로 작성된 임베디드 시스템의 코드 안정성, 호환성, 신뢰성 확보를 위한 규칙 제시 목적

- 우주/항공, 의료장비, 국방, 철도 등 다양한 산업한 Best Practice

 

NIST(National Institute of Standards and Technology) 보안 코딩 표준

- 미국 표준 기술 연구소에서 제시한 보안 코딩 가이드라인

- 입력 데이터 검증, 메모리 관리, 에러 처리, 보안 기능 등에 대한 영역에 가이드라인 제공

- 규제 준수 등 법적 요구사항 충족, 감사 대응 용이, 컴플라이언스 관리 효율성


소프트웨어 테스트 유형

Types of Testing
|- Manual Testing
|  |- White Box Testing
|  |- Black Box Testing
|  |  | - Functional Testing
|  |  |  |- Unit Testing
|  |  |  |- Integration Testing
|  |  |  |  |- Incremental Testing
|  |  |  |  |  |- Top-Down
|  |  |  |  |  |- Bottom-Up
|  |  |  |  |- Non-Incremental Testing
|  |  |  |- System Testing
|  |  | - Non-Functional Testing
|  |  |  |- Performance Testing
|  |  |  |  |- Load Testing
|  |  |  |  |- Stress Testing
|  |  |  |  |- Scalability Testing
|  |  |  |  |  |- Stability Testing
|  |  |  |- Usability Testing
|  |  |  |- Compatibility Testing
|  |- Grey Box Testing
|- Automation Testing

Manual Testing

- 사람이 직접 수행하는 테스트

 

Non-Manual Testing

- 도구와 스크립트를 사용한 자동화된 테스트

 

White Box Testing: 내부 로직을 알고 수행하는 테스트

Black Box Testing: 내부 구조를 모르고 입출력만으로 테스트

Grey Box Testing: 제한된 내부 지식을 바탕으로 수행하는 테스트

 

Functional Testing (기능 테스트)

- Unit Testing: 개별 컴포넌트, 모듈 테스트

- Integration Testing: 여러 모듈이 결합된 상태에서의 테스트

    - Incremental Testing (증분 테스트): 점진적으로 모듈을 추가하면서 테스트 (하향식, 상향식)

    - Non-Incremental Testing (비증분 테스트): 모든 모듈을 한 번에 통합하여 테스트

- System Testing: 전체 시스템을 이용한 완전한 테스트

 

Non-Functional Testing (비기능 테스트)

- Performance Testing (성능 테스트): 시스템의 응답성과 안정성 테스트

    - Load Testing (부하 테스트): 예상 부하 상태에서 성능 측정

    - Stress Testing: 극한 상황에서의 시스템 안정성 검증

    - Scalability Testing(확장성 테스트): 시스템의 확장 가능성 테스트

         - Stability Testing(안정성 테스트): 장기간 운영 시의 시스템 안정성 검증

- Usability Testing(사용성 테스트): 사용자 친화성과 접근성 테스트

- Compatibility Testing(호환성 테스트): 다양한 환경에서의 작동 검증


소프트웨어 분석

- 소프트웨어 품질, 정확성, 신뢰성 평가 및 개선을 위해 소프트웨어를 체계적으로 조사하고 검증하는 과정

- 소프트웨어 개발 생명주기 전반에 걸쳐 수행

- 소프트웨어 구조, 동작, 특성을 이해하고 이를 바탕으로 잠재적인 문제점을 식별하고 해결방안을 제시하는 것이 목적

- 안정성, 유지보수 용이성, 성능 최적화, 보안성 강화

- 정적 분석(Static Analysis)과 동적 분석(Dynamic Analysis)로 구분

 

정적 분석(Static Analysis)

- 프로그램을 실행하지 않고 소스코드를 분석하는 방법

- 컴파일 시점에 발견 가능한 오류 검출

- 전체 코드를 기반으로 포괄적인 분석이 가능

- White Box Testing의 한 종류

 

정적 분석 유형

제어 흐름 분석(Control Flow Analysis)

- 프로그램 실행 경로를 그래프 형태로 표현하여 분석

- 프로그램 실행 경로 추적

- 도달 불가능한 코드 (Dead Code) 검출

- 무한 루프 가능성 검사

- 조건문과 반복문의 논리적 오류 검출

- 예외처리 누락 확인

 

데이터 흐름 분석(Data Flow Analysis)

- 변수의 정의와 사용 관계 추적

- 초기화되지 않은 변수 사용 검출

- 변수 값 범위 분석

- 널 포인터 참조 가능성 검사

- 메모리 누수 가능성 분석

- 자원 할당과 해제 패턴 검사

 

타입 검사(Type Checking)

- 변수와 함수의 타입 호환성 검증

- 암시적 타입 변환의 안전성 검사

- 함수 매개변수 타입 정합성 확인

- 반환값 타입 검증

 

구문 분석(Syntax Analysis)

- 코드의 문법적 정합성 검증

- 코딩 스타일 가이드라인 준수 여부 확인

 

의미 분석(Semantic Analysis)

- 코드의 논리적 의미와 의도를 분석

- 정수와 문자열 덧셈, 0으로 나누는 연산 등 코드의 논리적 오류 분석

 

 

동적 분석(Dynamic Analysis)

- 프로그램을 실제로 실행하면서 분석하는 기법

- 다양한 입출력 데이터와 사용자 상호작용의 변화들을 점검

- 프로그램의 동작과 성능을 실시간으로 모니터링

 

동적 분석 유형

- 행위 탐지 기법: 프로그램이 실행될 때 나타나는 동작과 패턴을 관찰 및 분석

- 샌드박스 기법: 가상화 환경에서 직접 실행을 통해 이상 현상을 분석

- 모의 해킹: 화이트 해커가 실제로 프로그램을 분석하면서 취약점 진단