web-dev-qa-db-ja.com

次のコピー防止を破るのはどれくらい簡単ですか?

ARMデバイス(Raspberry Pi)でLinuxカーネルを起動する起動可能なSDカードであるいくつかの作業をコピープロテクトしようとしています。私はこのアプローチを使用しています:

  1. このアプローチでは、initrdを使用して暗号化されたルートファイルシステムをマウントします。
  2. Initrdは、SDカードのCIDに従ってファイルシステムのパスワードを生成します。 (ハッシュ関数が使用されますが、md5またはsha1についてはまだ決定していません)。 Initrdは、生成されたパスワードを使用してファイルシステムをマウントしようとします。
  3. ここで最も興味深い/疑わしい部分があります。initrd自体はカスタムC関数を使用して暗号化され、基本的に各バイトはカスタムメイドの疑似ランダムジェネレーターを使用してXORされます。カーネルは、復号化機能として機能する同じ暗号化機能を持つように変更されています。
  4. システム自体が削除されているため、キーボードや外部ストレージを使用する方法はありません。 1つのアプリがフルスクリーンで実行されます。

したがって、ブートローダーがカーネルとinitrdをロードした後、カーネルはinitrdを復号化し、そのinitスクリプトを実行します。これにより、パスワードが生成され、ルートファイルシステムがマウントされます。

私の質問は:このセットアップを破るのはどれくらい簡単ですか(ルートファイルシステムを復号化し、SDカードから起動させるため)?最も弱い部分は何ですか?カーネルを逆コンパイルして、それらのカスタム暗号化関数を見つけるのはどれほど簡単ですか?

編集:明らかなことに時間を無駄にしないように、いくつかの修正があります:

  1. ルートデバイスはLUKS(aes256)で暗号化され、キーはSDカードのCIDとソルトを使用するHMAC機能によって生成されます。
  2. Initramfs暗号化の疑似ランダムアルゴリズムは実際にはRC4であり、キーをバイト配列に格納するだけで取得が非常に簡単になるため、カスタム関数を使用してキーのみが生成されます(これは隠すことによるセキュリティですしかし、他の方法はないようです)。
  3. SDカードエミュレーターを使用している場合、誰かがこのシステムのコピーを作成できることを理解していますが、これは非常に難しく、誰もこれを行うことができないため、私は問題ありません(また、誰もエミュレーターを扱いたくないでしょう)
11
dimovnike

この設定を破るのはどれほど簡単ですか(ルートファイルシステムを復号化し、任意のSDカードから起動するため)?

セットアップを「破る」のがどれほど難しいかは、ファイルシステム自体に署名/暗号化するために使用している方法のエントロピーのビット数によって異なります(これにより、ブルートフォースに使用できる一意の組み合わせの総数が決まります)パスワード)。

最も弱い部分は何ですか?

間違いなく、事前定義されたCIDをパスワードとして使用し、カスタムの疑似乱数生成関数を使用します。

SDカードのCIDは読み取り専用であるのは想定だけですが、この時代に非準拠のフラッシュメモリデバイスが見つかることは珍しくありません。 一部の人々 特定のSDカードでCIDを上書きする機能さえ示しています。これにより、パスワードのブルートフォース攻撃が容易になります。特に、クローンを作成した後、SDカードをエミュレートするだけの場合はそうです(これは他にも検討したいことです)。

最後に、あらゆる種類の疑似乱数ジェネレーターを使用すると、ランダムではないという理由だけで、すでにいくつかの固有の欠陥があります-(疑似乱数。事前に作成された暗号化されたブートローダー( TrueCrypt またはLUKSなど。どちらもRaspberry Piで動作します)を使用し、カーネルを手動で変更する必要がないようにすることをお勧めします。

カーネルを逆コンパイルして、それらのカスタム暗号化関数を見つけるのはどれほど簡単ですか?

何かを逆コンパイルするのは非常に難しいです。逆に、コンパイルされたアプリケーションのデアセンブリは簡単なことが多く、アセンブリを別の高級言語にリバースエンジニアリングするために使用できるツールはたくさんあります。攻撃者がコンパイルされたカーネルにさえアクセスできる場合、コードが意図的に難読化されていない限り、疑似乱数ジェネレーターのようなものを分析することはおそらく簡単です。


TL、DR:暗号化とセキュリティに関しては、車輪の再発明をしないでください。実証済みの真実に固執してください。すでに利用可能であり、RaspberryPiで正常に機能することが実証されているフルディスク暗号化オプションがいくつかあります。 SDカードのCIDを一種の「パスワード」として使用することは避けます。変更できない場合でも、この値をスプーフィングする方法があります。

コピー防止機能は、SDカードの仕様に [〜#〜] cprm [〜#〜] としてすでに含まれています。

7
Breakthrough

熟練した人なら、これをクラックするのにそれほど問題はないでしょう。エミュレーターでSDカードを起動し、RAMからキーを読み取るのは比較的簡単です。次に、コピー防止機能のないバージョンをPirate Bay(など)に投稿します。それだけです。

または、エミュレーターを使用して、実行中のエミュレートされたシステムにシェルコードを挿入します。次に、実行中のシステムを使用して、復号化されたrootfsをコピーします(またはdmsetup table --showkeysなどを使用してキーを読み取ります)。

すばやく検索すると、 Raspberry Piエミュレーター の存在が判明するため、作業の一部はすでに完了しています。

別の問題、特にこれがあります。

カーネルは、復号化機能として機能する同じ暗号化機能を持つように変更されています。

これを配布する人は誰でも、GPLの条件の下でカーネルソースコードを受け取る権利があります。したがって、逆アセンブルする必要はありません。diffを使用して追加の関数を見つけることができます。

(たとえば、チェックカーネルとストックカーネルを比較できるように、分解によってそれを見つけるのはそれほど難しいことではありません)

私はRaspberryPiのブートコードに完全には精通していませんが、埋め込まれた暗号化キーを使用してブートローダーを再フラッシュできる場合(カーネルに渡されます)、少なくともSDカードにはないので ' dエミュレータで起動する試みを阻止します。

1
derobert