捨てアドスパムがうざすぎた💢

この記事は[Misskey Advent Calendar 2024](https://adventar.org/calendars/10208)2日目の記事です

# 捨てアドスパムがうざすぎた話

## この記事は何？
こんにちは～
すしすきー管理者のくちばしです

最近自分のサーバーにやたらと捨てアドを利用したスパムが湧きまして、どうやって対策したかをお伝えしたいと思います。

## 何があったの？
最近文体が非常に酷似したスパムが何度BANしてもアカウントを作り直すという被害を受けました。敵はVPNを使っていたのかわかりませんが、IPBANもほとんど効きませんでした。
これらがbotであればreCAPTCHAで対策できていたと思いますが、なんと執念に駆られた手動投稿だったのです。
また、サーバー管理者の皆さんであればご存知であろう定期的に湧く連投荒らしもおそらくアカウント作成自体は手動で行っているのではないかと思います。

## 何をするべきか
ずばり、捨てアド対策です。
彼らはわざわざアカウント作成する手間、もしくはその非匿名性を嫌います。
なので登録されたアカウントに紐づいているメールアドレスの妥当性を検証して、捌いていけば新規アカウントが健全に保たれるということになります（もっとも登録者をBANするには捨てアドを禁止する利用規約が必要ですが）
というわけで、私のサーバーがどんな対策を取っているのかを手短にはなりますがご紹介したいと思います。
### ここで言う捨てアドの定義
ネット用語なので意味は曖昧かと思いますが、ここでは以下のように定義します。
いわゆる、[こういった](https://m.kuku.lu/ja.php)サイトから発行できるメアドのことです。
サイト上から発行して、そして一回メールを受け取れば、その後インターネットの海にそのアドレスを返却してしまう。そういったサービスから得られる一時的なメールアドレスを指して捨てアドと言っています。

## 対策
### できなかった対策
#### verifymail.io
言わずとしれたmisskeyの標準機能verifymail.ioでの自動メアド選別機能。
知らない人のために→（verifymail.ioはメアドをぶん投げるとそのメールアドレスの危険性を検証して教えてくれるサービスです。misskeyにはこのサービスを使って自動で新規登録者のメールアドレスが安全なアドレスか？を検証する機能があるんです！！！！（すごい！！！！！！！！！！！！！））

みなさんも御存知の通りhttps://verifymail.io の精度は非常に高いように感じられます。
このサービスには、メールアドレスのドメインでそのドメインが捨てアドかどうか？を判定してくれる機能がアリマス。
なによりくちばしを驚かせているのは最近になって出てきたような新参捨てアドもバッチリ判定してくれるのです。
くちばしはこのサービスに絶対的な信頼をおいていますので、こちらを使いたいと...
＿人人人人人人人人人人＿
＞　あぎゃあああああ　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923242/9b48cadf-f426-9526-27a0-88b9cf7e6122.png)
そうなんです、実はverifymail.ioは無料だとたったの3件しかメアドを自動検証することはできず、有料使用を前提としたサービスなのです。
＄25なんてみんなの安心安全を考えたら安いもんだぜと男らしく言いたいものなのですが、スパム対策だけに日本円にして3800円近く毎日払うのは何か敗けた気がして悔しいです。
なのでくちばしは泣く泣く断念しましたとさ。

### 対策その1
ではこのサービスを使わずにどうやったのかといいますと、地道に禁止アドレスを増やしていきました。misskeyは禁止メールアドレスドメインを指定することができます。これに指定されたドメインは登録ページで登録しようとしても利用できないメールアドレスです。と表示されて使用することができません！
そしてこちらを使用します
https://github.com/disposable-email-domains/disposable-email-domains 
こちらには捨てアドのドメインが列挙されているので手始めに、こちらをすべて禁止アドレスにぶち込んでいまいましょう。

そして、こちらに記載されていない捨てアドがあると思います。
新規ユーザーのアドレスが捨てアドっぽいなと思ったらまず、その捨てアドで検索します。
その際にまた登場するのがhttps://verifymail.io/ 君。このサイトの検索欄から検索すると一発でわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923242/259489b6-4636-34cc-4813-60384c809fdd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923242/5f91ed7c-149d-0b0e-0d9e-02b4d0d5fc5f.png)

このサイトで検索したものをまた禁止アドレスリストにぶち込んでいきます。

### 対策その2
#### 敵の新たな一手
しかし敵はこの程度ではへこたれませんでした。奴らは新たな一手を打ってきたのです。
それは、gmailの捨てアド。
なにそれ？とおもうひとが大半であると思うので説明すると、gmailのエイリアスを使用して自動でメールアドレスを生成し、そのメアドを捨てアドとして提供しているサイトが有るのです。
たとえば[こちら](https://www.emailnator.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923242/4f8f4bcb-b0ae-e063-6146-c5295b4ebaae.png)
なんともアングラそうな雰囲気が漂っていますが、こちらが大量のgmailの量産工場です。
画像で得られているメアドは
e.m.mans.a.nt.o.a3@gmail.com
というアドレスですが、
こちらはもともと、
emmansantoa3@gmail.comというメアドであったことが推測されます
なぜならば、gmailにはエイリアス機能というのがありまして、ドットをどこに入れても同じメールボックスに届くという機能があるのです。その組み合わせは膨大で、しかし、別メアドであることは変わりなく、結果捨てアドが禁止されているサイトでも絶対に禁止されていないであろうgmailアドレスを合法的に量産できるという闇の量産工場が完成しているのです。
#### 対策
私達はこのメアドを使用して何度も登録をしてくるユーザーに対して対策を行いました。
その対策は以下です。
1. gmailの捨てアドを作っている闇の量産工場をすべてリストアップ
2. すべての闇の量産工場に対して、RPAを用いて使用されている元のメアドを抽出
3. そのメアドのリストをcloudflare workersで登録時に弾くように設定

このような対策を行いました。

workersのコード
```js
const blockedGmailList: string[] = []//ここにブロックしたい@より前の部分を列挙

// メールアドレスのローカル部分を抽出する関数
function extractLocalPart(email: string): string {
	return email.split('@')[0].replace(/\+.*$/, '').replace(/\./g, ''); // +エイリアスとドットを削除
}

async function handleRequest(request: Request): Promise<Response> {
	// /api/email-address/available へのPOSTリクエストを処理
	const url = new URL(request.url);
	if (request.method === 'POST' && url.pathname === '/api/email-address/available') {
		try {
			const requestBody = await request.clone().json() as { emailAddress?: string };
			const email = requestBody.emailAddress;

			if (email) {
				const localPart = extractLocalPart(email);

				// ブロックリストと照合して一致すればブロック
				if (blockedGmailList.includes(localPart)) {
					const responseBody = JSON.stringify({
						available: false,
						reason: "banned"
					});
					return new Response(responseBody, {
						status: 200,
						headers: { "Content-Type": "application/json" }
					});
				}
			}
		} catch (err) {
			return new Response("リクエストの処理中にエラーが発生しました。", { status: 400 });
		}
	}

	// ブロック対象でない場合は元のAPIにリクエストを転送
	const apiUrl = 'https://sushi.ski/api/email-address/available'; // 元のAPIのURL
	return fetch(apiUrl, {
		method: request.method,
		headers: request.headers,
		body: request.body,
		redirect: 'follow'
	});
}

// fetch関数をエクスポートしてCloudflare Workersが認識できるようにする
export default {
	fetch: handleRequest
};

```

/api/email-address/availableに向けてだけの対策なので、完璧な対策にはなっていないのかもしれませんが、これによってgmailの捨てアドを利用してくる人はいなくなりました。

闇の量産工場で量産されているgmailのローカル部は希望があれば公開します。
まあ、ただここまでの粘着にあっているサーバーもそんなに無いだろうと勝手に考えている。

## 最後に
サバ缶の皆さんそしてmisskeyをご利用の皆さん、いろいろな困難がありますが、いっしょにたったかっていきまっしょい。

せーのっmisskeyサイコー！！！


　 終
制作・著作
━━━━━
　ⓃⒽⓀ