2021.07.29

'사례로 본' 코드 재사용이 여전히 보안 악몽인 이유

Lucian Constantin | CSO
오늘날 소프트웨어 애플리케이션은 공개 리포지토리에서 가져온 수천 가지 서드파티 구성 요소를 엮어서 만든다. 이런 코드 재사용은 소프트웨어 업계 관점에서 큰 혜택으로, 개발 시간과 비용을 줄여주고 개발자가 더 빠르게 기능을 추가할 수 있다. 그러나 추적하기 어려운 복잡한 종속성 체계로 인해 중대한 취약점 관리 문제를 야기하기도 한다.

서드파티 코드에서 상속된 취약점이 애플리케이션으로 스며드는 문제는 오래전부터 있었지만 정부의 지원을 받는 소프트웨어 공급망 공격이 일어나는 지금은 그 문제가 전보다 더 심각하다. 소프트웨어 구성 분석 툴을 사용하면 일부 위험을 찾는 데 도움이 되지만 포착하기 어려운 종속성의 사각지대는 여전히 존재하고, 보안에 신경 쓰는 개발자라 해도 상속된 결함을 모두 잡아내기는 어렵다.

실제로 최근 리버싱랩스(ReversingLabs)의 보안 연구원이 뉴겟(NuGet) 리포지토리에서 zlib라는 인기 있는 라이브러리의 오래되고 취약한 버전을 사용하는 패키지를 50,000개 발견했는데, 그중 상당수에는 zlib 종속성이 명기되지 않았다.
 

혼돈의 '종속성 추적'

개발자가 모든 취약점을 찾아내려면 자신의 애플리케이션에서 사용하는 구성요소뿐만 아니라 그 구성요소의 기반인 서드파티 라이브러리와 패키지까지 추적해야 한다. 문제는 이 종속성 체인이 상당히 많은 층을 이루는 경우다.

2019년 다름슈타트(Darmstadt) 대학 연구원이 npm 리포지토리를 분석한 결과 평균적으로 자바스크립트 패키지 하나를 가져올 때마다 39개 메인테이너(maintainer)의 79개 패키지에 대한 암묵적 신뢰가 형성되는 것으로 나타났다. 또한, 연구진은 패키지의 약 40%가 알려진 취약점이 하나 이상인 코드에 의존한다는 사실도 밝혀냈다.

더구나 한 리포지토리의 패키지와 관련된 종속성은 패키지 리포지토리와 각각의 패키지 관리 툴에서만 추적할 수 있다. 반면 서드파티 코드가 프로젝트에 유입되는 경로는 이게 전부가 아니다. 실제로 일부 개발자는 정적으로 라이브러리를 연결하거나 패키지 리포지토리 외부의 다른 프로젝트에서 가져온 코드를 수동으로 컴파일하는데, 이 정보는 자동 스캔 툴로는 찾기가 쉽지 않다.

리버싱랩스는 오래되고 취약한 버전의 7Zip, WinSCP, PuTTYgen을 번들로 포함한 탓에 활발하게 악용되는 취약점을 가진 뉴겟 패키지를 50개 이상 발견했다. 이 3가지는 널리 사용되는 압축 또는 네트워크 연결 프로그램으로 뉴겟에 직접 호스팅되지는 않지만 다른 개발자가 만든 래퍼 패키지가 뉴겟에 존재할 수 있다.

뉴겟은 닷넷 프로그래밍 언어의 주 리포지토리이며 여기 호스팅되는 구성요소의 대다수가 .nupkg 확장자의 ZIP 아카이브로 제공되고 다른 소프트웨어 프로젝트로 가져오는 용도로 사전 컴파일된 윈도우 .DLL 라이브러리를 포함한다.

리버싱랩스가 발견한 취약한 뉴겟 패키지인 WinSCPHelper는 WinSCP의 래퍼 라이브러리다. 이 라이브러리를 통합하는 애플리케이션이 SFTP 프로토콜을 통해 원격 서버의 파일을 관리할 수 있게 해주는 기능을 한다.

WinSCPHelper는 2017년 이후 뉴겟에서 업데이트되지 않았지만 마지막 버전은 총 3만 4,000회 이상 다운로드됐고 지난 6주 동안에도 700여 번 다운로드됐다. 최신 WinSCP 버전은 5.17.10이며 치명적인 원격 코드 실행 취약점에 대한 패치를 포함하지만, WinSCPHelper에 번들로 포함된 버전은 이보다 훨씬 더 오래된 5.11.2다.

연구진은 “이 사례에서 분석된 패키지는 WinSCP를 사용한다는 점을 명시했지만 종속성 목록에서 버전을 공개하지는 않았으며 어느 취약점이 기반 종속성에 영향을 미치는지 쉽게 확인할 방법도 없다. 수동으로도 가능하지만 번거로운 작업이 필요하다”라고 말했다.
 

조용한 취약점 찾기

그러나 종속성 찾기는 이보다 더 어려울 수도 있다. 1995년에 처음 만들어진 이후 가장 광범위하게 사용되는 오픈소스 데이터 압축 라이브러리 중 하나인 zlib의 사례를 보자. 사실상의 표준으로 자리 잡은 이 라이브러리는 소스 코드로 제공된다. 즉, 개발자가 직접 소스 코드를 컴파일해 프로젝트에 정적으로 연결하는 경우가 일반적인데, 워낙 흔하다 보니 이를 명확히 언급하지 않는 경우가 많다.

리버싱랩스는 정적 파일 분석을 통해 2013년에 등장한, 심각도 수준이 높거나 치명적인 취약점 4개가 포함된 zlib 버전 1.2.8을 사용하는 뉴겟 패키지를 5만 개 이상 발견했다. 파악된 패키지 중 일부는 종속성으로 명시되지 않은 다른 서드파티 구성요소를 통해 이 오래된 zlib 버전과 해당 취약점을 상속했다. 연구진은 이러한 경우를 ‘조용한 취약점’으로 분류했다.

리버싱랩스가 제공한 예로, DICOM(Digital Imaging and Communications in Medicine) 프로토콜을 구현하는 DicomObjects라는 뉴겟 패키지가 있다. DICOM은 의료 영상 데이터를 전송하고 관리하는 데 사용되는 표준이다. 병원에서 폭넓게 사용되며 의료 스캐너, 프린터, 서버, 워크스테이션과 같은 많은 영상 디바이스가 이를 지원한다.

의료 소프트웨어 개발자가 DICOM 솔루션을 손쉽게 구축하는 데 사용하는 DicomObjects의 다운로드 횟수는 약 5만 4,000회이며 유지관리는 영국에 소재한 메디컬 커넥션스(Medical Connections)라는 회사가 맡고 있다.

이 패키지는 Microsoft.AspNet.WebApi.Client, Newtonsoft.Json, System.Net.Http를 종속성으로 명시하지만 리버싱랩스에 따르면, 별도 고지 없이 ceTe.DynamicPDF.Viewer.40.x86.dll이라는 상용 PDF 라이브러리도 포함한다. DynamicPDF Viewer는 뉴겟에 별도의 패키지로 분류되어 있으나 DicomObjects에 번들링된 버전은 zlib 1.2.8을 포함한 훨씬 더 오래된 버전이다.

연구진은 “이것은 가장 흔한 소프트웨어 유지관리 문제 중 하나다. 개발자가 소프트웨어 패키지를 만들면서 서드파티 소프트웨어를 사용하지만 이후 업데이트에서 종속성을 간과하는 경우다. 이 사례에서는 DicomObjects 패키지가 DynamicPDF.Viewer에 의존한다는 점이 어디에도 명시되지 않았으므로 더 심각하다. DynamicPDF.Viewer가 취약한 zlib 라이브러리에 의존한다는 것을 알 방도가 없다. 이런 방식으로 숨겨진 종속성을 있을 경우 여러 수준의 조용한 취약점으로 이어지고 소프트웨어 유지관리와 감사가 훨씬 더 어렵게 된다”라고 지적했다. 메디컬 커넥션스는 이와 관련한 취재에 응하지 않았다.

또 다른 예는 아파치 카프카 프로토콜을 구현하는 C 라이브러리인 librdkafka.redist라는 매우 인기 있는 패키지다. 아파치 카프카는 실시간 데이터 피드를 처리하기 위한 오픈소스 고성능 스트림 프로세싱 프레임워크다. librdkafka.redist 패키지 다운로드 횟수는 1,890만 회이며 그중에서 2개월 전에 나온 최신 버전인 1.7.0 다운로드에 해당하는 횟수는 31만 2,000건이다. 이 버전의 librdkafka.redist는 zlib 1.2.8을 사용하지만 뉴겟 또는 깃허브의 프로젝트 종속성 목록에는 이러한 사실이 명시되어 있지 않다.

이 문제는 1년여 전에 깃허브의 패키지 버그 트래커에 보고됐으며 현재 버전 1.8.0에서 수정되는 것으로 표시돼 있다. 프로젝트 수석 개발자인 마그누스 에덴힐은 4개의 zlib 취약점을 검토하고 이 중에서 librdkafka에 적용되는 것은 2개이며 카프카가 사용하는 메시지를 통해 이를 성공적으로 악용할 위험은 매우 낮은 것으로 보인다고 밝혔으나 논평 요구에는 응하지 않았다.

13개의 다른 뉴겟 패키지가 librdkafka.redist에 의존하며 이 중 일부는 대형 엔터프라이즈 고객이 많은 데이터 인프라 기업인 컨플루언트(Confluent)가 개발한 것이다.

리버싱랩스 연구진은 “안전한 소프트웨어 개발은 여러 개발 단계에 걸쳐 많은 참가자가 관여하는 복잡한 문제다. 회사가 생산하는 소프트웨어의 유형이 무엇이든 서드파티 종속성을 솔루션에 포함해야 하는 시점이 오고 보안과 코드 품질 위험을 관리해야 할 필요성이 발생한다. 소프트웨어 공급망 체인 공격은 사이버 커뮤니티에서 계속 커지는 위협이다. 전통적인 침해의 DDoS와 유사하다”라고 설명했다.
 

공급망 위험

취약한 종속성 문제가 존재하는 패키지 리포지토리는 뉴겟 외에도 더 있다. 생각하기에 따라 뉴겟이나 다른 리포지토리가 개발자에게 이러한 문제에 더 주의를 기울이도록 강제할 수 없다고 볼 수도 있다.

그러나 일부 플랫폼은 선제적으로 대응하고 있다. 깃허브는 자체 플랫폼에 호스팅되는 공개 코드 리포지토리를 적극적으로 검사하고 종속성을 분석하고 이러한 종속성에 알려진 취약점이 있으면 소유자에게 알린다. 깃허브는 npm(자바스크립트), 루비젬스(루비), 뉴겟(닷넷), pip(파이썬), 메이븐(자바)의 알려진 취약점이 포함된 공개 참조 데이터베이스를 운영하며 최근 고(Go) 모듈 지원을 발표했다.

오픈소스 거버넌스 기업 소나타입(Sonatype)이 2020년 발간한 소프트웨어 공급망 보고서를 보면, 해커가 종속성 체인의 상위에 있는 프로젝트와 애플리케이션을 감염시키기 위해 오픈소스 소프트웨어 프로젝트에 적극적으로 악성코드를 주입하는 차세대 공격의 횟수가 전년 대비 430% 증가했다.

해커가 오픈소스 구성요소의 알려진 취약점을 이용하는 전통적인 공격도 계속 강세지만, 공격자가 새로 발견된 취약점을 공개 후 며칠 이내에 악용하기까지 소요되는 시간이 단축됐다. 그러나 기업의 절반은 이와 같은 결함을 인지하기까지 일주일 이상 걸리며 이후 대응책을 마련하기까지 다시 일주일 이상이 걸리는 것으로 나타났다.

결국 공격자는 소프트웨어 공급망 악용에 뚜렷한 관심을 보이고 있다. 이런 가운데 상속된 취약점을 가진 수많은 소프트웨어가 여전히 공개 리포지토리에 존재하면서 엔터프라이즈 소프트웨어의 기반으로 사용되는 실정이다. editor@itworld.co.kr


2021.07.29

'사례로 본' 코드 재사용이 여전히 보안 악몽인 이유

Lucian Constantin | CSO
오늘날 소프트웨어 애플리케이션은 공개 리포지토리에서 가져온 수천 가지 서드파티 구성 요소를 엮어서 만든다. 이런 코드 재사용은 소프트웨어 업계 관점에서 큰 혜택으로, 개발 시간과 비용을 줄여주고 개발자가 더 빠르게 기능을 추가할 수 있다. 그러나 추적하기 어려운 복잡한 종속성 체계로 인해 중대한 취약점 관리 문제를 야기하기도 한다.

서드파티 코드에서 상속된 취약점이 애플리케이션으로 스며드는 문제는 오래전부터 있었지만 정부의 지원을 받는 소프트웨어 공급망 공격이 일어나는 지금은 그 문제가 전보다 더 심각하다. 소프트웨어 구성 분석 툴을 사용하면 일부 위험을 찾는 데 도움이 되지만 포착하기 어려운 종속성의 사각지대는 여전히 존재하고, 보안에 신경 쓰는 개발자라 해도 상속된 결함을 모두 잡아내기는 어렵다.

실제로 최근 리버싱랩스(ReversingLabs)의 보안 연구원이 뉴겟(NuGet) 리포지토리에서 zlib라는 인기 있는 라이브러리의 오래되고 취약한 버전을 사용하는 패키지를 50,000개 발견했는데, 그중 상당수에는 zlib 종속성이 명기되지 않았다.
 

혼돈의 '종속성 추적'

개발자가 모든 취약점을 찾아내려면 자신의 애플리케이션에서 사용하는 구성요소뿐만 아니라 그 구성요소의 기반인 서드파티 라이브러리와 패키지까지 추적해야 한다. 문제는 이 종속성 체인이 상당히 많은 층을 이루는 경우다.

2019년 다름슈타트(Darmstadt) 대학 연구원이 npm 리포지토리를 분석한 결과 평균적으로 자바스크립트 패키지 하나를 가져올 때마다 39개 메인테이너(maintainer)의 79개 패키지에 대한 암묵적 신뢰가 형성되는 것으로 나타났다. 또한, 연구진은 패키지의 약 40%가 알려진 취약점이 하나 이상인 코드에 의존한다는 사실도 밝혀냈다.

더구나 한 리포지토리의 패키지와 관련된 종속성은 패키지 리포지토리와 각각의 패키지 관리 툴에서만 추적할 수 있다. 반면 서드파티 코드가 프로젝트에 유입되는 경로는 이게 전부가 아니다. 실제로 일부 개발자는 정적으로 라이브러리를 연결하거나 패키지 리포지토리 외부의 다른 프로젝트에서 가져온 코드를 수동으로 컴파일하는데, 이 정보는 자동 스캔 툴로는 찾기가 쉽지 않다.

리버싱랩스는 오래되고 취약한 버전의 7Zip, WinSCP, PuTTYgen을 번들로 포함한 탓에 활발하게 악용되는 취약점을 가진 뉴겟 패키지를 50개 이상 발견했다. 이 3가지는 널리 사용되는 압축 또는 네트워크 연결 프로그램으로 뉴겟에 직접 호스팅되지는 않지만 다른 개발자가 만든 래퍼 패키지가 뉴겟에 존재할 수 있다.

뉴겟은 닷넷 프로그래밍 언어의 주 리포지토리이며 여기 호스팅되는 구성요소의 대다수가 .nupkg 확장자의 ZIP 아카이브로 제공되고 다른 소프트웨어 프로젝트로 가져오는 용도로 사전 컴파일된 윈도우 .DLL 라이브러리를 포함한다.

리버싱랩스가 발견한 취약한 뉴겟 패키지인 WinSCPHelper는 WinSCP의 래퍼 라이브러리다. 이 라이브러리를 통합하는 애플리케이션이 SFTP 프로토콜을 통해 원격 서버의 파일을 관리할 수 있게 해주는 기능을 한다.

WinSCPHelper는 2017년 이후 뉴겟에서 업데이트되지 않았지만 마지막 버전은 총 3만 4,000회 이상 다운로드됐고 지난 6주 동안에도 700여 번 다운로드됐다. 최신 WinSCP 버전은 5.17.10이며 치명적인 원격 코드 실행 취약점에 대한 패치를 포함하지만, WinSCPHelper에 번들로 포함된 버전은 이보다 훨씬 더 오래된 5.11.2다.

연구진은 “이 사례에서 분석된 패키지는 WinSCP를 사용한다는 점을 명시했지만 종속성 목록에서 버전을 공개하지는 않았으며 어느 취약점이 기반 종속성에 영향을 미치는지 쉽게 확인할 방법도 없다. 수동으로도 가능하지만 번거로운 작업이 필요하다”라고 말했다.
 

조용한 취약점 찾기

그러나 종속성 찾기는 이보다 더 어려울 수도 있다. 1995년에 처음 만들어진 이후 가장 광범위하게 사용되는 오픈소스 데이터 압축 라이브러리 중 하나인 zlib의 사례를 보자. 사실상의 표준으로 자리 잡은 이 라이브러리는 소스 코드로 제공된다. 즉, 개발자가 직접 소스 코드를 컴파일해 프로젝트에 정적으로 연결하는 경우가 일반적인데, 워낙 흔하다 보니 이를 명확히 언급하지 않는 경우가 많다.

리버싱랩스는 정적 파일 분석을 통해 2013년에 등장한, 심각도 수준이 높거나 치명적인 취약점 4개가 포함된 zlib 버전 1.2.8을 사용하는 뉴겟 패키지를 5만 개 이상 발견했다. 파악된 패키지 중 일부는 종속성으로 명시되지 않은 다른 서드파티 구성요소를 통해 이 오래된 zlib 버전과 해당 취약점을 상속했다. 연구진은 이러한 경우를 ‘조용한 취약점’으로 분류했다.

리버싱랩스가 제공한 예로, DICOM(Digital Imaging and Communications in Medicine) 프로토콜을 구현하는 DicomObjects라는 뉴겟 패키지가 있다. DICOM은 의료 영상 데이터를 전송하고 관리하는 데 사용되는 표준이다. 병원에서 폭넓게 사용되며 의료 스캐너, 프린터, 서버, 워크스테이션과 같은 많은 영상 디바이스가 이를 지원한다.

의료 소프트웨어 개발자가 DICOM 솔루션을 손쉽게 구축하는 데 사용하는 DicomObjects의 다운로드 횟수는 약 5만 4,000회이며 유지관리는 영국에 소재한 메디컬 커넥션스(Medical Connections)라는 회사가 맡고 있다.

이 패키지는 Microsoft.AspNet.WebApi.Client, Newtonsoft.Json, System.Net.Http를 종속성으로 명시하지만 리버싱랩스에 따르면, 별도 고지 없이 ceTe.DynamicPDF.Viewer.40.x86.dll이라는 상용 PDF 라이브러리도 포함한다. DynamicPDF Viewer는 뉴겟에 별도의 패키지로 분류되어 있으나 DicomObjects에 번들링된 버전은 zlib 1.2.8을 포함한 훨씬 더 오래된 버전이다.

연구진은 “이것은 가장 흔한 소프트웨어 유지관리 문제 중 하나다. 개발자가 소프트웨어 패키지를 만들면서 서드파티 소프트웨어를 사용하지만 이후 업데이트에서 종속성을 간과하는 경우다. 이 사례에서는 DicomObjects 패키지가 DynamicPDF.Viewer에 의존한다는 점이 어디에도 명시되지 않았으므로 더 심각하다. DynamicPDF.Viewer가 취약한 zlib 라이브러리에 의존한다는 것을 알 방도가 없다. 이런 방식으로 숨겨진 종속성을 있을 경우 여러 수준의 조용한 취약점으로 이어지고 소프트웨어 유지관리와 감사가 훨씬 더 어렵게 된다”라고 지적했다. 메디컬 커넥션스는 이와 관련한 취재에 응하지 않았다.

또 다른 예는 아파치 카프카 프로토콜을 구현하는 C 라이브러리인 librdkafka.redist라는 매우 인기 있는 패키지다. 아파치 카프카는 실시간 데이터 피드를 처리하기 위한 오픈소스 고성능 스트림 프로세싱 프레임워크다. librdkafka.redist 패키지 다운로드 횟수는 1,890만 회이며 그중에서 2개월 전에 나온 최신 버전인 1.7.0 다운로드에 해당하는 횟수는 31만 2,000건이다. 이 버전의 librdkafka.redist는 zlib 1.2.8을 사용하지만 뉴겟 또는 깃허브의 프로젝트 종속성 목록에는 이러한 사실이 명시되어 있지 않다.

이 문제는 1년여 전에 깃허브의 패키지 버그 트래커에 보고됐으며 현재 버전 1.8.0에서 수정되는 것으로 표시돼 있다. 프로젝트 수석 개발자인 마그누스 에덴힐은 4개의 zlib 취약점을 검토하고 이 중에서 librdkafka에 적용되는 것은 2개이며 카프카가 사용하는 메시지를 통해 이를 성공적으로 악용할 위험은 매우 낮은 것으로 보인다고 밝혔으나 논평 요구에는 응하지 않았다.

13개의 다른 뉴겟 패키지가 librdkafka.redist에 의존하며 이 중 일부는 대형 엔터프라이즈 고객이 많은 데이터 인프라 기업인 컨플루언트(Confluent)가 개발한 것이다.

리버싱랩스 연구진은 “안전한 소프트웨어 개발은 여러 개발 단계에 걸쳐 많은 참가자가 관여하는 복잡한 문제다. 회사가 생산하는 소프트웨어의 유형이 무엇이든 서드파티 종속성을 솔루션에 포함해야 하는 시점이 오고 보안과 코드 품질 위험을 관리해야 할 필요성이 발생한다. 소프트웨어 공급망 체인 공격은 사이버 커뮤니티에서 계속 커지는 위협이다. 전통적인 침해의 DDoS와 유사하다”라고 설명했다.
 

공급망 위험

취약한 종속성 문제가 존재하는 패키지 리포지토리는 뉴겟 외에도 더 있다. 생각하기에 따라 뉴겟이나 다른 리포지토리가 개발자에게 이러한 문제에 더 주의를 기울이도록 강제할 수 없다고 볼 수도 있다.

그러나 일부 플랫폼은 선제적으로 대응하고 있다. 깃허브는 자체 플랫폼에 호스팅되는 공개 코드 리포지토리를 적극적으로 검사하고 종속성을 분석하고 이러한 종속성에 알려진 취약점이 있으면 소유자에게 알린다. 깃허브는 npm(자바스크립트), 루비젬스(루비), 뉴겟(닷넷), pip(파이썬), 메이븐(자바)의 알려진 취약점이 포함된 공개 참조 데이터베이스를 운영하며 최근 고(Go) 모듈 지원을 발표했다.

오픈소스 거버넌스 기업 소나타입(Sonatype)이 2020년 발간한 소프트웨어 공급망 보고서를 보면, 해커가 종속성 체인의 상위에 있는 프로젝트와 애플리케이션을 감염시키기 위해 오픈소스 소프트웨어 프로젝트에 적극적으로 악성코드를 주입하는 차세대 공격의 횟수가 전년 대비 430% 증가했다.

해커가 오픈소스 구성요소의 알려진 취약점을 이용하는 전통적인 공격도 계속 강세지만, 공격자가 새로 발견된 취약점을 공개 후 며칠 이내에 악용하기까지 소요되는 시간이 단축됐다. 그러나 기업의 절반은 이와 같은 결함을 인지하기까지 일주일 이상 걸리며 이후 대응책을 마련하기까지 다시 일주일 이상이 걸리는 것으로 나타났다.

결국 공격자는 소프트웨어 공급망 악용에 뚜렷한 관심을 보이고 있다. 이런 가운데 상속된 취약점을 가진 수많은 소프트웨어가 여전히 공개 리포지토리에 존재하면서 엔터프라이즈 소프트웨어의 기반으로 사용되는 실정이다. editor@itworld.co.kr


X