정적 분석 – 누가 규칙을 정하는가?

정적 코드 분석툴 C-STAT은 IAR Embedded Workbench IDE에 완전히 통합되어 있으며, 어플리케이션이 MISRA(Motor Industry Software Reliability Association)에서 제정한 자동차 코딩 표준을 준수하는 지의 여부를 확인할 수 있는 간편한 수단입니다. 그러나 이러한 툴은 모든 종류의 어플리케이션에 대해 우수한 코드 품질을 확보해 줄 수 있는 수단이 되기도 합니다. MISRA 규칙과 더불어, C-STAT은 그 자체의 고유 점검 항목은 물론, CWE 및 CERT에서 파생된 수 백 가지 점검 항목도 함께 반영하고 있습니다.

C-STAT는 MISRA, CERT, CWE에서 취약 코드로 별도로 지정하고 있는 특정 코드 구조 작성을 막는 데에 도움을 줍니다. 그렇지만 이러한 규칙을 만드는 사람들은 과연 누구이며, 이러한 규칙을 우리는 왜 따라야 하는 것일까요? 

MISRA C/C++

MISRA-C 규칙은 영국 MISRA가 처음 제창한 것으로, 최초에는 오직 자동차용 소프트웨어 만을 대상으로 하고 있었습니다. 그러나 세월이 흐르면서 MISRA-C 규칙은 전 세계로 퍼져 나갔으며, 다른 산업계에서도 이를 적용하기 시작합니다. 오늘날 MISRA-C는 임베디드 업계에서 가장 널리 사용되는 하위 언어로 성장했습니다. 

그 중에서도 MISRA-C:2012는 가장 최신의 버전으로, 143개의 규칙과 16개의 ‘지침’을 포함하고 있습니다. 규칙은 의무 규칙, 필수 규칙, 권고 규칙으로 나뉘며, 그 내용으로는 정수의 크기 제한과 같은 컴파일러별 편차 발생의 방지, 장애 발생 가능성이 높은 함수 및 구조체 사용의 금지, 코드 복잡성의 제한, 명칭 부여 및 주석 작성의 규칙을 통한 코드의 관리성 확보 등을 들 수 있습니다. 

CWE(Common Weakness Enumeration, 공통 취약성 목록) 

CWE (the Common Weakness Enumeration) 는 커뮤니티에 의해 개발된 소프트웨어 취약성 및 잠재적 문제점에 대한 목록을 말합니다. 각각의 항목은 ID 번호, 취약성에 대한 설명, 그리고 잠재적으로 발생할 수 있는 결과와 피해 축소 방법은 물론 코드 샘플, 분류명, 참고 자료 등으로 구성되어 있습니다. 본 자료의 목적은 소프트웨어의 취약성에 대한 이해를 높이고, 관리를 개선할 뿐 아니라 소프트웨어 보안 툴 및 서비스를 좀 더 효과적으로 선택 및 사용하도록 하여 취약점을 발굴해 내는 데에 있습니다. 프로젝트는 미 연방 정부의 공공 연구 및 개발 센터 다수를 운영하는 미국 비영리 기관, MITRE Corporation의 후원으로 진행되고 있습니다.

그러면, 과연 소프트웨어 취약점이라는 것은 무엇을 말하는 것일까요? MITRE의 정의에 따르면 이는 각종 문제점, 허점, 버그, 약점, 기타 소프트웨어 구축, 코드, 설계, 아키텍쳐 상의 오류로서이를 방치할 경우 시스템 및 네트워크가 공격에 취약해지는 것을 말합니다. 

여기에서 언급하고 있는 취약점이 모두 임베디드 시스템에 해당되는 것은 아닙니다. 그렇지만 가장위험성이 높은 소프트웨어 에러로 구성된 CWE/SANS 상위 25개 목록에는 반드시 알아두어야 하는 취약점이 다수 수록되어 있습니다. 예를 들어 입력 사이즈의 확인 없이 버퍼를 복사하는 행위’(Classic Buffer Overflow), ‘버퍼 사이즈 계산 부정확’, ‘포맷 문자열 관리 실패 및 정수 오버플로우 또는 랩 어라운드(wraparound)’ 등을 들 수 있습니다. 그리고 전체 목록 중에서 이들 상위 25개의 취약성에 대한 항목만을 추려도 1000개가 넘습니다.  

CERT C/C++

CERT C/C++ 보안 코딩 표준은 C/C++ 프로그래밍 언어에서 코딩의 보안성을 확보하기 위한 교칙 및 권고 사항을 제시합니다. CERT C/C++ 표준은 카네기 멜론대에서 운영하고 있는 SEI(Software Engineering Institute) 내 CERT Division에서 발표한 것입니다. SEI는 주로 미국 국방부, 그리고 미국 국토방위부의 후원으로 운영되는 연구 및 개발 기관입니다.

CERT는 및 C++ 언어로 보안을 확보한 코딩을 하는 데에 필요한 일련의 규칙을 제시하고 있습니다. 각각의 지침은 제목, 내용, 그리고 위반 예시와 모범 코드의 예시로 구성되고 있습니다. 표준 내용으로는 코딩 및 구축 과정에서의 오류 방지 방법, 그리고 저 수준 디자인 에러 방지 방법 등이 포함되어 있습니다. 이러한 표준의 목적은 코딩 과정에서 보안상 취약한 행위, 그리고 정의되지 않은 반응이 발생해 향후 공격 시 악용될 수 있는 약점으로 이어지는 것을 방비하는 것입니다. 

표준 간의 관련성 

각각의 표준 상에 존재하는 규칙은 서로 중복 및 보완 관계에 있습니다. CWE에서는 알려진 소프트웨어 약점을 나열하고 있으며, CERT 및 MISRA 표준에서는 잠재적으로 소프트웨어의 약점을 노출시킬 수 있는 코딩 구조체를 소개합니다. CWE에서 나열하고 있는 취약성 내용을 모두 포함하고 있는 표준은 존재하지 않습니다. 왜냐하면, 하나의 프로그래밍 언어에 이러한 약점이 모두 존재하는 것이 아니기 때문입니다. 뿐만 아니라 일부 약점은 고급 설계 문제와 연결되어 있는 것도 있습니다. 마찬가지로, MISRA 또는 CERT에서 제시하고 있는 지침의 내용 중에는 CWE 상의 취약점과 연결되지 않는 것도 있습니다. 왜냐하면, 문제성있는 코드 구조체가 반드시 특정한 취약점과 연결되는 것은 아니기 때문입니다. 그러나 CERT 지침에서는 CWE 중 참조 항목이 존재하는 것에 대해서는 참조 정보를 제공하고 있습니다. 

상호간에 서로 보조적인 역할을 담당하는 경우도 있을 수 있으므로, 소프트웨어의 안전성 및 보안성 확보를 위하여 이러한 예시 모두를 확인해 보는 것이 바람직하거나, 또는 필요한 일일 수도 있습니다.  

자동으로 합시다! 

이런 작업을 직접 하지 않고 자동화하는 것이 좋지 않을까요? C-STAT에서는 다양한 보안 점검을 통해 MISRA 규칙, CERT C/C++ 보안 코딩 표준 상에서 정하고 있는 규칙, 그리고 CWE에서 정하고 있는 여러 가지 취약성을 기준으로 적정 유무를 확인합니다. 또 표준 대비 점검 업무의 간소화를 위해, C-STAT에서는 결과를 제시할 때에 CWE에서 사용하고 있는 취약성 명칭을 사용하고 있습니다.  

C-STAT 상에서 이루어지는 모든 보안 점검은 철저하게 문서화되며, CWE 상의 해당 항목 정보, 그리고 MISRA 및 CERT 상의 대응 항목 정보가 제시됩니다. 또 전체 규칙에 대한 확인 뿐 아니라, 일부 규칙을 지정해 그에 대한 부합 여부도 확인할 수 있습니다. 

static_analysis_who_makes_the_rules.png

Out of bound인 행렬 문제에 대해 관련 CWE 항목과 CERT, MISRA 표준 내 대응 규칙을 제시하는 C-STAT 화면.  

C-STAT은 IDE 상에 완전히 통합되어 있으며, 정규 빌드 툴로 사용하기도 간편합니다. 복잡한 툴 설정을 할 필요가 없으며, 언어 지원 및 기타 전반적인 빌드 상의 문제점과 씨름할 필요도 없습니다. C-STAT은 약 250개의 고유 점검 항목을 지원하며, 이는 CERT 및 CWE 뿐 아니라 MISRA C:2012, MISRA C++:2008, MISRA C:2004 등 서로 다른 코딩 표준 및 규정집 상에 존재하는 약 600개의 규칙과 대응합니다. 

static_analysis_who_makes_the_rules_2.png

C-STAT 표준 점검 규정집은 CWE 및 CERT C/C++ 상에서 다루고 있는 수 백 가지 보안 취약점에 대응하는 항목을 포함하고 있습니다.  

C-STAT은 C 및 C++을 지원하며, 이는 IAR Embedded Workbench에서 적용되는 모든 언어 구조체를 포함합니다. 뿐만 아니라 빌드 툴 체인 상에서 활성화하여 코드의 하드웨어와 직접적으로 인터페이스를 구성하는 코드의 개발 과정을 단순화할 수도 있습니다. 통계 분석은 첨단 기술을 바탕으로 하여 단순 의심 항목에서부터 버퍼 오버플로우, 산술 및 전환 문제, 힙 관리 과정 중 발생하는 일시적 특성 등 문제가 확실한 항목에 이르기까지 코드 상의 패턴을 파악해 날 수 있습니다. 

모듈 간 분석으로 효과를 볼 수 있는 점검의 경우, C-STAT는 모듈의 경계를 넘어 정보를 전파하게 됩니다. 뿐만 아니라 C-STAT는 복수 파일 컴필레이션 모드에서도 실행이 가능하여, 전체 소스를 하나의 모듈로 취합해 분석할 수도 있습니다. 이는 일부 검사 과정 중 정확도를 높여줍니다.  

결론적으로, C-STAT 은 코드를 자유 자재로 제어할 수 있도록 해 주며, 개발 과정 중 코드의 품질을 높일 수 있도록 합니다. 코드 품질 검사 기능을 각각의 개발자가 일상 업무의 일환으로 수행함으로써 기업 차원에서는 조기에 문제점을 발굴하고 그로 인하여 프로젝트 일정은 물론 완제품에 발생할 수 있는 영향을 최소화 수 있는 것입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.