Offcanvas
Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.
Offcanvas
1111Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.
개발자 / 오픈소스

오픈소스 코드에 러시아 비판 코드 넣은 '프로테스트웨어', 생태계 신뢰 저해하는 이유

Lucian Constantin  | CSO 2022.03.22
npm 리포지토리에 호스팅된 자바스크립트 구성요소 개발자가 러시아의 우크라이나 침공을 비판하기 위해 사용자의 컴퓨터에 임의로 파일을 추가하거나 삭제하는 코드를 배포하는 사건이 발생했다. node-ipc라는 이 구성요소는 여러 다른 프로젝트의 종속 항목으로 사용된다. 관련 있는 각 프로젝트는 이 구성요소의 동작을 차단하기 위해 서둘러 업데이트를 배포했다.
 
Nodejs 커뮤니티에서 이런 종류의 사건은 올해 들어 벌써 두 번째 발생했다. 일부에서는 개발자 스스로 자신의 코드를 훼손하는 사보타주 행위를 가리켜 ‘프로테스트웨어(protestware)’로 지칭한다. 전문가들은 개발자가 자신의 소프트웨어를 수정할 권리가 있다 해도 이 같은 행동이 오픈소스 생태계의 신뢰를 손상시킬 수 있다고 지적한다. 오픈소스 생태계는 최근 몇 년 사이 공급망 보안 문제 심화로 이미 골머리를 앓고 있는 상황이다.
 
ⓒ TheDigitalArtist / Daniel Veilleneuve / Petmal / Getty Images
 

node-ipc에 일어난 일

node-ipc는 로컬 및 원격 프로세스 간 커뮤니케이션을 위한 nodejs 모듈이며 npm 리포지토리의 월간 다운로드 횟수는 400만 회 이상이다. Vue.js 자바스크립트 프레임워크 또는 유니티(Unity) 게임 엔진과 관련된 유니티 허브를 위한 명령줄 인터페이스(CLI) 등 인기 있는 구성요소를 포함해 350개가 넘는 다른 npm 구성요소의 종속 항목이기도 하다.
 
깃허브에서 RIAEvangelist라는 이름을 사용하는 node-ipc 개발자는 지난주 node-ipc 지원 버전을 대상으로 악성 코드를 추가하는 여러 개의 업데이트를 릴리즈했다. 이를 처음 발견한 개발자 타일러 레스크는(깃허브 사용자 이름 MidSpike) 3월 9일 node-ipc 버그 트래커에 문제를 보고했다. 레스크가 토론 쓰레드에 올린 댓글 중 몇 개는 RIAEvangelist에 의해 삭제됐고, 레스크는 별도의 리포지토리에 이 댓글을 정리해 올렸다.
 
보안 업체 스니크(Snyk)가 분석한 바에 따르면, 사건은 npm에 호스팅된 40개 이상 구성요소의 유지관리자인 RIAEvangelist가 3월 8일 peacenotwar라는 구성요소를 레지스트리에 게시한 것에서 시작했다. 이 구성요소는 사용자 바탕화면에 WITH-LOVE-FROM-AMERICA.txt라는 파일을 쓴다. 이 파일에는 우크라이나 전쟁에 대한 항의 메시지가 여러 언어로 포함돼 있다. 같은 날 개발자는 node-ipc에 11.0.0이라는 새 주 버전도 릴리즈했는데, 이 버전에는 peacenotwar가 종속 항목으로 추가됐다.
 
문제가 크게 불거진 시점은 3월 15일이다. RIAEvangelist는 모듈의 9.x 분기인 node-ipc 9.2.2도 릴리즈하면서 여기에도 peacenotwar를 종속 항목으로 추가했다. 9.x 분기는 안정화 버전으로 간주되어 사용량이 가장 많은 만큼 여러 프로젝트의 사용자가 시스템에 새 파일이 생긴 것을 인지하면서 문제에 주목하기 시작했다.
 

소프트웨어 공급망 악성코드의 징후

이후 node.ipc를 통한 RIAEvangelist의 사보타주 시도는 이번이 처음이 아니라는 사실이 드러났다. 타일러 레스크는 peacenotwar를 발견한 이후 과거의 코드 커밋을 조사했고 3월 7일, ssl-getspec.js라는 파일을 추가한 수상한 커밋을 발견했다. base64로 난독화된 코드가 포함된 이 파일은 실행되면 원격 지오로케이션 서비스에 연결해서 시스템의 IP 주소 위치가 러시아 또는 벨라루스인지를 테스트한다. 테스트 결과가 true인 경우 코드는 시스템 볼륨의 모든 파일을 하트 캐릭터로 덮어쓴다. 즉, 이 커밋은 러시아 및 벨라루스 사용자의 시스템을 사보타주하도록 만들어진 파괴적인 코드다.
 
스니크의 분석에 따르면 이 악성 코드는 3월 7일 changelog 또는 readme에 아무런 관련 언급 없이 node.ipc 버전 10.1.1에 추가됐다. 약 10시간 뒤에는 변경된 코드가 거의 없는 10.1.2라는 또 다른 버전이 릴리즈됐다. 연구원들에 따르면 이 두 번째 릴리즈는 자동 종속 항목 업그레이드를 트리거하려는 시도로 보인다. 약 5시간 후인 3월 8일, RIAEvangelist는 문제의 악성 코드를 제거한 버전 10.1.3을 릴리즈했다.
 

대응 방법과 오픈소스 공급망 신뢰 문제

현재 시점에서 버전 9.2.2, 10.1.1, 10.1.2는 npm 레지스트리에서 제거된 상태다. 버전 11.1.0은 남아 있는데, v11부터는 peacenotwar 종속 항목이 포함된다는 내용이 모듈 설명 페이지에 명시돼 있다.
 
RIAEvangelist는 node-ipc 버그 트래커에서 “이 코드의 동작은 문서화되어 있고, 하는 일도 파일이 이미 존재하는지 확인해서 없으면 그 파일 하나를 쓰는 것이 전부다. 이 코드가 포함되지 않은 버전으로 종속 항목을 잠그는 것은 각자의 자유다. 러시아의 우크라이나 침공이 3차 대전으로 발전해 모두가 뒤늦게 후회하든지, 전쟁이 끝나고 이 코드가 삭제되든지 둘 중 하나”라고 게시했다.
 
node-ipc에서 종속 항목을 안전한 버전으로 잠그거나 고정하는 것은 Vue.js 유지관리자들이 실제로 사용한 효과적인 방법이다. 또한 스니크는 npm 패키지 관리자의 “오버라이드” 기능을 사용해서 영향을 받는 모든 버전을 제외할 것을 권장한다. 단, 이 기능은 npm 버전 8 이상에서만 지원된다. 얀(Yarn) 패키지 관리자 역시 선택적 버전 결정을 지원한다.
 
npm 레지스트리를 운영하는 깃허브는 파일 덮어쓰기와 peacenotwar 문제, 두 가지 모두에 대한 보안 공지를 게시했다. 이 사고는 많은 의문으로 이어진다. 이 유지관리자를 앞으로 신뢰할 수 있는가? npm 또는 다른 리포지토리에 프로젝트를 게시하는 권한을 박탈해야 하는가? 이 같은 사보타주 행위에 더 많은 개발자가 동참하면 어떻게 될까? 지난 1월에는 컬러스(colors)와 페이커(faker)라는 두 개의 인기 모듈이 각 유지관리자에 의해 의도적인 사보타주 대상이 됐다. 앞으로 프로테스트웨어가 보편적인 문제로 발전할까?

스니크의 개발자 지원 책임자인 리란 탈은 “유지관리자인 RIAEvangelist의 의도적이고 위험한 행동을 정당한 항의 행위로 보는 시각도 일부 있지만, 그 유지관리자의 미래 평판과 개발자 커뮤니티의 이해관계에 미칠 영향을 생각해야 한다. 이 유지관리자가 앞으로 참여하는 프로젝트에서 이와 같은 또는 더 공격적인 행동을 하지 않을 것이라고 신뢰할 수 있을까?”라고 물었다.

공급망 보안 업체 소나타입(Sonatype)의 CTO 브라이언 폭스는 “신뢰의 문제로 보면 최선의 대처 방법은 적절한 소프트웨어 공급망 위생 절차를 두는 것이다. 어떤 오픈소스 프로젝트를 사용할 것인지를 선택할 때 유지관리자가 누구인지를 확인해야 한다”라고 말했다.
 
폭스는 아파치 재단과 같은 재단이 뒷받침하는 프로젝트의 코드만 선택할 것을 권한다. 이와 같은 프로젝트 중에는 개발자나 유지관리자가 한 명인 경우는 없기 때문이다. 재단이 관여하면 일정한 감독과 그룹 리뷰, 거버넌스가 이뤄지므로 이와 같은 유형의 오남용이 발생하면 퍼지기 전에 발견될 가능성이 높다.
 
폭스는 “단순히 기여되는 코드뿐만 아니라 종속 항목에도 마찬가지로 적용된다. 재단은 종속 항목에도 코드와 동일한 엄격한 기준을 사용하므로 문제로 확산될 가능성이 훨씬 더 낮다. 프로젝트를 선택할 때 유지관리자 위생을 고려하는 것이 중요한 이유”라고 말했다.
 
폭스에 따르면 소나타입은 개발자가 자신이 소유한 코드로 원하는 것을 할 수 있는 권리를 지지하지만, 리포지토리의 관리 주체로서(자바의 메이븐 센트럴) 악의적인 요소는 제거할 방침을 명확히 밝혔다. 폭스는 “우리는 개발자의 권리를 지지하지만 리포지토리는 본질적으로 악의적인 코드를 호스팅할 수 없다. 소나타입이 앞으로 RIAEvangelist의 코드를 호스팅하기는 어려울 것”이라고 말했다.
editor@itworld.co.kr 
 Tags 프로스트웨어 러시아 우크라이나 깃허브 자바스크립트
Sponsored

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2022 International Data Group. All rights reserved.