web-dev-qa-db-ja.com

PKCS#11セッションオブジェクトのセキュリティ

CKA_TOKEN属性は、オブジェクトがトークンオブジェクトであるかセッションオブジェクトであるかを識別します。

PKCS#11オブジェクトのCKA_TOKEN属性がtrueに設定されている場合、PKCS#11対応デバイスのメモリ内に安全に格納されていると考えられます。たとえば、秘密のAESキー、特にそれが抽出できない場合。

セッションキーとそのセキュリティはどうですか?

セッションが閉じられると、アプリケーションがオブジェクトを「使用」している他のセッションがあったとしても、セッションによって作成されたすべてのセッションオブジェクトは自動的に破棄されます。

それで、私のセッションを盗聴できる誰かが私の秘密鍵のクリアテキストの値を見ることができるでしょうか?たとえば、2つのエンドポイント間でキーを変換したい場合、キーをラップ解除して別のキーでラップする必要があります。つまり、セッションのどこかでクリアテキストでしばらく表示される必要があります。システムメモリにありますか?それとも何らかの方法で保護されていますか?

3
user1563721

物理ストレージの特性は、PKCS#11の定義の一部ではありません。 PKCS#11は [〜#〜] api [〜#〜] です。実際のテクノロジーではなく、関数呼び出しに関するライブラリの動作を定義します。すべてのキーがRAMにある、純粋にソフトウェアのPKCS#11ライブラリは完全に可能です(これが、Firefox Webブラウザーが内部で使用しているものです)。

CKA_TOKENが有効になっていると、キーはpermanentになるはずです。つまり、新しいセッションを開いた後にキーが返されます。使用中または保管中は、必ずしもいかなる種類の保護も必要としません。 CKA_EXPORTABLEと呼ばれる別の属性があり、キーをエクスポートできるかどうかを宣言します。ただし、ここでも攻撃を限定するものではなく、エクスポート関数を呼び出した場合に得られるものだけです。 PKCS#11ライブラリの実装方法によっては、すべてのキーがRAM=に浮かぶ場合があります。

キーがどこにあるかを正確に知りたい場合は、PKCS#11ライブラリがあるデバイスまたはシステムのドキュメントを参照する必要があります。デバイスが [〜#〜] hsm [〜#〜] であり、HSMのドキュメントで、HSMに格納されている秘密鍵がデバイスから離れないことが保証されている場合、それらはコピーされないことがわかりますRAM-PKCS#11関連の属性が原因ではなく、HSMがそれを行うためです。PKCS#11ライブラリは、HSMサービスのコンシューマにすぎません。


そうは言っても、いくつかの推論を行うことは可能です。たとえば、暗号化デバイスがスマートカードである場合、そのI/O機能は非常に制限されているため(9600ボーが一般的)、PKCS#11 APIによって提供されるバルク暗号化(AES)はソフトウェアで処理される可能性があります。秘密のラップされていないAESキーは、実際にはPCのRAMのどこかにあります。

4
Thomas Pornin