VercelでSubdomain Takeover出来るのか
TL;DR
少なくとも現在はVercelでSubdomain Takeoverを行うことは難しい。
用語
- Subdomain Takeover:
- Dangling DNS Recordを利用して、既に使われていないサブドメインを本来と異なるリソースに紐づけることでサブドメインを乗っ取る攻撃手法
- 対策が取られていないサービスでは、非常に簡単に行うことが可能
- Dangling DNS Record:
- 宙ぶらりんのDNSレコード
- 一般的にはCNAMEレコードで、もはや存在しない、あるいは誰にも確保されていないリソースを指し示しているDNSレコード
背景、Vercelの推奨ドメイン設定の変更
ある日Vercelのドメイン設定で、DNSレコードの変更を推奨されていることに気づいた。
「As part of a planned IP range expansion」と理由は書かれているものの、具体的な内容は書かれておらず、よく分からなかったため調べると、Subdomain Takeoverの危険性を下げられるためではないかという言及があった。
一般にこのような変更でSubdomain Takeoverの危険性を下げられることは正しく、以前の複数のユーザーで共有されてるcname.vercel-dns.com
に対して、xxxxx.vercel-dns-xxx.com
のようにプロジェクト毎に分けることで、Dangling DNS Recordであっても攻撃者が再利用出来なくなる。
しかし、Vercelがこのような脆弱性を残しているとは思えなかったため、実際に試してみることにした。
実験
自身の所有しているサブドメインとVercelのプロジェクトを利用して、Subdomain Takeoverを試みた。
Dangling DNS Recordの用意
自身の所有しているdiff.ohiruneuni.com
ドメインを設定したVercelプロジェクトを削除。
実際にアクセスして、Dangling DNS Recordになっていることを確認する。
DNSレコードの調査
サブドメインのDNSレコードを調べる。今回のケースでは、cname.vercel-dns.com
を指すCNAMEレコードが存在していることが分かる。
$ nslookup diff.ohiruneuni.com// ....Name: cname.vercel-dns.com// ...Aliases: diff.ohiruneuni.com
Subdomain Takeoverの実行
Vercelで他チームアカウントのプロジェクトにdiff.ohiruneuni.com
を設定する。
ここで、設定が出来てしまえばSubdomain Takeoverが成功する。
所有権の確認
Vercelでは少なくとも現在、次のようにDNSレコードを利用した所有権の確認が行われるため、Subdomain Takeoverを行うことは難しいと思われる。
プロジェクトの削除ではなく、サブドメインの解除を行った場合でも、所有権の確認を求められたため、ドメインの設定を行い、一度疎通確認が行われた時点でVercel側でドメインとVercelアカウントを紐づけていると思われる。
まとめ
少なくとも現在は、所有権の確認が行われることに加えて、プロジェクトに一意なDNSレコードの設定を求められるため、VercelでSubdomain Takeoverを行うことは難しい。
しかしSubdomain Takeover
に脆弱なサービスは少なくないため、Vercelが現在問題がないとしてもDangling DNS Record
は積極的に消していく必要がある。