4

この記事によると http://blog.gdssecurity.com/labs/2013/3/5/retrifying-crypto-keys-via-ios-runtime-hooking.html

Apple の doCipher:key:context:padding メソッドのサンプル コードhttp://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.htmlには「悪い慣行があります。次のコード スニペットは、それを示しています。 16 バイトの 0x0 の静的 IV を使用します。

 // Initialization vector; dummy in this case 0’s.

uint8_t iv[kChosenCipherBlockSize];

memset((void *) iv, 0x0, (size_t) sizeof(iv));

素人の言葉でそれが本当に悪いのはなぜですか、そしてそれを修正する方法は?

私が理解しているのは、そのコードをフックして対称キーを傍受できるということだけです。しかし、これを防ぐ理由と方法がわかりません。

4

2 に答える 2

4

その投稿で概説されているコードは、初期化ベクトルがランダムな値であるという規則に従っていないため、安全ではありません。これを書いたエンジニアが次のようにコメントしていることに注意してください。

//... dummy in this case 0’s.

固定サイズの真の初期化ベクトル (ブログでは IV と呼んでいます) は、暗号関数に渡されるバッファを同じ値で何度も割り当てることはありません。代わりに、バッファに含まれるデータを毎回ランダム化します。著者が行ったように、提供されたサンプル コードを見て、その場所を推測することはできませんでした。への呼び出しを切り取るだけmemset()で、そのメモリ ブロックはランタイムによって「ジャンク」で満たされます。技術的なことを知りたい場合は、memset()疑似乱数データを生成してそのローカルのメモリを上書きする独自のバージョンを作成してください。

于 2013-05-18T21:43:50.063 に答える
3

Classes_SecKeyWrapper.mでは、CCCryptorCreate の呼び出しで初期化ベクトル (IV) が使用されていることがわかります。これは、デフォルトで暗号ブロック連鎖 (CBC) モードを使用します ( CommonCryptor.hに記載されています)。

CBC モードは、暗号化する前に各ブロックを次のブロックと XOR し、2 つの同一のブロックが同じ結果を生成しないようにします。最初のブロックには XOR する前のブロックがないため、「初期化ベクトル」と呼ばれるブロックを作成する必要があります。これにより、最初のブロックの出力がランダム化され、リプレイ攻撃または選択暗号文攻撃の可能性が低くなります。

CBC モードでは、初期化ベクトルは CCCryptorCreate への呼び出しごとにランダムかつ一意である必要があり、暗号化コードと復号化コードで使用する必要があります (したがって、結果を復号化したい人にメッセージと共に送信する必要があります)。

Apple のサンプル コードにはdummy in this case 0's. ダミーは本物の代用なので、元の作者は問題を認識していて、わざと簡単な例を書くことを選択しただけだと思います。

于 2013-05-19T19:13:03.050 に答える