2P by GN⁺ | ★ favorite | 댓글 1개
  • 1991년 암호가 걸린 채 보관된 ANC Operation Vula 소스 코드 ZIP이 복호화되며, 남아공 아파르트헤이트 체제에 맞선 비밀 통신 코드 공개가 가능해짐
  • 이 코드는 1980년대 후반 ANC의 남아공 내부 지하 네트워크 구축에 쓰였고, 8비트 컴퓨터와 DTMF 톤, 음향 커플러, PowerBASIC으로 일회용 패드 암호화 메시지를 주고받았음
  • 초기 PKZIP의 ZipCrypto는 알려진 평문 공격에 취약했고, bkcrack으로 ZIP 내부의 예측 가능한 12바이트 평문을 찾아 키를 복구함
  • 공격은 ALLBAS.ZIP 안의 압축되지 않은 Store 항목, 내부 ZIP의 PK 헤더, 첫 파일명 COMKEY.BAS를 이용했으며 23분 뒤 98e0f009 48a0b11a c70f8499 키를 얻음
  • 복호화된 RANDOM.BAS와 TECOD.BAS는 DOSBox에서 컴파일·실행됐고, 랜덤 데이터 생성, 파일 암복호화, RAM 디스크 사용, 사용 후 키 자료 파기 방식이 확인됨

Operation Vula 코드가 잠겨 있던 이유

  • Operation Vula는 1980년대 후반 ANC 지도부와 물자를 남아공 안으로 들여보내고, 국내 활동 요소를 연결하는 지하 네트워크 구축 작전이었음
  • 안전한 통신을 위해 8비트 컴퓨터, DTMF 톤, 음향 커플러, 여러 장비, PowerBASIC 프로그램으로 일회용 패드 암호화 메시지를 교환했음
  • 암호 시스템을 주로 만든 Tim Jenkin은 원본 코드를 Vulacode GitHub에 공개했고, 자세한 설명은 Talking To Vula.pdf에 있음
  • 코드 공개가 늦어진 직접적인 이유는 1991년에 만든 암호 ZIP 파일이었음
    • Tim Jenkin은 영국을 떠나 남아공으로 돌아갈 때 전체 소스 코드를 ZIP으로 묶고 암호를 설정함
    • 이후 남아공에서는 코드를 열 필요가 없었고, 몇 년 뒤 다시 열려고 했을 때 암호를 기억하지 못함
    • 접근 가능한 파일 하나는 매우 이른 버전이었고, 나머지는 암호 때문에 추출할 수 없었음

오래된 PKZIP 파일과 알려진 평문 공격

  • 전달받은 파일은 ALLBAS.ZIPCODMAY93.ZIP으로, 둘 다 초기 PKZIP으로 만들어졌고 암호가 걸려 있었음
  • 당시 ZIP 형식의 ZipCrypto에는 알려진 평문 공격이 존재했고, 오픈소스 구현체 bkcrack을 사용할 수 있었음
  • 이 공격에는 ZIP 파일 내부의 알려진 위치에 있는 12바이트 평문 예측이 필요함
  • ALLBAS.ZIP에는 여러 .BAS, .INC, .ZIP, .EXE 파일이 들어 있었고, 일부 항목은 압축 방식이 Store로 표시됨
    • Store 항목은 이미 바이너리라 압축하지 않은 파일이어서, 압축 결과를 맞추지 않고도 평문을 예측할 수 있음
    • ZIP 파일 자체도 Store 항목으로 들어 있었고, ZIP 파일은 시작 부분에 PK 헤더가 있어 평문 후보로 삼기 좋았음

평문 후보 찾기: 내부 ZIP의 첫 파일명

  • 공격 대상은 ALLBAS.ZIP 안에 들어 있던 내부 ZIP 파일 OLDCOD.ZIP이었음
  • ZIP 파일 시작 부분의 PK 헤더에는 파일명 길이와 추가 필드 길이 등이 포함되므로, 첫 파일명을 알면 공격에 필요한 평문을 만들 수 있었음
  • 파일명이 최소 8자라면 .BAS, .INC 같은 확장자와 함께 파일명 크기, 추가 필드 길이 바이트를 더해 필요한 12바이트를 확보할 수 있음
  • 최악의 경우 대문자와 숫자 조합, 최대 8자와 확장자 형태의 파일명을 브루트포스할 수도 있었지만 실제로는 필요하지 않았음
  • Tim Jenkin은 OLDCOD.ZIP의 다른 버전을 갖고 있었고, 그 안의 첫 파일이 COMKEY.BAS라고 알려줄 수 있었음

bkcrack으로 키 복구

  • COMKEY.BAS를 평문 후보로 넣기 위해 간단한 Perl 프로그램을 작성했고, bkcrack -C ALLBAS.ZIP -c OLDCOD.ZIP -p ... -o 26 -j 8 형태로 공격을 실행함
  • 23분 뒤 bkcrack이 찾은 키는 다음과 같음
    • 98e0f009 48a0b11a c70f8499
  • 같은 키로 ALLBAS.ZIP을 복호화해 ALLBAS-DECRYPTED.ZIP을 만들었고, CODMAY93.ZIP에도 같은 키가 동작해 CODMAY93-DECRYPTED.ZIP을 생성함
  • 다른 내부 ZIP 파일을 같은 방식으로 공격하고, 그래도 실패하면 파일명 브루트포스를 시도하는 대안도 있었음
  • 나중에 확인한 TECOD5.BAS 후보는 같은 키를 38초 만에 찾았고, 적절한 평문 선택이 공격 속도에 큰 영향을 줌

복호화된 코드 실행

  • 두 프로그램은 DOSBox에서 PowerBASIC으로 컴파일해 실행됨
    • RANDOM.BAS: 일회용 패드로 쓸 랜덤 숫자 디스크를 만드는 데 사용됨
    • TECOD.BAS: 이메일로 보낼 메시지를 암호화·복호화하는 데 사용됨
    • 컴파일한 코드와 생성된 실행 파일은 jgc-vula-september-2024에 있음
  • PowerBASIC Compiler Version 3.00b로 컴파일했으며, TECOD.BAS는 2,575개 문장과 2,329줄, RANDOM.BAS는 2,194개 문장과 1,940줄로 표시됨
  • RANDOM.EXE는 랜덤 데이터 생성을 위해 세 가지 방식의 난수 생성 알고리듬을 사용했고, 그중 하나는 사용자가 직접 입력하는 랜덤 키 기반이었음
  • TECOD.EXE는 암호로 보호되어 있었고, 이 버전의 내장 암호는 코드에서 문자 순서를 흩어 저장한 TIMBOBIMBO였음
    • Tim Jenkin은 이 암호를 단순하지만 난독화해 프로그램 안에 넣음
    • ANC의 서로 다른 구성원에게 전달된 프로그램 버전마다 암호는 달랐음
  • 직접 실행하려는 사람을 위한 매뉴얼은 TECOD_HLP.pdf에 있음

당시 운용 방식에서 드러난 세부 사항

  • 예시 실행은 RANDOM.EXE로 키용 랜덤 데이터를 RANDATA.1에 만들고, PLAIN.TXT를 암호화해 PLAIN.BIN으로 바꾼 뒤 되돌리는 흐름이었음
  • 모든 암호 작업은 RAM 디스크에서 수행되도록 설계됨
  • 암호화 예시에서는 프로그램 파일 TECOD.EXETECOD.CNF가 A: 플로피 디스크에 있고, 키 파일이 들어 있는 데이터 디스크가 B:에 있으며, RAM 디스크가 R:에 있음
  • 암호화 단계에서는 RANDATA.1 파일 이름을 SNUM으로 바꿔야 했고, 복호화 단계에서는 B:의 RANDATA.1RNUM이라는 이름이어야 했음
  • 프로그램에는 사용 후 키 자료를 파기하는 동작, 생성된 랜덤 바이트 분포 검사, RAM 디스크 사용 강조가 포함되어 있었음

댓글과 토론

Hacker News 의견들
  • Vula에서 흥미로웠던 점은 시스템의 사용성 부족이 결국 몰락의 원인이 됐다는 것임
    자유를 위해 살인적인 정권에 맞선 매우 헌신적인 활동가들조차 시스템을 제대로 쓰지 못했음
    문서를 암호화하지 않은 채 남기고, 키는 쉽게 얻을 수 있었으며, 소프트웨어가 너무 번거로워 중요한 통신 일부가 평문으로 전송됐음
    PGP 설정과 올바른 사용이 얼마나 골치 아픈지는 모두 알고 있고, 결국 보안은 사용성
    Vula에 대해 조금 더 쓴 글: https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encr...

    • 집 열쇠를 잃어버리면 다시는 집에 들어갈 수 없다고 상상해보면 됨
      사용성은 대부분의 경우 보안성을 낮추는 방향으로 작용함
  • 보안용 일회용 패드의 난수 생성기를 봤는데, Melissa O'Neil이 좋아했을 만함. 거의 PCG에 가까움
    PowerBASIC 시스템 Rand 선형 합동 생성기(LCG)를 써서 새 rand1-3 함수 셋 중 하나를 고르고, 그중 둘은 서로 다른 LCG를 사용함
    https://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...

    • 일회용 패드 생성 방식은 꽤 안 좋아 보임. 서로 다른 생성기의 시드 상태를 복구하는 게 충분히 가능할 듯하고, LCG는 역공학이 매우 쉬움
      의사난수 생성기들이 시스템 난수 생성기로 시드되는 것처럼 보이므로, 결국 시스템 LCG의 초기 시드만 복구하면 일회용 패드를 역공학할 수 있음
      시스템 LCG의 시드 크기는 모르겠지만 32비트라면, 시드 상태를 그냥 무차별 대입하고 결과에 엔트로피 분석을 걸어 한 시간 안에 깰 수도 있을 것 같음
    • 원래 프로그래머가 암호학과 BASIC을 즉석에서 익혀가며 작성했다는 점도 있음
      “직접 암호를 만들지 말라”가 첫 번째 규칙이지만, 80년대 후반에 멋진 신기술을 다루던 상황이라면 예외처럼 보였을 수도 있음
    • 실제 일회용 패드로 쓰기에는 당연히 턱없이 부족함
  • 남아프리카공화국 아파르트헤이트 붕괴 전반이 꽤 흥미로움. 이런 측면은 거의 모르고 있었음
    재미있는 사실로, BDS 운동(보이콧, 투자 철회, 제재)이 여기서 시작됐고, 당시 다수는 아파르트헤이트가 절대 끝나지 않을 거라고 봤음
    하지만 오랜 시간 여러 압박 지점에서 지속적으로 압력이 가해지며 큰 스트레스를 만들었고, 그것이 붕괴로 이어졌음
    이 작업이 Toshiba T-100에서 이뤄졌다는 점도 꽤 흥미롭고, 멋진 컴퓨터임

  • 흥미로움. 남아공에서는 정말 많은 일을 겪어왔음. 지금의 GNU가 종말 시계를 뒤로 돌려주길 바람
    추천작은 Action Kommandant. 순교자이자 Bonteheuwel의 자랑인 Ashley Kriel의 삶을 엿볼 수 있음

    • Ashley Kriel의 이름을 알게 되어 반가움. ANC와 함께했던 재능 있는 동료들의 삶과 다양한 재능은 자주 가려지곤 해서, 그런 인물들을 배우는 데 관심이 많았음
      중등학교 영어 시간에 80년대 감시를 피해 남아공에서 캐나다로 떠난 급진적인 선생님을 통해 Athol Fugard를 알게 됐고, 시야가 열렸음
      남아공 사람들에게도 행운을 빔. 재능 있는 사람과 자연적 부가 많은 나라는 훨씬 더 나은 대우를 받아야 함. 적어도 ANC 내부의 경직된 정치 시대는 끝난 것처럼 보임
  • 무차별 대입용 Rust 코드: https://github.com/rhulha/ZipMcKracken

  • Operation Vula, 8비트 컴퓨터, DTMF 톤, 음향 커플러라니 흥미로움
    CIA/NSA가 내장 DES가 있는 상용 Philips PX-1000으로 Operation Vula가 운영된다는 낌새를 알아채고, Philips에 뇌물을 줘 제품에 뒷문을 심었음: https://www.cryptomuseum.com/crypto/philips/px1000/

    • Tim Jenkins는 자체 시스템과 자체 암호를 써서 그 문제를 우회했음
      뒷문 있는 DES가 아니라, 승무원이 플로피로 각 당사자에게 운반한 일회용 패드를 사용했음
      남아공에서 그런 플로피 하나가 잡히더라도 해당 수신자의 메시지만 노출되고, 결국 조만간 탐지될 수 있었음
    • 상용 암호화 기술을 어떤 것이든 쓰면 대체로 끝장이라고 봐야 함
      하지만 일회용 패드의 키를 의사난수 생성기로 만드는 건 순진한 방식임
      일회용 패드의 핵심은 진짜 무작위 키를 써서 진정한 보안을 얻는 데 있음. 여기서 사용한 식의 키라면 시드만 교환해도 로컬에서 만들 수 있었고, 그랬다면 승무원들을 위험에 빠뜨리지 않아도 됐을 것임
      개발자가 독학했고 그마저도 하면서 배운 상황이었다는 점은 이해하지만, 정말 중요한 비밀을 다루는 사람이라면 이런 실수는 하지 말아야 함
      다만 대량의 진짜 난수를 만드는 일도 쉽지 않음. 결국 직접 하드웨어 장치를 만들어야 할 텐데, 상용 장비는 대부분 조작되어 있을 가능성이 큼
  • “오래된” ZIP 암호를 깨야 하고 아카이브 안의 몇 글자를 알고 있다면 이보다 나은 건 없음: https://github.com/kimci86/bkcrack

    • 글 전체가 바로 그 프로그램에 대한 내용 아님?