2P by GN⁺ | ★ favorite | 댓글 1개
  • xz/liblzma tarball의 백도어를 둘러싸고, Jia Tan의 Git 커밋 시간대와 작업 패턴이 실제 활동 지역을 추정하는 단서로 쓰임
  • 커밋 시각은 GIT_AUTHOR_DATEGIT_COMMITTER_DATE로 조작 가능하지만, 전체 시각을 그럴듯하게 맞추기보다 시간대만 바꾸는 방식이 더 쉬웠을 가능성이 큼
  • Jia Tan의 커밋 440개 대부분은 UTC+08로 기록됐지만, 일부 UTC+02·UTC+03 기록은 동유럽식 겨울·서머타임 전환과 맞아떨어짐
  • 2022년 10월 6일과 2023년 6월 27일의 시간대 전환은 실제 이동으로 설명하기 어려울 만큼 간격이 짧아, 단순 여행 가능성을 약하게 만듦
  • 일부 +0200 커밋은 Lasse Collin이 git am으로 적용한 패치로 보이며, 이메일 패치 흐름에서는 타임존 정보의 신뢰도가 낮아지는 한계가 있음

xz 백도어와 분석 대상

  • xz/liblzma tarball에서 발견된 백도어는 자유 소프트웨어 생태계의 신뢰를 크게 흔든 사건으로 받아들여짐
  • 백도어는 xz의 장기 메인테이너였던 Jia Tan이 넣었을 가능성이 있다고 봄
  • Jia Tan은 커뮤니티에서 이름 외에 알려진 정보가 거의 없었고, 그 이름도 사실이 아닐 수 있음
  • 분석 대상은 JiaT75의 GitHub 활동과 xz 저장소 커밋 타임스탬프임
  • 출발점이 된 공개 글은 oss-security 메일링 리스트 게시물

Git 타임스탬프를 위조하기 어려운 이유

  • Git 커밋 시간은 GIT_AUTHOR_DATEGIT_COMMITTER_DATE 환경변수로 바꿀 수 있음
  • 아직 푸시하지 않은 커밋은 amend로 날짜를 나중에 수정하는 것도 가능함
  • 그러나 그럴듯한 시간 데이터 위조에는 여러 제약이 따름
    • 미래에 만든 것처럼 보이는 커밋을 푸시하면 의심을 살 수 있음
    • 온라인 논의보다 더 오래된 것처럼 보이는 커밋도 부자연스러움
    • 이런 제약을 피하려면 커밋을 보류해야 해 프로젝트 개발이 지연될 수 있음
  • 실제 시각을 조정하는 대신 시간대만 변경하면 계산이나 커밋 지연 없이 더 쉽게 속일 수 있음

UTC+08 기록과 UTC+02/03 가능성

  • Jia Tan의 커밋 대부분인 440개는 UTC+08 타임스탬프로 남아 있음
  • UTC+08은 중국 CST일 가능성이 크지만, 인도네시아·필리핀·서호주도 같은 시간대에 속함
  • Jia Tan이라는 이름은 아시아인, 특히 중국인처럼 보이게 하려는 신호일 수 있음
  • 실제 활동 지역은 UTC+02 겨울 시간 / UTC+03 서머타임 지역이었을 가능성이 제시됨
    • 해당 지역에는 동유럽 EET, 이스라엘 IST 등이 포함됨
    • UTC+08 기록을 UTC+02/03 기준으로 보정하면 보통 오전 9시부터 오후 6시까지 일한 패턴이 됨
    • 보정하지 않으면 화요일 밤 자정과 새벽 1시에 일한 형태가 되어 덜 자연스러움

시간대 전환에서 드러난 단서

  • 일부 커밋은 Jia Tan이 시간대 변경을 잊은 결과일 수 있음
  • UTC+02 커밋 3개와 UTC+03 커밋 6개가 확인됨
    • UTC+02는 2월과 11월의 겨울 시간과 맞음
    • UTC+03은 6월, 7월, 10월 초의 서머타임과 맞음
    • 이는 동유럽의 서머타임 전환, 즉 10월 마지막 주말 이후 +0200, 3월 마지막 일요일 이후 +0300 패턴과 맞음
  • 이 시간대는 Lasse Collin과 Hans Jansen의 시간대와도 같아 보임
  • 4월 2일 업데이트에서는 Joey Hess의 지적을 반영해, 이런 사례 중 다수가 Lasse Collin이 committer인 커밋이라고 덧붙임
    • 다만 Lasse가 커밋한 Jia의 모든 커밋에서 같은 현상이 나타나지는 않고, 많은 경우 +0800으로 기록됨
    • 따라서 +02/03 커밋이 실수인지, 단순한 워크플로 변화인지는 명확하지 않음

실제 이동으로 보기 어려운 간격

  • UTC+08 거주자가 가끔 UTC+02/03 지역으로 비행했다는 설명은 세부 타임스탬프와 잘 맞지 않음
  • 2022년 10월 6일에는 21:53:09 +0300 커밋 뒤에 17:00:38 +0800 커밋이 있음
    • 두 커밋 사이 차이는 약 11시간
    • 중국에서 동유럽 또는 중동까지는 순수 비행 시간만 최소 10~12시간이며, 직항이 드물어 더 오래 걸릴 가능성이 큼
  • 2023년 6월 27일에는 23:38:32 +0800 커밋과 17:27:09 +0300 커밋이 이어짐
    • 두 커밋 차이는 몇 분 수준임
  • 이런 전환은 Jia Tan이 실제로 UTC+08 CST 지역에 있었던 것이 아닐 가능성을 뒷받침함

휴일과 주중 작업 패턴

  • 휴일 패턴도 중국보다 동유럽 쪽과 더 잘 맞는 것으로 보임
  • 중국 공휴일 목록은 Bank of China Indonesia의 2023년 공휴일 안내를 참고함
  • 중국 공휴일로 제시된 날에도 작업 기록이 있음
    • 2023년 9월 29일: 중추절
    • 2023년 4월 5일: 청명절
    • 2023년 1월 22~27일 등: 춘절 기간
  • 동유럽 공휴일과 관련해서는 12월 25일 크리스마스, 12월 31일과 1월 1일 신년에 일한 기록이 없다고 봄
  • Jia의 가장 흔한 작업 요일은 화요일 86회, 수요일 85회, 목요일 89회, 금요일 79회임

이름과 패치 적용 caveat

  • “Jia Cheong Tan”이 실제 이름이라면 중국에서 쓰는 한자 이름의 유효한 로마자 표기일 수 없고, 말레이시아 같은 동남아 쪽 표기에 가깝다는 지적이 있음
  • “Cheong” 철자는 현대 중국에서 쓰이지 않으며, 중국식 영문 표기는 이름 글자를 붙여 쓰는 경향이 있다는 예시도 제시됨
    • 예시는 “Yangqing Jia”이지 “Yang Qing Jia”가 아님
  • 다만 두 개의 +0200 커밋 de5c5e4, e446ab7a는 committer가 Lasse Collin이며, Jia가 이메일로 보낸 패치를 git am으로 적용한 것으로 보임
  • 해당 커밋과 인접 커밋 일부는 동일한 타임스탬프를 가지며, 이는 패치 파일 묶음을 git am으로 적용한 경우와 일치함
  • 패치가 이메일로 오가는 경우 타임존 정보에 의존하기 어려워, 이 분석의 일부는 약해짐

댓글과 토론

Hacker News 의견들
  • 국가 지원 공격이었다면 코드와 메일링리스트 메시지를 작성하는 사람/부서와, 그 결과물이 인터넷에 나가는 시간과 타임스탬프를 “프로젝트 설정에 맞는 이야기”와 일치시키는 별도 팀이 있었을 가능성이 충분함
    가끔은 일부러 “실수”를 넣어 실제 위치가 아니라 또 다른 선택된 장소를 수사관에게 암시했을 수도 있음

    • 이 작전 뒤에는 전체 팀이 있었을 가능성이 높고, 그 팀의 업무 중에는 “XZ 프로젝트가 우리가 고른 관리자를 받아들이도록 사회공학적으로 유도하기” 같은 것도 포함됐을 수 있음
      다른 글[1]에서도 갑자기 생긴 계정들이 긴박감을 만들어 관리권 이전을 앞당겼을 가능성이 제기됐음
      [1] https://connortumbleson.com/2024/03/31/watching-xz-unfold-fr...
      via: https://news.ycombinator.com/item?id=39888854
      관련 부분은 "Progress will not happen until there is new maintainer"로 검색하면 됨
    • “외로운 늑대 한 명”이 아니라는 전제를 두면 훨씬 많은 일이 가능해짐
      특정 위치에서 활동하는 것처럼 보이게 만들고, 동시에 한 명 이상처럼 보이지 않게 꾸미는 것도 포함됨
  • 동유럽 출신은 아니라고 보지만, UTC+0200/+0300을 보면 유럽에서는 핀란드, 발트 3국, 우크라이나, 루마니아, 몰도바, 그리스 정도가 해당됨
    조금 아래로 내려가면 이스라엘을 포함한 중동의 꽤 큰 지역도 포함됨

    • 8월에 4주짜리 공백이 보이는데, 유럽 휴가 일정과 맞아떨어짐
      다만 핀란드에서는 보통 7월을 선호해서 덜 흔함
    • Tukaani는 주로 핀란드 사람들이 기여하는 핀란드 조직이고, 기여자들을 보면 거의 모두 핀란드식 이름임
      보기에는 앞뒤가 맞아 보임
    • 일광절약시간과 휴일 기준으로 보면 이스라엘과는 어떻게 맞아떨어지는지 궁금함
    • 왜 다운보트를 받는지 모르겠음. 국가 행위자를 떠올리면 Stuxnet 같은 사례 때문에 이스라엘은 미국/러시아/중국/북한과 함께 꽤 위쪽에 올라옴
      특히 IDF의 Unit 8200은 상당히 유명한 평판이 있음
      다른 나라에 역량이 없다는 뜻은 아니고, 이 공격이 NSA나 GCHQ급 자원이 꼭 필요한 일처럼 보이지도 않음. 실제로는 외로운 늑대 한 명일 수도 있지만, 그래도 주목할 만함
    • “아무도 믿지 마라! 신이 세 번째 원시인을 싸질렀을 때부터 그중 하나를 겨냥한 음모가 꾸며졌다!” - Gen. Hunter Gathers, OSI (The Venture Bros.)
      사실상 무한한 자원과 동기를 가진 세력들은 책임을 특정 방향으로 몰아가려고 위장 작전을 꾸밀 수 있음. 이들은 흔적을 지우는 데 매우 능숙하고, 가장 숙련된 보안 연구자도 누가 책임자인지 교육받은 추정에 도달하는 데 몇 달이나 몇 년이 걸릴 수 있음
      그래서 “누가 했는가”를 알아내려는 건 시간 낭비에 가까움
      교훈은 이렇다: 운영 환경에는 어떤 이유로도 최첨단 미검증 소프트웨어를 넣지 말 것, 조직의 침투 테스터는 정기적으로 스택을 깨보며 결과를 조직과 패키지 관리자에게 알려야 함, 자유·오픈소스 관리자는 특히 보안에 민감한 새 코드를 릴리스마다 감사해야 함, 그리고 관리자에게 기부해야 함
      다행히 stable에는 들어가지 않았고, 시스템 안에서 보안 체르노빌이 터지기 직전까지 갔다가 간신히 피한 수준임
      특정 세력이 책임자라고 모두를 설득하려는 사람들이 있고, 거기에는 지정학적 목적이 있음. 예를 들어 미국에서 인기 웹 앱의 외국인 소유를 금지하자는 논의가 있는 상황에서, 그런 법으로 이득을 보는 정부나 기업에게 중국식 이름의 GitHub 사용자가 PRC에서 온 것처럼 보이는 타임스탬프로 공격 벡터를 커밋했다면 얼마나 편리하겠는가
      설령 실제로 중국 본토의 누군가라고 해도, 국가 지원을 받았다면 기소와 범죄인 인도 요청이 나와도 미국 보안관에게 넘겨질 가능성은 거의 없음. 오히려 더 큰 조직 정보가 적에게 넘어가지 않도록 “입막음”될 수도 있음
      본드 영화식 음모를 제외하면, 그 지식을 실무에 적용할 곳은 별로 없음. 사용자들이 어디서 오는지는 대개 이미 알고 있고, 지역 차단도 할 수 있음. 아니라면 그 지역에서 오는 다른 위협에 대비해야 함
  • GMT+8, 이름의 구성(중국어/혼합 방언식 이름 + Hokkien 성), 그리고 싱가포르의 VPN 출구나 호스팅 서버로 보이는 곳에서 접속했다는 정황[1]은 실제든 위장이든 싱가포르인 정체성과 모두 맞아떨어짐
    그래서 [1]의 출처가 “이름이 가짜처럼 들린다”고 본 것도 어느 정도 걸러 들어야 함. 중국 본토 사람들이 디아스포라 중국인 공동체를 항상 잘 아는 것은 아님
    언급된 휴일 상당수도 싱가포르 공휴일[2]은 아님. 1월 24일은 공휴일이었지만, “근무일에 일한다”는 패턴을 적용하기엔 1월 22일은 일요일인데 근무한 것으로 표시되어 있음
    Jia Tan의 글, 특히 더 오래된 글을 더 많이 보면 흥미로울 듯함. 싱가포르인, 중국 본토인, 여러 슬라브어권 화자, 영어 원어민을 구분하는 데 쓸 수 있는 꽤 뚜렷한 언어 습관이 있을 수 있음
    [1] https://boehs.org/node/everything-i-know-about-the-xz-backdo...
    [2] https://www.mom.gov.sg/employment-practices/public-holidays

    • 내가 본 Jia Tan의 몇몇 커밋에서 영어는 미국이나 영국 원어민처럼 자연스럽게 읽혔고, 싱가포르식 영어의 흔적은 보지 못했음
      물론 표본이 매우 작아서 너무 많이 읽어낼 수는 없음
      싱가포르인의 거의 10%가 Tan이라는 성을 가짐
      [1] [https://en.wikipedia.org/wiki/File:Singaporean_surnames_by_f...](https://en.wikipedia.org/wiki/File:Singaporean_surnames_by_frequency.png)
    • Tan은 별개의 Hokkien 성(훨씬 흔한 陳)일 뿐 아니라, 중국어 성 이기도 함
  • 사안의 심각성은 잠시 제쳐두면, 이 사건의 추리소설 같은 면에 완전히 빠져듦
    인터넷이 “누가, 어떻게, 왜”를 맞춰가는 과정이 흥미로움

  • 몇 년 전부터 바로 이런 이유로 터미널의 gcTZ=UTC0 git commit에 매핑해 두었음
    시스템 시간이나 git 설정을 바꿀 필요가 없음. 전역 설정에 더 나은 방법이 있을 수도 있겠지만
    악의적인 이유도 아님. 여행을 많이 다니는데, 공개 저장소에 여행 일정을 흘리고 싶지 않음

    • git 커밋의 시간 정보를 숨기려고 작은 도구를 만들어 쓰고 있음: https://github.com/SmartHypercube/git-date-truncate
      시간대를 UTC로 맞출 뿐 아니라 시간을 00:00으로 설정해서 커밋에는 날짜 정보만 남음. git 커밋에 영구적으로 저장되는 정보는 날짜 정도면 충분하고, 정확한 커밋 시간을 흘릴 필요는 없다고 봄
    • 이렇게 하면 어떨까?
      alias git='TZ=UTC0 git'
    • 여행을 많이 다니지만 요즘은 워크스테이션의 시간대를 PST/PDT에서 바꾸지 않음
      수동 단계가 필요하고, 위치 서비스도 쓰지 않음
  • Jia가 안됐네. 2년이나 작업한 게 전부 물거품이 됐음
    Jia, 이걸 읽고 있다면 시도하지 않은 슛은 100% 놓친다는 걸 기억하길. 고개 들어, 형제

    • 그 온라인 인격 뒤의 개인이 얼마나 많은 또 다른 자아를 갖고 있는지, 그리고 그 자아들로 다른 프로젝트를 얼마나 오염시켰는지는 아무도 모름
    • 걱정할 필요 없음. 그들, 즉 팀은 이미지 라이브러리, WebKit, Kubernetes 등에도 기여하고 있을 테니까
    • 왜 물거품이라고 봄? 목표를 달성하지 못했다는 걸 알고 있음?
    • JiaT가 xz 프로젝트에서만 작업했을 거라고는 확신하기 어려움
  • “누가 이른 아침에 정기적으로 일하나?”

    “해커라면 오후와 늦은 밤에 일하는 편이 훨씬 그럴듯하다”
    여기서 해커를 젊은 사람으로 바꾸면 더 맞을 듯함

    • “해커” 고정관념도 낡았지만, 그걸 “젊은 사람”으로 바꾸고 “나이 든 사람”은 아니라고 암시하는 것도 똑같이 이상함
      나는 41세이고 지난 10년 동안 오전 7시 전에 깨어 있었던 날이 20번쯤 될까 말까 함. 아직도 컴퓨터 일을 견디는 이유의 절반은, 대부분의 날 오전 11시~오후 7시 일정으로 일하면서도 잘할 수 있는 몇 안 되는 직업이기 때문임
      아침형 인간과 밤형 인간이 있음. 누구든 자기 리듬이 있고 판단할 일은 아니지만, 나이가 들며 자연히 바뀌거나 바뀌어야 하는 건 아님
    • c/hacker/younger person 이 문법은 뭐지? sed 치환의 s/a/b/는 알지만 c로 시작하는 건 모르겠음
    • 고정관념을 빼더라도, 성실히 코딩하는 해커들은 보통 외부 의무에 맞춰 “실제 작업” 일정을 둘러싸게 됨
      아침은 “아침형 인간”을 상대하는 것 같은 방해가 많고, 점심 이후부터 저녁까지는 끼어드는 일이 훨씬 적음
      무작위 전화와 이메일이 들어오는 8시간 근무보다, 방해받지 않는 4시간에 훨씬 더 많은 일을 할 수 있음. 더 이상 젊은 사람도 아니지만, 방해가 없고 몇 시간 동안 틈틈이 생각해둔 뒤라면 절반 시간에 끝낼 수 있어서 밤에 하는 일도 있음
      평화로운 아침을 보내고 있다면 부러움
  • “2023년 6월 27일 화요일에 23:38:32 +0800과 17:27:09 +0300 두 커밋이 보인다. 계산하면 두 커밋 사이에는 약 9시간 차이가 난다”
    그런데 17:27:09 +0300은 22:27:09 +0800이니까, 두 커밋은 약 1시간 차이 아닌가?

    • 맞음. 더 나쁜 부분도 있음
      “더 결정적으로 2022년 10월 6일에는 21:53:09 +0300 커밋 뒤에 17:00:38 +0800 커밋이 보인다. 이는 단 몇 분 차이다!”
      아님. 이건 거의 10시간 차이
      작성자가 두 분석을 실수로 바꿔 썼거나, 시간대 계산을 잘 못하는 듯함
  • 미국인, 혹은 전혀 다른 지역 사람이 중국인인 척하는 동유럽인인 척한 것이라면 어떨까?
    뭔가를 위장한다면 적어도 한 단계 더 우회를 넣었을 것임

    • 중국인이 중국인인 척하는 동유럽인이나 이스라엘인인 척한 것일 수도 있음
      그런 구성이라면 이런 누출이 있어도 별일이 생기지 않음
  • 원문 작성자 중 한 명임. 향후 분석에 쓸 만한 아이디어를 많이 얻었고, 자주 나온 네 가지 반론에 답하자면 이렇다
    한 명이었는지 여러 명이었는지는 불분명하다는 데 동의함. 다만 팀이었다 해도 시간대 접근은 그 팀이 어디에 있었는지를 알려줄 수 있음. 활동 시간이 전 세계에 흩어진 팀보다는 정규 근무시간처럼 너무 많이 보임
    커밋 시간이 바뀌었거나, 시간 예약 스크립트로 커밋/업로드됐을 가능성도 당연히 있음. 그래도 실제로 큰 시간대 차이를 숨기려면 엄청난 지연을 넣어야 하므로 현실적으로 어렵다고 봄. xz는 진공 상태에서 개발된 것이 아니라, 이슈 등록이나 메일링리스트 글 같은 온라인 사건에 반응하며 개발됐기 때문임
    두 예시는 실제로 뒤섞어 썼음. 10시간쯤 차이 난다고 한 두 시각은 사실 몇 분 차이고, 몇 분 차이라고 한 시각은 10시간쯤 차이임. 업데이트 예정임
    마지막으로 UTC+2/3이 동유럽만이 아니라 중동 일부도 포함한다는 점도 맞음. 이 부분도 글 업데이트에서 명확히 했음