Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

USBメモリ、SDカードの容量詐欺、偽装を検査する

USBメモリの容量詐欺、偽装検査

f:id:espio999:20210527204501p:plain
USBメモリを頂いた。容量128GBだ。面白いことに、スマートフォンに挿入すると256GBと認識された。PCでフォーマットしても、やはり256GBだ。

USBメモリやSDカードの類には、容量詐欺と呼ばれる製品が紛れている。パッケージには128GBと記載しているのに、実際には32GBしか搭載されていないような、羊頭狗肉のような製品だ。このような製品であれば、記録されている容量よりも、実容量は少ないのが常なのだが、今回は逆のケースだ。多い分には不審に思われない、とでも当事者は期待しているのだろうか。

このような製品に遭遇したことがなく、実際に触れた機会もないため、当然、調べ方も分からない。調べ方を確かめて、実際に確認するための良い機会と捉え、試してみることにした。

調べ方とツール-H2testw

調べると言っても、理屈は単純だ。記録領域にデータを書き込み、書き込まれたデータを確認する。これを全記録領域に対して実施する。もし認識されている容量よりも実容量が少なければ、どこかのタイミングでDATA LOSTが生じる。書き込まれたデータが確認できない、あるいはそもそも記録されていない、記録できない、ということだ。

製品によっては、OSがエラーを表示しないよう工夫している場合もあるようだ。例えば、記憶領域からあふれたデータは、また記憶領域のの先頭に戻って記録される。
言うなれば、画用紙の上から下へ線を引き続けるとしよう。画用紙下端まで到達したが、まだ線を引き続ける必要がある。本来であれば、ここでエラーを申し出るのだが、黙って上に戻り、今まで線を引いたところを、足りない分だけ上書きしていくのだ。

この仕掛けも考慮して、しらみつぶしに記憶領域の健全性を確認してくれるのが、H2testwだ。具体的には、特定のセクターに最大1GBのファイル(H2Wファイル)を記録する。これを繰り返し、記憶領域を埋め尽くす。今回の場合、約1GBのファイルが250個作成された。そして、一つひとつファイルを検証していくのだ。
f:id:espio999:20210527231322p:plain

H2testw writes files of up to 1 GByte to the chosen destination and names them 1.h2w, 2.h2w, 3.h2w and so on. If the target directory alread contains such a set of files H2testw will offer to verify them. If there are any other files named *.h2w it will refuse to work.

特定のセクターに障害があれば、そこにファイルを記録できない、あるいは記録したものの正しく読み込めず、該当箇所だけがエラーとなる。
容量偽装の場合は、あるタイミングから、書き込み先となる記憶領域のアドレス指定が不適切となるため、記録できない、あるいは記録したものの正しく読み取れない、と言ったエラーが延々と続くことになる。

このような確認を「しらみつぶし」に対応するだけあり、検査には時間がかかる。今回の事例での経過時間は、後述する。
www.heise.de

ちなみに、もし認識されている容量よりも実容量が多ければ、それは「ラッキーでしたね」というところだが、健全な製品において、それはありえないだろう。

実際にやってみる、その前に...

実際のところ、今回の場合については、容量以前に不審点があったのだ。USBメモリをPCに挿入しても、PCは何も異常を報告しないし、デバイス・マネジャーにも異常は示されない。しかしUSBメモリのプロパティから辿れる情報には、互換性の不備を示唆するイベントが記録されていたのだ。

...was not migrated due to partial or ambiguous match."

f:id:espio999:20210527204411p:plain
端的に、これはOSとコントローラの互換性が不十分であることを示している。通常は、互換性を担保するためにドライバが存在している。
ドライバやユーティリティが頻繁に更新できないため、互換性維持のためにOSのバージョンを指定するエンタープライズ向けハードウェアは多い。誤ってOSだけ先にアップデートしてしまった場合に遭遇するのが、よくあるケースだ。

とはいえ、今やUSBメモリは汎用製品であり、OSが搭載している標準ドライバで動作するのが当たり前の状況だ。専用ドライバが無ければ動作しないUSBメモリの方が珍しい。容量以前に、ここが怪しいのだ。何か細工をしているに違いない。

実際にやってみる。やはり...

H2testwによる256GB分のWriting検査には3時間半程度を要した。何も問題は報告されなかった。しかしVerify検査で、次の問題を報告し始めた。

The media is likely to be defective.
29.2 GByte OK (61374487 sectors)
9.3 GByte DATA LOST (19707881 sectors)
Details:0 KByte overwritten (0 sectors)
0 KByte slightly changed (< 8 bit/sector, 0 sectors)
9.3 GByte corrupted (19707881 sectors)
0 KByte aliased memory (0 sectors)
First error at offset: 0x0000000751002e00
Expected: 0x0000000751002e00
Found: 0xb0f4c113694e0ff4
H2testw version 1.3

29.2GBまでは問題なく記録できていたのだが、それ以降はDATA LOSTが発生し続けている。このメッセージが出力されている時点で、すでに9.3GBのデータが喪失しているのだが、この投稿をタイプしている現在も、H2testwは検証を続けている。Verify検査に約2時間を費やしている時点で、喪失データ量は40.2GBだ。
f:id:espio999:20210527204436p:plain
Writing、Verifyの検査で、合わせて5時間超が経過しているのだが、まだ256GB分の全検査は終了していない。「しらみつぶし」に検査するのは、これほどまでに時間がかかるのだが、少なくとも知りたいことは確認できた。

  • 容量詐欺か?:Yes
  • 実効容量は?:32GB

結論が出れば、直ちに検査を打ち切っても良いし、気の済むまで検証を続けても良い。