はじめに
ポストXとして一気に台頭してきたBlueskyへ外部から投稿するAPIを調べていて気になった部分があったのでまとめます。
※この内容は2024/2/12時点の情報です。
外部から投稿する仕組み
まず最初に外部から投稿する仕組みについてまとめます。
Blueskyは公式アプリや公式サイト以外から投稿するためにAPIが準備されています。
公式のAPIリファレンスはこちらです。
仕組みとしては認証を実行して、成功したら投稿のAPIが利用できる状態になります。
公式のTypescriptのコードを引用します。
import { BskyAgent } from '@atproto/api'
const agent = new BskyAgent({
service: 'https://bsky.social'
})
await agent.login({
identifier: 'example.com',
password: 'hunter2'
})
await agent.post({
text: 'Hello world! I posted this via the API.',
createdAt: new Date().toISOString()
})
agent.loginの部分で使用されているメールアドレスとパスワードはアカウントのログインに使用するものです。
なのでloginの関数を利用するとパスワードがあっているかを試せるということになります。
APIの実行制限
APIのレート制限があり、以下のリンクから値は確認できます。
制限を確認する限り、全体のレートがIPアドレス単位で3000/5分、認証はおそらくcreateSessionに該当しそうなのでアカウント単位で30/5分かつ300/1日です。(おそらく単位は回)
無限に試せるわけではありませんが、ある程度の回数はパスワードを試すことがAPI経由でできます。
APIを悪用すると...
例えばどこかで流出したメールアドレスがあれば、時間をかければ総当たりで試すことができそうです。
1)大量のメールアドレスを取得
2)複数のIPアドレスから通信できる環境を作る
3)それぞれのメールアドレスにパスワードが通るかどうかを総当たりで試す
Blueskyには2段階認証などもないのでパスワードがバレるとアカウントの乗っ取りができてしまうことはもちろん、フィッシング詐欺などもできてしまいそうだとも思いました。
例えばこのようなことができてしまう可能性があると思いました。
1)メールアドレスとパスワードがバレる
2)メールアドレス宛に「アカウント情報のセキュリティ強化です」や「パスワード忘れのために別の認証情報を登録をお願いします」というようなメールを送って偽サイトへの誘導を行う
3)偽サイトで個人情報と現在のパスワードを入れさせる
本来はサイトしか知らないはずのパスワードだから、誤ったパスワードを入れたら違いますと表示するような仕組みがあれば信じる人が出てきそう
APIの無効化ができるか?
調べた限り、2024/2/12時点でAPIを無効化する手段は見つかりませんでした。
また、アカウントを作った時点でAPIが有効で利用できることになっています。
しかも、公式アプリや公式サイトであれば2段階認証などの導入もあるかもしれませんが、APIだと試されていることを通知されることもないと思われます。
対策
個人的な対策としては、Blueskyに登録するメールアドレスはBluesky専用のメールアドレスにしておくことかなと思います。
Gmailのエイリアス機能を使って専用のメールアドレスにして、エイリアスにランダムな文字列を入れて推測させないようにしておいた方が安全だと思います。(+blueskyや+bsとかだと推測される可能性もあるので)
メールアドレスが推測できなければパスワードを試されてバレることはないと思われます。
外部から認証を試されているかを知ることができるのは、調べた限り現状下記のリンク先のシステムのログだけです。
ただ、こちらも細かな情報が確認できるわけではないので普通に使っているのに赤い!マークが大量にあったら怪しそうぐらいしか確認できないと思われます。
まとめ
Blueskyが招待制でなくなり一気に人が流れ込んできましたが、セキュリティ面ではまだまだ緩いと思われます。
特にAPIの利用がアカウントを作った時点で利用できる状態になっているのも、あまり周知されていないことだと思いました。
せめてAPIの利用を初期無効にして、本当に必要な時に有効にできる仕組みができるといいなと思いました。