取締役CTOの小竹(aka tkmru)です。
dummyというファイルアップロード機能の検証用の静的ファイルを作成するコマンドラインツールを公開しました。 指定したテキストを書き込んだJPEGファイル、PNGファイル、PDFファイルを生成でき、PNGファイルに関してはサイズ(バイト数)の指定も行えます。 この記事では、作成した「dummy」の使い方、仕組みを紹介します。
アップロード機能の検証の際に困ること
ファイルアップロード機能を対象に脆弱性診断を行うとき、どんな画像をアップロードするか、いつも悩みます。 ペンテスターでなくともフリー素材ではないネットミームの画像や自分が食べた美味しいご飯の画像を業務で使用するのには少し気が引けるでしょう。 クライアント(顧客)のサーバにファイルをアップロードする脆弱性診断では、なおさらです。 そこで、誰が見ても悪い印象を受けない検証用の画像を作成するためにツールを作りました。
また、扱えるファイルのサイズに制限がある場合、その制限が有効になっているか確認したいときがあります。 その制限に引っかかるような大きいサイズのファイルを用意するのは少し大変です。 そういう場合にも対応できる、任意のサイズのファイルを作成できるツールが必要でした。
作ったツール
検証用の静的ファイルを作成する「dummy」というコマンドラインツールを作りました。 前述した通り、指定したテキストを書き込んだJPEGファイル、PNGファイル、PDFファイルを生成でき、PNGファイルに関してはサイズ(バイト数)の指定も行えます。 Pillowという画像処理ライブラリを使用したかったため、Pythonで実装しています。
使い方
インストール方法や各種パラメータの指定方法を紹介します。
インストール方法
pip
コマンドでインストールできます。
Pythonの実行環境を整えた上で、次のコマンドを実行してください。
$ pip install git+ssh://git@github.com/sterrasec/dummy.git
ファイルを生成する
生成したいファイルのパスはオプションなしで指定できます。
また、生成するファイルの種類は拡張子によって自動で識別されます。
-t
オプションでファイルに書き込むテキスト、-b
オプションでバイト数を指定できます。
-b
オプションはPNGファイルを生成するときのみ使用できます。
$ dummy -t abc -b 1MB test.png
-t
オプション、-b
オプションは指定しなくとも使用できます。
-t
オプションでテキストを指定しない場合は、デフォルトの「dummy file」というテキストが書き込まれます。
$ dummy test.jpeg
どのようにして任意のサイズのPNGファイルを生成しているのか
小さすぎないバイト数を指定しない限り、「dummy」では任意のサイズのPNGファイルを作成できます。 これをどのように実現しているのか解説します。
PNGファイルはチャンクと呼ばれるデータブロックから構成されています。
IHDR
や、IDAT
、IEND
などのチャンクが知られています。
IHDR
は、画像の幅や高さ、色深度、圧縮方式などの情報を持っています。
IDAT
は、画像データを持っています。
IEND
は、PNGファイルの終端を表します。
独自のチャンクを作成することもできます。
チャンクは、チャンクタイプ、チャンクデータ、CRCという3つの要素から構成されています。
これらのデータを適切に挿入することで、PNGファイルの機能を損なわずにファイルを大きくすることができます。
「dummy」では、eXtr
という無意味なデータ列から構成される独自のチャンクをIEND
チャンクの手前に挿入することで、指定されたバイト数になるよう、データ量をかさ増ししています。
おわりに
「dummy」が脆弱性診断、QAに従事するエンジニアに広く使われるよう育てていきたいと思っています。 ぜひ、気づいたことがあればフィードバックしてもらえるとうれしいです。 みなさまからのIssueやプルリクエストをお待ちしております。