1P by GN⁺ | ★ favorite | 댓글 1개
  • Keyhole은 CLiP의 라이선스 검증 흐름을 우회해 Microsoft Store 앱과 최신 Windows 에디션용 라이선스를 만들 수 있게 했던 DRM 우회 버그임
  • CLiP는 서명된 XML 라이선스를 clipsvc.dll에서 검증한 뒤 SPLicenseBlockclipsp.sys로 넘겨 커널에서 다시 확인하는 신뢰 체인을 사용함
  • clipup.exe에 XML 라이선스 서명용 ECDSA 키가 난독화 없이 들어 있어, 임의로 서명한 XML 라이선스를 ClipSvc가 받아들일 수 있었음
  • 실제 취약점은 라이선스 블록의 서명 블록 뒤 데이터가 검증되지 않는데도 같은 타입의 앞선 블록을 덮어쓸 수 있다는 점이며, device-locked Windows 라이선스에는 device-locked 앱 라이선스가 필요했음
  • Cisco TALOS가 같은 버그를 2024년 4월 8일 Microsoft에 보고했고, 수정 후 파서는 서명 블록을 만나면 즉시 종료해 뒤따르는 블록을 처리하지 않음

Keyhole의 성격과 공개 배경

  • Keyhole은 Windows 라이선스 검사 우회 작업 중 발견된 버그로, Microsoft Store 앱 또는 최신 Windows 에디션에 라이선스를 부여할 수 있게 했던 DRM 우회 방법임
  • 일부 버그는 향후 활성화 방법이나 테스트 도구로 보존하기 위해 비공개로 유지됐지만, CVE-2024-38184Cisco TALOS를 통해 공개되면서 Keyhole 내용도 공개됨
  • 이 버그는 Microsoft에 보고된 시기와 비슷한 때 독립적으로 발견됨

CLiP의 라이선스 처리 구조

  • CLiP(Client Licensing Platform)는 Windows 10에서 도입된 시스템으로, 주로 Microsoft Store 앱 DRM을 구현하고 Windows 활성화와도 통합됨
  • Windows 내 주요 구성요소는 다음과 같음
    • clipup.exe: Windows 8 Store 라이선스, 정품 티켓, 제품 키를 디지털 라이선스로 마이그레이션함
    • clipsvc.dll: 앱 라이선스를 관리하는 사용자 모드 서비스
    • clipc.dll: 애플리케이션이 CLiP와 상호작용하는 API
    • clipwinrt.dll: Windows Runtime을 쓰는 UWP 애플리케이션용 API
    • clipsp.sys: 라이선스를 검증하는 커널 모드 드라이버
  • CLiP 라이선스 앱이 설치되면 서명된 XML 라이선스가 clipsvc.dll로 전달되고, XML 서명 검증 후 데이터가 %PROGRAMDATA%\Microsoft\Windows\ClipSVC\tokens.dat에 저장됨
  • 이후 SPLicenseBlock 태그에서 서명된 라이선스 블록이 추출되어 clipsp.sys로 전달되고, 검증을 거쳐 CLiP 라이선스 저장소 HKLM\SYSTEM\CurrentControlSet\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}에 저장됨
  • 이 저장소는 기본적으로 보이지 않도록 보호되지만, 권한을 바꾸면 접근할 수 있음

clipup.exe에 남아 있던 서명 키

  • clipup.exe에는 XML 라이선스 서명에 사용할 수 있는 유효한 ECDSA 키가 난독화 없이 저장돼 있었음
  • 이 키는 원래 Microsoft Store에 임시 라이선스를 보내 디지털 라이선스를 받는 용도로 쓰이지만, ClipSvc는 앱 라이선스에도 같은 키를 받아들였음
  • 그 결과 임의의 XML 라이선스를 서명하거나 재서명할 수 있었고, ClipSvc의 사용자 모드 검사를 우회해 원하는 라이선스 블록을 clipsp.sys로 직접 넘길 수 있었음
  • 이 단계에서 사용자 모드 수준의 신뢰 체인은 무력화되고, 남은 쟁점은 ClipSp를 속일 수 있는지였음

ClipSp 분석과 Warbird 난독화 해제

  • ClipSp의 많은 코드는 Microsoft의 독자 난독화 도구인 Warbird로 숨겨져 있었음
  • ClipSp는 난독화된 코드 호출을 복호화 함수와 암호화 함수로 감싸며, 사용자 모드 프로그램에서 Warbird가 동작하는 방식과 유사함
  • Microsoft 서버에 있던 clipsp.sys 심볼이 분석에 도움이 됐고, KiFilterFiberContext의 방법을 바탕으로 복호화 함수를 수동 실행해 숨겨진 코드를 확인할 수 있었음
  • Warbird의 사용자 모드 동작은 warbird-docs에서 참고할 수 있음

라이선스 블록 형식과 Keyhole 버그

  • CLiP에서 중요한 라이선스 정보는 라이선스 블록에 들어 있으며, 형식은 CikExtractor에 문서화돼 있음
  • 라이선스 블록은 TLV(tag-length-value) 형식을 사용함
    • 각 하위 블록은 데이터 타입, 데이터 길이, 실제 데이터를 가짐
    • 예를 들어 타입 0xC9는 License Information, 길이 0xA는 10바이트 데이터를 뜻함
  • 라이선스 블록 끝에는 항상 타입 0xCC서명 블록이 있으며, 이 블록은 앞의 모든 데이터 서명과 서명에 사용된 키 정보를 담음
  • 실험 결과 서명 블록 뒤에 붙은 데이터는 검증되지 않았고, 같은 타입의 블록이 여러 개 있으면 마지막 블록이 앞선 블록을 덮어썼음
  • 따라서 서명 블록 뒤에 새 라이선스 데이터를 붙이면 기존 라이선스 정보를 바꿀 수 있었고, 이 방식이 Keyhole로 명명됨

가능한 범위와 제약

  • 이 방법은 Microsoft Store에서 판매되는 항목의 라이선스를 다른 Microsoft Store 라이선스에서 만들 수 있게 했음
  • 무료 앱에도 라이선스가 많기 때문에 원하는 항목용 라이선스를 다수 만들 수 있는 상태였음
  • 단, device-locked 라이선스는 device-unlocked 라이선스에서 만들 수 없었음
  • Windows 디지털 라이선스는 device-locked이므로, Windows 라이선스를 만들려면 Roblox 같은 device-locked 앱 라이선스가 필요했음
  • 이를 통해 Enterprise LTSC를 디지털 라이선스로 활성화하거나, generic key로 정상 KMS 서버를 활성화하는 등 이전에는 불가능했던 작업도 가능했음

공개된 재현 흐름과 수정 방식

  • Windows 라이선스를 만드는 흐름은 device-locked 앱 설치, https://licensing.mp.microsoft.com/v7.0/licenses/content에서 오는 라이선스 가로채기, 라이선스 디코딩과 블록 추출, 새 데이터 추가, XML 패키징과 서명, C:\ProgramData\Microsoft\Windows\ClipSVC\Install\Migration에 복사, ClipSvc 재시작 또는 clipup -p 실행으로 이어짐
  • Cisco TALOS의 TALOS-2024-1964는 같은 버그를 Microsoft에 2024년 4월 8일 보고했음
  • 이 버그는 단순 DRM 문제처럼 보일 수 있지만, Keyhole이 ClipSp의 더 심각한 버그로 들어가는 진입점이 될 수 있어 TALOS 공개 범위에 포함됨
  • 수정된 라이선스 블록 파서는 서명 블록을 만나면 즉시 종료해 서명 뒤 블록을 처리하지 않으며, 이 변경으로 Keyhole이 막힘

공개 자료와 Xbox One과의 관계

  • Keyhole 공개 후 Keyhole 라이선스 생성 코드와 분석을 돕기 위한 심볼 포함 CLiP 바이너리 모음이 공개됨
  • ClipSp의 코드 상당 부분은 Xbox One DRM 시스템에서 복사된 것으로 파악됨
  • Xbox One에는 최신 PC의 TPM에 기반한 SP, 즉 secure processor 칩이 있으며, 주요 역할은 코드 서명 강제와 라이선스 검증임
  • CLiP의 XML 라이선스 형식과 TLV 기반 라이선스 블록 대부분은 Xbox One DRM 시스템에서 가져온 형태임
  • Xbox SP에도 ClipSp와 같은 파싱 버그가 있지만, 데이터 블록과 서명 관련 블록을 따로 파싱하기 때문에 Keyhole은 Xbox에서 동작하지 않음

댓글과 토론

Hacker News 의견들
  • 그러니까 이제 세부 사항만 알아내면 Microsoft Store에서 Xbox 게임을 무료로 직접 다운로드할 수 있다는 뜻인가?
    즉 Xbox가 지금으로서는 PS Vita만큼 완전히 해킹된 상태라는 건가?

    • 맞음. 글에서 가장 간과된 부분 같지만, 어쩌면 제일 흥미로운 부분이기도 함
      다만 Xbox에서 자동 업데이트를 켜둔 사람에게는 안타깝게도 해당되지 않음. 최신 시스템 소프트웨어는 collateral-damage 익스플로잇이 지원하는 것보다 더 높은 커널 버전을 포함하는 듯함
    • 완전히 딴 얘기지만, 각주 표시로 엔/위안 기호를 쓴 게 아주 흥미로움. 놓친 역사가 있는 건지, 아니면 그냥 임의로 쓴 건지 궁금함
  • Windows Store에 2020년까지 있던 Lego Boost for Windows 10 앱을 설치할 수 있는 라이선스도 얻을 수 있으면 좋겠음
    이해한 바로는 라이선스가 있으면 아직 다운로드할 수 있지만, 새 사용자에게는 더 이상 제공되지 않음

  • 제대로 읽은 게 맞다면 Microsoft가 임시 라이선스 서명 키의 적용 범위를 줄일 수 있을 테니, 영구 라이선스를 생성할 수 있는 기간은 길지 않을 가능성이 큼

  • 이걸로 Microsoft 계정 없이 HEVC 확장을 활성화할 수 있나? 특허를 일괄 라이선스로 처리하지 못한다는 게 너무 답답함

    • 이 익스플로잇은 필요 없음. MS 코덱 팩이 필요 없는 미디어 플레이어를 쓰면 되지만, 그게 선택지가 아니라고 하면:
      1. https://store.rg-adguard.net로 이동
      2. https://apps.microsoft.com/detail/9n4wgh0z6vhq를 붙여넣기
      3. ring을 "Retail"로 변경
      4. "appxbundle" 확장자를 가진 파일 다운로드
      5. 설치하기. 이 단계에서 개발자 모드를 켜야 할 수도 있는데 정확히는 기억나지 않음
    • 공식 Microsoft 서명 HEVC 설치 파일 다운로드 링크는 massgrave.dev[0]에서도 찾을 수 있음. 정말 훌륭한 자료임
      0: https://massgrave.dev/unsupported_products_activation#hevc-v...
    • 돈 낼 필요 없음. 직접 링크만 있으면 됨
      ms-windows-store://pdp?productId=9N4WGH0Z6VHQ
      ms-windows-store://pdp?productId=9PMMSR1CGPWG
      ms-windows-store://pdp?productid=9MVZQVXJBQ9V
      ms-windows-store://pdp?productid=9N4D0MSMP0PT
      ms-windows-store://pdp?productid=9N95Q1ZZPMH4
    • 굳이 왜 필요함? HEVC 코덱은 GPU 제조사의 드라이버 패키지에 같이 들어 있음
  • 이런 종류의 일들이 수십 년 동안 Windows 배포와 소통 채널로는 가장 효과적이었음

    • 대부분의 다른 소프트웨어에는 해당되지 않음
  • 아이러니하게도, 실제로는 물리 디스크를 가진 Guitar Hero 게임을 정품 하드웨어에서 플레이하려고 진지하게 쓰게 될 것 같음. 게임은 설치돼 있지만, 고장 난 DVD 드라이브에 디스크가 물려 있지 않으면 플레이할 “라이선스”가 없는 상태임
    더 큰 아이러니는, 이게 동작하더라도 콘솔의 공개 키가 폐기 목록에 올라 있어서 내 게임 저장 파일을 읽지 못할 수도 있다는 점임. CON 파일을 기본값 0으로 다시 서명하면 우회할 수는 있음
    세 번째 아이러니도 곧 나올지 모름. 이 모든 게 정말 익숙해 보임. 대단히 훌륭함

    • XML > TLV > 널 종료 문자열 / 사용자 입력용 UTF-16 같은 생태계에서는 어디서든 오프바이원 오류나 검증되지 않은 악성 사용자 입력이 들어오면, 기술 부채로 된 카드집이 권한 상승, 원격 코드 실행, 수평 이동의 지뢰밭으로 무너질 수 있음. 다만 사소한 일은 아님
      이 버그는 본질적으로, 정제되지 않은 입력과 문맥 탈출이 우연히 결합되는 날을 위한 소급적 피벗 플랫폼에 가까움
      겉으로는 단순한 디지털 스티커 바꿔치기처럼 보이지만, Microsoft가 성공을 과도하게 지렛대 삼고, 하위 호환성과 자체 기술 부채 때문에 깨지는 변경을 거부해 온 탓에 어떤 실수는 사소해도 영향력이 크고 영구화됨
  • 백신이 페이지를 막고 있다면 여기로 보면 됨: https://archive.is/90XGW

    • 어떤 백신들이 그렇게 함?
  • Clip은 Xbox One보다 더 오래전부터 있지 않았나?

  • 글을 읽고, 특히 이 엔진이 Xbox DRM 엔진에서 복사-붙여넣기됐다는 부분을 보면, Pluton도 Xbox에서 복사해 온 만큼 최종 사용자 보안을 위한 것이라고 아직도 믿는 사람이 있나? 결국 Microsoft가 PC에서 강제 가능한 DRM을 갖기 위한 게 아닌가?
    참고로 Pluton은 최신 Intel 노트북 칩에도 들어갔고, AMD에는 한동안 들어가 있었음. Windows가 이걸 요구하게 되기까지 얼마나 걸릴까?

    • 그런 걸 믿어본 적이 없음. 최악은 Microsoft식 Kool-Aid를 마시는 사람들에게 이걸 설명하는 일임
      Microsoft 관리자라 회사 사람들은 Win11, Intune 같은 최대 봉쇄식 구성을 좋아함. 내게 Windows의 본질은 그런 게 아니라, 훌륭한 관리 도구와 하위 호환성임
      Pluton도 또 다른 TPM이 될 것임. 도입하고 5년 기다린 뒤 의무화하겠지. Microsoft에게는 시간이 있음
    • TPM이 도입된 뒤로 10년 넘게 사람들이 계속 그렇게 말해왔음
      그래도 Windows가 깔려 판매된 PC에 여전히 Linux를 설치할 수 있고, Store가 아닌 곳에서 받은 서드파티 소프트웨어도 Windows에 설치할 수 있으며, 토렌트에서 내려받은 해적판 영화도 볼 수 있음
      바탕화면 이미지를 바꿀 수 없는 게 괜찮다면 등록하지 않거나 결제하지 않은 Windows도 실행할 수 있음
    • 순진할 수도 있지만, 아직은 믿고 있음. 회의는 필요하지만, 추측만으로 완전히 기각하는 것도 나름의 오류 추론임
      Microsoft가 잠재적으로 이득을 볼 수 있나? 당연함. 하지만 그게 진짜 사용자 보안 동기와 최종 사용자에게 돌아가는 이점을 부정하지는 않음
  • “서명 블록 뒤의 데이터는 전혀 검사하지 않고, 심지어 앞에 나온 데이터를 덮어쓸 수도 있다. 같은 유형의 블록이 함께 저장되면 마지막 블록이 앞의 모든 블록을 덮어쓴다. 그래서 라이선스 데이터를 바꾸고 싶다면 해당 블록을 만들어 서명 블록 뒤에 넣기만 하면 된다”
    정말 놀라움

    • Nintendo Wii가 해시 검증에 strncmp를 써서 첫 번째 일치하는 00 바이트에서 멈췄던 일 이후 최악의 암호학 실수인지 궁금함