Q「暗号化機能がない（無効な）SSDのNANDには生データが書かれているのですよね？」 A「いいえ、加工されたデータです」

# はじめに
　NANDフラッシュメモリを記憶媒体とするSolid State Drive (SSD)に記録されたデータに対する不正アクセス対策としてセキュリティを高める方法としては、AESなどによる暗号化が一般的に知られています。

　実は、SSDの暗号化機能なし（無効状態）でSSDにデータをライトした場合でも、SSDに搭載されたNANDフラッシュメモリにはSSDコントローラにより**加工されたデータ**が記録されています。生データがそのまま記録されているわけではありません。

　このデータ加工方法は、加工されたデータがNANDフラッシュメモリメーカーの規定する性質を備える必要があり、SSDコントローラしか知り得ない様々なパラメータを用いて計算されます。このため、NANDフラッシュメモリに記録された（加工された）データを読み出して、そのデータを加工したSSDコントローラの力を借りずに元のデータを復元するという攻撃は**ほぼ成功しません**。

　ただし、上記データ加工の本来の目的はNANDフラッシュメモリに記録したデータの信頼性向上（低下抑制）であり不正アクセス対策（セキュリティ）ではないことに注意が必要です。

　今回の記事では上記「NANDフラッシュメモリにデータを書き込む際のデータ加工」について説明します。

# まとめ

* ホストがSSDに書き込んだデータはスクランブラにより加工されてNANDフラッシュメモリに書き込まれる
* スクランブラによるデータ加工はNANDフラッシュメモリの寿命を最大限活用するために必須
* スクランブラはSSDコントローラの機能でありコントローラなしでのデータ復元（デスクランブル）は困難

# SSDにおけるデータの流れ
　図1は、SSDの中でデータがどのように処理（加工）されてホストとNANDフラッシュメモリの間を行き来するか（データパス）のイメージを示したものです。この図は、2019年に開催されたFlash Memory Summitでの講演資料<sup>[1]</sup>を参考に作成したものです。

　なお、全てのSSDが図1に示した全ての機能を有するわけではありません。また機能を有していても図1と同じ順番に繋げられているとも限りませんのでご注意ください。

![SSDにおけるデータパス（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/74913079-5690-b5e2-ef34-18cc9536d5a6.png "SSDにおけるデータパス（イメージ）")
図1：SSDにおけるデータパス（イメージ）

　各機能の概要は以下の通りです。

* **End-to-End Data Path Protection**：NANDフラッシュメモリを除くSSD内部で発生するデータ誤りの包括的検出用機構。CRC16が多い。
* **Compression**：圧縮エンジン。NANDフラッシュメモリに書き込むデータサイズの削減が目的。使用するアルゴリズムにより特性は異なる。
* **Encryption**：暗号エンジン。AESが多い。
* **ECC**：誤り訂正エンジン。最新の3D NANDフラッシュ向けとしてはLDPCが一般的。
* **Scrambler**：スクランブラ。NANDに書き込むデータがNANDメーカー規定の特徴を有するように加工する。

　このうちEnd-to-End Data Path Protection（以降E2EDPPと記載）とECCのエンコーダは、入力データをエンコードして誤り検出に用いるパリティを出力するものです。入力データを加工するものではありません。

　これに対し、圧縮、暗号、スクランブラ、の3つは、入力データを加工したデータを出力します。つまり、入力データと出力データが異なります。

# 一般的なSSDの場合
　私たちが普通に店頭で購入できるSSDは、出荷状態ではE2EDPPなし、圧縮なし、暗号化無効、という設定の製品が多いです。そのようなSSDでは、ホストからデータを書き込む際のデータの流れが図2のようになります。

![ECCとスクランブラのみが有効なSSDにおけるデータパス（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/30385914-a4d6-d7b3-a638-144320255026.png "ECCとスクランブラのみが有効なSSDにおけるデータパス（イメージ）")
図2：ECCとスクランブラのみが有効なSSDにおけるデータパス（イメージ）

　ホストから書き込まれたデータは、スクランブラに入力されるまで加工されることはなく、ホストから書き込まれた値をそのまま維持します。スクランブラは入力データ（＝ホストから書き込まれた生データ）をNANDフラッシュメモリへの書き込みに適したデータに加工します。

　このため、ホストからどのようなデータが書きこまれても、SSDのNANDフラッシュメモリにはスクランブラにより加工されたデータが書き込まれます。例えば、**ホストからオール0やオール1のデータが書き込まれても、NANDフラッシュメモリにオール0やオール1のデータが書き込まれることはありません**。

# なぜスクランブルするのか
　上記の通り、スクランブラは、NANDフラッシュメモリにデータを書き込む直前に位置し、NANDに書き込むデータがNANDフラッシュメモリメーカー規定の性質を備えるようにデータを加工します。

　スクランブルの目的は、NANDフラッシュメモリに記録したデータの信頼性向上（低下緩和）と、NANDフラッシュメモリ（メモリセル）の長寿命化です。

　そもそも、メーカーから示されるNANDフラッシュメモリの仕様に記載される記録したデータの信頼性（リテンション）と寿命（書き換え回数）は、**スクランブラにより適切に加工されたデータがNANDフラッシュメモリに書き込まれることが前提です**。

　スクランブラにより加工されたデータに求められる性質は、NANDフラッシュメモリメーカーにより異なりますが、少なくと0と1の出現頻度に偏りのないデータであることが求められます。

　書き込むデータにこの性質が求められる理由として、第一に隣接ワードライン（のメモリセル）間の影響平準化が挙げられます。そしてあるワードラインに注目した場合に特定のメモリセルに高い電圧（負荷）がかかり続けることを避けて全てのメモリセルにできるだけ少ない回数でかつ均等に負荷をかけること、も挙げられます。つまり「**ミクロなウェアレベリング**」と言えます。

　隣接ワードライン間の影響とは、NANDフラッシュメモリの構造に起因するものです。図3は3D NANDフラッシュメモリのワードラインとメモリセルの簡略化した構造イメージです。

![3D NANDフラッシュメモリのワードラインとメモリセルの関係（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/7bad6729-e300-fae0-4018-70903b795532.png "3D NANDフラッシュメモリのワードラインとメモリセルの関係（イメージ）")
図3：3D NANDフラッシュメモリのワードラインとメモリセルの関係（イメージ）

　3D NANDフラッシュメモリは、図3に示したようにワードラインが何層にも積層されていて、ワードラインを貫いた場所（より正確には貫いた側壁部分）にメモリセルが構成されます。

　このメモリセルに対して「隣接メモリセル」が定義されます。図3の例では、メモリセルAの隣接メモリセルを、両隣のワードラインのメモリセルと同じワードラインの両隣のメモリセルの合計8つとしています。

　あるメモリセルに対してどのメモリセルが影響を考慮すべき隣接メモリセルかは、NANDフラッシュメモリメーカーやメモリの世代により異なります。

　この隣接メモリセルが重要なのは、隣接するメモリセル間の距離および隣接するワードライン間の距離が短くなることで、あるメモリセルにデータを書き込む際に隣接メモリセルの状態（蓄えられた電荷、つまり記録されたデータ）の影響を受けやすくなるからです。

　図3のメモリセルAに注目した際に、隣接メモリセルであるメモリセルa～hが蓄えられた電荷が多い（＝電圧が高い）メモリセルばかりだと、メモリセルAの電圧もそれらに影響を受けて高くなり、結果的にメモリセルAに意図したレベルに書き込めないもしくは書き込まれたデータの信頼性が低下します。

　このような隣接メモリセル間の影響をできるだけ平準化するためにスクランブルが必要になります。

　一方、メモリセルに高い電圧（負荷）がかかり続けるのを避けることは、NANDフラッシュメモリに蓄えられた電荷と記録されたデータの対応関係に起因します。

　図4は、TLC NANDフラッシュメモリにおける、セルが蓄える電荷（＝電圧レベル）と対応する値の対応関係（エンコーディング）の例<sup>[2]</sup>です。

![NANDフラッシュメモリにおけるメモリセルの電圧レベルと対応する値（エンコーディング）の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b0f143c3-c349-f99e-ae53-f4ca5c46e70e.png "NANDフラッシュメモリにおけるメモリセルの電圧レベルと対応する値（エンコーディング）の例")
図4：TLC NANDフラッシュメモリにおけるメモリセルの電圧レベルと対応する値（エンコーディング）の例

　図4のエンコーディングを採用したNANDフラッシュメモリに「オール1」のデータを書き込み続けると、メモリセルには毎回「電圧レベルF」相当の電圧つまり負荷がかかります。「電圧レベルF」は相対的に高い電圧であり、メモリセルにとり強い負荷です。

　メモリセルに強い負荷をかけ続けるとメモリセルのデータ保持特性が悪化しますので、記録したデータの信頼性が低下し、かつメモリセルの寿命が短くなります。

　ただ、どのようなデータがホストから与えられてもNANDフラッシュメモリの全てのメモリセルにかける電圧を常に低くすることは無理ですので、いずれかのメモリセルの電圧レベルが高い時にほかのいずれかのメモリセルにかかる電圧が高くなることはやむを得ません。

　このような理由から、NANDフラッシュメモリメーカーは、メモリセルに書き込むデータ（電圧レベル）に対して、全ての電圧レベルの出現頻度に偏りがないことを求めるわけです。

　このスクランブルにより、ホスト視点では同じデータを同じアドレス(LBA)に書く（上書きする）場合、よりNANDフラッシュメモリに近い視点では同じ元データ（スクランブル前のデータ）を同じアドレス（NANDフラッシュメモリ上の位置）に書く場合でも、毎回異なるデータが書き込まれます。

# スクランブラの制御はコントローラの役割

　このように、スクランブラはNANDフラッシュメモリを優しく使用して寿命を最大限引き出すために重要な機能です。3次元化して構造が複雑化を増した最近のNANDフラッシュメモリでは、スクランブル時に考慮が必要な要素も増えています。

　スクランブラを制御するのは、図1と図2に示した通りSSDコントローラの役割です。実際には、周期の長い系列を生成する数式（生成多項式）を利用したりテーブル（表）を参照したりして、NANDフラッシュメモリメーカーが示す要求を満たすような偏りのない疑似乱数系列を生成します。

　結果として、NANDフラッシュメモリに記録されたデータは、そのデータを書き込んだコントローラ、より正確に言えばNANDフラッシュメモリに書き込んだデータをスクランブラにより生成したコントローラでなければ、元データつまりホストからSSDに書き込まれたデータを復元することは困難です。

　つまり、SSDからNANDフラッシュメモリだけを剥がして記録されたデータを読み出し、スクランブルされる前のデータ（生データ）を盗む、ということはとても難しいのです。

# まとめ

　今回の記事では、「SSDに書き込まれているデータはホストから書き込まれたデータそのもの（生データ）ではない」ということを説明しました。これはSSDコントローラが備えるスクランブラという機能によるものです。

　一見、不正アクセス対策（セキュリティ）に有効であるように見えますが、スクランブラが行うデータ加工の本来の目的はNANDフラッシュメモリに記録したデータの信頼性向上（低下抑制）であることに注意が必要です。

# References
[1] Roman Pletka, _"NAND Flash Media Management Algorithms,"_ Flash Memory Summit 2019, Santa Clara, CA, August 2019
[2] Shun Suzuki, et al., _"Endurance-based Dynamic VTHDistribution Shaping of 3D-TLC NAND Flash Memories to Suppress Both Lateral Charge Migration and Vertical Charge De-trap and Increase Data-retention Time by 2.7x"_, in Proceedings of 48th European Solid-State Device Research Conference (ESSDERC), pp.150 -- 153, Dresden, Germany, October 2018

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。