長い間開発業をしていると誰でも一つや二つは冷や汗をかく瞬間というものがありますよね?
その中でもセキュリティに関連したものは本当に心臓に悪いです。
今回書くのは私が体験した最大の冷や汗ものの話です。
もう随分昔の話になりますが、恥を忍んで書くことにしました。
背景
私は結構長い期間オーストラリアの企業でウェブ開発者として働いていました。
当時私がいたチームは小さいチームでいくつもの自社サイトの開発を行っており、私はそのうちの数個のサイトの開発を任されていました。
思い出したくもない事件
私が担当しているサイトの一つはPHPで開発されていて、ユーザーが画像をアップロードできるようになっていました。
ある日の朝、何気なくファイルがアップロードされるディレクトリを眺めていたところ数ある画像ファイルのアイコンの中に見かけないアイコンがあるのに気付きました。
よくよく見てみると拡張子が”php”でした。ファイル名は覚えていません。
最初、「こんなところにphpファイルを置いた記憶がないから同じチームの誰かが間違えて置いたのかな?」くらいにしか考えませんでした。
で、とりあえずエディタで開いて中身を見てみると、ご丁寧に冒頭の部分にきれいなフォーマットでコメントがあり、何をするプログラムか書いてありました笑(←引きつった笑いです。もちろん)
詳しい内容は覚えていないのですが、まあ簡単に言うと「サーバーの中のファイルを閲覧・編集できますよ」的な。
これを見た瞬間、サーッと血の気が引いて数秒間くらいフリーズしていたと思います(あー、嫌な思い出)
こんなご丁寧なコメントが入っているということは、どこからか拾ってきたコードをそのままアップロードしたのでしょう。
「まさかこのファイル、パスを指定して開けば普通に動作するんだろうか?」
「頼む。アップロードされただけならまだなんとんかなる。動作しないでくれ」
と神に祈りつつブラウザで開いてみると・・・
祈りも虚しくユーザーフレンドリーなUIが開き、ファイル全部丸見え(泣)
ぎゃぁぁぁ・・・
しかも、ご丁寧にルートまで遡って全部見える。
つまりサーバーの中のファイル見放題で、操作し放題。
報告
このとき現実逃避したくなる思いがあり、この期に及んで「そもそもどこからアップされたのか確認をしないと。ワンチャン自分のせいじゃないかも」と思い(希望的願い)、開発環境で自分が作ったファイルアップロードページでテスト用のphpファイルをアップロード→できてしまった汗
なんでファイル形式の制限をかけ忘れていたんだろう。もう単純なミスとしか言いようがない。自分のバカ。
でも事は重大。
正直なところ「まてよ、何もされてなかったらこのままこのファイルを消去してしれっとアップロード制限かければ知らんふりでき・・・」と悪魔の囁きが実はありました。はい。
でも、例え何もされていなくてこのままバレなかったとしてもそんなことをしたら絶対今後の人生ずっと後悔することになると思い直し、重い腰を上げて後ろに座っている上司に報告しました。
その後
上司はファイルの検証をした後、すぐにインフラ・セキュリティチームに報告しサーバーの調査を依頼しました。
そうしている間にどうやらそのユーザーがアップロードしたと思われる画像ファイルを発見。
何語だったか分かりませんが画像の中には文字が書かれていました。
私も上司も読めなかったのですが、これは◯◯語かも(←忘れた)と上司が言い、それが読めそうな同僚に連絡を取りました。
同僚が英語に訳してくれましたが(実際にそこに書いてあったことももう覚えていないのですが)私達からするとあまり意味のないことでみんなで「どういう意味だろ?」と首を傾げていました。
数日後、特に問題があるものが仕掛けられている形跡は無かったという調査結果が出ました。
当然、今回の犯人が何をしようとしていたのか目的などは一切分からず。意味不明のメッセージの画像も意味不明のまま。
そのサーバーには特に機密情報なども入っていなかったのでこの件はそこで終わりということになりました。
あ、もちろん上司には平謝りで謝罪しておきました。
上司はそういうことでしつこく言うタイプの人間ではなかったので、一言注意されただけで終わりました。
私にとっては一言だろうとものすごく重かったです。当然ですが。
回避策
当たり前ですが、事件後すぐに拡張子による制限はかけました。
あと、その後からは可能であればファイルアップロード機能は外部のサービスを使うことにしました。
日本ではあまり知られていないようですが、例えばその時に選定されたのはUploadcareというサービスでした。
https://uploadcare.com/
UploadcareはファイルアップロードのUIも提供してくれていてそのUIの中でトリミングなどもできたりするので、そこを作り込む時間も省けて一石二鳥です。さすがそれ専用に作られたサービスは違うと言った感じです。
経験
この事件はこういう単純なことを忘れるだけで大事になる可能性があるということを改めて身に染みて体験させられました。
もちろんその後も開発業は続けていますが、こういうところは気をつけないとという気持ちが常に私の中にあります。
大事にならずに本当に良かったし、おかげでそれ以降慎重に作業する習慣が付きました。
こんな初歩的ミスをする人なんていないかな?そもそもテストをする人員がいたらこんなミスを見逃したりはしないかもしれませんが。
いや、本当に恥ずかしすぎるミスで今でも穴があったら入りたい気持ちになります。でもあのとき正直に報告しておいて良かった。ほんと。
この記事を読んでくれた人たちが同じようなミスをすることを防ぐのに少しでもお役に立てれば幸いです。