개발자들이 코딩을 할 때 처음부터 어떠한 오류나 보안 취약점이 발생하지 않게끔 코드를 작성하는 것은 어려운 일입니다. 하지만, 소프트웨어 취약점이 해결되지 않은 채로 배포된다면 심각한 보안 위협으로 이어질 수 있기 때문에 개발 단계에서 부터 철저한 관리가 필요한데요. CWE를 활용하면 개발자가 작성한 소스 코드를 안전하게 수정함으로써 취약점 발생을 사전에 방지할 수 있습니다. 이번 시간에는 CWE가 무엇인지와 함께 Java 보안 약점 예시와 조치 방안을 소개해 드리겠습니다.
1. CWE의 정의와 번호
CWE(Common Weakness Enumeration)는 소프트웨어의 보안 취약점을 체계적으로 정리한 목록으로 미국의 비영리 조직인 MITRE Corporation에서 주관하고 관리합니다. MITRE는 공공 부문 및 민간 부문과 협력하여 보안 및 사이버 위협 대응을 위한 다양한 프로젝트를 운영하고 있으며, CWE는 이러한 프로젝트 중 하나인데요. MITRE는 CWE를 통해 소프트웨어와 하드웨어의 보안 취약점을 체계적으로 분류하고 목록화하여, 보안 전문가들이 취약점을 식별하고 완화하는 데 도움을 주고 있습니다. MITRE는 지속적으로 CWE를 업데이트하고 있으며 현재 시점에서의 가장 최신 버전은 2024년 2월 29일에 공개된 4.14 입니다. 최신 버전이 궁금하신 분들을 위해 MITRE가 제공하는 페이지를 링크로 첨부하오니 함께 읽어보시면 좋을 것 같습니다. (페이지 바로가기)
최근 보안 업계의 화두인 SW 공급망 공격을 비롯한 각종 사이버 위협은 취약점을 악용해 발생하게 되는데요. CWE로 관리되고 있는 보안 약점은 취약점으로 이어질 수 있으므로 빠른 조치가 필요합니다. CWE는 각 보안 약점들에 대해서 VIEW ID인 번호를 부여하고 해당 약점에 대한 상세한 설명과 발생가능한 개발 환경, 발생 가능한 문제점과 예제 코드 등을 제공하고 있습니다. 또한, 더 나아가 번호를 부여한 다양한 약점을 프로그래밍 언어 혹은 특정 기준으로 그룹핑해 또다른 하나의 CWE 번호를 부여함으로써 보안 약점을 목록화해 제공하고 있습니다.
| CWE View ID 예시 | |
|---|---|
| C로 작성된 SW 약점 | CWE-658 |
| C++로 작성된 SW 약점 | CWE-659 |
| Java로 작성된 SW 약점 | CWE-660 |
| 소프트웨어 개발 관련 약점 | CWE-699 |
| 잘못된 코딩 습관과 관련된 약점 | CWE-1006 |
2. CWE-660: Java 언어의 보안 약점

Java로 작성된 소프트웨어 약점은 VIEW ID 660으로 관리되며, 위와 같이 홈페이지에 접속해 660을 검색하면 Java 언어로 작성된 소프트웨어에서 발생할 수 있는 보안 약점들을 한눈에 조회할 수 있습니다. Java에서 발생 가능한 취약점과 함께 어떻게 조치를 취하면 되는지 설명해드리겠습니다.
✔️신뢰할 수 없는 데이터의 역직렬화
Java의 직렬화 기능은 객체를 바이트 스트림으로 변환하여 파일, 데이터베이스, 네트워크를 통해 전송할 수 있도록 합니다. 이 바이트 스트림을 역직렬화하면 원래의 객체로 복원할 수 있는데요. 이 취약점은 공격자가 악의적으로 조작된 직렬화 데이터를 애플리케이션에 전송할 경우, 그 데이터가 역직렬화 과정 중에 애플리케이션을 공격하는 코드를 실행할 수 있도록 만듭니다.
이와 같은 취약점을 방지하기 위해서는 역직렬화 되는 객체의 유효성을 검증하고, 허용된 클래스만 역직렬화 하도록 화이트리스트를 준비하는 것이 좋습니다. 혹은 특정 버전 이상의 자바에서 제공하는 필터 기능을 사용하여 특정 클래스의 역직렬화를 허용하거나 차단하는 것도 좋은 방법입니다.
✔️민감한 정보가 포함된 오류 메시지 생성
민감한 정보가 포함된 오류 메시지 생성 취약점은 소프트웨어 시스템이나 애플리케이션이 실패 또는 예외 상황에서 민감한 정보(예: 시스템 파일 경로, 데이터베이스 쿼리, 비밀 키 등)를 포함한 오류 메시지를 사용자에게 보여주는 경우에 발생합니다. 이 취약점은 실제로 공격에 사용될 수 있는 꽤 중요한 정보들을 노출한 사례가 많은데요. 데이터베이스의 테이블 이름, 중요 시스템 파일의 위치, 서버 구성 세부 정보 등 공격자에게 시스템의 내부 구조나 상태에 대한 단서를 제공할 수 있으며, 이를 통해 공격자는 추가적인 공격을 시도할 수 있는 정보를 얻을 수 있습니다.
따라서 명확한 오류 처리 정책을 수립하여 외부로 출력하는 내용에 민감한 정보가 포함되지 않도록 할 필요가 있습니다. 또한, 예외 처리를 철저히 하여 예외 발생 시 표준 오류 메시지를 사용하고, 예외 로그는 안전한 위치에 저장하도록 합니다.
스패로우는 소스코드 보안약점 점검 도구인 Sparrow SAST를 통해 CWE-660을 지원하고 있습니다. Java로 소프트웨어를 개발 중이라면 Sparrow SAST로 개발보안을 적용하고 보안 약점을 사전에 진단해, 보다 안전하게 소프트웨어를 개발하세요!
