長年(2005年以降)、私が保守している複数のDNS/BINDサーバーで、奇妙なランダムDNS要求のログが表示されました。
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で、chrome:// net-internals /#dnsというURLを使用すると、Chrome DNS統計で同様のリクエストが見つかりましたページ。
私のChromeブラウザには、無害なプラグインがインストールされていますそしてマルウェアの兆候はありません。
私はそれが悪意のある活動であるかどうかを正直に疑っています。何が起こっている?
(画像に示すように、pnxcygqqemww、ryzypwbheguutkd、およびsnplueo Chromeによって行われたDNS名の要求)。
Chromeブラウザが開いているときにDNSアクティビティをスニッフィングします。
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リンクによると、Chromeでプロキシ(Squid)を使用している場合、Chromeの起動時に、対応するSquid access.log
ログファイルでランダムなDNS名を確認できます。
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
ChromeによるランダムなDNSリクエストに関する一連の投稿/バグレポートを見つけました。結論は、ランダムなDNS要求はマルウェアによっても、プラグインやアドオンによっても生成されないということです。
リクエストはChrome=によって実行され、アドレスバーからの検索を処理できるかどうかを確認します。
私が見つけた最良の説明は、この link から引用されています。
単一単語の検索クエリを入力した場合、chromeはDNSリクエストを送信して、これが単一単語のホスト名であるかどうかを確認する必要があります。たとえば、「test」は検索である可能性があります。 「テスト」または「 http:// test "へのナビゲーション。クエリが最終的にホストになる場合、chromeは、「代わりに「テスト」に行くことを意味します。」パフォーマンス上の理由から、DNSクエリは非同期である必要があります。
現在、一部のISPは、存在しないドメイン名( http://en.wikipedia.org/wiki/DNS_hijacking )の広告を表示し始めました。つまり、Chromeすべての単一単語クエリの情報バー。これは煩わしいので、chromeは起動時に3つのランダムなDNSリクエストを送信し、それらすべてが(同じIPに)解決されると、そのIPに解決される単一単語のクエリに対して「もしかして」という情報バーを表示しないこと。
上記のリンクされたWikipediaエントリをISPレベルまたはマルウェアDNSハイジャックする以外に、一部の有料ワイヤレスアクセスポイントまたはキャプティブポータルもDNSをハイジャックします。ランダムなリクエストは、Chromeの起動時だけでなく、一見ランダムな間隔で行われます。少なくとも、現在のネットワークインターフェイスが新しいIPアドレスを取得するたびに発生します。
@Gillesのテーマに関連する別のリンクは次のとおりです: nusual HEAD Chromeからの意味のないURLへのリクエスト したがって、質問にプロキシテスト設定のトピックを追加します。プロキシが構成されている場合、要求はプロキシ経由で行われ、DNS要求を解決するのはプロキシ次第なので、プロキシログが表示されます。
オンラインでより詳細な情報がないため、Chromiumのソースコードをダウンロードして以下のコマンドで熟読しました。
git clone https://chromium.googlesource.com/chromium/src
以下の引用は、Chromiumソースコードのコメントからコピーされました。
この関数は起動時に呼び出すことができるため、URLフェッチを開始すると20ミリ秒の時間を消費する可能性があるため、起動後に十分な長さの7秒の遅延が見込まれますが、結果はすぐに返されます。
このコンポーネントは、ランダムに生成された、存在しない可能性が高い3つのホスト名にリクエストを送信します。少なくとも2つのリダイレクトが同じホスト名にリダイレクトされる場合、これはISPがNXDOMAINをハイジャックしていることを示唆しており、特定の検索で「移動するつもりでしたか?入力。
トリガー:「起動時およびコンピューターのIPアドレスが変更されたとき。」
7〜15文字のランダムなホスト名を生成します。
私の結論は、これらのランダムなDNSリクエスト名はマルウェアの動作の兆候ではないということです;それらはプローブであり、Chromium(およびGoogle Chrome)が少なくとも検索。
オンラインでより詳細な情報がないため、調査ではChromiumのソースをダウンロードしました。この機能を処理するロジックは、ファイルsrc/chrome/browser/intranet_redirect_detector.cc
およびsrc/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要求-ネットワーク内のマルウェア? 。