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は積極的に消していく必要がある。