Linux PC に対する DoS 攻撃が可能な「systemd」の脆弱性について解説

トレンドマイクロが 2017 年 7 月に発見および報告した Linux のシステム管理機構である「systemd」の DNS リゾルバ機能における脆弱性「CVE-2017-15908」は、影響を受ける多くの Linux ディストリビューションに対して「Denial of Service(DoS、サービス拒否)攻撃」を可能とします。攻撃者が管理する DNS サーバに systemd が DNS 問合せを送信すると、サーバは特別に細工したパケットを返信します。このパケットを受信すると、systemd が無限ループに陥り、CPU 使用率が 100% になります。

攻撃者の管理下にあるDNSサーバに問い合わせを送信させる方法はいくつか考えられますが、もっとも簡単な方法は、マルウェアやソーシャルエンジニアリングを利用するなどして、攻撃者が管理するドメインにアクセスさせることです。

この脆弱性に対するもっとも効果的な対策は、systemd に更新プログラムを適用することです。トレンドマイクロは 2017 年 7 月にこの脆弱性を発見し、同月中に弊社が運営する脆弱性発見・研究コミュニティ「Zero-DayInitiative(ZDI)」を通して然るべき製造業者に報告しました。2017 年 8 月
には、別のリサーチャによって同じ脆弱性が発見され、Ubuntu をサポートする企業「Canonical」に報告されています。8月下旬に更新プログラムが公開された Ubuntu 以外にも、さまざまな Linux ディストリビューションに対して更新プログラムが提供されています。幸いにも、この脆弱性を狙った攻撃は確認されていません。

■脆弱性の解析

新しい機能の追加や安全性のために、DNS には時間とともに新しい関数が追加されてきました。「DNS Security Extensions(DNSセキュリティ拡張、DNSSEC)」に追加された新しいリソースレコード「NSEC(Next Secure)」もその 1 つです。NSEC は「RFC 4034」で定義されています。

脆弱性「CVE-2017-15908」は、NSEC のタイプビットマップフィールドで指定されたリソースレコードのタイプが擬似リソースレコードである際の処理に起因します。図 1は、問題のコードとスタックフレームです。ハイライトされている行の continue 文によって while 文内のコードが無限に繰り返されます。この関数「dns_packet_read_type_window()」は、ファイル “resolved-dns-packet.c” に実装されています。

図1
図 1:無限ループを発生させるコードとスタックフレーム

上述の関数「dns_packet_read_type_window()」は、レコードタイプが「DNS_TYPE_NSEC」である場合に「dns_packet_read_rr()」から呼び出されることに留意してください。図2は “resolved-dns-packet.c” に実装された関数「dns_packet_read_rr()」のコードの一部です。

図2
図 2:DNS パケットを読んでタイプを判別するコード

■Proof-of-concept(概念実証、PoC)

トレンドマイクロは、この脆弱性を実証するために細工したパケットを送り返す DNSサーバを構築しました。図3のように、このサーバの応答には問題の脆弱性を利用して無限ループを引き起こす NSEC レコードが含まれています。

図3
図 3:細工した DNS パケット

名前解決のために systemd を実行する PC がこの DNS サーバが返信する細工された DNS パケットを受信すると、図 4 のように CPU 使用率が 100% になることが確認されました。

図2
図 4:systemd の CPU 使用率が 100 %に

■被害に遭わないためには

本記事で解説したように、この脆弱性には更新プログラムが公開されています。影響を受ける PC に速やかに適用してください。

細工された可能性のあるパケットを手動でブロックしたい場合、システム管理者は RFC 4034 のセクション 4 を参照し、受信したDNSレスポンスに問題を引き起こすリソースレコードが含まれていないかチェックしてください。もし、DNS パケットの NSEC リソースレコードのタイプが擬似リソースレコードであった場合はブロックする必要があります。

参考記事:

翻訳:澤山 高士(Core Technology Marketing, TrendLabs)