- 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.ZIP과 CODMAY93.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.EXE와TECOD.CNF가 A: 플로피 디스크에 있고, 키 파일이 들어 있는 데이터 디스크가 B:에 있으며, RAM 디스크가 R:에 있음 - 암호화 단계에서는
RANDATA.1파일 이름을 SNUM으로 바꿔야 했고, 복호화 단계에서는 B:의RANDATA.1이 RNUM이라는 이름이어야 했음 - 프로그램에는 사용 후 키 자료를 파기하는 동작, 생성된 랜덤 바이트 분포 검사, RAM 디스크 사용 강조가 포함되어 있었음