본문 바로가기

보안/시큐어코딩

가장 위험한 25 개 프로그래밍 오류와 CERT C 코딩 표준

가장 위험한 25 개 프로그래밍 오류와 CERT C 코딩 표준


대응되는 CERT C 코딩 표준이 명시되지 않은 CWE 항목은 C 언어와 관련이 없거나, CERT C 코딩 표준에 해당하는 규

칙이나 권고가 없는 경우이다.


컴포넌트 사이의 안전한지 못한 상호작용


1. CWE-20 적절하지 못한 입력 검증

■ INT06-C 문자열을 정수로 변환할 때에는 strtol() 또는 유사 함수를 사용한다.

■ ERR07-C 같은 일을 하는 함수이면 오류 검사를 수행하는 함수를 사용한다.

■ API00-C 함수 인자는 반드시 검증되어야 한다.

■ MEM10-C 포인터 검증 함수를 정의해서 사용한다.


2. CWE-116 적절하지 못한 출력 구성 (encoding and escaping)

■ MSC09-C 문자 코딩 - 안전을 위해서는 ASCII의 부분 집합을 사용한다.

■ MSC10-C 문자 코딩 - UTF8 관련 사항, 유효한 값의 범위 내에 있는지 검증한다.


3. CWE-89 SQL 쿼리 보존 실패 (SQL 주입). C 언어 관련 없음


4. CWE-79 웹 페이즈 구조 보존 실패. C 언어 관련 없음


5. CWE-78 OS 명령에 사용되는 특수 원소의 적절하지 못한 위생처리 (OS 명령어 주입)

■ STR02-C 복잡한 서브시스템에 전달된 데이터는 위생처리 한다.

■ ENV03-C 외부 프로그램을 기동시킬 때에는 환경을 위생처리 한다.

■ ENV04-C 명령어 처리기가 필요하지 않으면, system() 함수를 호출하지 않는다.


6. CWE-319 민감한 정보의 단순 텍스트 전송. 설계 단계의 취약성.


7. CWE-352 교차-사이트 요청 위조. 설계 단계의 취약성. C언어 관련 없음


8. CWE-362 경쟁 조건

■ FIO31-C 같은 파일을 동시에 두 개 이상 열지 않는다.


9. CWE-209 오류 메시지 정보 유출

■ MEM03-C 재사용 가능한 자원에 저장된 민감한 정보는 반드시 지운다.


위험성이 높은 자원 관리


10. CWE-119: 메모리 버퍼의 경계 안으로 연산 제한 실패

■ MEM09-C 메모리 할당 루틴이 초기화까지 할 것이라 가정하지 않는다.

■ FIO37-C 문자 데이터만 읽었을 것이라고 가정하지 않는다.

■ ENV01-C 환경 변수의 크기에 대하여 어떤 가정도 하지 않는다.

■ ARR00-C 배열 관련 연산에 대하여 이해하라.

■ ARR33-C 충분한 크기의 저장소로 복사되었음을 보장해야 한다.

■ ARR34-C 표현식의 배열 타입이 호환성이 있음을 확인한다.

■ ARR35-C 배열 한계를 넘는 루프 회전은 허락하지 않는다.

■ STR31-C 문자열 저장소는 문자 데이터를 NULL 마감 문자를 위한 충분한 공간을 갖고 있음을 보장한다.

■ STR32-C NULL 마감 바이트를 갖는 문자열이 되게 한다.

■ STR33-C 두 바이트 문자(wide character)로 구성되는 문자열의 크기를 정확히 한다.

■ MSC34-C 사용하지 말라고 권고된 함수나 오래되어 사용하지 않는 함수는 사용하지 않는다.


11. CWE-642 치명적인 상태 데이터의 외부로부터의 제어


12. CWE-73: 파일 이름이나 경로의 외부로부터의 제어

■ FIO01-C 파일 이름을 사용하여 신원 확인하는 함수에 대하여 주의한다.

■ FIO02-C 신뢰할 수 없는 출처로부터의 경로 이름은 정규화 한다.


13. CWE-426 신뢰하지 못하는 탐색 경로

■ ENV02-C 같은 유효 이름을 갖는 여러 환경 변수에 주의한다.


14. CWE-94 코드 발생 제어 실패 (코드 주입). C언어 관련 없음


15. CWE-494 무결성 검사 없는 코드 내려받기. C 언어 관련 없음


16. CWE-404 적절하지 못한 자원 폐쇄 또는 방출

■ FIO42-C 파일이 더 이상 필요하지 않을 때에는 반드시 적절한 절차로 닫는다.

■ MEM00-C 메모리 할당과 해제는 같은 모듈의 같은 추상화 수준에서 수행한다.

■ MEM11-C 힙 공간이 무한하다고 가정하지 않는다.

■ MEM31-C 동적 할당된 메모리는 정확히 한번만 해제하다.


17. CWE-665 적절하지 못한 초기화

■ MEM09-C 메모리 할당 루틴이 초기화까지 할 것이라 가정하지 않는다.

■ ARR02-C 초기값 지정이 함축적으로 크기를 나타내더라도 배열 크기는 명시적으로 표시한다.


18. CWE-682 부정확한 계산

■ INT10-C % 연산자를 사용할 때 나머지가 양수일 것이라 가정하지 않는다

■ INT07-C 수치값에 대해서는 명시적으로 signed 또는 unsinged 지정된 문자 타입만을 사용한다.

■ INT13-C 비트 연산자는 무부호(unsigned) 피연산자에 대해서만 적용한다.

■ FLP32-C 수리 함수에서는 정의역과 치역 오류를 탐지하거나 방지하도록 한다.

■ FLP33-C 부동소수점 연산을 위해서는 정수를 부동소수점으로 변환한다.


허점 많은 방어


19. CWE-285 부적절한 접근 제어 (인증). 언어 독립적 취약성. 웹 서버/DB 관련


20. CWE-327 깨지거나 위험 암호학적 알고리즘 사용

■ MSC30-C 의사난수 발생을 위해서 rand() 함수를 사용하지 않는다.

■ MSC32-C 난수 발생기에 적절한 시드값이 주어지는 확인한다.


21. CWE-259 엮여 들어간 패스워드 (프로그램 내에 패스워드사 문자열 상수로 나타남)


22. CWE-732 치명적인 자원에 대한 안전하지 못한 허용 지정


23. CWE-330 충분히 임의성을 확보하지 못한 값 사용

■ MSC30-C 의사난수 발생을 위해서 rand() 함수를 사용하지 않는다.

■ MSC32-C 난수 발생기에 적절한 시드값이 주어지는 확인한다.


24. CWE-250 불필요한 권한으로 실행

■ POS02-C 최소 권한 원칙을 따른다.

■ POS36-C 권한을 내놓을 때에는 올바른 철회 순서를 준수한다.

■ POS37-C 권한을 내놓는 것이 제대로 수행되었음을 확인한다.


25.  CWE-602 클라이언트 측에서 강제할 수 있는 서버 측 보안. 설계 단계의 취약성


출처: 안전한 C 프로그램을 위한 코딩 표준 

        표창우, 홍익대학교

        한경숙, 한국산업기술대학교


원문: 

안전한코딩C.hwp



CERT C 코딩 표준은 수많은 취약성을 분석하여 공통의 프로그래밍 오류를 찾아내고 안전하지 않은 코딩에 대응되는 안전한 코딩 방법을 구축하였다.  


이 표준은 89개 규칙과 132개의 권고로 구성되어 있다.


CERT C 코딩 표준은 전처리기와 선언, 초기화. 수식, 정수형과 실수형, 배열, 문자역, 메모리관리, 입출력, 환경, 시그널, 오류처리, API, POSIX와 기타 15가지로 구분된 규칙과 권고를 포함한다.


CERT C 코딩 표준에서는 각 분류별로 00~29번은 권고를, 30번 이후는 규칙을 나타낸다.


각 표준은 오류의 심각성, 발생가능성, 수정비용의 세가지 요소를 세단계로 분류하여 1~27의 우선순위를 정하고, 이를 기반으로 L1, L2, L3 중요도로 표시한다.



CWE는 MITRE가 주관하여 소프트웨어의 구성, 설계단계와 관련된 소프트웨어 취약성의 관리에 대한 이해를 높일뿐 아니라 소스 코드나 운영체제에서 소프트웨어 취약성을 찾아내는 소프트웨어 보안 도구나 서비스에서 사용하고 논의하거나 기술하는데 유용한 소프트웨어 취약성을 모아 놓은것이다.


CWE는 CVE 리스트의 다양한 실제 취약성을 기반으로 CWE 커뮤니티의 많은 소스와 예제를 통해 취약성 리스트를 만들어 나간다.



SANS TOP 25는 MITRE와 SANS가 주도하여 30개 이상의 미국와 유럽의 기업, 연구소, 정부부처가 공동으로 "상위 25개의 가장 위험한 프로그래밍 오류"로 발표 한 리스트이다. 이 리스트는 컴포넌트 사이의 안전하지 못한 상호작용, 위험성이 높은 자원관리, 허점많은 방어  3부분으로 나누어져 있다.



분석/표준 검사 도구의 Top25 오류 검출 능력


Top25 분류

CERT 표준

Fortify V 5.0

Compass/

ROSE

Klocwork V. 8.0.4.16

LDRA V. 7.6.0

Splint V 3.1.1

구성원 사이의 안전하지 않은 상호작용

INT06-C

O

ERR07-C

APP00-C

O

MSC09-C

O

MSC10-C

O

MEM10-C

ENV03-C

O

O

ENV04-C

O

O

STR02-C

O

O

FIO31-C

위험한 자원 

관리

ARR00-C

ARR33-C

O

O

O

O

ARR34-C

ARR35-C

O

ENV01-C

FIO37-C

O

MEM09-C

O

STR31-C

O

O

O

O

STR32-C

O

O

STR33-C

O

FIO01-C

O

O

FIO02-C

O

ENV03-C

FIO42-C

O

O

O

O

ARR02-C

O

FLP32-C

O

FLP33-C

O

O

O

INT07-C

O

O

O

O

INT13-C

O

O

O

O

허점 많은 방어

MSC30-C

O

O

O

MSC32-C

O

POS02-C

POS36-C

O

POS37-C

O