2 ポイント 投稿者 GN⁺ 2024-09-08 | 1件のコメント | WhatsAppで共有
  • 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にまとめてパスワードを設定した
    • その後、南アフリカではコードを開く必要がなく、数年後に再び開こうとしたときにはパスワードを覚えていなかった
    • アクセスできたファイル1つは非常に初期の版で、残りは暗号のため展開できなかった

古い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秒で見つけられ、適切な平文選択が攻撃速度に大きく影響することが分かった

復号されたコードの実行

  • 2つのプログラムは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は乱数データ生成のために3種類の乱数生成アルゴリズムを使っており、そのうち1つはユーザーが直接入力するランダムキーに基づいていた
  • 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ディスク使用の強調が含まれていた

1件のコメント

 
GN⁺ 2024-09-08
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 関数セットのうち 1 つを選び、そのうち 2 つはそれぞれ別の LCG を使っている
    https://github.com/Vulacode/RANDOM/blob/d6a1a1d694b22e6a115b...

    • その ワンタイムパッドの生成方式はかなり良くなさそうに見える。異なる生成器のシード状態を復元するのは十分可能そうだし、LCG はリバースエンジニアリングが非常に簡単
      擬似乱数生成器群はシステムの乱数生成器でシードされているように見えるので、結局システム LCG の初期シードさえ復元できれば、ワンタイムパッドをリバースエンジニアリングできる
      システム LCG のシードサイズは分からないが、32 ビットならシード状態を総当たりして結果に エントロピー解析をかければ、1 時間以内に破れるかもしれない
    • そもそも元のプログラマーが暗号学と BASIC をその場で学びながら書いたという事情もある
      「自分で暗号を作るな」が第一のルールだが、80 年代後半にクールな新技術を扱っていた状況なら、例外のように見えたのかもしれない
    • 実際の ワンタイムパッドとして使うには、当然ながらまったく不十分
  • 南アフリカ共和国の アパルトヘイト崩壊全般はかなり興味深い。この側面はほとんど知らなかった
    面白い事実として、BDS 運動(ボイコット、投資引き揚げ、制裁)はここから始まり、当時の多数派はアパルトヘイトが決して終わらないと見ていた
    しかし長い時間をかけて複数の圧力点に継続的に圧力がかかり、大きなストレスを生み、それが崩壊につながった
    この作業が Toshiba T-100で行われたという点もかなり興味深く、いいコンピューターだ

  • 興味深い。南アフリカでは本当に多くのことが起きてきた。今の GNU が終末時計を戻してくれることを願う
    おすすめは Action Kommandant。殉教者であり、ボンテヘウウェルの誇りである 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 ではなく、乗務員がフロッピーで各当事者に運んだ ワンタイムパッドを使っていた
      南アフリカでそのようなフロッピーが 1 枚捕まっても、その受信者宛てのメッセージだけが露出し、いずれ近いうちに検知できたはずだった
    • 市販の暗号化技術を 何であれ使えば、たいていは終わりだと考えるべき
      ただしワンタイムパッドの鍵を 擬似乱数生成器で作るのはナイーブなやり方だ
      ワンタイムパッドの核心は、真にランダムな鍵を使って本物の安全性を得ることにある。ここで使われたような鍵ならシードだけを交換してローカルで生成できたはずで、そうしていれば乗務員を危険にさらす必要はなかった
      開発者が独学で、しかも作りながら学んでいた状況だったことは理解するが、本当に重要な秘密を扱う人なら、このようなミスは避けるべきだ
      とはいえ、大量の真の乱数を作ることも簡単ではない。結局は自前のハードウェア装置を作る必要があるだろうが、市販機器はほとんどが改ざんされている可能性が高い
  • 「古い」 ZIP 暗号を破る必要があり、アーカイブ内の数文字を知っているなら、これ以上のものはない: https://github.com/kimci86/bkcrack

    • 記事全体がまさにそのプログラムについての内容ではないの?