플러그인 보안 업데이트 (새 탭에서 열림)
Figma는 플러그인 보안을 위해 사용하던 Realms shim에서 샌드박스 탈출 취약점이 발견되자 즉시 플러그인 게시와 업데이트를 중단하고 패치를 적용했다. 공개된 플러그인들을 감사한 결과 실제 악용 흔적은 발견되지 않았으며, 재발 방지를 위해 JavaScript 실행 환경을 Realms shim에서 WebAssembly로 컴파일한 QuickJS VM으로 교체했다. ## 플러그인 보안의 기본 원칙 Figma는 플러그인이 다음 작업을 수행할 수 있도록 설계했다. - 사용자가 명시적으로 실행한 경우에만 동작 - 플러그인 전용 대화상자 안에서 UI 표시 - 현재 열어 실행한 Figma 문서의 데이터 읽기 - 해당 문서의 데이터 수정 - 인터넷상의 서버와 통신 반대로 플러그인은 다음 작업을 할 수 없어야 한다. - 사용자 동의 없이 스스로 실행 - 파일을 소유한 프로젝트나 팀 정보 접근 - 실행 중이 아닐 때 데이터 접근 - 실행된 파일 이외의 다른 파일 데이터 접근 - 플러그인 UI 대화상자 외부의 Figma UI 변경 또한 Organization 요금제에서는 관리자가 허용된 플러그인 목록을 지정해 조직 내에서 신뢰할 수 없는 플러그인의 실행을 차단할 수 있다. ## Realms shim 취약점 발견 - Figma는 웹에서 서드파티 JavaScript를 안전하게 실행하기 위해 Realms shim을 사용했다. - 2019년 9월경 Realms shim에서 여러 독립적인 취약점이 발견됐다. - 취약점이 악용되면 샌드박스 내부 코드가 외부로 탈출해 Figma가 설정한 플러그인 보안 제한을 우회할 수 있었다. - 첫 번째 취약점은 공개 GitHub 이슈로 보고됐고, 나머지는 제한된 보안 권고를 통해 비공개로 공유됐다. - Figma는 공개 플러그인을 감사했지만 실제 플러그인이 취약점을 악용한 증거는 찾지 못했다. ## 취약점에 대한 대응 Figma는 위험 확산을 막기 위해 플러그인 배포 체계를 일시적으로 제한했다. - 신규 플러그인의 커뮤니티 허브 게시 중단 - 기존 플러그인의 업데이트 게시도 완전히 중단 - 공개 취약점에 대해서는 Realms shim 패치를 당일 적용 - 비공개 취약점은 관련 업체들과 공개 일정을 조율한 뒤 다음 주에 해결 - 모든 수정 사항이 배포된 후 취약점 세부 내용을 공개 - 게시된 플러그인 코드를 감사해 실제 공격 여부 확인 Figma의 수동 리뷰는 주로 사용자 경험과 품질을 검토하는 절차이며, 보안 경계를 사람이 직접 검증하는 방식은 아니다. 보안은 샌드박스가 강제하도록 설계했기 때문에, 리뷰만으로 악성 코드나 취약점을 완전히 차단할 수 있다고 보지 않았다. ## 실시간 업데이트가 만드는 위험 - Figma 플러그인 코드는 라이브 방식으로 배포된다. - 개발자가 기존 플러그인을 업데이트하면 변경 사항이 열려 있는 클라이언트에도 즉시 전파된다. - 따라서 취약점을 알고 있는 플러그인 개발자가 업데이트를 통해 악성 코드를 배포할 가능성을 차단하기 위해 기존 플러그인 업데이트까지 중단했다. - 이는 플러그인 생태계의 신속한 배포 기능이 보안 사고 시 위험 요소가 될 수 있음을 보여준다. ## QuickJS 기반 실행 환경으로 전환 Figma는 사고 대응 과정에서 Realms shim을 완전히 제거하고 QuickJS를 도입했다. - QuickJS는 C로 작성된 JavaScript 가상 머신이다. - Figma는 이를 WebAssembly로 크로스 컴파일해 플러그인 실행에 사용했다. - Realms shim의 객체 경계 혼동에서 비롯된 이번 취약점 유형은 새 구현에서는 발생하지 않는다. - 기존 구조가 교체 가능한 아키텍처로 설계되어 있었기 때문에 백업 계획이었던 QuickJS로 빠르게 전환할 수 있었다. ## 실용적인 결론 서드파티 코드를 실행할 때는 사람의 코드 리뷰보다 강제 가능한 샌드박스 경계가 핵심이다. 또한 배포 중단, 신속한 패치, 비공개 정보 공개 일정 조율, 실행 환경 교체 계획을 사전에 마련해 두면 취약점 발견 시 피해 확산을 효과적으로 줄일 수 있다.