TL;DR

  • C2PA(C2PA)의 서명 계산에서 파일 전체를 제외하면 신뢰할 수 있는 타임스탬프가 있어도 서명된 데이터가 비어 있게 만들 수 있어, 서명 후 파일을 조작할 수 있음.
  • C2PA 매니페스트에는 클레임 서명과 타임스탬프 기관(TSA)의 서명이 포함되며, TSA는 특정 해시를 특정 시각에 확인했다는 증명을 제공함.
  • 취약점은 서명 계산에서 임의의 바이트 범위를 제외하도록 허용하는 C2PA 사양의 설계에 있으며, 파일 전체를 제외하는 것도 가능함.
  • 시연 이미지에는 복권 번호가 추첨 전에 찍힌 것처럼 보이는 유효한 C2PA 서명과 타임스탬프가 포함되지만, 실제 이미지는 추첨 후 조작됨.
  • 제외 기능을 단순히 없애기 어려운 이유는 PNG 같은 형식에서 순환 의존성을 피하려면 일부 데이터를 서명 범위에서 빼야 하기 때문이며, 형식별 허용 범위를 명시하고 검증기가 이를 강제하는 방안이 제안됨.

시간을 해킹한다면

  • 영화 역사상 가장 인상적인 해킹 묘사로 《Kung Fury》(2015)에서 Hackerman이 시간을 해킹하는 장면을 꼽음. 그는 과거의 잘못을 바로잡는 데 이 능력을 사용함.
  • 나비 효과가 더 두려워 몇 시간 전으로 돌아가 자신에게 당첨 복권 번호를 알려주고 싶다고 밝힘.
  • 이미지의 암호학적으로 위조할 수 없는 C2PA 메타데이터에 따르면 실제로 그렇게 한 셈임. 이미지가 포토샵으로 조작된 것은 분명하며, 실제 복권 사기를 시도하는 것은 아니라고 덧붙임.
  • C2PA 메타데이터와 타임스탬프는 C2PA 검증 도구에서 확인할 수 있음. 글을 미래에 읽는 경우 해당 서비스에 완화책이 도입됐을 수도 있다고 언급함.
  • 당첨 번호가 추첨 시각보다 몇 시간 앞서 표시됐는지는 EuroMillions 결과 페이지에서 확인할 수 있음.

배경

  • 일반적인 C2PA 매니페스트에는 두 개의 서명이 포함됨. 첫 번째는 ‘클레임’ 서명이며, 카메라 앱에서는 사진이 특정 시각과 GPS 좌표에서 촬영됐다는 주장을 담을 수 있음. 실제 표현은 C2PA 사양에 따라 더 형식적임.
  • 이전 글에서 클레임 서명은 거의 가치가 없으며, 적어도 Google Pixel Camera 앱 같은 주요 C2PA 구현에서는 원하는 클레임에 서명할 수 있음을 보였음.
  • 보통 두 번째 서명은 타임스탬프 기관(Time Stamp Authority, TSA)이 제공함. 기기 자체의 시각을 신뢰하지 않고 RFC 3161 프로토콜을 통해 원격 서버에 확인을 요청함.
  • 서버는 특정 해시를 특정 시각에 확인했다는 서명을 반환하며, 이 응답은 C2PA 메타데이터에 포함됨. 서버가 잘못 작동하지 않는다는 전제 아래, 서명 대상 데이터가 지정된 시각 이전 또는 그 시각에 존재했음을 증명하며 TSA는 독립적인 증인 역할을 함.
  • Google은 Pixel 10에서 기기 자체가 시간을 알려도 신뢰할 수 있다고 판단함. ‘기기 내 신뢰할 수 있는 타임스탬프(on-device trusted time-stamp)’ 구현은 아직 평가하지 않았으며, 이에 대해 매우 회의적이라고 밝힘.
  • 이 글에서는 TSA를 공격하지 않으며, TSA가 설명대로 작동한다고 가정함.

시간 해킹의 때

  • TSA 방식이 안전하다면 사양의 ‘발목잡기(spec footgun)’를 이용해 시간을 해킹함.
  • C2PA는 임의의 ‘제외(exclusions)’를 허용함. 이는 서명 계산에서 제외되는 파일 내 바이트 범위임. 이 동작은 사양에 명시돼 이미 알려져 있지만, 아직 조치가 이뤄지지 않았다고 지적함.
  • Dr. Neal Krawertz는 2025년 6월에 발표한 C2PA 결함 목록에서 이 문제를 명시적으로 지적함.

큰 제외 범위. 매니페스트는 일반적으로 서명에서 매우 큰 바이트 범위를 제외함. 제외된 바이트는 탐지되지 않은 채 변경될 수 있음.

  • 새로운 점은 악의적인 서명자가 큰 제외 범위를 우연히 사용하는 대신 의도적으로 설정할 수 있다는 것임.
  • 파일 전체를 제외하면 빈 문자열에 대한 완전히 유효한 서명을 만들 수 있음. 이에 따라 서명과 TSA 타임스탬프 증명을 무효화하지 않고도 서명 후 파일을 변조할 수 있음.

시간 상태: 해킹됨

  • 실제 복권 사진을 찍고 유효한 C2PA 서명과 신뢰할 수 있는 타임스탬프를 붙였지만, 매니페스트에서 파일 전체를 제외하도록 구성함. 그 결과 당첨 번호 발표 후 이미지를 서명 무효화 없이 조악하게 포토샵으로 조작할 수 있었음.
  • 개념 증명(PoC) 파일의 매니페스트를 c2patool -d로 확인하면 c2pa.hash.data의 제외 시작 위치가 0, 길이가 3995383임을 볼 수 있음.
  • 3995383은 파일 전체 길이이며, 47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=는 빈 문자열의 해시임. openssl sha256 -binary /dev/null | base64 명령으로 같은 해시를 확인할 수 있음.
  • 클레임 서명은 해당 해시에 대해 생성되고 타임스탬프 서명은 클레임 서명에 대해 생성됨. 사실상 아무것도 서명하지 않은 셈이지만, 현재까지 확인한 C2PA 검증 도구 중 이를 이상하게 표시하는 도구는 없음.

해결할 수 있을까?

  • 파일 전체가 제외됐는지 탐지해 무효로 처리하는 것은 간단하지만, 일부만 제외된 경우에는 그 부분이 무해한지, 아니면 수정 시 이미지의 외관을 완전히 바꿀 수 있는지 판별하기 어려움. 후자의 사례는 MD5 해시 충돌 개념 증명에서 확인할 수 있음.
  • 첫 초안에서는 제외 기능을 C2PA 사양에서 제거하라고 권고했지만, 해결책은 그보다 복잡함.
  • 제외 기능이 필요한 주요 이유는 일부 파일 형식의 구조임. 예를 들어 PNG 파일에서는 각 청크에 CRC32 체크섬이 있으며, 서명을 파일에 삽입한 뒤 체크섬을 수정해야 함.
  • CRC32를 서명 범위에서 제외하지 않으면 순환 의존성이 생김. 체크섬 무효화를 피하는 수학적 기법을 고려하지 않는 경우에는 CRC32를 제외해야 함.
  • 따라서 지원하는 파일 형식마다 제외가 허용되는 부분을 신중하고 명시적으로 규정하고, 검증기가 해당 제약을 강제하는 것이 적절한 해결책임.