Chrome: solicitações de DNS com nomes DNS aleatórios: malware?

77

Ao longo dos anos (desde 2005), vi registros de solicitações aleatórias de DNS aleatórios, nos vários servidores DNS / BIND que mantive.

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)

Eu geralmente atribui isso a algum malware do Windows. No entanto, eu comecei a notar que também vem dos clientes Linux e Mac, ultimamente. Mais uma vez pensei que poderia ser devido a alguns plug-in de navegador malicioso.

No entanto, ao depurar um problema do navegador Google Chrome, no meu Macbook Pro / Chrome recém-instalado, usando o URL chrome: // net-internals / # dns, encontrei solicitações semelhantes na minha página de estatísticas do DNS do Chrome.

Meu navegador Google Chrome tem plug-ins bastante inócuos instalados e nenhum sinal aparente de malware .

Tenho minhas dúvidas honestas sobre se deve ou não ser uma atividade maliciosa. O que está acontecendo?

(Como visto na imagem, pnxcygqqemww , ryzypwbheguutkd , e snplueo pedidos de nomes DNS feitos pelo Chrome).

FarejandoaatividadedoDNSquandoonavegadorGoogleChromeestásendoaberto,com:

sudotcpdump-nport53

EupossoverasseguintessolicitaçõesdeDNSenovamenteassolicitaçõesaleatóriasàs10:20:34:

AbrindooChrome:

tcpdump:datalinktypePKTAPtcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningonpktap,link-typePKTAP(AppleDLT_PKTAP),capturesize262144bytes10:20:27.119736IP1.1.1.2.12568>1.1.1.1.53:10990+A?apis.google.com.(33)10:20:27.119962IP1.1.1.2.34930>1.1.1.1.53:13828+A?disconnect.me.(31)10:20:27.120078IP1.1.1.2.17860>1.1.1.1.53:37420+A?mxr.mozilla.org.(33)10:20:27.120314IP1.1.1.1.53>1.1.1.2.12568:109902/4/4CNAMEplus.l.google.com.,A216.58.214.174(206)10:20:27.120479IP1.1.1.1.53>1.1.1.2.34930:138283/4/8A54.197.255.152,A54.225.94.202,A204.236.239.134(339)10:20:27.120666IP1.1.1.1.53>1.1.1.2.17860:374201/4/5A63.245.215.42(234)10:20:27.123394IP1.1.1.2.51642>1.1.1.1.53:58375+A?ssl.gstatic.com.(33)10:20:27.123658IP1.1.1.2.17933>1.1.1.1.53:48570+A?www.google.pt.(31)10:20:27.123726IP1.1.1.1.53>1.1.1.2.51642:583751/4/4A216.58.214.163(192)10:20:27.123897IP1.1.1.2.57779>1.1.1.1.53:7559+A?www.gstatic.com.(33)10:20:27.123946IP1.1.1.1.53>1.1.1.2.17933:485701/4/4A216.58.207.163(193)10:20:27.124192IP1.1.1.1.53>1.1.1.2.57779:755916/4/4A194.210.238.166,A194.210.238.170,A194.210.238.174,A194.210.238.176,A194.210.238.177,A194.210.238.181,A194.210.238.185,A194.210.238.187,A194.210.238.144,A194.210.238.148,A194.210.238.152,A194.210.238.154,A194.210.238.155,A194.210.238.159,A194.210.238.163,A194.210.238.165(432)10:20:27.432926IP1.1.1.2.29865>1.1.1.1.53:62300+A?clients4.google.com.(37)10:20:27.433219IP1.1.1.2.28193>1.1.1.1.53:23734+A?translate.googleapis.com.(42)10:20:27.433703IP1.1.1.1.53>1.1.1.2.29865:623002/4/4CNAMEclients.l.google.com.,A216.58.211.238(213)10:20:27.464772IP1.1.1.1.53>1.1.1.2.28193:237341/4/4A216.58.198.202(201)10:20:28.430622IP1.1.1.2.46792>1.1.1.1.53:1963+A?accounts.google.com.(37)10:20:28.431046IP1.1.1.1.53>1.1.1.2.46792:19631/4/4A216.58.201.141(189)10:20:32.348765IP1.1.1.2.16654>1.1.1.1.53:39847+A?www.google.com.(32)10:20:32.349362IP1.1.1.1.53>1.1.1.2.16654:398471/4/4A216.58.213.164(184)

Apósalgunssegundos,assolicitaçõesdeDNSaleatóriasmencionadasaparecemdefato:

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

AbrindoumanovaguianoChrome:

10:20:44.106915IP1.1.1.2.26171>1.1.1.1.53:14460+A?clients2.google.com.(37)10:20:44.139387IP1.1.1.1.53>1.1.1.2.26171:144602/4/4CNAMEclients.l.google.com.,A216.58.211.238(213)

Alémdisso,deacordocomolink@Gilles,aousarumproxy(Squid)noChrome,vocêpodeverosnomesDNSaleatóriosnoarquivodelogdoSquidaccess.logcorrespondente,quandooChromeestáinicializando:

1494276554.709216127.0.0.1TCP_MISS/504277HEADhttp://vgifrooogs/ - DIRECT/vgifrooogs text/html e 1494276554.731 238 127.0.0.1 TCP_MISS/504 277 HEAD http://cbwknhka/ - DIRECT/cbwknhka text/html e 1494276554.875 382 127.0.0.1 TCP_MISS/504 277 HEAD http://vtjhiag/ - DIRECT/vtjhiag text/html

    
por Rui F Ribeiro 07.05.2017 / 13:37

1 resposta

109

Acabei cavando, na Internet, uma série de posts / relatórios de bugs sobre pedidos aleatórios de DNS, feitos pelo Chrome.

A conclusão é que as solicitações de DNS "aleatórias" não são geradas por malware nem por plug-ins / complementos.

Tais solicitações de DNS são feitas intencionalmente pelo próprio Chrome, para descobrir se ele pode lidar adequadamente com pesquisas de frases na barra de endereço.

Como ele coloca a melhor explicação que encontrei, neste link :

If you type in a single-word search query, chrome needs to send a DNS request to check if this might be a single-word host name: For example, "test" might be a search for "test" or a navigation to "http://test". If the query ends up being a host, chrome shows an infobar that asks "did you mean to go to 'test' instead". For performance reasons, the DNS query needs to be asynchronous.

Now some ISPs started showing ads for non-existent domain names ( http://en.wikipedia.org/wiki/DNS_hijacking ), meaning Chrome would always show that infobar for every single-word query. Since this is annoying, chrome now sends three random DNS requests at startup, and if they all resolve (to the same IP, I think), it now knows not to show the "did you mean" infobar for single-word queries that resolve to that IP.

(Como uma nota lateral, além do nível de ISP / DNS de malware seqüestrando a entrada da Wikipedia acima mencionada, alguns pontos de acesso sem fio pagos / portais cativos também seqüestram DNS.)

Também há sugestões para essas solicitações aleatórias em intervalos aparentemente aleatórios, e não apenas ao iniciar o Google Chrome. Pelo menos, eles acontecem toda vez que a interface de rede atual sobe / recebe um novo endereço IP.

Sobre outro link relacionado ao tema de @Gilles, Incomum HEAD solicitações para URLs sem sentido do Chrome - e, portanto, adicionar à pergunta a configuração do teste de proxy; você acaba vendo logs de proxy / squid porque quando um proxy é configurado em um navegador, as solicitações são feitas por meio do proxy e cabe ao proxy para resolver as solicitações de DNS.

A falta de detalhes mais sólidos on-line, fiz o download e examinei o código-fonte do Chromium no link com o comando:

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

De acordo com os comentários do código-fonte do Chromium:

Because this function can be called during startup, when kicking off a URL fetch can eat up 20 ms of time, we delay seven seconds, which is hopefully long enough to be after startup, but still get results back quickly.

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."

We generate a random hostname with between 7 and 15 characters.

Assim, a conclusão é que esses nomes aleatórios de solicitações de DNS não são uma manifestação do comportamento de malware ; eles são testes para o Chrome / Chromium para descobrir o que ele pode fazer em relação a pelo menos as pesquisas .

P.S. Eu fiz o download das fontes do Chromium, pois o Chromium é de código aberto; da minha investigação, a lógica que lida com essa funcionalidade pode ser encontrada em src/chrome/browser/intranet_redirect_detector.cc e src/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc . (daí a citação anterior dos comentários)

Trechos de 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();
  } 

....

Trechos de 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|!
}

Ligeiramente relacionado: Solicitações de DNS de caso misto - Malware na minha rede?

    
por 07.05.2017 / 13:37