DNSは、インターネット接続時に端末とサーバーがやりとりをしてIPアドレスに対しドメイン名を受け取る仕組みである。普段は自動的に正規のサーバーとやりとりをしているので問題はないが、ユーザーが気付かないままリンク先が変わってしまうという攻撃もある。
この記事は、ESETが運営するマルウェアやセキュリティに関する情報サイト「Welivesecurity」の記事を翻訳したものである。
勝手に所定のDNSサーバーを使わせる「DNSハイジャック(乗っ取り)」……と書いても、この攻撃に関心を持つ理由が分かりにくいかもしれない。だが、この攻撃はユーザーからは確認が困難なために、知っておくだけの価値がある。外部からDNSの静的エントリーが設定されてしまうにもかかわらず、それがGUI上ではプライマリー、セカンダリーDNSのエリアには表示されないし、さらにひどいことに、DHCPを使っていなくてもDHCPを使っていると表示されてしまう。こうした操作を行うのが「DNSアンロッカー」(DNS Unlocker)と名付けられた「PUA」(Potentially Unwanted Applicationの略、潜在的に望まれないアプリケーションのこと)である。
DNSアンロッカーは、フリーソフトをインストールした後に勝手にブラウザーに広告を表示させるアドウェアである。被害者のネットワーク設定を、偽のDNSサーバーを使用するように書き換え、被害者のブラウザーがGoogle Analytics.comを探していれば、不正なDNSサーバーはJavaScriptを挿入して不正なサーバーを指定する。
実行されると、DNSアンロッカーによる広告がGoogle Analyticsを通じてWebページに挿入される。一般的には、DNSアンロッカーに感染したコンピューターのユーザーは、表示部の下に「Ads by DNSUnlocker」と示された広告を見ることになる。
ほかにも類似例があり、「support scam」(サポート詐欺)とポップアップが表示される場合がある。
DNS設定の改変
DNSをハイジャックするマルウェアは特に目新しいものではない。あるいは、通常はあらためて取り上げるほどのものではない。このDNSアンロッカーを興味深いものにしているのは、ひそかにDNS設定を書き換えてしまうトリックにある。
もしもあなたがWindows上の「TCP/IPv4」のプロパティを調べようとすると、何らかのDNSの静的エントリーが、コントロールパネルのウィンドウの下部に表示されるはずである。
オプションとして以下のDNSサーバーのアドレスが選択されていれば、最初に問い合わせる「優先DNSサーバー」のフィールドに、IPアドレスが表示されているはずだ。続いて(優先DNSサーバーが応答しないときに代わりに利用される)「代替DNSサーバー」のフィールドもある。しかし、DNSアドレスを取得するためにDHCPを使っているのであれば、画像にあるように、DNSサーバーのアドレスは自動的に取得される。
驚いたことに、DNS アンロッカーは、TCP/IPv4のコントロールパネルが、あたかもDNSが自動的に取得されたかのように、静的DNSの設定が表示される。実際、コマンドラインからの「ipconfig /all」の実行結果は、DHCPを使っていることを示すだろう。だが実際には、静的に設定されたDNSアドレスを「参照する」ことになるだろう。「ipconfig」を使うと、静的なDNSアドレスを「参照する」にもかかわらず、それを本当に「使っている」かどうか、明らかにする方法はない。そこで、これは自動的に取得されたものだと考えてしまう。
しかし、GUIでは、自分が自動的にDNSサーバーのアドレスを取得しているかどうかは、(表示されていない)静的なアドレスを実際に使っていれば、はっきりしている。どのようにするとGUIに静的なDNSを使っていることを表示させないようにできるのだろうか。これを理解するためには、Windowsが静的なDNSをレジストリーでどのように示しているかを見る必要がある。
WindowsレジストリーにおけるDNS
レジストリーの下記の場所を確認してほしい。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
それぞれGUID(グローバル一意識別子の略記)で特定される、複数のネットワークのインターフェース設定を見て取れるだろう。それぞれの異なるネットワークアダプターの設定は「DhcpNameServer」や「NameServer」の値を含んでいるかもしれない。一般的には、静的DNSを用いたいのであれば、コントロールパネルあるいは「netsh」コマンドを用いて設定する。そして固定DNSアドレスは、「NameServer」レジストリー値にコンマ区切りされたリストが保存される。ちょうど下記のような形である。
192.168.1.21,192.168.1.22
もしもコンマ区切りの代わりに、スペース区切りだったらどうだろうか。
192.168.1.21 192.168.1.22
ほんのわずかな変化であることもあり、Windowsはまだ、両方のアドレスが使える状態にある。1つは「プライマリーDNS」として、そしてもう1つは「セカンダリーDNS」としてである。しかし、WindowsのGUIは、コンピューターが固定DNSを使っているかどうかを、コントロールパネルの下半分には表示できない。何が表示されているかというと、DHCPがDNSに使用されているということだけである。
WindowsがプライマリーとセカンダリーDNSサーバーを設定していると捉えることから(しかしユーザーには表示されない)、優先あるいは代替のフィールドを埋めると、Windowsは、ちょうど、これらの新しい設定を、下のようなレジストリーの中に追加する。
192.168.1.21 192.168.1.22,208.67.222.123,208.67.220.123
見て取れる通り、Windowsはコンマ区切りを第3と、第4のDNSサーバーのエントリーに使用している。しかしスペース区切りを最初のアドレスと2番目のアドレスの間に残している。
本当の疑問は、なぜ、このような状態でも動作してしまうのかということだ。今のところ、この疑問に答える有効な回答は持ち合わせていない。「DhcpNameServer」の値が、スペース区切りのリストにどう使われるかということや、TechNetでマイクロソフトがどう説明するかに基づいた仮説にすぎない。
「NameServer」の値が妥当であれば「DhcpNameServer」の値よりも優先される(出典: DhcpNameServerの記事、Microsoft TechNet)。
「DhcpNameServer」がスペース区切りを保持していてもいいことから、「NameServer」でも許される。そして「NameServer」がスペース区切りを使おうとしているのも、TechNetを見ればはっきりしている。実際、その文書では、スペース区切りだけが許可されているということを示唆している。
繰り返すが、これはただの推測にすぎない。現実には、標準ではないプロパティをWindowsが持っており、コントロールパネルでもGUIでどのように操作すればよいのか示されない。コントロールパネルは、スペース区切りのリスト、コンマ区切りのリストを入力させることもない。GUIの優先あるいは代替DNSサーバーのフィールドに何が入れられたとしても、コンマ区切りのリストを作る。しかし、別のコードは、レジストリー値として読み込み、スペース区切りの形式を受け取る。そして、いずれの区切り方でも適切に動作する。しかしコントロールパネルのGUIは、同様に動作しない。スペース区切りのエントリーを、アドバンストタブ以外では表示させないのだ。
そしてDNSはネットワーク設定で……
さらに悪いことに、この機能はDNSアンロッカーにも使われているのである。コンピューターが意図したサーバーとして、攻撃側のDNSサーバーを使い続けさせるために、である。これがコンピューターを悩ませている。DNSハイジャックは、隠れたDNSサーバーの使用を強いるのである。「隠れた」としているのは、静的なDNSサーバーは、TCP/IPv4プロパティのプライマリー、セカンダリーフィールドに表示されないからなのである。
こうして今、DNSがレジストリーで不適切に設定されているかもしれないということを把握した。TCP/IPv4プロパティの別エリアをもう一つ見ておこう。興味の対象エリアは、下に示すDNSアドバンストTCP/IP設定のウィンドウだ。タブ最上部にはリストがあり、そこでは、DNSサーバーの使用順序を指示し、2つ以上のIPアドレスをDNSサーバーとして使用できるように設定できる。それぞれのアドレスは各行に登録されなければならない。しかし今、もしもDNSが乗っ取られ隠されているとすると、TCP/IPの設定は次の画像のようになっているはずだ。
画像を見ての通り、2つのアドレスが1行にまとめて入力されている。もしも追加ボタンをクリックしようとすると、不適切なIPアドレスであるというエラーが表示され、アドレスが追加できない。DNSサーバーをマニュアルで優先、代替サーバーからTCP/IPv4プロパティのページで、隠れたDNSを持っている間に特定したとすれば、次の画像にあるような、隠れたDNSのエントリーを見つけるだろう。
改善策
幸運なことに、不適切なDNSエントリーは「リムーブ」ボタン(右上)をクリックすることによって、アドバンストTCP/IP設定のDNSタブから取り除くことができる。このことをきちんと記憶しておけばいいだろう。
情報開示
ESETは、Microsoftのセキュリティセンター(MSRC)にこの件を報告している(2016年の5月10日)。MSRCの担当者は、問題を一般向けに知らせはしたものの、セキュリティの脆弱性とは認識していないとした。理由は、レジストリーの設定は管理者権限を必要として、MSRCのセキュリティサービスとなる基準を満たしていないからだという。担当者はこの問題を、将来のバージョンについて考えるチームに伝えるとした。
まとめ
Windowsは、カンマ区切りのスプレッドシートを厳しく実施する代わりに、DNSサーバーのアドレスのリストを空間的に制限することなくインターフェースにネームサーバーの値を読んで使用しているので、PUAはこの手法を、彼らのDNSセッティングをシステムに表示させずにおくために使用できる。DNS アンロッカーによる、こうした不正DNS設定を隠すやり方は、2015年の12月からWindowsXP、Vista 7、8/8.1、そしてWindows 10(x86 and x64)に見られてきた。最後に、非常に興味深いことがある。静的に設定されたDNSアドレスを隠すために使える手法も、まだマルウェアやPUAによって用いられてはいないものの、機能していたのである(2016年5月31日時点)。
マルウェア情報
ここで述べられたDNSアンロッカーのバージョンは、ESETによって「MSIL/Adware.CloudGuard.C」(アプリケーション)として検知される。DNSをハイジャックするために以下のIPアドレスを使う。
・199.203.131.145
・199.203.131.150 ~ 199.203.131.152
・82.163.142.2 ~ 82.163.142.7
・82.163.142.66 ~ 82.163.142.70
・82.163.142.130 ~ 82.163.142.189
・82.163.143.131 ~ 82.163.143.190
・95.211.158.129 ~ 95.211.158.135
・95.211.158.145 ~ 95.211.158.151
以下のIPアドレスはHTTPサーバーとして使用される。その結果、Webページに広告を表示させる不正なJavaScriptを挿入する。
・82.163.143.23 ~ 82.163.143.250
・209.88.193.133 ~ 209.88.193.141
この技術を用いるマルウェアサンプル
SHA-1 |
ESETが検知する名称 |
用いられるネームサーバーの値 |
---|---|---|
E7108973D9AE0BDB97801C959622E1ECECDCE80E |
MSIL/Adware.CloudGuard.C (アプリケーション) |
82.163.143.17 182.163.142.173 |
AEEEA6C3697D983337598E2D3B940DB0225A05CB |
Win32/Agent.XSF (トロイの木馬) |
199.203.131.145 82.163.143.167 |
A9AC712B4D31F20AC3DEFC066D66C2982A4ADC0C |
Win32/DNSChanger.NDI (トロイの木馬) |
199.203.131.151 82.163.143.181 |
1A1764F7AA3E9F81B23997982E1BDB300D3707B1 |
Win32/Adware.Adposhel.F |
82.163.142.3 95.211.158.130 |
(アプリケーション) | 95.211.158.130 |