Webhookのセキュリティについて考える

なんか知らんが攻撃された

IFTTTのWebhook用に簡単なWebアプリを作ったんですが、案の定 CTF 攻撃されました。

画像では内容がC%252B%252B%258A%25AE%2591S%2582%25C9%2597%259D%2589%25F0%2582%25B5%2582%25DC%2582%25B5%2582%25BDとなってますが、2回デコードするとC++完全に理解しましたとなります。(C++はHelloWorldすらしたことないですごめんなさい)

このときはIPアドレスでアクセスの制限をかけていたので、 FLAGを出す 実害が出ることはありませんでした。

Webhookを受け付けるURLって誰でも特定できるのでセキュリティがアレだといくらでも偽造できちゃいますね…
(実際URL特定されて偽装されました)

そんなわけでWebhookのセキュリティをあげる方法を考えました。
といっても自分はセキュリティスペシャリストでもなんでもないので多少のガバがあるかもしれないので、まぁ…

送信するWebhookにトークンを付与する

どこから送信されたかを判別するために送信する内容にトークン(文字列)を追加します。
受け取り側ではそれ以外のトークンはブロックするようにします。

例:IFTTTのWebhook送信設定のBody欄にtextと一緒にtokenを書いて送信、
Webアプリ側でトークンを判定し、一致しなかったら403(Forbidden)エラーを返す。

SSL/TLSで通信をする

URLをhttps://にするアレです。
通信内容(ここではツイート内容とかトークンとか)を暗号化して送信することができます。

IPアドレスで制限する

こちらはWebhookを送信するサーバが決まってるときに有効です。
送ってくるサーバのIPアドレスだけを通し、それ以外をブロックします。

ちなみにIFTTTは送信元のIPアドレスが時間によって変わるらしく、この方法は失敗しました。

おしまい

この一件で情報セキュリティに少し興味を持ちました。