개요
1월 3일 Project Zero는 프로세스가 최악의 경우 해당 프로세스에 속하지 않는 메모리를 포함하여 임의의 메모리를 읽는 데 사용할 수 있는 최신 CPU의 취약점을 발표했습니다. 이러한 취약점은 Spectre 및 멜트다운으로 명명되었습니다. Chrome은 웹을 안전하게 보호하기 위해 어떤 조치를 취하고 있으며 웹 개발자는 자체 사이트를 위해 무엇을 해야 하나요?
요약
웹을 탐색하는 사용자는 운영체제와 브라우저를 업데이트해야 합니다. 또한 Chrome 사용자는 사이트 격리를 사용 설정할 수 있습니다.
웹 개발자인 경우 Chrome팀에서 권장하는 사항은 다음과 같습니다.
- 가능하면
SameSite
및HTTPOnly
쿠키 속성을 사용하고document.cookie
에서 읽지 않음으로써 쿠키가 렌더러 프로세스의 메모리에 들어가지 않도록 합니다. - MIME 유형이 올바른지 확인하고 사용자별 또는 민감한 콘텐츠가 포함된 URL의 경우
X-Content-Type-Options: nosniff
헤더를 지정하여 사이트 격리를 사용 설정한 사용자의 교차 출처 읽기 차단을 최대한 활용합니다. - 사이트 격리를 사용 설정하고 사이트에 문제가 발생하면 Chrome팀에 알립니다.
이 단계가 도움이 되는 이유가 궁금하다면 계속 읽어 보세요.
위험 요소
이러한 취약점에 대한 다양한 설명이 있으므로 더 이상 설명하지 않겠습니다. 이러한 취약점이 악용되는 방식에 관심이 있으시다면 Google Cloud팀 동료가 작성한 블로그 게시물을 참고하시기 바랍니다.
Meltdown과 Spectre 모두 프로세스가 읽을 수 없는 메모리를 읽을 수 있게 허용할 수 있습니다. 때로는 여러 사이트의 여러 문서가 Chrome에서 프로세스를 공유하게 될 수 있습니다. 이는 window.open
, <a href="..." target="_blank">
또는 iframe을 사용하여 다른 페이지를 연 경우에 발생할 수 있습니다. 웹사이트에 사용자별 데이터가 포함되어 있으면 다른 사이트에서 이러한 새로운 취약점을 사용하여 사용자 데이터를 읽을 수 있습니다.
완화 조치
Chrome 및 V8 엔지니어링팀은 이 위협을 완화하기 위해 여러 가지 노력을 기울이고 있습니다.
사이트 격리
민감한 정보가 공격자가 제어하는 코드와 프로세스를 공유하지 못하도록 하면 Spectre를 성공적으로 악용하는 경우의 영향을 크게 줄일 수 있습니다. Chrome팀은 이를 달성하기 위한 '사이트 격리'라는 기능을 개발하고 있습니다.
사이트 격리는 몇 가지 알려진 문제가 있고 Chrome팀에서 최대한 많은 현장 테스트를 진행하고자 하기 때문에 아직 기본적으로 사용 설정되지 않았습니다. 웹 개발자인 경우 사이트 격리를 사용 설정하고 사이트가 계속 작동하는지 확인해야 합니다. 지금 선택하려면 chrome://flags#enable-site-per-process
를 사용 설정하세요. 작동하지 않는 사이트를 발견하면 버그를 신고하고 사이트 격리가 사용 설정되어 있다고 언급해 주세요.
교차 사이트 문서 차단
모든 교차 사이트 페이지가 별도의 프로세스에 배치되더라도 페이지는 이미지, JavaScript와 같은 일부 교차 사이트 하위 리소스를 합법적으로 요청할 수 있습니다. 민감한 정보가 유출되지 않도록 하기 위해 사이트 격리에는 렌더러 프로세스에 전송되는 네트워크 응답을 제한하는 '교차 사이트 문서 차단' 기능이 포함되어 있습니다.
웹사이트는 서버에 '문서'와 '리소스'라는 두 가지 유형의 데이터를 요청할 수 있습니다. 여기서 문서는 HTML, XML, JSON, 텍스트 파일입니다. 웹사이트는 자체 도메인 또는 허용 CORS 헤더가 있는 다른 도메인에서 문서를 수신할 수 있습니다. 리소스에는 이미지, JavaScript, CSS, 글꼴 등이 포함됩니다. 모든 사이트의 리소스를 포함할 수 있습니다.
교차 사이트 문서 차단 정책은 다음과 같은 경우 프로세스가 다른 출처에서 '문서'를 수신하지 못하도록 합니다.
- HTML, XML, JSON 또는 text/plain MIME 유형을 사용합니다.
X-Content-Type-Options: nosniff
HTTP 응답 헤더가 있거나 빠른 콘텐츠 분석('스니핑')으로 유형이 올바른지 확인할 수 있습니다.- CORS에서 문서에 대한 액세스를 명시적으로 허용하지 않음
이 정책에 의해 차단된 문서는 프로세스에 비어 있는 것으로 표시되지만 요청은 백그라운드에서 계속 실행됩니다.
예를 들어 공격자가 민감한 정보(예: <img src="https://yourbank.com/balance.json">
)가 포함된 JSON 파일이 포함된 <img>
태그를 만든다고 가정해 보겠습니다.
사이트 격리가 없으면 JSON 파일의 콘텐츠가 렌더러 프로세스의 메모리에 저장되며 이때 렌더러는 유효한 이미지 형식이 아니라는 것을 감지하고 이미지를 렌더링하지 않습니다. 그러나 Spectre를 사용하면 이제 메모리 청크를 읽을 수 있는 방법이 있습니다. 교차 사이트 문서 차단으로 인해 MIME 유형이 차단되므로 교차 사이트 문서 차단은 이 파일의 콘텐츠가 렌더러가 실행 중인 프로세스의 메모리에 들어가지 못하도록 합니다.
사용자 측정항목에 따르면 text/html
또는 text/plain
MIME 유형으로 전송되는 JavaScript 및 CSS 파일이 많습니다. 실수로 문서로 표시된 리소스를 차단하지 않도록 Chrome은 응답을 스니핑하여 MIME 유형이 올바른지 확인하려고 시도합니다. 이 스니핑은 불완전하므로 웹사이트에서 올바른 Content-Type
헤더를 설정하고 있다고 확신하는 경우 Chrome팀에서는 모든 응답에 X-Content-Type-Options: nosniff
헤더를 추가하는 것이 좋습니다.
교차 사이트 문서 차단을 사용해 보려면 위에 설명된 대로 사이트 격리를 선택합니다.
쿠키 SameSite
개
위의 예인 <img
src="https://yourbank.com/balance.json">
로 돌아가 보겠습니다. 이는 yourbank.com에 사용자를 자동으로 로그인하는 쿠키가 저장된 경우에만 작동합니다. 쿠키는 일반적으로 <img>
태그를 사용하여 서드 파티에서 요청한 경우에도 쿠키를 설정하는 웹사이트에 대한 모든 요청에 대해 전송됩니다. SameSite 쿠키는 쿠키가 동일한 사이트에서 발생한 요청에만 연결되어야 함을 지정하는 새로운 속성입니다. 이름은 여기에서 따왔습니다. 안타깝게도 이 글을 작성하는 시점에서는 Chrome 및 Firefox 58 이상에서만 이 속성이 지원됩니다.
HTTPOnly
및 document.cookie
사이트의 쿠키가 클라이언트 JavaScript가 아닌 서버 측에서만 사용되는 경우 쿠키 데이터가 렌더러 프로세스에 들어가지 않도록 하는 방법이 있습니다. 지원되는 브라우저(예: Chrome)에서 클라이언트 측 스크립트를 통해 쿠키에 액세스하지 못하도록 명시적으로 방지하는 HTTPOnly
쿠키 속성을 설정할 수 있습니다. HTTPOnly
를 설정할 수 없는 경우 절대적으로 필요한 경우가 아니라면 document.cookie
를 읽지 않음으로써 렌더링된 프로세스에 로드 쿠키 데이터가 노출되는 것을 제한할 수 있습니다.
rel="noopener"
를 사용하여 외부 링크 열기
target="_blank"
를 사용하여 다른 페이지에 연결하면 열린 페이지는 window
객체에 액세스할 수 있고 페이지를 다른 URL로 이동할 수 있으며 사이트 격리가 없는 경우 페이지와 동일한 프로세스에 있습니다. 페이지를 더 효과적으로 보호하려면 새 창에서 열리는 외부 페이지 링크는 항상 rel="noopener"
를 지정해야 합니다.
고해상도 타이머
Meltdown 또는 Spectre를 악용하려면 공격자가 메모리에서 특정 값을 읽는 데 걸리는 시간을 측정해야 합니다. 이를 위해서는 안정적이고 정확한 타이머가 필요합니다.
웹 플랫폼에서 제공하는 API 중 하나는 5마이크로초까지 정확한 performance.now()
입니다. 완화 조치로 모든 주요 브라우저는 공격을 더 어렵게 만들기 위해 performance.now()
의 해상도를 낮췄습니다.
고해상도 타이머를 가져오는 또 다른 방법은 SharedArrayBuffer를 사용하는 것입니다. 버퍼는 전용 작업자가 카운터를 증분하는 데 사용됩니다. 기본 스레드는 이 카운터를 읽고 타이머로 사용합니다. 당분간 브라우저는 다른 완화 조치가 적용될 때까지 SharedArrayBuffer를 사용 중지하기로 결정했습니다.
V8
Spectre를 악용하려면 특별히 제작된 CPU 명령어 시퀀스가 필요합니다. V8팀은 알려진 공격 개념 증명에 대한 완화 조치를 구현했으며, 이러한 공격이 트리거되더라도 생성된 코드를 안전하게 만드는 최적화 컴파일러인 TurboFan의 변경사항을 연구하고 있습니다. 그러나 이러한 코드 생성 변경사항으로 인해 성능이 저하될 수 있습니다.
웹 안전하게 보호
스펙터 및 멜트다운 발견과 그 의미에 관해 많은 불확실성이 있었습니다. 이 도움말을 통해 Chrome 및 V8팀이 웹 플랫폼을 안전하게 보호하기 위해 어떤 노력을 하고 있는지, 웹 개발자가 기존 보안 기능을 사용하여 어떻게 도움을 줄 수 있는지 알 수 있기를 바랍니다. 궁금한 점이 있으면 언제든지 Twitter에서 문의해 주세요.