MoRanYue
(MRY)
1
Recent updates seemed to stop rake task themes:update to use a proxy serverからの議論を続けます。
そのタイムアウトエラーのため、テーマコンポーネントのフェッチも更新もできませんでしたが、ついに解決策を見つけました。ファイル \u003cDiscourse\u003e/lib/theme_store/git_importer.rb 内の - で始まる以下の行を削除しました。
def clone_http!
uri = redirected_uri
raise_import_error! if %w[http https].exclude?(@uri.scheme)
- addresses = FinalDestination::SSRFDetector.lookup_and_filter_ips(uri.host)
- raise_import_error! if addresses.empty?
env = { "GIT_TERMINAL_PROMPT" => "0" }
args =
clone_args(
uri.to_s,
- "http.followRedirects" => "false",
- "http.curloptResolve" => "#{uri.host}:#{uri.port}:#{addresses.join(",")}",
)
begin
Discourse::Utils.execute_command(env, *args, timeout: COMMAND_TIMEOUT_SECONDS)
rescue RuntimeError
raise_import_error!
end
end
このコードはDNSの事前解決を処理し、その後gitに事前解決によって取得されたIPアドレスを使用するように強制します。なぜ私のサーバーでは常に失敗するのか分かりませんが、そのロジックを削除しました。
実際、このロジックの存在について疑問があります。git自体がDNS解決を行うのに、なぜこのロジックが必要なのでしょうか?これは冗長です。
simonk
(Simon King)
2
SSRF(FinalDestination::SSRFDetectorで言及されている)は サーバーサイドリクエストフォージェリ の略です。これは、攻撃者が通常アクセスできないリソースに、攻撃者がサーバーにアクセスするように仕向けるメカニズムを指します。
例えば、インターネットからのアクセスを許可するためにリバースプロキシを使用してプライベートネットワーク内でDiscourseを実行していると想像してみてください。攻撃者は、プライベートネットワーク内のIPアドレスを指すリンクを含むトピックを作成する可能性があります。DiscourseのOneboxシステムがそのURLを取得し、Oneboxにそのコンテンツを表示する可能性があります。
これを防ぐために、Discourseはユーザー提供のURLがプライベートIPアドレスを指していないことを最初に確認せずに、それらのURLにアクセスしません。
テーマやテーマコンポーネントで使用されるgitリポジトリについては、それらは管理者が指定するため、これはそれほど重要ではないかもしれませんが、Discourseはここでは用心深くなることを選択しています。
「いいね!」 1
MoRanYue
(MRY)
3
ご説明ありがとうございます。自分の状況に対する究極の解決策を見つけました。
私の状況:私はWSL(仮想LANで192.168.1.2が割り当てられている)を使用してDiscourseを実行しており、Windowsで実行されているプロキシ(192.168.1.1が割り当てられている)を介してリモートサーバーに接続するように設定されています。
Discourseがホスト名を使用してリモートサーバーに接続しようとすると、SSRFは/etc/resolv.confで設定されたシステムのDNSを試みます。しかし、デフォルトでは、WindowsのvLAN IPアドレス(私の場合は192.168.1.1)がWSLの唯一のDNSサーバーです。しかし、サブネット192.168.0.0/16はSSRFDetectorによってブラックリストに登録されており、DNS応答を取得することさえできません。(コードをざっと読んだだけなので、上記の意見が正しいかどうかはわかりません)
設定項目Allowed internal hostsに192.168.1.1を追加すると、すべてが引き続き機能します。うーん、Discourseは環境変数HTTP_PROXYとHTTPS_PROXY内のホスト名をブラックリストに登録すべきではないのでしょうか?