LavaMoat를 활용한 소프트웨어 공급망 보안 해결

LavaMoat는 소프트웨어 공급망 위험을 완화하기 위한 JavaScript 앱용 보안 도구 모음입니다.

3분 읽기
LavaMoat를 활용한 소프트웨어 공급망 보안 해결

LavaMoat는 공급망 보안을 우려하는 모든 JavaScript 개발팀을 위한 무료 오픈소스 도구입니다. MetaMask 공동 창업자 Kumavis의 역작인 이 도구는 Web3의 보안 문제와 오픈소스 생태계의 오랜 구조적 보안 문제를 동시에 해결합니다.

JavaScript(줄여서 JS)로 개발하고 있다면 JS와 그 의존성의 보안 상황을 이해해야 합니다. JS 개발자들은 앱을 "처음부터" 만드는 경우가 거의 없으며, 일반적으로 "의존성(dependencies)"이라고 불리는 기존 코드 조각들을 프로젝트에 가져와 빌딩 블록처럼 사용합니다. 이는 협업과 개발 속도 면에서 매우 유리하지만, 만약 그 의존성 중 하나에 악성 코드가 포함되어 있다면 어떻게 될까요?

소프트웨어 공급망 보안은 애플리케이션에 영향을 미치는 모든 요소(의존성 등)와 개발 과정에서 역할을 하는 모든 요소(빌드 도구나 CI 시스템 등)를 포함합니다. JavaScript는 개발자들 사이에서 단연 가장 인기 있는 언어이며, 공급망 공격에도 매우 취약합니다. 2017년의 이 취약점 타임라인을 보면 공격의 절반 가량이 오픈소스 JS 패키지의 인기 소스인 npm에서 비롯된 것을 확인할 수 있습니다:

출처: SonaType

JavaScript가 공격 대상이 되는 이유는 다음과 같습니다:

  1. 인기도: 프론트엔드와 백엔드 모두에서 사용됨

  2. 광범위한 권한: JavaScript가 실행되는 환경에서는 네트워크 접근 등 다양한 권한에 접근 가능

  3. 가변성: 모든 것이 기본적으로 변경 가능

2018년의 Copay 지갑 해킹 사건은 Kumavis가 이 문제 해결에 관심을 갖게 된 계기이며, LavaMoat 설계의 주요 사례 연구입니다. Copay는 BitPay의 자기 수탁형 비트코인 지갑으로, 공급망 해킹의 표적이 되어 사용자 자금이 탈취되었습니다. 지갑이 사용하던 npm 의존성이 공격자에 의해 제어되면서 공격이 실행될 수 있었습니다.

그렇다면 해결책은 무엇일까요? 이 문제를 해결하기 위한 몇 가지 주장이 있습니다.

의존성을 전혀 사용하지 않는다? 글쎄요.

더 안전할 수는 있겠지만, 우리 모두가 그 위에서 구축하는 공동의 토대를 형성하는 오픈소스를, 공유와 협업을 포기할 건가요? 복잡한 무언가를 만들려 할 때, 정말로 바퀴를 다시 발명하는 데 시간을 쓰고 싶으신가요?

저희도 그렇지 않습니다.

모든 의존성을 항상 감사한다? 글쎄요.

좋은 생각이긴 하지만, 의존성이 몇 개나 되나요? 수백 개? 수천 개? 수만 개? 현실적이지 않습니다. 물론 수동 감사를 원한다면 LavaMoat가 가장 위험한 것들의 우선순위를 정하는 데 도움을 줄 것입니다(이에 대해서는 나중에 더 자세히 설명합니다).

그리고 패키지의 차이점을 꼼꼼히 살펴볼 시간이 있다 해도, 보안 취약점을 발견할 수 있을까요?

장담하기 어렵습니다. 그러니 다른 해결책을 살펴봅시다:

LavaMoat? 바로 이겁니다.

의존성을 전혀 사용하지 않거나 모든 의존성을 항상 감사하는 대신, 패키지를 격리된 구획에 감싸고 필요한 것에만 접근 권한을 부여하는 LavaMoat의 보안 커널을 살펴보겠습니다.

기억하세요, 악성 코드가 시스템을 공격하려면 그에 대한 권한이 필요합니다. LavaMoat의 커널은 프로젝트에 가져오는 서드파티 코드를 분석하고, 의존성이 실행되는 데 필요한 것을 파악한 후, 해당 의존성에 오직 그것만을 부여합니다.

LavaMoat는 현재 MetaMask에서 수천만 명의 사용자를 보호하고 있으며, 각 개발 프로세스의 세 가지 단계에서 실행됩니다: 의존성 설치, 빌드, 런타임.

더 명확하게 이해하기 위해 이 의존성 그래프 시각화 대시보드를 확인해 보세요:

왼쪽에는 의존성 목록이 있고, 오른쪽에는 신경망 형태로 그래프가 표시됩니다. 색상은 위험도 휴리스틱을 기반으로 합니다: 예를 들어, 녹색은 강력한 플랫폼 API를 가져오지 않는 것들입니다.

여기서의 핵심은 의존성 감사의 우선순위를 정하는 데 도움을 주는 것입니다.

그렇다면 어떻게 구현할까요?

세 가지 개발 단계를 고려하면:

  1. 설치: @lavamoat/allow-scripts

  2. 빌드: lavamoat-node

  3. 런타임: 번들러용 lavamoat-x 플러그인

이것이 악성 코드에 대한 해자(moat) 역할을 할 것입니다.

대규모 소프트웨어 구축

저희를 돕고 싶으시다면, LavaMoat는 오픈소스입니다! 가능한 한 많은 번들러용 플러그인을 개발하고, 정책 검토를 더 쉽게 만들며, 패키지에 네트워크 접근 권한을 부여할 때 엄격한 잠금을 추가하고자 합니다. 여기에서 기여할 수 있습니다.

더 많은 업데이트를 위해 개발자 뉴스레터를 구독하세요! 즐거운 개발 되세요.

AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.

번역 평가하기
  • MetaMask
    MetaMask

    Consensys가 구축한 선도적인 자기 보관형 암호화폐 지갑이자 Web3로 가는 관문입니다.

    모든 글 읽기