Samsung Galaxy S6의 그래픽 드라이버 버그가 Chrome 탭 데이터를 유출 한 방법

3 월 말에 GPU 안정성 테스트를 전문으로하는 영국의 신생 기업이 웹 페이지를 방문 할 때 Qualcomm Snapdragon 845 Samsung Galaxy S9 / S9 +가 재부팅되는 GPU 버그를 발견했습니다. GraphicsFuzz 라는 회사는이 문제를 Qualcomm 및 Samsung에보고하기 위해 협력했습니다. 일부 독자들은 GraphicsFuzz 와 같은 회사가 어떻게 이러한 취약점을 발견 할 수 있는지 배우는 데 관심이 있었기 때문에 회사와 협력하여 그들이 오래된 GPU 취약점을 발견 한 방법을 보여주었습니다. 이미 패치 된 취약점으로 공격자는 Samsung Galaxy S6의 Chrome 브라우저 탭 내용을 원격으로 "스파이"할 수있었습니다.

이 사용자는 악의적 인 웹 페이지를 방문하기 전에 은행 웹 사이트를보고있었습니다. 내용이 캡처되어 원격 서버로 업로드되었습니다. 출처 : GraphicsFuzz.

GraphicsFuzz가 GPU 버그를 찾는 방법

그래픽 드라이버는 셰이더 프로그램을 실행하여 GPU로 전송하여 이미지를 렌더링함으로써 작동합니다. 쉐이더를 GPU로 보내기 전에 그래픽 드라이버는 GPU가 이해할 수있는 형태로 변환합니다. 번역이 잘못되면 렌더링 오류, 프로그램 또는 장치 충돌, 잘못된 이미지 및 보안 문제가 발생할 수 있습니다. GraphicsFuzz 에는 일련의 참조 셰이더를 기반으로 이러한 버그를 찾을 수있는 자동화 된 테스트 제품군이 있습니다. 사용자가 테스트를 실행하면 모든 결과 이미지가 동일하게 보입니다. 다르게 보이는 이미지는 버그가 있음을 의미합니다.

GraphicsFuzz 테스트 스위트를 실행하는 인기있는 여러 장치의 결과. 이 차트에는 Samsung Galaxy S6, Samsung Galaxy S7 및 Samsung Galaxy S8이 포함되어 있습니다. 출처 : GraphicsFuzz.

Samsung Galaxy S6의 경우 GraphicsFuzz 는 행 중 하나의 이미지가 다른 테이블에 있어야 할 이미지를 표시하고 있음을 발견했습니다. 이는 이전 테스트의 이미지가 이후 테스트로 누출되었음을 의미합니다. 그런 다음 팀은 Chrome에서 테스트 스위트를 다시 실행하여 웹 페이지의 일부가 이미지에 나타나는 것을 발견했습니다. 또한 다른 탭을 열면 이미지에 다른 탭의 일부가 표시되는 것으로 나타났습니다. 기본적으로이 버그로 인해 하나의 Chrome 탭에서 다른 Chrome 탭에 대한 정보가 유출 될 수있었습니다. GraphicsFuzz 의 팀은 의도적으로 보안 버그를 찾지는 않았지만 테스트 결과로 버그를 찾았습니다. (팀은 Galaxy S6 및 Mozilla Firefox의 기본 삼성 브라우저에서 버그를 재현했습니다.)

버그의 작동 방식

Samsung Galaxy S6에서 장기 실행 버그를 유발하는 데 사용되는 이미지. 출처 : GraphicsFuzz.

GraphicsFuzz에서 만든“악의적 인”웹 페이지는 WebGL을 사용하여 위와 같이 캔버스 안에 공간 장면을 그리려고 시도합니다. 각 픽셀의 색상은 GPU에서 실행하기 위해 웹 페이지에서 제공하는 프래그먼트 셰이더 인 프래그먼트 쉐이더에 의해 결정됩니다. GraphicsFuzz 프레임 워크는 프래그먼트 셰이더를 수정하여 실제로 오랫동안 실행되었습니다. 셰이더가 너무 오래 실행되면 브라우저 나 운영 체제는 일반적으로 렌더링을 중단합니다. 그러나 몇 개의 픽셀을 그린 후 GPU에서 렌더링이 중단되었지만 GPU 드라이버는이를 Chrome에보고하지 않았습니다. 가비지 비디오 메모리를 표시하는 기사 상단의 이미지를 보면 실제로 왼쪽 상단의 공간 장면의 일부를 볼 수 있습니다. 즉, 중단 전에 렌더링 된 픽셀은 그대로 유지됩니다. 즉, 최종 렌더링 된 이미지는 대부분 가비지 비디오 메모리입니다. 비디오 메모리는 지속적으로 다른 웹 페이지를 렌더링하는 데 사용되므로 "쓰레기"데이터에는 실제로 다른 웹 페이지의 이전 렌더링이 포함됩니다. 따라서 다른 웹 페이지는 "악의적 인"웹 페이지에 표시됩니다. 결정적으로 WebGL을 사용하면 웹 페이지가 렌더링되는 내용을 캡처 할 수 있습니다. 그런 다음이 이미지는 원격 서버에 업로드됩니다.

Chrome 탭 데이터가 "누설"되는 장기 실행 GPU 버그를 설명하는 다이어그램. 출처 : GraphicsFuzz.

Chrome은 여러 프로세스를 사용하므로 서로 다른 탭이 분리되어 종종 이러한 악용이 불가능 해 보입니다. 그러나 Chrome은 단일 'GPU 프로세스'를 사용하여 GPU와 상호 작용합니다. 즉, 모든 탭이 동일한 GPU 메모리를 공유하므로 이러한 악용이 가능합니다. 위의 다이어그램은이를 자세히 보여줍니다.

이 비디오에서 처음 22 초 동안 버그가 발견되었습니다. GraphicsFuzz가 발견 한 다른 보안 문제도 설명합니다.

배울 교훈

WebGL을 사용하면 악의적 인 웹 페이지가 GPU에 코드를 보내어 실행할 수 있기 때문에 오작동 GPU는 모든 Chrome 및 Android의 보안 조치를 무시할 수 있습니다. 회사가 하드웨어 및 드라이버를 제어하지 않기 때문에 Google은 GPU 버그를 수정할 수 없습니다 . 이 경우 버그를 수정하는 것은 GPU 공급 업체 (이 경우 ARM)의 책임이며 업데이트에 수정 사항을 통합하는 장치에 영향을받는 OEM (이 경우 Samsung)의 OEM입니다. 혼합기에 이동 통신사를 추가하면 이와 같은 버그를 수정하는 데 실제로 오랜 시간이 걸리는 방법을 쉽게 알 수 있습니다. 대부분의 Samsung Galaxy S6 사용자가 패치를받는 데 5 개월 이상 걸렸 습니다 .

GraphicsFuzz는 GPU 공급 업체가 잘못된 코드를 생성하여 GPU에서 실행하게하는 잘못된 컴파일 버그와 같은 감지하기 어려운 버그를 찾을 수 있도록 도와줍니다. 자동화 된 테스트 프레임 워크를 통해이 기사에서 소개 된 버그와 같은 버그를 찾을 수 있습니다. "악의적 인"웹 페이지로 인한 장기 실행 루프는 HTC One M7 및 최근에는 Samsung Galaxy S9와 같은 다른 장치에서도 문제를 일으키는 것으로 나타났습니다. GraphicsFuzz 는 주력 스마트 폰을 테스트하고 테스트 하위 집합의 성능을 기준으로 이러한 장치의 순위를 지정하는 결과 테이블을 게시합니다. 테스트 중에 수백 개의 충돌 및 렌더링 오류 가 발견되었지만 대부분 보안 위협이 있는지 조사하지는 않았습니다. 그러나이 익스플로잇에서 알 수 있듯이 GPU의 오작동은 보안 위험이며 하나 이상의 중요한 보안 취약점이 발견되기를 기다리고있을 수 있습니다. GraphicsFuzz 는 GPU 공급 업체가 향후 드라이버 품질 향상을 우선시하기를 희망합니다.

총 문제 수로 정렬 된 그래픽 드라이버의 비교 신뢰성. 출처 : GraphicsFuzz.

공개 일정

  • 2016 년 12 월 GraphicsFuzz 는 Chrome 보상 프로그램에 적합했기 때문에 Google Chromium 버그 추적기에 버그를보고했습니다. GraphicsFuzz가 버그를 Google Chromium 버그 추적기에 제출 한 후 Google에서 버그를 수락하여 패치를 위해 ARM과 Samsung에 전달했습니다.
  • Google은이 보고서를 ARM과 삼성의 담당자에게 전달했습니다.
  • 삼성은 자동으로 버그를 패치하고 2017 년 3 월과 6 월 사이에 릴리스 된 Android 7.0 누가 업데이트에서 픽스를 출시했습니다. GraphicsFuzz 는 적절한 프로세스를 통해 버그를보고하지 않았습니다.
  • 나중에 GraphicsFuzz 는 삼성과 ARM이 보고서를보고 ARM이 보고서로 인해 문제를 해결할 수 있음을 확인할 수있었습니다.
  • 2017 년 8 월, GraphicsFuzz 는 버그 보고서에 대해 Google로부터 $ 2, 000의 보상을 받았습니다.
  • 2017 년 11 월, 버그 보고서가 공개되었습니다.