執筆背景
アルバムコレクションという画像共有サイトがあるのだが恐らく作者の意図に反して、__誰でも(ユーザ登録していなくても)__ファイルをダウンロードできてしまう。
AWSの認証周りが問題なのだが、勉強する上で良い題材なので何がまずいのかを解説する。
※執筆時点9/20の状況です
記事の中身
- 認証なしでファイルをダウンロードする手順の解説
- 何がまずかったのかの解説
- 改善案の提示
認証なしでファイルをダウンロードする手順の解説
想定環境
windows10
使うツール
- git for windows (https://gitforwindows.org/)
- Google Chrome(ブラウザhttps://www.google.co.jp/chrome/)
手順
- git for windowsをインストールする(選択肢は全てデフォルトでOK)
- Google Chromeをインストールする
- Google Chromeでアルバムコレクションにアクセスする
- ログインせずに受け取る画面でIDを入力して受け取るボタンを押下する
- 出力されたモザイク掛かった画像を右クリックし「検証」を押下する
- imgと書いてある部分を右クリックして「Copy」→「Copy outerHTML」を押下する
- 適当なエディタにコピーした文字を張り付けると下記のような文字列を得ることができる
- 文字列の中からhttps以降thumbより前の_(アンダーバー)までを抜き出す
ちなみに_の後に1をつけてURL欄に張り付けると1番目の画像にアクセスできることが分かる。
後続の手順では複数ファイルをまとめて取得するため用意している。 - PCに適当なフォルダを作り、フォルダ内で右クリックし「Git Bash Here」を押下する
- gitターミナルからcurlコマンドを発行する。[]の中の数字はファイル数を表しており、例えば19ファイルであれば[1-19]とする
# curl -O 手順8で抽出した文字列[1-ファイル数]
# 例.ファイル数が19個、手順8の文字列が右記URLの時https://s3-us-west-2.amazonaws.com/file.album-collection.net/a3928lsadgd6e498712c3tirca4ba8b5c3b4974
curl -O https://s3-us-west-2.amazonaws.com/file.album-collection.net/a3928lsadgd6e498712c3tirca4ba8b5c3b4974_[1-19]
gitターミナルを開いたフォルダにファイルが保存されているので確認する
そのままだとファイル名が長すぎるのと、拡張子がうまく付いていないので下記コマンドを入れる。
ファイル名を変えているのとファイルサイズに応じて拡張子(jpgまたはmp4)を付けている
i=1
for file in `ls`
do
size=`ls -l $file | awk '{print $5}'`
if [ $size -lt 300000 ] ; then
mv ${file} ${i}.jpg
else
mv ${file} ${i}.mp4
fi
i=$((i+1))
done
exit
何がまずかったのか
2つの悪さがあると考えられる
-
アクセス制御がない(URLが分かればファイルが取得できてしまう)
ファイルにアクセス制御がなく誰にでも公開された状態になってしまっている。URL情報からS3を使っていることが明確だが、折角のS3なので署名付きURLなどを使いアクセス制御すべきであるが、それがないところが問題。 -
アクセス先URLが容易に推測できる
たとえアクセス制御がなかったとしてもアクセス先URLが分からなければ容易にはファイルにたどり着けない。本件ではアクセス先URLが容易に推測できてしまうところが問題。
改善案の提示
ほぼ上記で記載している内容だが、最善策はS3の署名付きURLを使ってアクセス制御をすると誰でもファイルが取得できる状態が回避できる。
次策はアクセス先URLの生成を工夫し、推測できないようなURLを生成することを提案する。
また、ビジネスよりの話になるが、利用規約に同意していない人がファイルをダウンロードできてしまう状態なので、モザイク版についても利用規約に同意した人だけが実施できるようAPIGatewayの認可の仕組みを取り入れるという改善の余地があると考えている。