[보안뉴스 문가용 기자] 기업이 NPM 리포지터리에 호스팅한 비공개 소프트웨어 패키지를 공략하는 방법이 보안 업체 아쿠아시큐리티(Aqua Security)에 의해 개발됐다. 실제로 존재하는 비공개 소프트웨어 패키지의 이름을 알아낸 후, 똑같은 이름으로 공개 패키지를 악성으로 만들어 원래의 비공개 소프트웨어 패키지를 이용하는 사람들 중 누군가 실수로 악성 패키지를 다운로드 받게 만드는 것이라고 한다. 코드 디펜던시를 혼동시키는 것이다.
[이미지 = utoimage]
보통 회사에서 내부 개발을 진행할 때는 비공개 리포지터리를 NPM과 같은 플랫폼들에 마련하고, 그 리포지터리에 내부적으로 신뢰할 수 있는 코드들을 두고 활용한다. 그렇게 함으로써 외부인이 소프트웨어를 구성하는 코드 요소들을 건드리지 못하게 하고, 따라서 공급망 공격의 가능성을 최소화 하는 것이다. 공급망 공격을 하려고 하는 해커들에게 있어 이런 비공개 리포지터리들은 꽤나 가치가 높은 표적이 될 수밖에 없다.
지난 해 보안 전문가 알렉스 버산(Alex Birsan)은 ‘코드 디펜던시 혼동 공격(code dependency confusion attack)’이라는 개념을 만들어냈다. 당시 아마존, 리프트, 슬랙, 질로우와 같은 회사들의 내부 프로그램 개발 프로젝트에 사용되는 비공개 패키지들과 똑같은 패키지를 가짜로 만들고, 이를 회사 내부로 유입시키는 데 성공했었다. 실험이었기에 가짜 패키지에는 악성 요소가 없었다. 하지만 아무리 비공개로 리포지터리를 관리하더라도 외부 패키지를 내부로 집어넣을 방법이 완전히 사라지는 건 아니라는 게 공개됐었다. 공격 난이도가 높지도 않고, 시간이 오래 걸리지도 않았다.
이런 류의 공격으로부터 안전해지려면 내부적으로만 사용하는 패키지의 이름을 외부로 유출시키지 않아야 한다. 그래야 비슷한 이름에 속는 일이 없어진다. 아쿠아시큐리티가 이번에 발견한 방법은, 그 비밀스러운 정보인 패키지 이름을 억지로 알아내고, 그것을 활용하여 코드 디펜던시 혼동 공격을 이어가는 것이라고 말할 수 있다. 아쿠아시큐리티가 이렇게 할 수 있는 건 NPM 레지스트리 API의 취약점 때문이다.
새로운 유형의 타이밍 공격
NPM의 API는 사용자들이 특정 패키지가 존재하는지 확인하고 다운로드 할 수 있게 해 주는 기능을 가지고 있다. 패키지에 대한 정보를 얻어갈 때도 이 API를 활용하는 게 가능하다. 그런데 사용자가 비공개 처리된 패키지를 검색하거나 아예 존재하지 않는 패키지를 검색하면, 404 HTTP 오류 메시지가 나타난다. 다만 비공개 패키지에 대한 오류가 출력되는 시간과, 존재하지 않는 패키지에 대한 오류가 출력되는 시간에 차이가 있다고 한다.
“비공개 패키지에 대한 오류 메시지일 경우 평균 648밀리세컨드가 걸렸습니다. 존재하지 않는 패키지의 경우 101 밀리세컨드가 걸렸습니다.” 아쿠아 측의 설명이다. “만약 공격자가 패키지를 다섯 번 정도 연속으로 검색하고, 404 오류 메시지가 뜨는 시간을 측정하면 높은 확률로 자신이 요청한 패키지가 존재하는지 하지 않는지 확인할 수 있게 됩니다.” 잘만 맞춘다면 패키지 비공개로 존재하는 패키지의 존재를 알아낼 수 있는 것이다.
아쿠아시큐리티의 전문가는 비공개 패키지 이름을 어느 정도 조합할 수 있는 방법들이 공격자들 사이에 알려져 있다고 설명한다. 즉 아쿠아 측이 제시한 공격 방법이 이론상으로만 존재 가능한 것이 아니라는 뜻이다. 패키지 이름 추측의 방법에는 대표적으로 다음 두 가지가 있다.
1) 공격 대상이 되는 조직 내에서 통용되는 이름 짓기 패턴을 파악하고, 이를 기반으로 사전 공격을 실시해 패키지 이름을 추측한다.
2) 라이브러리 등 온라인을 통해 공개된 데이터셋을 활용해 공공 패키지들 중 삭제된 것들이 무엇이 있는지 확인한다. 공공 패키지였다가 비공개로 전환되면서 삭제된 것들이 존재하는 게 가능하다.
아쿠아시큐리티는 이러한 공격 기법을 정리해 깃허브의 버그바운티 프로그램에 제출했다. 그리고 깃허브로부터 다음과 같은 응답을 받았다. “아키텍처 자체의 제한이 있기 때문에 NPM 내에 특정 비공개 패키지가 존재한다는 걸 제3자가 확인하는 것까지 막을 수 없습니다.” 공격의 가능성이 충분하지만 실제적인 방어책이 존재할 수 없는 공격 기법이라고 판단했다는 뜻이다.
기업들은 그러면 속수무책으로 당해야 할까? 아쿠아시큐리티는 “공공 패키지들을 주기적으로 검사해 내부 패키지와 이름이 비슷한 것들이 존재하는지, 있다면 언제부터 등록되어 있었는지 파악해야 한다”고 말한다. “의심가는 패키지들을 추려내고, 분석을 통해 악성 요소가 존재하는지를 파악하는 작업을 이뤄내야 합니다.”
3줄 요약
1. 소프트웨어 개발 프로젝트에 사용되는 비공개 리포지터리와 패키지, 이름을 알아낼 수 있음.
2. 이름을 알아내면 똑같은 이름으로 공공 리포지터리 만들어 악성 패키지 삽입함.
3. 그러면 누군가 착각해서 악성 패키지를 다운로드 받아 사용함.
[국제부 문가용 기자(globoan@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>