12

iOS アプリのメモリから機密データを消去したいと考えています。Windows では、SecureZeroMemory を使用していました。現在、iOS では普通の古い memset を使用していますが、コンパイラがそれを最適化するのではないかと少し心配しています: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.html

コードスニペット:

 NSData *someSensitiveData;
 memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length);
4

2 に答える 2

5

771-BSIの言い換え(リンクはOPを参照):

memset 呼び出しがコンパイラによって最適化されないようにする方法は、memset 呼び出しの後に、コンパイラが場所を最適化しないようにする方法でバッファに再度アクセスすることです。これは次の方法で達成できます。

*(volatile char*)buffer = *(volatile char*)buffer;

memset()電話の後。

実際、secure_memset()関数を書くことができます

void* secure_memset(void *v, int c, size_t n) {
    volatile char *p = v;
    while (n--) *p++ = c;
    return v;
}

(コードは 771-BSI から取得しました。以前のコード提案の欠陥の可能性を指摘してくれた Daniel Trebbien に感謝します。)

volatileが最適化を妨げるのはなぜですか? https://stackoverflow.com/a/3604588/220060を参照してください

更新メモリ内の機密データもお読みください。なぜなら、iOS システムに敵がいる場合、敵がそのメモリを読み取ろうとする前であっても、多かれ少なかれ既に失敗しているからです。要約すると、SecureZeroMemory() または secure_memset() は実際には役に立ちません。

于 2012-04-02T14:30:09.080 に答える
0

問題は、NSDataが不変であり、何が起こるかを制御できないことです。バッファーがユーザーによって制御されている場合は、dataWithBytesNoCopy:length:を使用でき、NSDataがラッパーとして機能します。終了したら、バッファをmemsetできます。

于 2012-04-02T14:10:42.100 に答える