TOOLPIPO LAB IMAGE

画像を共有すると「見えないデータ」も渡る?

画像を開いても、ファイルの中身がすべて見えるわけではありません。透明な部分の色、別のサムネイル、末尾の追加データを、3つの合成画像で確かめました。

左は全面透明で背景の格子が見え、右はalphaのみ255に変更した診断表示で中央の赤い正方形が見える

結論

見える画像が同じでも、透明部分・サムネイル・末尾に別のデータが残る場合があります。画像を開いて目視するだけでは、ファイル内の情報を全部は確認できません。

検証概要

検証日
検証条件
自作ファイル・条件・実測結果は本文に掲載
再現用ファイル
本文に作成条件・確認方法を掲載

画像に表示されない情報も、ファイル内には残った

画像を開くだけでは、ファイルに含まれる情報を全部は確認できません。

今回の3ファイルでは、透明な部分の色、別の小さな画像、画像の終端より後ろの文字列が残っていました。すべての画像に同じ情報があるわけではありません。

3つの合成ファイルで確認した結果
実験普通に画像を見るだけで分かる?内部には存在した?
透明な部分に保存された色分からない今回のPNGでは1024 pixelに存在
EXIF内の小さな画像主画像だけでは分からない今回のJPEGでは別の画像が存在
画像の終端より後ろのデータ分からない今回のPNGでは22 byteが存在

透明PNGに残る色

透明に見える部分にも、色の値を保存できます。透明度だけを変えると、その色が見えるようになりました。

透明PNGの作り方と仕様

transparent-rgb.png は64×64 pixel、計4096 pixelのalphaをすべて0にしました。中央32×32 pixelだけRGBを (220, 40, 40)、残りを (0, 0, 0) にしてあります。普通に表示すると全面が透明です。

左は全面透明で背景の格子が見え、右はalphaのみ255に変更した診断表示で中央の赤い正方形が見える
左右は同じRGB情報を元にしています。左は保存されたalphaを適用した通常表示、右は検証のためalphaだけ不透明にしてRGBを可視化したものです。

検証ファイルを画像共有前・隠しデータチェッカーで解析すると、完全透明pixelは4096個、そのうち0以外のRGB値を持つpixelは1024個でした。割合は25.0%です。右図は元の写真の復元ではなく、今回ToolPipoが保存した合成RGB値を見えるようにした診断図です。

W3CのPNG Specification Third Editionでは、alpha=0は完全透明で、RGB値はalphaで事前乗算しない形式とされています。したがって透明度0でもRGB sampleが必ず0になるわけではありません。ただし編集ソフトが実際に何を保存するかは処理方法によって異なり、「透明PNGには元画像が必ず残る」とは言えません。

JPEGに残した別のサムネイル

画像ファイルには、主画像とは別に小さな画像を入れられます。今回のJPEGは、普通に開くと青い画像ですが、中には赤いサムネイルも入っていました。

exif-thumbnail.jpg は、青い背景に「MAIN」と描いた320×200 pixelの主JPEGへ、赤い背景に「THUMB」と描いた80×50 pixelの別JPEGをEXIF IFD1として埋め込みました。どちらもToolPipoが作った架空の図です。

通常表示の青いMAIN画像とEXIFから抽出した赤いTHUMBサムネイルを並べた図
左は普通に開いたときの主画像。右は同じファイルのEXIF IFD1から抽出した別のJPEGサムネイルです。

ブラウザの通常表示では320×200 pixelのMAINが表示されます。チェッカーはEXIF内から80×50 pixelのTHUMBを抽出し、そのJPEGデータは1654 byteでした。主画像とthumbnailは別の画像データになり得ることを、この合成ファイルで確かめました。

CIPA DC-008-2026(Exif Version 3.1)は、主画像とは別のthumbnail dataを1st IFDに記録できる形式を定めています。この実験はその構造を用いましたが、実際の編集ソフトやカメラが古い画像を必ず残すことを示してはいません。

PNGの終端より後ろのデータ

PNGには画像データの終わりを示す印があります。その後ろに文字列を付けても、今回のブラウザでは画像を表示できました。

png-trailing-data.png は64×64 pixelの単純な合成画像です。PNGのIEND chunkの後ろに、無害なASCII文字列 TOOLPIPO_TRAILING_TEST を付けました。

左に普通に表示できた青いPNG、右にPNG signature、IHDR、IDAT、IEND、末尾文字列の順を示すファイル構造図
普通の画像表示とファイル構造の比較。破線より下の22 byteはIENDより後ろにあります。

このファイルは検証したChromiumブラウザの <img> で通常の画像として表示できました。一方、チェッカーはIEND後に22 byteの追加データを検出しました。文字列は画像表示に使われません。

W3C仕様ではIENDがPNG datastreamの終端であり、適合するdatastreamにはその後の内容を置きません。Security considerationsはIEND後にデータが存在し得ることにも注意を促しています。つまり、今回ブラウザで表示できたことは、末尾付きファイル全体の規格適合を意味しません。追加データがあるだけでmalware・改ざん・情報漏洩と断定することもできません。

画像を共有する前に確認したいこと

  1. EXIFに撮影日時・機種・GPSなどが残っていないか。
  2. 主画像と異なるサムネイルがないか。
  3. 完全に透明なピクセルのRGBに意図しない値がないか。
  4. XMPや画像末尾の追加データがないか。
  5. Motion Photoなど、静止画以外の情報を持つ形式ではないか。

この一覧は共有前の確認ポイントです。GPS、XMP、Motion Photo、ステガノグラフィは今回の3ファイルでは検証していません。手元のJPEGやPNGを調べるには画像共有前・隠しデータチェッカーを使えます。ただし、何も検出されなくても「共有して安全」とまでは言えません。

検証用ファイル

すべてToolPipoが検証用に作成した合成ファイルです。実在する人物・位置情報・個人情報は含みません。

手元で確かめる

  1. 上の検証ファイルをダウンロードします。
  2. 画像共有前・隠しデータチェッカーを開きます。
  3. 各ファイルを1件ずつ読み込みます。
  4. 透明pixel数・非ゼロRGB数、サムネイルの表示とbyte数、末尾byte数を記事の値と比較します。

画像は同じファイルを普通のブラウザ表示でも開き、通常表示と解析結果の違いを確かめられます。EXIF thumbnailの寸法はチェッカーの抽出プレビューで確認できます。

参考資料

自分のファイルで確認する

自分のファイルで確認する

関連する検証