Skip to content

Misskey直接入力URLのSSRF対策 - #18

Closed
sakots wants to merge 2 commits into
satopian:masterfrom
sakots:master
Closed

Misskey直接入力URLのSSRF対策#18
sakots wants to merge 2 commits into
satopian:masterfrom
sakots:master

Conversation

@sakots

@sakots sakots commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

noReitaで修正した内容です。

Misskey投稿機能で指定されたサーバーURLが、FILTER_VALIDATE_URL のみで検証されています。

この検証ではlocalhost、プライベートIP、リンクローカルIPなども有効なURLとして扱われるため、Petit Noteの設置サーバーから内部ネットワークへリクエストを送信できる可能性がありました。

MisskeyサーバーURLの検証とcURLの接続設定を強化し、SSRFを防止します。

変更内容

  • Misskeyサーバーを公開HTTPSドメインに限定
  • 443番ポートのみ許可
  • IPアドレスの直接指定を禁止
  • URLに含まれる以下の要素を禁止
    • ユーザー名、パスワード
    • パス
    • クエリ
    • フラグメント
  • DNSのA/AAAAレコードを検証
  • 以下のIPアドレス範囲を拒否
    • ループバック
    • プライベートIP
    • リンクローカル
    • CGNAT
    • 予約済み・文書用アドレス
    • マルチキャスト
  • 検証したIPアドレスへcURLの接続先を固定
    • DNSリバインディング対策
  • cURL通信をHTTPSのみに制限
  • HTTPリダイレクトを禁止
  • TLS証明書とホスト名の検証を明示
  • 環境変数などによるプロキシ利用を無効化
  • 接続・処理タイムアウトを設定
  • MiAuth確認、画像アップロード、画像更新、ノート作成、既存トークン確認のすべてに同じ対策を適用

変更したファイル

  • petitnote/misskey_note.inc.php
  • petitnote/connect_misskey_api.php

新しい設定定数は追加していません。
misskey_note.inc.php の既存バージョン値のみ更新しています。

互換性への影響

Misskeyサーバーの直接入力機能は引き続き利用できますが、次のようなURLは使用できなくなります。

  • http:// のURL
  • 443番以外のポート
  • localhostやプライベートIP
  • サブディレクトリに設置されたURL
  • URLにクエリやフラグメントを含むもの

このため、http://localhost:3000 などのローカル開発用Misskeyには接続できません。本番環境でlocalhostへのSSRF経路を作らないことを優先しています。

確認内容

  • 両PHPファイルの構文検査
  • 不正なURL・内部IP・予約済みIPの拒否
  • 公開IPv4/IPv6アドレスの判定
  • misskey.io のDNS検証
  • cURLの接続先IP固定オプション生成
  • 同梱されている13件のMisskeyサーバーURLが検証を通過すること
  • git diff --check

以上を確認済みです。

(codexを使用してコードの変更を行っています。)

@satopian

Copy link
Copy Markdown
Owner

noReitaの基本機能は壊れています。
報告したりIssueをたてるときりがありませんので、こちらは静観しているのですが…。
AIが作成したコードのコードレビューが正しいのかの検証がそもそもnoReitaで行われているようにも見えず、いくつかの私の思い込みもあるかとは思いますが、本当にこれ正しいのという点で懐疑的になっています。
はっきりとわかるバグが解決されていくようにも見えませんので。
また、これだけの長さのコードを確認する時間も知識も現時点ではありませんので、いったんクローズさせていただきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants