XZ 백도어: 시간, 저주받은 시간, 그리고 사기들
(rheaeve.substack.com)- xz/liblzma tarball의 백도어를 둘러싸고, Jia Tan의 Git 커밋 시간대와 작업 패턴이 실제 활동 지역을 추정하는 단서로 쓰임
- 커밋 시각은
GIT_AUTHOR_DATE와GIT_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_DATE와GIT_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"로 검색하면 됨 - “외로운 늑대 한 명”이 아니라는 전제를 두면 훨씬 많은 일이 가능해짐
특정 위치에서 활동하는 것처럼 보이게 만들고, 동시에 한 명 이상처럼 보이지 않게 꾸미는 것도 포함됨
- 이 작전 뒤에는 전체 팀이 있었을 가능성이 높고, 그 팀의 업무 중에는 “XZ 프로젝트가 우리가 고른 관리자를 받아들이도록 사회공학적으로 유도하기” 같은 것도 포함됐을 수 있음
-
동유럽 출신은 아니라고 보지만, UTC+0200/+0300을 보면 유럽에서는 핀란드, 발트 3국, 우크라이나, 루마니아, 몰도바, 그리스 정도가 해당됨
조금 아래로 내려가면 이스라엘을 포함한 중동의 꽤 큰 지역도 포함됨- 8월에 4주짜리 공백이 보이는데, 유럽 휴가 일정과 맞아떨어짐
다만 핀란드에서는 보통 7월을 선호해서 덜 흔함 - Tukaani는 주로 핀란드 사람들이 기여하는 핀란드 조직이고, 기여자들을 보면 거의 모두 핀란드식 이름임
보기에는 앞뒤가 맞아 보임 - 일광절약시간과 휴일 기준으로 보면 이스라엘과는 어떻게 맞아떨어지는지 궁금함
- 왜 다운보트를 받는지 모르겠음. 국가 행위자를 떠올리면 Stuxnet 같은 사례 때문에 이스라엘은 미국/러시아/중국/북한과 함께 꽤 위쪽에 올라옴
특히 IDF의 Unit 8200은 상당히 유명한 평판이 있음
다른 나라에 역량이 없다는 뜻은 아니고, 이 공격이 NSA나 GCHQ급 자원이 꼭 필요한 일처럼 보이지도 않음. 실제로는 외로운 늑대 한 명일 수도 있지만, 그래도 주목할 만함 - “아무도 믿지 마라! 신이 세 번째 원시인을 싸질렀을 때부터 그중 하나를 겨냥한 음모가 꾸며졌다!” - Gen. Hunter Gathers, OSI (The Venture Bros.)
사실상 무한한 자원과 동기를 가진 세력들은 책임을 특정 방향으로 몰아가려고 위장 작전을 꾸밀 수 있음. 이들은 흔적을 지우는 데 매우 능숙하고, 가장 숙련된 보안 연구자도 누가 책임자인지 교육받은 추정에 도달하는 데 몇 달이나 몇 년이 걸릴 수 있음
그래서 “누가 했는가”를 알아내려는 건 시간 낭비에 가까움
교훈은 이렇다: 운영 환경에는 어떤 이유로도 최첨단 미검증 소프트웨어를 넣지 말 것, 조직의 침투 테스터는 정기적으로 스택을 깨보며 결과를 조직과 패키지 관리자에게 알려야 함, 자유·오픈소스 관리자는 특히 보안에 민감한 새 코드를 릴리스마다 감사해야 함, 그리고 관리자에게 기부해야 함
다행히 stable에는 들어가지 않았고, 시스템 안에서 보안 체르노빌이 터지기 직전까지 갔다가 간신히 피한 수준임
특정 세력이 책임자라고 모두를 설득하려는 사람들이 있고, 거기에는 지정학적 목적이 있음. 예를 들어 미국에서 인기 웹 앱의 외국인 소유를 금지하자는 논의가 있는 상황에서, 그런 법으로 이득을 보는 정부나 기업에게 중국식 이름의 GitHub 사용자가 PRC에서 온 것처럼 보이는 타임스탬프로 공격 벡터를 커밋했다면 얼마나 편리하겠는가
설령 실제로 중국 본토의 누군가라고 해도, 국가 지원을 받았다면 기소와 범죄인 인도 요청이 나와도 미국 보안관에게 넘겨질 가능성은 거의 없음. 오히려 더 큰 조직 정보가 적에게 넘어가지 않도록 “입막음”될 수도 있음
본드 영화식 음모를 제외하면, 그 지식을 실무에 적용할 곳은 별로 없음. 사용자들이 어디서 오는지는 대개 이미 알고 있고, 지역 차단도 할 수 있음. 아니라면 그 지역에서 오는 다른 위협에 대비해야 함
- 8월에 4주짜리 공백이 보이는데, 유럽 휴가 일정과 맞아떨어짐
-
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 성(훨씬 흔한 陳)일 뿐 아니라, 중국어 성 譚이기도 함
- 내가 본 Jia Tan의 몇몇 커밋에서 영어는 미국이나 영국 원어민처럼 자연스럽게 읽혔고, 싱가포르식 영어의 흔적은 보지 못했음
-
사안의 심각성은 잠시 제쳐두면, 이 사건의 추리소설 같은 면에 완전히 빠져듦
인터넷이 “누가, 어떻게, 왜”를 맞춰가는 과정이 흥미로움 -
몇 년 전부터 바로 이런 이유로 터미널의
gc를TZ=UTC0 git commit에 매핑해 두었음
시스템 시간이나 git 설정을 바꿀 필요가 없음. 전역 설정에 더 나은 방법이 있을 수도 있겠지만
악의적인 이유도 아님. 여행을 많이 다니는데, 공개 저장소에 여행 일정을 흘리고 싶지 않음- git 커밋의 시간 정보를 숨기려고 작은 도구를 만들어 쓰고 있음: https://github.com/SmartHypercube/git-date-truncate
시간대를 UTC로 맞출 뿐 아니라 시간을 00:00으로 설정해서 커밋에는 날짜 정보만 남음. git 커밋에 영구적으로 저장되는 정보는 날짜 정도면 충분하고, 정확한 커밋 시간을 흘릴 필요는 없다고 봄 - 이렇게 하면 어떨까?
alias git='TZ=UTC0 git' - 여행을 많이 다니지만 요즘은 워크스테이션의 시간대를 PST/PDT에서 바꾸지 않음
수동 단계가 필요하고, 위치 서비스도 쓰지 않음
- git 커밋의 시간 정보를 숨기려고 작은 도구를 만들어 쓰고 있음: https://github.com/SmartHypercube/git-date-truncate
-
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이 동유럽만이 아니라 중동 일부도 포함한다는 점도 맞음. 이 부분도 글 업데이트에서 명확히 했음