Risolto errore di timeout nel recupero del tema rimuovendo la pre-risoluzione DNS

Continua la discussione da Recent updates seemed to stop rake task themes:update to use a proxy server:

Non riuscivo a recuperare o aggiornare alcun componente tema a causa di quell’errore di timeout, alla fine ho capito. Rimuovendo le seguenti righe che iniziano con - nel file \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

Questo codice elabora una pre-soluzione DNS quindi forza git a utilizzare gli indirizzi IP che si ottengono dalla pre-soluzione, non so perché fallisca sempre sul mio server, quindi ho rimosso la logica.

In effetti, ho una domanda sulla sua esistenza, git stesso esegue una soluzione DNS, perché abbiamo bisogno di questa logica? Questo non è distinto.

SSRF (come menzionato in FinalDestination::SSRFDetector) sta per Server-Side Request Forgery. Si riferisce a un meccanismo mediante il quale un attaccante inganna il tuo server affinché acceda a risorse a cui l’attaccante altrimenti non sarebbe in grado di accedere.

Ad esempio, immagina di eseguire Discourse all’interno di una rete privata con un proxy inverso per consentire l’accesso da Internet. Un attaccante potrebbe creare un argomento con un link che punta a un indirizzo IP all’interno della tua rete privata. Il sistema Onebox di Discourse potrebbe quindi recuperare tale URL e visualizzarne il contenuto in un Onebox.

Per evitare ciò, Discourse non accede a nessun URL fornito dall’utente senza prima verificare che non punti a indirizzi IP privati.

Si potrebbe sostenere che questo sia meno importante per i repository git utilizzati da temi e componenti tema, poiché questi sono specificati dagli amministratori, ma Discourse sta optando per la massima cautela.