Chrome: solicitudes DNS con nombres DNS aleatorios: ¿malware?

89

A lo largo de los años (desde 2005), he visto registros de extrañas solicitudes aleatorias de DNS realizadas en los múltiples servidores DNS / BIND que he mantenido.

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)

Por lo general, lo atribuí a algunos malware de Windows. Sin embargo, he comenzado a notar que también proviene de clientes Linux y Mac, últimamente. Nuevamente, pensé que podría deberse a algunos complementos maliciosos del navegador.

Sin embargo, al depurar un problema del navegador Google Chrome, en mi Macbook Pro / Chrome recién instalado, usando la URL chrome: // net-internals / # dns, encontré solicitudes similares en mi página de estadísticas DNS de Chrome.

Mi navegador Chrome tiene complementos bastante inocuos instalados y no hay signos aparentes de malware .

Tengo mis sinceras dudas sobre si debería ser o no una actividad maliciosa. ¿Qué está pasando?

(Como se ve en la imagen, pnxcygqqemww , ryzypwbheguutkd y snplueo solicitudes de nombres DNS realizadas por Chrome).

dns

Oler la actividad de DNS cuando se abre el navegador Chrome, con:

sudo tcpdump -n port 53

Puedo ver las siguientes solicitudes de DNS, y nuevamente las solicitudes aleatorias a las 10:20:34:

Apertura de 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)

Después de un par de segundos, las solicitudes aleatorias de DNS mencionadas aparecen de hecho:

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)

Abrir una nueva pestaña en 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)

Además, según el enlace @Gilles, cuando se usa un proxy (Squid) en Chrome, puede ver los nombres DNS aleatorios en el access.logarchivo de registro de Squid correspondiente , cuando Chrome se inicia:

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
Rui F Ribeiro
fuente

Respuestas:

125

Encontré una serie de publicaciones / informes de errores sobre solicitudes DNS aleatorias realizadas por Chrome. La conclusión es que las solicitudes aleatorias de DNS no son generadas por malware ni por complementos o complementos.

Chrome realiza las solicitudes para saber si puede manejar búsquedas realizadas desde su barra de direcciones.

La mejor explicación que he encontrado se cita a continuación desde este enlace .

Si escribe una consulta de búsqueda de una sola palabra, Chrome debe enviar una solicitud de DNS para verificar si puede ser un nombre de host de una sola palabra: por ejemplo, "prueba" podría ser una búsqueda de "prueba" o una navegación a " http: // prueba ". Si la consulta termina siendo un host, Chrome muestra una barra de información que pregunta "¿querías ir a 'prueba' en su lugar". Por razones de rendimiento, la consulta DNS debe ser asíncrona.

Ahora, algunos ISP comenzaron a mostrar anuncios de nombres de dominio inexistentes ( http://en.wikipedia.org/wiki/DNS_hijacking ), lo que significa que Chrome siempre mostrará esa barra de información para cada consulta de una sola palabra. Como esto es molesto, Chrome ahora envía tres solicitudes DNS aleatorias al inicio, y si todas se resuelven (a la misma IP, creo), ahora sabe que no debe mostrar la barra de información "¿quiso decir?" Para consultas de una sola palabra que resuelven a esa IP.

Más allá del nivel de ISP o el DNS de malware que secuestra la entrada de Wikipedia vinculada anteriormente, algunos puntos de acceso inalámbrico de pago o portales cautivos también secuestran DNS. Las solicitudes aleatorias se realizan a intervalos aparentemente aleatorios, y no solo al iniciar Chrome. Al menos, ocurren cada vez que la interfaz de red actual obtiene una nueva dirección IP.

Aquí hay otro enlace relacionado con el tema de @Gilles: solicitudes HEAD inusuales a URL sin sentido de Chrome . Por lo tanto, agregando a la pregunta el tema de la configuración de la prueba de proxy. Termina viendo registros de proxy porque, cuando se configura un proxy, las solicitudes se realizan a través del proxy; y depende del proxy resolver las solicitudes de DNS.

Al carecer de detalles más sólidos en línea, descargué y leí el código fuente de Chromium con el siguiente comando.

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

La cita a continuación se copió de los comentarios del código fuente de Chromium:

Debido a que esta función se puede invocar durante el inicio, cuando iniciar una búsqueda de URL puede consumir 20 ms de tiempo, demoramos siete segundos, lo que es de esperar el tiempo suficiente después del inicio, pero aún así obtener resultados rápidamente.

Este componente envía solicitudes a tres nombres de host generados aleatoriamente y, por lo tanto, probablemente inexistentes. Si al menos dos redireccionan al mismo nombre de host, esto sugiere que el ISP está secuestrando NXDOMAIN, y el omnibox debería tratar las navegaciones redirigidas similares como 'fallidas' al decidir si se le solicita al usuario una barra de información '¿Quisiste navegar?' Para cierta búsqueda entradas

disparador: "Al inicio y cuando cambia la dirección IP de la computadora".

Generamos un nombre de host aleatorio con entre 7 y 15 caracteres.

Mi conclusión es que esos nombres de solicitud DNS aleatorios no son una manifestación de comportamiento de malware ; son sondas para Chromium (y Google Chrome) para aprender lo que puede hacer al menos con respecto a las búsquedas .

Al carecer de detalles más sólidos en línea, descargué las fuentes de Chromium en mi investigación. La lógica que trata con esta funcionalidad se puede encontrar en el archivo src/chrome/browser/intranet_redirect_detector.ccy src/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc.

A continuación se muestra un extracto 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();
  } 

....

A continuación se muestra un extracto del archivo 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|!
}

Enlace relacionado: Solicitudes DNS de mayúsculas y minúsculas: ¿Malware en mi red? .

Ligeramente relacionado: ¿Por qué Chromium no almacena en caché DNS durante más de un minuto?

Rui F Ribeiro
fuente
@cat Gracias, ya que te gusta esto, tal vez te gustaría también este unix.stackexchange.com/questions/363498/…
Rui F Ribeiro
3
"También hay indicios de que esas solicitudes aleatorias se realizan a intervalos aparentemente aleatorios, y no solo al iniciar Chrome", definitivamente cierto. Los veo en los registros de paquetes, aunque básicamente nunca reinicio Chrome.
Kevin
2
@Kevin "cada vez que cambie la dirección IP de la computadora": su computadora necesita renovar su arrendamiento de DHCP con el enrutador a intervalos aparentemente aleatorios, lo que desencadenaría esto.
Riking
@Riking hecho. Lo comenté expresamente. Sin embargo, no estoy seguro de si sucede en otras condiciones.
Rui F Ribeiro