미국 사이버보안 및 인프라 보안국(CISA)은 172개의 주요 오픈소스 프로젝트를 조사하고 이러한 프로젝트들이 메모리 결함에 취약한지 여부를 조사한 연구 결과를 발표했습니다.
CISA, 연방수사국(FBI), 호주 기관(ASD, ACSC), 캐나다 기관(CCCS)의 공동 서명을 받은 이 보고서는 2023년 12월에 발표된 ‘메모리 안전 로드맵 사례’에 대한 후속 조치로, 메모리 안전 코드의 중요성에 대한 인식을 높이는 것을 목표로 합니다.
메모리 안전
메모리 안전 언어는 버퍼 오버플로, 사용 후 해제 및 기타 유형의 메모리 손상과 같은 일반적인 메모리 관련 오류를 방지하도록 설계된 프로그래밍 언어입니다.
프로그래머가 안전한 메모리 할당 및 할당 해제 메커니즘을 구현하는 것에 의존하는 대신, 자동으로 메모리를 관리하여 이를 달성합니다.
안전한 언어 시스템의 현대적인 예로는 Rust의 Borrow Checker가 있는데, 이는 데이터 경쟁을 제거합니다. Golang, Java, C#, Python과 같은 다른 언어는 가비지 수집을 통해 메모리를 관리하고, 해제된 메모리를 자동으로 회수하여 악용을 방지합니다.
메모리 안전하지 않은 언어는 내장된 메모리 관리 메커니즘을 제공하지 않아 개발자에게 이 책임을 지우고 오류 가능성을 높이는 언어입니다. 이러한 경우의 예로는 C, C++, Objective-C, Assembly, Cython, D가 있습니다.
널리 사용되는 오픈소스 코드는 안전하지 않습니다
이 보고서는 광범위하게 배포된 172개의 오픈소스 프로젝트를 조사한 연구 결과를 제시하며, 절반 이상이 메모리에 안전하지 않은 코드를 포함하고 있다는 사실을 발견했습니다.
보고서에 제시된 주요 결과는 다음과 같이 요약됩니다.
- 분석된 주요 오픈소스 프로젝트의 52%는 메모리 안전하지 않은 언어로 작성된 코드를 포함하고 있습니다.
- 이러한 프로젝트의 총 코드 줄(LoC) 중 55%는 메모리 안전하지 않은 언어로 작성되었습니다.
- 가장 큰 프로젝트는 메모리가 안전하지 않은 언어로 작성되는 경우가 많습니다.
- 전체 LoC 기준 가장 큰 10개 프로젝트 중 각 프로젝트는 메모리가 안전하지 않은 LoC 비율이 26%를 넘습니다.
- 이러한 대규모 프로젝트에서 메모리가 안전하지 않은 LoC의 중간 비율은 62.5%이며, 4개의 프로젝트가 94%를 초과했습니다.
- 메모리가 안전한 언어로 작성된 프로젝트조차도 메모리가 안전하지 않은 언어로 작성된 구성 요소에 의존하는 경우가 많습니다.
검토된 세트 중 주목할 만한 몇 가지 예로는 Linux(안전하지 않은 코드 비율 95%), Tor(안전하지 않은 코드 비율 93%), Chromium(안전하지 않은 비율 51%), MySQL Server(안전하지 않은 비율 84%), glibc(비율 85%), Redis(비율 85%), SystemD(65%), Electron(47%)이 있습니다.
CISA는 소프트웨어 개발자가 리소스 제약, 성능 요구 사항 등 메모리에 안전하지 않은 언어를 사용해야 하는 여러 가지 문제에 직면한다고 설명합니다.
이는 네트워킹, 암호화, 운영 체제 기능 등 저수준 기능을 구현할 때 특히 그렇습니다.
CISA는 보고서에서 “많은 중요한 오픈소스 프로젝트가 부분적으로 메모리 안전하지 않은 언어로 작성되었으며, 제한된 종속성 분석 결과 프로젝트가 종속성을 통해 메모리 안전하지 않은 언어로 작성된 코드를 상속받는 것으로 나타났습니다.”라고 설명합니다.
“성능과 리소스 제약이 중요한 요소인 경우, 메모리 안전하지 않은 언어가 계속 사용될 것으로 예상하고 있습니다.”
또한 해당 기관은 개발자들이 특정 요구 사항을 충족시키기 위해 실수로 또는 의도적으로 메모리 안전 기능을 비활성화하는 문제점을 강조하며, 이는 이론적으로 더 안전한 구성 요소를 사용하더라도 위험이 따른다는 점을 지적했습니다.
궁극적으로 CISA는 소프트웨어 개발자가 Rust, Java, GO와 같은 메모리 안전 언어로 새로운 코드를 작성하고 기존 프로젝트, 특히 중요한 구성 요소를 해당 언어로 전환할 것을 권장합니다.
또한 안전한 코딩 관행을 따르고, 종속성을 신중하게 관리하고 감사하며, 정적 분석, 동적 분석, 퍼즈 테스트를 포함한 지속적인 테스트를 수행하여 메모리 안전 문제를 탐지하고 해결하는 것이 좋습니다.