매달 MetaMask 보안 책임자 Luker가 여러분이 알아야 할 최신 암호화폐 공격과 새롭게 등장하는 위험에 대해 보고합니다.
MetaMask 보안팀의 2022년 4월 보고서는 다음 내용을 다룹니다: npm 의존성 체인을 위한 Endo의 CommonJS 호환성 마일스톤, LavaMoat v6의 새로운 'a'a 패키지 명명 표기법으로 metamask-extension 실행 시간을 10분에서 1초 미만으로 약 600배 단축, MetaMask Extension의 LavaMoat v6 공급망 보호 도입, LavaMoat의 lockdown()이 React Native 호환성에 도달하여 MetaMask Mobile로의 경로 개척, 그리고 MetaMask 볼트 데이터에 대한 iCloud 백업 주의사항. 아래에서 자세한 내용을 살펴보세요. 그 전에 먼저...
이달의 STEM 선구자: 역량 기반 컴퓨터 보안의 아버지, Butler Lampson
Butler Lampson은 소프트웨어가 리소스에 대한 접근을 제어하는 방식을 체계화한 미국의 컴퓨터 과학자입니다. 1970년대 초에 개발된 그의 접근 행렬 모델은 역량(capabilities)과 접근 제어 목록(access control lists)을 단일 프레임워크로 통합했으며, 이를 통해 1992년 튜링상을 수상했습니다. 그가 개척한 역량 기반 격리는 오늘날 Endo와 LavaMoat가 MetaMask를 보호하는 데 사용하는 컴파트먼트 샌드박싱의 이론적 토대입니다.
Endo, CommonJS 모듈 호환성 달성 및 npm 패키지 로딩의 잔여 문제 발견
Endo의 CommonJS 지원이 2022년 4월 중요한 마일스톤에 도달했습니다. npm 생태계의 실제 패키지(주로 MetaMask 의존성에서 선택)를 대상으로 한 엔드투엔드 테스트를 통해 CommonJS 지원이 불충분한 사례가 발견되었고, 이를 통해 구현이 개선되었습니다. Endo, Node.js, 그리고 여러 번들러에서 ESM으로 가져온 CommonJS의 다양한 export 형태를 비교하는 테스트는 목표를 설정하고 회귀를 방지하는 데 도움이 되었습니다.
이 기간 동안 Endo CommonJS 지원의 주요 변경 사항은 다음과 같습니다: exports를 import *에 연결하고 암묵적 기본 export 도입, 렉서(lexer) 개선을 통해 require의 모든 발생을 감지하고 누락된 패키지 오류를 런타임으로 연기, exports 처리를 리팩토링하여 module.exports를 기본값으로 설정하고 명명된 exports 식별, 그리고 type:module이 포함된 중첩 package.json 및 package.json exports의 선택적 값 배열 지원 추가.
진행 상황은 CommonJS 추적 에픽에서 확인할 수 있습니다.
Endo는 이제 CommonJS 모듈을 올바르게 로드할 수 있습니다. npm에서 실제 패키지를 로드할 때 남아 있는 모든 문제는 네 가지 범주로 분류됩니다: 누락된 기능 사용(예: require.resolve 또는 import.meta), 전역 변수 및 내장 객체 수정, imports 주입 또는 HTML 주석으로부터 보호하는 필터 트리거, 그리고 Endo의 잘못된 export 매핑 및 모듈 유형 해석.
Endo 실험적 run 명령어, 컴파트먼트 격리로 JS 파일 실행
Endo 엔드투엔드 테스트를 연결하는 데 사용되는 기존 도구를 기반으로, 실험적 endo run 명령어가 이제 컴파트먼트를 사용하여 JS 파일을 실행할 수 있습니다. 이는 node app.js와 유사하지만 Endo의 격리 모델이 적용됩니다.
현재 모든 Node.js 핵심 모듈은 코드베이스와 의존성에 의해 require/import로 사용 가능합니다. 향후 작업에서는 LavaMoat의 정책 지원이 추가될 예정입니다.
LavaMoat v6 'a'a 패키지 명명으로 metamask-extension 실행 시간 600배 단축, 10분에서 1초 미만으로
LavaMoat v6는 사칭 및 패키지 이름 재사용으로 인한 문제를 방지하기 위한 새로운 패키지 식별자 표기법과 함께 출시되었습니다. 'a'a로 불리는 이 표기법은 이제 정책 파일의 키에 사용됩니다.
초기 구현의 성능은 파일 조회 및 접근 시 Node.js의 비효율성으로 인해 크게 저하되었습니다. 성능 개선을 위한 첫 번째 시도—단순 메모이제이션 두 가지 경우로 제한—는 metamask-extension에서 'a'a의 최악의 경우 실행 시간을 10분에서 30초로 단축했습니다. 그러나 메모리 사용량 급증 비용이 너무 높았습니다.
두 번째 성능 진단 및 개선 반복은 새로운 알고리즘, 재귀 제거, 그리고 Node.js 모듈 해석에 대한 로컬 성능 개선을 통해 첫 번째 반복 결과 대비 시간과 RAM을 25배 이상 줄였습니다.
전체적으로 첫 번째 완전한 구현과 현재 버전 사이의 실행 시간 개선은 약 600배에 달합니다.
MetaMask Extension, LavaMoat v6 공급망 보호 도입
MetaMask Extension이 이제 LavaMoat v6의 보호 하에 실행되고 있으며, 롤아웃은 PR #14488에서 추적되고 있습니다.
LavaMoat lockdown(), React Native 호환성 달성으로 MetaMask Mobile로의 경로 개척
React Native 애플리케이션에서 LavaMoat를 작동시키기 위한 근본적인 단계는 SES lockdown() 함수를 실행하는 것입니다. lockdown() 함수는 JavaScript의 원시 객체(primordials)를 나열하고 프로토타입을 동결함으로써 소프트웨어를 공급망 공격으로부터 보호하며, 악의적인 행위자가 프로토타입 오염 공격을 수행하기 어렵게 만듭니다.
이 작업 중 발견된 인사이트에 대한 자세한 내용은 React Native 호환성 트래커에 있습니다. 호환성을 달성하기 위한 핵심 사항은 다음과 같습니다: .cjs 파일을 실행하여 Metro가 SES 번들을 실행할 수 있도록 허용, 특정 lockdown 옵션 추가, Babel 플러그인 제거, 그리고 Promise polyfill 제거. 그 외 Sentry 및 EthereumJS 의존성과 같은 문제는 MetaMask Mobile 애플리케이션에 특정한 사항입니다.
그 결과 MetaMask Mobile 애플리케이션 저장소에 pull request가 제출되었습니다. 다음 단계는 엔드투엔드 테스트를 실행하여 lockdown()이 추가 기능을 손상시키지 않았는지 확인한 후, 다음 단계인 MetaMask Mobile에 LavaMoat 통합으로 진행하는 것입니다.
iCloud 백업에 비밀번호로 암호화된 MetaMask 볼트 데이터가 포함된 것으로 확인
앱 데이터에 대해 iCloud 백업을 활성화한 Apple 사용자는 자신도 모르게 비밀번호로 암호화된 MetaMask 볼트를 백업하고 있을 수 있습니다. 비밀번호가 충분히 강력하지 않고 누군가가 iCloud 자격 증명을 피싱할 경우, 자금이 도난당할 수 있습니다. MetaMask는 X에 안내를 게시하여 기기에서 이 설정을 제어하는 방법을 단계별로 설명했습니다.
MetaMask의 2022년 4월 암호화폐 보안 보고서는 MetaMask의 npm 의존성 체인을 위한 Endo의 CommonJS 호환성 마일스톤, 새로운 'a'a 패키지 명명 표기법을 통한 metamask-extension에서의 LavaMoat v6 600배 성능 개선, 그리고 MetaMask 볼트 데이터에 대한 iCloud 백업 주의사항을 다루었습니다. 생태계 전반에서 안전을 유지하기 위한 더 많은 위협, 트렌드, 그리고 팁을 확인하려면 MetaMask 암호화폐 보안 보고서의 이전 호를 살펴보세요.