Chrome: richieste DNS con nomi DNS casuali: malware?


89

Nel corso degli anni (dal 2005), ho visto registri di strane richieste DNS casuali fatte, su più server DNS / BIND che ho gestito.

May  7 12:13:50 1.1.1.1 named[63742]: client 1.1.1.2#24123 (verxkgiicjmcnxg): view internal: query: verxkgiicjmcnxg IN A + (1.1.1.1)
May  7 12:13:50 1.1.1.1 named[63742]: client 1.1.1.2#29159 (epqoaqsayo): view internal: query: epqoaqsayo IN A + (1.1.1.1)
May  7 12:13:50 1.1.1.1 named[63742]: client 1.1.1.2#27411 (qlllglwcjglu): view internal: query: qlllglwcjglu IN A + (1.1.1.1)

Di solito lo attribuivo ad alcuni malware di Windows. Tuttavia, ho iniziato a notare che proviene anche da client Linux e Mac, ultimamente. Ancora una volta ho pensato che potrebbe essere dovuto ad alcuni plug-in del browser dannoso.

Tuttavia, durante il debug di un problema con il browser Google Chrome, nel mio Macbook Pro / Chrome appena installato, utilizzando l'URL chrome: // net-internals / # dns, ho trovato richieste simili nella mia pagina delle statistiche DNS di Chrome.

Il mio browser Chrome ha plug-in piuttosto innocui installati e nessun segno apparente di malware .

Ho i miei onesti dubbi sul fatto che dovrebbe essere un'attività dannosa o meno. Che cosa sta succedendo?

(Come si vede nell'immagine, pnxcygqqemww , ryzypwbheguutkd e snplueo richieste di nomi DNS fatte da Chrome).

dns

Annusare l'attività DNS quando si apre il browser Chrome, con:

sudo tcpdump -n port 53

Sono in grado di vedere le seguenti richieste DNS, e di nuovo le richieste casuali alle 10:20:34:

Apertura di Chrome:

tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
10:20:27.119736 IP 1.1.1.2.12568 > 1.1.1.1.53: 10990+ A? apis.google.com. (33)
10:20:27.119962 IP 1.1.1.2.34930 > 1.1.1.1.53: 13828+ A? disconnect.me. (31)
10:20:27.120078 IP 1.1.1.2.17860 > 1.1.1.1.53: 37420+ A? mxr.mozilla.org. (33)
10:20:27.120314 IP 1.1.1.1.53 > 1.1.1.2.12568: 10990 2/4/4 CNAME plus.l.google.com., A 216.58.214.174 (206)
10:20:27.120479 IP 1.1.1.1.53 > 1.1.1.2.34930: 13828 3/4/8 A 54.197.255.152, A 54.225.94.202, A 204.236.239.134 (339)
10:20:27.120666 IP 1.1.1.1.53 > 1.1.1.2.17860: 37420 1/4/5 A 63.245.215.42 (234)
10:20:27.123394 IP 1.1.1.2.51642 > 1.1.1.1.53: 58375+ A? ssl.gstatic.com. (33)
10:20:27.123658 IP 1.1.1.2.17933 > 1.1.1.1.53: 48570+ A? www.google.pt. (31)
10:20:27.123726 IP 1.1.1.1.53 > 1.1.1.2.51642: 58375 1/4/4 A 216.58.214.163 (192)
10:20:27.123897 IP 1.1.1.2.57779 > 1.1.1.1.53: 7559+ A? www.gstatic.com. (33)
10:20:27.123946 IP 1.1.1.1.53 > 1.1.1.2.17933: 48570 1/4/4 A 216.58.207.163 (193)
10:20:27.124192 IP 1.1.1.1.53 > 1.1.1.2.57779: 7559 16/4/4 A 194.210.238.166, A 194.210.238.170, A 194.210.238.174, A 194.210.238.176, A 194.210.238.177, A 194.210.238.181, A 194.210.238.185, A 194.210.238.187, A 194.210.238.144, A 194.210.238.148, A 194.210.238.152, A 194.210.238.154, A 194.210.238.155, A 194.210.238.159, A 194.210.238.163, A 194.210.238.165 (432)
10:20:27.432926 IP 1.1.1.2.29865 > 1.1.1.1.53: 62300+ A? clients4.google.com. (37)
10:20:27.433219 IP 1.1.1.2.28193 > 1.1.1.1.53: 23734+ A? translate.googleapis.com. (42)
10:20:27.433703 IP 1.1.1.1.53 > 1.1.1.2.29865: 62300 2/4/4 CNAME clients.l.google.com., A 216.58.211.238 (213)
10:20:27.464772 IP 1.1.1.1.53 > 1.1.1.2.28193: 23734 1/4/4 A 216.58.198.202 (201)
10:20:28.430622 IP 1.1.1.2.46792 > 1.1.1.1.53: 1963+ A? accounts.google.com. (37)
10:20:28.431046 IP 1.1.1.1.53 > 1.1.1.2.46792: 1963 1/4/4 A 216.58.201.141 (189)
10:20:32.348765 IP 1.1.1.2.16654 > 1.1.1.1.53: 39847+ A? www.google.com. (32)
10:20:32.349362 IP 1.1.1.1.53 > 1.1.1.2.16654: 39847 1/4/4 A 216.58.213.164 (184)

Dopo un paio di secondi, le richieste DNS casuali menzionate appaiono davvero:

10:20:34.159229 IP 1.1.1.2.5042 > 1.1.1.1.53: 47676+ A? kblxfid.xxx.xxx.xxx. (44)
10:20:34.159829 IP 1.1.1.2.63360 > 1.1.1.1.53: 55094+ A? weefjmw.xxx.xxx.xxx. (44)
10:20:34.159893 IP 1.1.1.1.53 > 1.1.1.2.5042: 47676 NXDomain* 0/1/0 (104)
10:20:34.160230 IP 1.1.1.1.53 > 1.1.1.2.63360: 55094 NXDomain* 0/1/0 (104)
10:20:34.160872 IP 1.1.1.2.29339 > 1.1.1.1.53: 22434+ A? luebcanqpumlaj.xxx.xxx.xxx. (51)
10:20:34.161290 IP 1.1.1.1.53 > 1.1.1.2.29339: 22434 NXDomain* 0/1/0 (111)
10:20:34.162489 IP 1.1.1.2.64592 > 1.1.1.1.53: 49055+ A? kblxfid.xxx.xxx.xxx. (44)
10:20:34.162859 IP 1.1.1.1.53 > 1.1.1.2.64592: 49055 NXDomain* 0/1/0 (104)
10:20:34.164105 IP 1.1.1.2.50225 > 1.1.1.1.53: 1276+ A? weefjmw.xxx.xxx.xxx. (44)
10:20:34.164386 IP 1.1.1.2.52389 > 1.1.1.1.53: 59022+ A? luebcanqpumlaj.xxx.xxx.xxx. (51)
10:20:34.164472 IP 1.1.1.1.53 > 1.1.1.2.50225: 1276 NXDomain* 0/1/0 (104)
10:20:34.164751 IP 1.1.1.1.53 > 1.1.1.2.52389: 59022 NXDomain* 0/1/0 (111)

Apertura di una nuova scheda in Chrome:

10:20:44.106915 IP 1.1.1.2.26171 > 1.1.1.1.53: 14460+ A? clients2.google.com. (37)
10:20:44.139387 IP 1.1.1.1.53 > 1.1.1.2.26171: 14460 2/4/4 CNAME clients.l.google.com., A 216.58.211.238 (213)

Inoltre, secondo il link @Gilles, quando si utilizza un proxy (Squid) in Chrome, è possibile visualizzare i nomi DNS casuali nel access.logfile di registro Squid corrispondente , all'avvio di Chrome:

1494276554.709    216 127.0.0.1 TCP_MISS/504 277 HEAD http://vgifrooogs/ - DIRECT/vgifrooogs text/html
1494276554.731    238 127.0.0.1 TCP_MISS/504 277 HEAD http://cbwknhka/ - DIRECT/cbwknhka text/html  
1494276554.875    382 127.0.0.1 TCP_MISS/504 277 HEAD http://vtjhiag/ - DIRECT/vtjhiag text/html

Risposte:


125

Ho trovato una serie di post / segnalazioni di bug su richieste DNS casuali fatte da Chrome. La conclusione è che le richieste DNS casuali non sono generate né da malware né da plug-in o componenti aggiuntivi.

Le richieste vengono fatte da Chrome per sapere se è in grado di gestire le ricerche effettuate dalla barra degli indirizzi.

La migliore spiegazione che ho trovato è riportata di seguito da questo link .

Se digiti una query di ricerca a parola singola, Chrome deve inviare una richiesta DNS per verificare se potrebbe trattarsi di un nome host a parola singola: ad esempio, "test" potrebbe essere una ricerca di "test" o una navigazione a " http: // test ". Se la query finisce per essere un host, Chrome mostra una barra delle informazioni che chiede "intendevi invece andare a" test ". Per motivi di prestazioni, la query DNS deve essere asincrona.

Ora alcuni ISP hanno iniziato a mostrare annunci per nomi di dominio inesistenti ( http://en.wikipedia.org/wiki/DNS_hijacking ), il che significa che Chrome avrebbe sempre mostrato quella infobar per ogni query a parola singola. Poiché questo è fastidioso, Chrome ora invia tre richieste DNS casuali all'avvio e, se si risolvono tutte (allo stesso IP, penso), ora sa di non mostrare la barra dei dati "intendevi dire" per le query a parola singola che risolvono a quell'IP.

Oltre al livello ISP o al malware DNS che dirotta la voce Wikipedia collegata sopra, alcuni punti di accesso wireless a pagamento o portali captive dirottano anche il DNS. Le richieste casuali vengono fatte a intervalli apparentemente casuali e non solo all'avvio di Chrome. Almeno, si verificano ogni volta che l'interfaccia di rete corrente ottiene un nuovo indirizzo IP.

Ecco un altro link correlato al tema di @Gilles: richieste HEAD insolite a URL senza senso da Chrome . Quindi, aggiungendo alla domanda l'argomento della configurazione del test proxy. Si finisce per vedere i log del proxy perché, quando un proxy è configurato, le richieste vengono fatte tramite il proxy; e spetta al proxy risolvere le richieste DNS.

In mancanza di dettagli più solidi online, ho scaricato e analizzato il codice sorgente di Chromium con il comando seguente.

git clone https://chromium.googlesource.com/chromium/src 

La citazione seguente è stata copiata dai commenti sul codice sorgente di Chromium:

Poiché questa funzione può essere richiamata durante l'avvio, quando l'avvio di un recupero URL può richiedere 20 ms di tempo, ritardiamo sette secondi, che si spera sia abbastanza lungo da essere dopo l'avvio, ma otteniamo comunque risultati rapidamente.

Questo componente invia richieste a tre nomi host generati casualmente, e quindi probabilmente inesistenti. Se almeno due reindirizzamenti allo stesso nome host, ciò suggerisce che l'ISP sta dirottando NXDOMAIN e l'omnibox dovrebbe considerare simili navigazioni reindirizzate come "non riuscite" quando decide se richiedere all'utente una barra dei dati "intendevi navigare" per una determinata ricerca ingressi.

trigger: "All'avvio e quando l'indirizzo IP del computer cambia."

Generiamo un nome host casuale con un numero di caratteri compreso tra 7 e 15.

La mia conclusione è che quei nomi di richieste DNS casuali non sono una manifestazione del comportamento del malware ; sono sonde per Chromium (e Google Chrome) per sapere cosa può fare riguardo almeno alle ricerche .

In mancanza di dettagli più solidi online, nella mia indagine ho scaricato le fonti di Chromium. La logica relativa a questa funzionalità è disponibile nel file src/chrome/browser/intranet_redirect_detector.cce src/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc.

Di seguito è riportato un estratto di src/chrome/browser/intranet_redirect_detector.cc:

void IntranetRedirectDetector::FinishSleep() {
  in_sleep_ = false;

  // If another fetch operation is still running, cancel it.
  fetchers_.clear();
  resulting_origins_.clear();

  const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
  if (cmd_line->HasSwitch(switches::kDisableBackgroundNetworking))
    return;

  DCHECK(fetchers_.empty() && resulting_origins_.empty());

  // Create traffic annotation tag.
  net::NetworkTrafficAnnotationTag traffic_annotation =
      net::DefineNetworkTrafficAnnotation("intranet_redirect_detector", R"(
        semantics {
          sender: "Intranet Redirect Detector"
          description:
            "This component sends requests to three randomly generated, and "
            "thus likely nonexistent, hostnames.  If at least two redirect to "
            "the same hostname, this suggests the ISP is hijacking NXDOMAIN, "
            "and the omnibox should treat similar redirected navigations as "
            "'failed' when deciding whether to prompt the user with a 'did you "
            "mean to navigate' infobar for certain search inputs."
          trigger: "On startup and when IP address of the computer changes."
          data: "None, this is just an empty request."
          destination: OTHER
        }
        policy {
          cookies_allowed: false
          setting: "This feature cannot be disabled by settings."
          policy_exception_justification:
              "Not implemented, considered not useful."
        })");

  // Start three fetchers on random hostnames.
  for (size_t i = 0; i < 3; ++i) {
    std::string url_string("http://");
    // We generate a random hostname with between 7 and 15 characters.
    const int num_chars = base::RandInt(7, 15);
    for (int j = 0; j < num_chars; ++j)
      url_string += ('a' + base::RandInt(0, 'z' - 'a'));
    GURL random_url(url_string + '/');
    std::unique_ptr<net::URLFetcher> fetcher = net::URLFetcher::Create(
        random_url, net::URLFetcher::HEAD, this, traffic_annotation);
    // We don't want these fetches to affect existing state in the profile.
    fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE |
                          net::LOAD_DO_NOT_SAVE_COOKIES |
                          net::LOAD_DO_NOT_SEND_COOKIES |
                          net::LOAD_DO_NOT_SEND_AUTH_DATA);
    fetcher->SetRequestContext(g_browser_process->system_request_context());
    fetcher->Start();
    net::URLFetcher* fetcher_ptr = fetcher.get();
    fetchers_[fetcher_ptr] = std::move(fetcher);
  }
}

void IntranetRedirectDetector::OnURLFetchComplete(
    const net::URLFetcher* source) {
  // Delete the fetcher on this function's exit.
  auto it = fetchers_.find(const_cast<net::URLFetcher*>(source));
  DCHECK(it != fetchers_.end());
  std::unique_ptr<net::URLFetcher> fetcher = std::move(it->second);
  fetchers_.erase(it);

  // If any two fetches result in the same domain/host, we set the redirect
  // origin to that; otherwise we set it to nothing.
  if (!source->GetStatus().is_success() || (source->GetResponseCode() != 200)) {
    if ((resulting_origins_.empty()) ||
        ((resulting_origins_.size() == 1) &&
         resulting_origins_.front().is_valid())) {
      resulting_origins_.push_back(GURL());
      return;
    }
    redirect_origin_ = GURL();
  } 

....

Di seguito è riportato un estratto del file src/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc:

// Returns true if |final_url| doesn't represent an ISP hijack of
// |original_url|, based on the IntranetRedirectDetector's RedirectOrigin().
bool IsValidNavigation(const GURL& original_url, const GURL& final_url) {

....

void ChromeOmniboxNavigationObserver::NavigationEntryCommitted(
    const content::LoadCommittedDetails& load_details) {
  load_state_ = LOAD_COMMITTED;
  if (ResponseCodeIndicatesSuccess(load_details.http_status_code) &&
      IsValidNavigation(match_.destination_url,
                        load_details.entry->GetVirtualURL()))
    OnSuccessfulNavigation();
  if (!fetcher_ || (fetch_state_ != FETCH_NOT_COMPLETE))
    OnAllLoadingFinished();  // deletes |this|!
}

...

void ChromeOmniboxNavigationObserver::OnURLFetchComplete(
    const net::URLFetcher* source) {
  DCHECK_EQ(fetcher_.get(), source);
  const net::URLRequestStatus& status = source->GetStatus();
  int response_code = source->GetResponseCode();
  fetch_state_ =
      (status.is_success() && ResponseCodeIndicatesSuccess(response_code)) ||
              ((status.status() == net::URLRequestStatus::CANCELED) &&
               ((response_code / 100) == 3) &&
               IsValidNavigation(alternate_nav_match_.destination_url,
                                 source->GetURL()))
          ? FETCH_SUCCEEDED
          : FETCH_FAILED;
  if (load_state_ == LOAD_COMMITTED)
    OnAllLoadingFinished();  // deletes |this|!
}

Link correlato: Richieste DNS a caso misto - Malware nella mia rete? .

Leggermente correlato: perché Chromium non memorizza nella cache DNS per più di un minuto?


@cat Grazie, dato che ti piace forse anche questo ti piacerebbe unix.stackexchange.com/questions/363498/…
Rui F Ribeiro

3
"Ci sono anche suggerimenti che quelle richieste casuali vengono fatte a intervalli apparentemente casuali, e non solo all'avvio di Chrome" - sicuramente vero. Li vedo nei registri dei pacchetti anche se praticamente non riavvio mai Chrome.
Kevin,

2
@Kevin "ogni volta che cambia l'indirizzo IP del computer" - il tuo computer deve rinnovare il suo lease DHCP con il router a intervalli apparentemente casuali, il che innescerebbe questo.
Riking

@Riking Indeed. L'ho commentato espressamente. Non sono tuttavia sicuro che accada in altre condizioni.
Rui F Ribeiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.