45611


[Basic HTTP auth with Scotty](https://ro-che.info/articles/2016-04-14-scotty-
http-basic-auth)を読んで、`Data.SecureMem`というモジュールを使うと、タイミング攻撃を防止（軽減？）できることを知りました。

その後SecureMemについて調査してみたのですが、あまり情報がなく、唯一参考になりそうなのが[`Data.SecureMem`のドキュメント](http://hackage.haskell.org/package/securemem-0.1.10/docs/Data-
SecureMem.html)の次の記述でした。

> SecureMem is a memory chunk which have the properties of:  
>  ● Being scrubbed after its goes out of scope.  
>  ● A Show instance that doesn't actually show any content  
>  ● A Eq instance that is constant time

そこで質問なのですが、これら３つの性質が一般的にはどのようなセキュリティ上の利点をもたらしてくれるのか、特にタイミング攻撃に対してなぜ有効なのか、そして「定数時間での比較」とは何を意味するのかを教えてください。


CC BY-SA 4.0
2018-07-14T05:53:41.600
45608
2018-07-14T13:41:48.667
13199
question
security haskell
SecureMemを使用することのセキュリティ上の利点について


>   * Being scrubbed after its goes out of scope.
>

上記は、不要になったスコープ外の変数をクリアすることで、プログラム実行時のメモリイメージから機密データが漏洩するのを防止しているのだと思います。

>   * A Show instance that doesn't actually show any content
>

上記は、インスタンスの文字列変換時に`<scrubbed-
bytes>`といった固定の文字列に変換することで、デバッグやログ出力時などに、機密データが漏洩するのを防止しているのだと思います。

>   * A Eq instance that is constant time
>

タイミング攻撃は、データ比較時などの処理時間の差を分析して機密データを検出する攻撃です。  
そのため、データ比較時間が常に一定であれば防ぐことができます。  
(参考: [実装の隙を突く「タイミング攻撃」とは？](https://corgi-lab.com/programming/timing-attack/) )

[hs-securemem/cbits/utils.c#L73](https://github.com/vincenthz/hs-
securemem/blob/master/cbits/utils.c#L73)にあるように、配列の全ての要素を常に比較することにより、データ比較時間を一定にし、タイミング攻撃を防止しているのだと思います。

[code]

    for (i = 0; i < size; i++)
            acc &= (p1[i] == p2[i]);
        return acc;
    
[/code]

一方、以下のような比較処理の場合、データ内容によりループ回数が変わるため、処理時間の差を利用したタイミング攻撃の対象となります。

[code]

    for (i = 0; i < size; i++) {
       if (p1[i] != p2[i])
         return 0; // 不一致を返却
    }
    return 1; // 一致を返却
    
[/code]


CC BY-SA 4.0
2018-07-14T12:14:15.923
45611
2018-07-14T13:41:48.667
2018-07-14T13:41:48.667
45608
answer


あまり自信がないのですが、

> ● Being scrubbed after its goes out of scope.

変数のスコープを抜けたとき、つまりその変数が不要になったときにそのセキュアなデータの乗ったメモリーの領域を別のデータ（ランダム値など）で上書きすることだと思います。そうすることで例えば別のプログラムなどがその領域を利用した場合にデータが漏れることが防げます。

> ● A Show instance that doesn't actually show any content

これはうっかり `show` してしまっても大丈夫なようにということでしょうか。（あまり分かりません。）

> ● A Eq instance that is constant time

true もしくは false
が返るまでにかかる時間によって比較対象の隠されてる値が推測できるので「定数時間での比較」をすることでそれを防げるということだと思います。例えば文字列の比較などで単純な先頭からの比較の場合、“abc”
に対して “a” と “b” では結果の返る時間に差ができてしまいます。


CC BY-SA 4.0
2018-07-14T12:14:39.707
45612
2018-07-14T12:14:39.707
153
45608
answer