추상 위키백과/업데이트/2023-10-25
◀ | 추상 위키백과 업데이트 | ▶ |
웹어셈블리에서 실행
몇 주 전에 우리는 일부 커뮤니티 회원을 위해 위키함수를 열었지만 아직 더 폭넓은 기여와 사용을 위해 공개하지는 않았습니다. 일부 커뮤니티 회원, 특히 록칼의 훌륭한 의견 덕분에 우리는 잠재적인 보안 문제가 악용되기 전에 이를 알게 되었습니다. 이로 인해 일부 보안 완화를 구현하는 동안 로그인한 사용자에 대한 함수 호출을 제한하게 되었습니다.
우리의 원래 계획은 보안에 대한 다계층 접근 방식을 사용하여 백엔드를 두 부분으로 나누는 것이었습니다. 한 사람은 오케스트레이터이고, 필요한 모든 데이터를 수집하는 사람이고, 다른 사람은 평가자입니다. 실제로 위키함수 편집자가 작성한 코드를 실행합니다. 평가자는 매우 제한된 권한을 가진 Docker 가상 머신에서 실행됩니다. 그러나 위키함수를 열면서 아직 자체적으로 악용할 수는 없지만 미래에 그렇게 될 수 있는 문제가 발생했습니다.
우리는 새로운 우려 사항에 대응하기 위해 SRE 및 보안 팀과 파트너십을 맺고 함께 아이디어를 브레인스토밍하고 보호 계층을 추가하기 위한 잠재적인 솔루션을 강구했습니다. 아이디어는 심층적인 추가 보안을 제공하는 것입니다. 수정된 보안 전략의 주요 구성 요소 중 하나는 평가자 캡슐화 서비스를 완전히 다시 작성해야 했습니다. Docker의 언어 런타임에서 사용자가 작성한 코드를 직접 실행하는 대신 컨테이너 내부의 웹어셈블리 런타임 위에서 실행합니다.
웹어셈블리란 무엇인가요? 웹어셈블리 또는 줄여서 "WASM"은 낮은 수준의 프로그래밍 언어입니다. 즉, 비교적 간단하고 더 높은 수준의 추상화를 직접 지원하지 않습니다. 웹어셈블리에는 다양한 런타임이 있으며 그 중 가장 눈에 띄는 것은 기본적으로 모두 최신 브라우저입니다(따라서 이름에 "웹"이 있음). 다른 많은 저수준 프로그래밍 언어와 마찬가지로 다른 프로그래밍 언어의 컴파일 대상으로도 사용할 수 있습니다. 즉, 예를 들어 C 또는 Rust로 작성된 코드를 가져와 웹어셈블리로 컴파일할 수 있습니다. 이를 통해 데스크탑용으로 작성된 프로그램을 브라우저에서 실행할 수 있습니다. 한 가지 예는 원래 C++로 작성되었으며 이제 브라우저에서 실행할 수 있는 점프 앤 런 게임 SuperTux입니다.
웹어셈블리는 브라우저에서 실행될 필요가 없습니다. 서버에서도 실행할 수 있습니다. 지난 몇 년 동안 수많은 활동으로 인해 수십 개의 런타임이 생성되었습니다. 웹어셈블리의 한 가지 장점은 웹어셈블리를 실행하는 런타임을 제어하고 제한하기 쉽다는 것입니다. 따라서 코드를 웹어셈블리로 변환하면 보안 계층이 추가됩니다.
이번 주부터 우리는 자바스크립트용 평가기의 새 버전을 배포했습니다. 우리는 이러한 변화가 위키함수 실행의 성능과 비용에 어떤 영향을 미치는지 모니터링할 것입니다. 웹어셈블리 런타임은 다른 보안 조치를 대체하지 않지만 기존 조치에 추가로 추가됩니다. 이제 자바스크립트에서 실행되는 함수의 "세부 사항"을 살펴보면 Node v16.17.1이 아닌 WASM(구체적으로 WasmEdge) 내부의 QuickJS v0.5.0에서 실행된다는 것을 알 수 있습니다. 우리는 곧 파이썬용 평가기를 웹어셈블리 기반 평가기로 전환하는 작업을 진행 중입니다.
하지만 이전의 한 가지 결정으로 인해 상황이 좀 더 어려워졌습니다. 바로 자바스크립트와 파이썬으로 시작하기로 한 것입니다. 웹어셈블리는 C, Rust 또는 Go와 같은 컴파일된 프로그래밍 언어에 맞춰져 있는 반면 파이썬과 자바스크립트는 해석된 언어입니다. 결국 우리는 웹어셈블리로 컴파일할 수 있는 파이썬 및 자바스크립트 인터프리터를 찾았고, 이러한 컴파일된 빌드는 실제 파이썬 및 자바스크립트 코드를 실행하는 데 사용됩니다. 우리는 흥미로운 시대에 살고 있습니다.
실제로 파이썬 및 JS용 WASM 관련 도구는 채택 중에 "매혹적인" 버그를 일으킬 정도로 참신하고 최첨단입니다. 한때 우리는 바이트코드 얼라이언스에서 작성한 wasmtime이라는 훌륭한 도구를 사용하여 웹어셈블리에서 파이썬 실행기를 실행했습니다. 우리의 테스트는 WASM을 사용하도록 스테이징 파이썬 실행기를 전환하기로 결정한 날까지 몇 주 동안 안정적으로 녹색이었습니다. 그러나 새 릴리스가 준비 영역에 도달하면 파이썬 함수 호출이 이상하게도 실패했습니다. 디버깅 후 우리는 wasm 명령줄 도구에 대한 호출이 원인이라는 것을 발견했습니다. 우리가 사용하고 있던 wasm 러너가 배포용 이미지를 구축하기 한 시간도 채 되지 않아 주요 변경 사항으로 표시된 새로운 주요 버전을 푸시한 것으로 나타났습니다. 해당 문제에 대한 수정은 쉬웠습니다. 코드를 다운로드하고 이전 버전의 명령줄 도구를 사용하도록 간단히 다시 지정했지만 이는 WASM의 세계가 얼마나 빠르게 움직일 수 있는지를 보여줍니다.
다음에는 어디로 갈까요? 우리는 시스템이 지속 가능한지 확인하기 위해 새로운 아키텍처가 서버에 가하는 로드를 모니터링할 것입니다. 기능 평가 속도에는 약간의 변화가 있을 것이지만, 전체적으로는 변화가 거의 눈에 띄지 않을 것으로 예상됩니다. 추가 보호 계층이 유지되기를 바랍니다. 하지만 이를 통과할 수 있는 방법을 찾으면 알려주십시오.
우리는 런타임 속도 측면에서 개선의 여지가 꽤 있다고 생각합니다. 웹어셈블리 런타임은 지난 몇 년 동안 개발의 회오리바람을 겪었으며 특히 해석된 언어의 경우 여전히 기회가 많은 것 같습니다. 위키함수의 런타임 특성을 개선하는 한 가지 방법은 Rust 또는 C와 같이 웹어셈블리에 더 자연스러운 언어에 대한 지원을 추가하는 것입니다. 가장 빠른 구현에 대한 자동 지원을 고려하면 이는 보다 효율적인 구현으로 신속하게 통합될 수 있습니다. 그러나 컴파일된 언어에는 컴파일 결과를 어떻게든 저장해야 하므로 약간 다른 아키텍처가 필요합니다. 흥미로운 옵션 중 하나는 함수 평가를 사용자의 브라우저에 푸시하는 것입니다. 여기에는 웹어셈블리 런타임도 포함되어 있기 때문입니다. 그러나 우리는 특히 느린 장치의 경우 그 결과를 이해해야 합니다.
우리는 로그인한 사용자뿐만 아니라 모든 사람이 위키함수에서 커뮤니티 승인 기능을 실행할 수 있는 권한을 실험적으로 전환할 수 있는 기회로 이 변경 사항을 사용했습니다. 보시다시피 이 변경 사항은 이번 업데이트에 깊이 묻혀 있으며 언제든지 다시 취소될 수 있습니다. 우리는 시스템이 얼마나 안정적인지 모니터링할 것입니다. 이 뉴스레터를 통해 최신 소식을 전해드리겠습니다.
이 프로젝트를 주도한 코리, 프로덕션에 참여해준 제임스, 우리를 매우 유용하게 지원해준 보안 및 SRE 팀에게 감사드립니다! 위키함수가 모든 사람에게 공개되는 데 큰 발걸음을 내딛게 되어 매우 기쁩니다.