Chrome: คำขอ DNS ที่มีชื่อ DNS สุ่ม: มัลแวร์


88

ในช่วงหลายปีที่ผ่านมา (ตั้งแต่ปี 2005) ฉันได้เห็นบันทึกคำขอ DNS แบบสุ่มแปลก ๆ เสร็จแล้วบนเซิร์ฟเวอร์ DNS / BIND หลายเครื่องที่ฉันดูแล

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)

ฉันมักจะชอล์กถึงมัลแวร์ Windows บางตัว อย่างไรก็ตามฉันเริ่มสังเกตเห็นว่ามันมาจากไคลเอนต์ Linux และ Mac เมื่อเร็ว ๆ นี้ อีกครั้งฉันคิดว่าอาจเป็นเพราะปลั๊กอินของเบราว์เซอร์ที่เป็นอันตราย

อย่างไรก็ตามในขณะที่การดีบักปัญหาเบราว์เซอร์ Google Chrome ใน Macbook Pro / Chrome ที่ติดตั้งใหม่ของฉันโดยใช้ URL chrome: // net-internals / # dns ฉันพบคำขอที่คล้ายกันในหน้าสถิติ DNS ของ Chrome

เบราว์เซอร์ Chrome ของฉันมีค่อนข้างอันตรายติดตั้งปลั๊กอินและไม่มีสัญญาณที่ชัดเจนของมัลแวร์

ฉันมีข้อสงสัยอย่างตรงไปตรงมาว่าควรจะเป็นกิจกรรมที่เป็นอันตรายหรือไม่ เกิดอะไรขึ้น?

(ตามที่เห็นในรูปภาพpnxcygqqemww , ryzypwbheguutkdและsnplueo DNS ร้องขอชื่อโดย Chrome)

DNS

การดมกลิ่นกิจกรรม DNS เมื่อเปิดเบราว์เซอร์ Chrome ด้วย:

sudo tcpdump -n port 53

ฉันสามารถดูคำขอ DNS ต่อไปนี้และขอสุ่มอีกครั้งได้ที่ 10:20:34:

กำลังเปิด 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)

หลังจากสองสามวินาทีคำขอ DNS แบบสุ่มที่กล่าวถึงจะปรากฏขึ้นจริง:

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)

การเปิดแท็บใหม่ใน 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)

นอกจากนี้ตามลิงก์ @Gilles เมื่อใช้พร็อกซี (Squid) ใน Chrome คุณสามารถเห็นชื่อ DNS แบบสุ่มในaccess.logไฟล์บันทึกSquid ที่เกี่ยวข้องเมื่อ 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

คำตอบ:


124

ฉันพบชุดบทความ / รายงานข้อผิดพลาดเกี่ยวกับการร้องขอ DNS แบบสุ่มที่ทำโดย Chrome สรุปได้ว่าคำขอ DNS แบบสุ่มนั้นไม่ได้สร้างขึ้นโดยมัลแวร์หรือโดยปลั๊กอินหรือโปรแกรมเสริม

Chrome ดำเนินการตามคำขอเพื่อเรียนรู้ว่าสามารถจัดการการค้นหาที่ทำจากแถบที่อยู่ได้หรือไม่

คำอธิบายที่ดีที่สุดที่ฉันได้พบจะยกมาด้านล่างจากนี้การเชื่อมโยง

หากคุณพิมพ์ข้อความค้นหาคำเดียวโครเมี่ยมต้องส่งคำขอ DNS เพื่อตรวจสอบว่านี่อาจเป็นชื่อโฮสต์คำเดียว: ตัวอย่างเช่น "test" อาจเป็นการค้นหา "test" หรือการนำทางไปยัง " http: // test " หากแบบสอบถามกลายเป็นโฮสต์โครเมี่ยมจะแสดงแถบข้อมูลที่ถามว่า "คุณหมายถึงไปที่ 'ทดสอบ' แทนหรือไม่ สำหรับเหตุผลด้านประสิทธิภาพแบบสอบถาม DNS จะต้องไม่ตรงกัน

ขณะนี้ผู้ให้บริการอินเทอร์เน็ตบางรายเริ่มแสดงโฆษณาสำหรับชื่อโดเมนที่ไม่มีอยู่ ( http://en.wikipedia.org/wiki/DNS_hijacking ) ซึ่งหมายความว่า Chrome จะแสดงแถบข้อมูลดังกล่าวสำหรับคำค้นหาทุกคำ เนื่องจากเป็นสิ่งที่น่ารำคาญ Chrome จึงส่งคำขอ DNS แบบสุ่มสามรายการเมื่อเริ่มต้นและหากพวกเขาแก้ปัญหาทั้งหมด (กับ IP เดียวกันฉันคิดว่า) ตอนนี้ก็รู้ว่าจะไม่แสดงแถบข้อมูล "คุณหมายถึง" สำหรับการสืบค้นคำเดียว เพื่อ IP นั้น

นอกเหนือจากระดับ ISP หรือมัลแวร์ DNS ที่ถูกขโมยไปยังรายการ Wikipedia ที่เชื่อมโยงข้างต้นแล้วจุดเชื่อมต่อไร้สายที่จ่ายเงินบางส่วนหรือพอร์ทัลที่เป็นเชลยก็ยังทำการจี้ DNS ด้วย คำขอสุ่มจะทำในช่วงเวลาที่ดูเหมือนสุ่มและไม่ใช่แค่เมื่อเริ่มต้น Chrome อย่างน้อยก็เกิดขึ้นทุกครั้งที่ส่วนต่อประสานเครือข่ายปัจจุบันได้รับที่อยู่ IP ใหม่

นี่คือลิงค์อื่นที่เกี่ยวข้องกับชุดรูปแบบจาก @Gilles: คำขอ HEAD ที่ผิดปกติไปยัง URL เรื่องไร้สาระจาก Chrome ดังนั้นให้เพิ่มคำถามในหัวข้อการตั้งค่าการทดสอบพร็อกซี คุณเห็นการบันทึกพร็อกซี่เนื่องจากเมื่อมีการกำหนดค่าพร็อกซีคำขอจะทำผ่านทางพร็อกซี และขึ้นอยู่กับพร็อกซีเพื่อแก้ไขคำขอ DNS

ไม่มีรายละเอียดที่ชัดเจนมากขึ้นออนไลน์ฉันดาวน์โหลดและอ่านรหัสต้นฉบับ Chromium ด้วยคำสั่งด้านล่าง

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

คำพูดด้านล่างถูกคัดลอกมาจากความคิดเห็นของรหัสแหล่ง Chromium:

เนื่องจากสามารถเรียกใช้ฟังก์ชั่นนี้ได้ในระหว่างการเริ่มต้นเมื่อเริ่มการดึง URL ออกมาสามารถกินเวลาได้ 20 ms เราจึงหน่วงเวลาเจ็ดวินาทีซึ่งหวังว่าจะนานพอที่จะเริ่มทำงานหลังจากนั้น แต่ก็ยังได้ผลลัพธ์อย่างรวดเร็ว

องค์ประกอบนี้ส่งคำขอไปยังสามชื่อที่สร้างแบบสุ่มและมีแนวโน้มว่าไม่มีชื่อโฮสต์ หากมีการเปลี่ยนเส้นทางอย่างน้อยสองครั้งไปยังชื่อโฮสต์เดียวกันนี่แสดงว่า ISP กำลังทำการลักลอบ NXDOMAIN และแถบอเนกประสงค์ควรปฏิบัติการนำทางที่คล้ายกันในการเปลี่ยนเส้นทางที่เป็น 'ล้มเหลว' เมื่อตัดสินใจว่าจะให้ผู้ใช้ด้วย 'คุณหมายถึงนำทาง' แถบข้อมูล ปัจจัยการผลิต

ทริกเกอร์: "เมื่อเริ่มต้นและเมื่อที่อยู่ IP ของคอมพิวเตอร์เปลี่ยน"

เราสร้างชื่อโฮสต์สุ่มที่มีความยาวระหว่าง 7 ถึง 15 ตัวอักษร

ข้อสรุปของฉันคือการที่ผู้ร้องขอชื่อ DNS สุ่มไม่ได้รวมตัวกันของพฤติกรรมของมัลแวร์ ; พวกเขาจะprobesสำหรับโครเมียม (และ Google Chrome) เพื่อเรียนรู้สิ่งที่มันสามารถทำเกี่ยวกับที่การค้นหาอย่างน้อย

ไม่มีรายละเอียดที่ชัดเจนมากขึ้นออนไลน์ฉันดาวน์โหลด Chromium ในการตรวจสอบของฉัน ตรรกะที่เกี่ยวข้องกับการทำงานนี้สามารถพบได้ที่ในไฟล์และsrc/chrome/browser/intranet_redirect_detector.ccsrc/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc

ด้านล่างเป็นข้อความที่ตัดตอนมาจาก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();
  } 

....

ด้านล่างเป็นข้อความที่ตัดตอนมาของไฟล์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|!
}

ลิงค์ที่เกี่ยวข้อง: คำขอ DNS แบบตัวพิมพ์ใหญ่ - มัลแวร์ในเครือข่ายของฉันหรือไม่ .

เกี่ยวข้องเล็กน้อย: ทำไม Chromium จึงไม่แคช DNS นานกว่าหนึ่งนาที


@cat ขอบคุณเนื่องจากคุณชอบสิ่งนี้บางทีคุณอาจจะชอบอันนี้ด้วยunix.stackexchange.com/questions/363498/…
Rui F Ribeiro

3
"นอกจากนี้ยังมีคำใบ้คำขอสุ่มเหล่านั้นถูกสร้างขึ้นตามช่วงเวลาแบบสุ่มซึ่งดูเหมือนว่าจะไม่ได้เกิดขึ้นเมื่อเริ่มต้นใช้งาน Chrome" - เป็นความจริงอย่างแน่นอน ฉันเห็นมันในบันทึกแพ็คเก็ตแม้ว่าโดยทั่วไปฉันจะไม่รีสตาร์ท Chrome
เควิน

2
@Kevin "เมื่อใดก็ตามที่มีการเปลี่ยนแปลงที่อยู่ IP ของคอมพิวเตอร์" - คอมพิวเตอร์ของคุณจำเป็นต้องต่ออายุ DHCP ของสัญญาเช่ากับเราเตอร์ในช่วงเวลาสุ่มซึ่งดูเหมือนว่าจะเรียกสิ่งนี้
Riking

@Riking แน่นอน ฉันแสดงความคิดเห็นว่าออกมาอย่างชัดเจน แต่ฉันไม่แน่ใจว่ามันจะเกิดขึ้นในเงื่อนไขอื่น ๆ
Rui F Ribeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.