
Windows Snipping Tool の CVE-2023-28303 脆弱性による PNG キャプチャの検出と復元
SnipRecover CLI は、依存関係のない最小限のコマンドラインユーティリティで、以下の機能を提供します。
IEND チャンクの後に追加された圧縮データを回復して元の画像を復元します。デフォルトでは、復元された画像は RGBA 形式、解像度 1920×1080 で保存され、出力パスが指定されない場合は restored-<元のファイル名>.png に書き込まれます。
PNG 仕様 (ISO/IEC 15948) によれば、すべての画像データ (IDAT チャンク) は最後の IEND チャンクの 前に 配置されなければなりません。Windows Snipping Tool は誤って IEND の 後に 追加の IDAT データを付加しており、これは標準に違反し、「切り取られた」完全な画像コンテンツを露出させます。
標準の PNG 構造:
89 50 4E 47 0D 0A 1A 0AIHDR: 画像ヘッダー (幅、高さ、カラータイプなど)IDAT: 圧縮ピクセルデータIEND: ファイル終端マーカーSnipping Tool で切り取られた PNG は、IEND 以降に 余分なバイト を含んでいます。SnipRecover CLI はこの異常を検出し、圧縮ストリームを再構築して元の画像を復元します。
前提条件:
手順:
git clone https://github.com/m31r0n/SnipRecover-CLI.git
cd SnipRecover-CLI
chmod +x sniprecover
外部ライブラリは不要です — Python の標準モジュール _struct_、 _zlib_、 _io_ のみを使用します。
# ヘルプを表示
python3 sniprecover --help
# 1. 脆弱な PNG を検出
python3 sniprecover detect /path/to/images/
# 2. 切り取られたキャプチャを復元
python3 sniprecover restore capture.png --output restored-capture.png
注意:
--width、--height、--alphaを省略した場合、デフォルトの 1920×1080 と RGBA が適用されます。--outputを省略した場合、復元画像はrestored-<元のファイル名>.pngとして保存されます。
SnipRecover-CLI/
├── sniprecover # メイン CLI 実行可能ファイル (実行権限が必要)
└── README.md # ドキュメントと理論
MIT © 2025 – m31r0n によって開発
| オプション | 説明 | デフォルト |
|---|
--width <int> | 元の画像の幅 | 1920 |
--height <int> | 元の画像の高さ | 1080 |
--alpha | アルファチャンネルを含める (RGBA) | 有効 |
--output <file> | 復元 PNG の保存先パス | restored-<元のファイル名>.png |