HN 日本語サマリー

← 一覧へ戻る
セキュリティ

USBドライブに隠された暗号化ボルトを構築する

My USB Drive Has a Hidden Encrypted Vault (rootkitlabs.com)

268 pointsby machinehum144 コメント

要約

この記事では、プライバシー保護と検閲回避を目的としたオープンソースのUSBドライブ「Phantomdrive」を紹介しています。このデバイスは、通常8GBのドライブとして認識され、パスワードで保護された隠しボリュームにAES-256暗号化を適用します。設計は完全にオープンソースであり、CH569チップとSDカードを使用しています。

全文翻訳

この記事は人間が人間向けに書いたものです。多くの場所ではプライバシー法が尊重されておらず、特定の状況ではメディアの暗号化を解除させられたり、さらに悪いことに、有罪とみなされたりする可能性があります。VeraCryptの隠しボリュームは前者の状況では役立ちますが、後者には役立ちません。だからこそ私はPhantomdriveを作りました。Phantomdriveは、最初に接続されたときに8GBのドライブとして認識される、完全にオープンソースのUSBドライブです。OSがディスクの残りの部分を検出する方法はありません。ユーザーがパスワード:PUTYOURPASSWORDHEREという内容のプレーンテキストファイルをディスク上で編集すると、デバイスはアンマウントされ、2番目の隠しセクションを再マウントし、AES-256でインプレース暗号化/復号化を行います。Phantomdriveを使えば、権威主義的な政府関係者、腐敗した警察、そして基本的な暗号化の権利を尊重しない他の誰かをすり抜けられることを願っています。 設計 すべてが完全にオープンソースです:ファームウェア、ハードウェア、機械工学。デバイスの設計に使用したツールもオープンソースです。設計に入りましょう。 このプロジェクトでは、CH569という興味深い小さなチップを使用しました。これは、ほぼすべての模倣Arduinoに見られるUSB-シリアルチップ(CH340)と同じ会社が製造しているものです。このプロジェクトでは、USB3、SD/eMMC、およびAESブロックを利用しています。上記で見られるSM4暗号化ブロックは、中国では商用暗号化のために標準化されているようです - Wikipedia。AIの需要によりeMMCメモリのコストが異常に高いため、メモリにはSDカードを選択しました。SDカードは分解されれば誰かが見つけるでしょうが、もちろんすべて暗号化されています。ケースはエポキシで接着したので、攻撃者が内部に入ろうとすればデバイスを破壊する必要があります。これが要件に合わない場合は、他を探すことをお勧めします😊 eMMCの価格が下がれば、それを使用するバージョンが登場するでしょう。 デバイスはシンプルで、CH569、USBポート、2つのバックコンバータ、ファームウェアアップデート用のボタン、SDカード、およびいくつかのサポートコンポーネントのみです。ファームウェア開発に役立つUARTテストポイントもあります。 暗号化 私のリポジトリで「人々」がいくつかのAI生成のGitHubイシューを開いたときに通知を受け取っていませんでした。それらは、すでにパッチが適用された問題、AIの幻覚、および誇張された小さな問題の混合を概説していました。私が寝ている間に、Redditはすぐにこれに群がりました。これは私の大きな失敗でした。少なくとも、人々がイシューを開いていることに気づくべきでした。それらのほとんどは問題ではありませんでしたが、AES-XTSだけは例外で、後で説明します。 デバイスのセキュリティに関しては、機能テストでこれを検証しました。これにより、暗号化が機能しており、OpenSSLの実装のAESに対して検証されていることを確認できます。 キー導出関数(KDF) KDF、または「キー導出関数」は、暗号化で使用するキーを生成するために使用される関数です。最もひどいAESキー導出方法から始めましょう。 $$ K = Pw || 0x000 $$ パスワードを取得し、それを32バイト(AES-256の場合)になるまでゼロを追加して、キーとします。糟糕なパスワード、「password1234」のようなものであれば、数分で総当たり攻撃できます。良いパスワードであれば数時間、本当に良いパスワードであれば数年から数十年になります。しかし、攻撃者が事前に計算されたキーテーブルを使用したらどうでしょうか?これは、彼らが何も計算する必要がないことを意味します。この問題に対処するためにソルトを追加します。 $$ K = Pw || salt || 0x000 $$ すべてのデバイスにユニークなソルトがあれば、攻撃者はデバイスごとにキーを計算する必要があります。そのため、ルックアップテーブルの問題はなくなります。ソルトが異なるため、SDカードをあるデバイスから別のデバイスに取り出して使用することはできません。ソルトを取得する方法は次のとおりです。 udevadm info --query=property --name=/dev/sdc | grep ID_SERIAL_SHORT ID_SERIAL_SHORT=Phantomdrive:34FC1FA7145467F7 したがって、34FC1FA7145467F7はこのデバイスのソルトであり、デバイスが壊れた場合にデータ復旧に必要です。FYI: ファームウェアを変更してステルス性を高めることで、「Phantomdrive」やUSB PID/VIDを好きなものに変更できます。 次に、攻撃者が非常に強力なマシンを持っており、ソルトを取得し、独自の「テーブル」を計算すると仮定しましょう。これを少し難しくするために、KDFに100,000回のSHA-256ラウンドを追加します。 $$ K = sha256(sha256(sha256(Pw || salt || 0x000))) … 100k $$ 100kラウンドを選択したのは、デバイスのロック解除に約3秒かかるためです。それ以上増やすと時間がかかります。Argon2のようなメモリハードなアルゴリズムは使用できません。ロック解除手順が5秒を超えないように、これより良い方法があればぜひ聞きたいですが、現時点ではこのデバイスの計算能力の限界に達しています。より高いセキュリティが必要な場合は、KDF SHA256ラウンド数を増やすか、別のデバイスを探すか、このデバイスをソフトウェアソリューションで二重に暗号化することができます。暗号化をオフにして、ソフトウェアベースの暗号化のみを使用することも可能です。 AESモード AESはブロック暗号であり、固定(16バイト)のデータ量を暗号化および復号化できます。これをストリーム暗号にするためのさまざまなモードがあります。 AES-ECB AES-ECB、またはElectronic Codebookは、ストリーム暗号を作成する単純な方法です。ストリーム内の各16バイトのプレーンテキストブロックを単純に暗号化します。完了!ストリーム暗号ができました。これはいくつかの理由で安全ではありません。同じプレーンテキストブロックは同じ暗号文ブロックを生成するため、拡散性が欠如します。攻撃者は暗号文からデータを削除でき、復号化されたときにプレーンテキストが予測可能な方法で変更されます。したがって、これは良い方法ではありません。 AES-CTR AES-CTR、またはCounterは、上記の問題を解決する方法です。単純な方法で、カウンターをAESで暗号化し、その出力をクリアテキストとXORします。 uint64_t i = 0; while(i < len(ciphertext)) { ctr = aes_encrypt(i); ciphertext[i] = plaintext[i] ^ ctr i++; } これは擬似コードですが、要点はつかめるでしょう。このモードを使用する際には、「カウンターの再利用」というセキュリティリスクに注意する必要があります。攻撃者が暗号文を回復し、デバイスを元に戻します。あなたは新しいデータをたくさん書き込みます。攻撃者は再び暗号文を回復します。攻撃者が一方の暗号文を推測できれば、もう一方の暗号文を回復できます。このデバイスでは、AES-CTRで約9MB/sの書き込みと20MB/sの読み取り、AES-XTSで6MB/sの書き込みと10MB/sの読み取りが得られています。私にとっては、速度に対するセキュリティ上の利得は十分ではないため、AES-XTSに移行する価値はありませんが、あなたの場合は完全に異なるかもしれません。 AES-XTS AES-XTS、またはTweak Codebook Modeは、ディスク暗号化の標準です。2つのキーを使用します:K1はデータキー、K2はツイークキーを生成します。ディスクセクターごとに、セクター番号Sからツイークキーを計算する必要があります。 $$ T_n = AES(K_2,S) $$ 各16バイトブロックは独自のツイークを取得するため、T0、T1、T2...Tnが得られます。次に、プレーンテキストPのブロックごとに暗号化して、最終的な暗号文Cを取得します。 $$ C_n = AES(K_1, (P_n igoplus T_n)) igoplus T_n $$ これは上記のカウンター再利用の問題を解決しますが、少し遅くなります。 ファームウェア 2つのプロジェクトを使用しました。そのメンテナーに感謝します。 チップ用のライブラリ(BSP) https://github.com/hydrausb3/wch-ch56x-lib ISPプログラミングライブラリ https://github.com/hydrausb3/wch-ch56x-isp ファームウェアで興味深いかもしれないいくつかの部分があります... パスワードのスヌーピング デバイスは実際にはファイルシステムを認識しておらず、USB WRITE10/READ10コマンドを受け取り、それをSDカードのCMDxコマンドに変換するだけです。そのため、アンロックの魔術を行うには、生のデータを調べます。アンロック状態では次のようになります。 void phantomdrive_snoop_write(uint8_t *buf, uint32_t len) { const char *prefix = "password:"; const size_t prefix_len = 9; uint32_t i; for (i = 0; i + prefix_len <= len; i++) { if (buf[i] != 'p') continue; if (memcmp(buf + i, prefix, prefix_len) != 0) continue; size_t pw_start = i + prefix_len; size_t pw_end = pw_start; while (pw_end < len && (pw_end - pw_start) < sizeof(pending_pw) && buf[pw_end] != '\n' && buf[pw_end] != '\r' && buf[pw_end] != '\0') pw_end++; size_t pw_len = pw_end - pw_start; // Copy the password into