Synopsys Cybersecurity Research Center(CyRC)の研究チームは、Internet Systems Consortium(ISC)社によるBIND 9の開発ブランチ・ビルドにサービス拒否の脆弱性を発見しました。この脆弱性に気付かず安定版(利用を前提として作られたバージョン)のリリースに残っていたとしたら、インターネットのネームサーバの約3分の2は実行が容易なサービス拒否(DoS)攻撃に対して脆弱であったことでしょう。この脆弱性発見の事例は、アプリケーション開発にセキュリティテストを統合することの価値を明らかにしてくれました。

BIND 9とは

BIND 9は、インターネット上のホストに付けられたアルファベットの名前を数値で表すIPアドレスに紐付けるインターネットのシステム(DNS:ドメイン・ネーム・システム)に関連するソフトウェア群です。この脆弱性は、BIND 9に含まれるnamed(ネームディー:「name daemon」の略)DNSサーバの実装に存在していました。

namedは、ほとんどのUNIXおよびLinuxプラットフォームで配布されるフリーソフトウェア製品であり、2015年時点で、UNIX系オペレーティング・システムで最も広く使用されているDNSソフトウェアとしてデファクトスタンダード(事実上の標準)になっています。2020年9月には、DNSサーバの65%でBIND 9が使用されていたことが調査によって明らかになりました。

この脆弱性はBIND 9の開発ブランチ・ビルドで発見されたため、安定版のビルドに入り込んでリリースされ、広範に広がる前に対処できたのです。

攻撃を成功させるには、ターゲットサーバでTLS(Transport Layer Security)のサポートを有効化し、設定されたバージョンのnamedを実行する必要があります。

このようなサーバにTLS経由で0以外の命令コードを指定してDNS要求を送信すると、アサーションエラー(DBサーバが予期しない状態に遭遇したことを示す)が発生し、操作が異常終了します。DNSの命令コードは標準クエリに既定値の0を指定して、必要な操作を定義します。

  • DNSの命令コードは標準クエリに既定値の0を指定して、必要な操作を定義する

    DNSの命令コードは標準クエリに既定値の0を指定して、必要な操作を定義する

バージョン9.17.7では、BIND 9にTLSのサポートが追加され、関連する脆弱性はバージョン9.17.16で修正されました。リリースノートはこちら。

もし、この脆弱性が放置されたまま本番リリースに至っていたとしたら、namedを使用しているあらゆる組織に悲惨な結果をもたらしたことでしょう。

このようなシナリオでは、namedの適切な機能が有効になっていれば、サーバはメッセージ1つでクラッシュする可能性があります。これにより、影響を受けたサーバ領域で深刻なネットワークの途絶が発生します。

ファジングで脆弱性を発見する

Synopsysの研究チームは、標的となるソフトウェアに意図的に不正な入力を送信するネガティブテスト手法のファジングを用いて、この脆弱性を発見しました。脆弱性は障害の発生時に見つかりました。このときは、無効な命令コードが指定されたDNSリクエストをファザーがTLS経由で送信し、アサーションエラーでnamedがクラッシュしました。

開発チームがネガティブ単体テスト(不正な形式の入力を用いた単体テスト)を作成することは可能ですが、時間と手間がかかります。自動化されたファザーを利用すれば、不正な形式の入力を膨大に作成して送信し、ターゲットソフトウェアを徹底的に鍛え上げることができます。

Synopsysの研究チームは、ジェネレーション型(あるいはモデルベース)のファジングでテストケースを作成するファジングツールを使用しました。このツールは有効な入力の詳細を熟知しているため、正常な入力のごく一部に変則的情報を含めたファジング・テストケースを作成することができます。結果として得られるテストケースは、ターゲットソフトウェアを特定の状態に移行させ、さまざまな経路でコードを実行します。

他のセキュリティテストの場合と同じように、ファジングにおいても開発を最新の状態に維持することが重要です。DNS over TLSは、まだ普及が進んでいない新しい手法です。DNSテストスイートを更新してTLS経由でDNSをサポートすることで、最新の状態を維持することの重要性と、ファジングがエコシステム全体のセキュリティ向上を支援する仕組みがわかります。

どのみち、ソフトウェアはファジングの洗礼を受けることになります。アプリケーションが世の中にリリースされ、デプロイされると、過誤または攻撃によって予期しない不正な入力を受けるようになります。アプリケーションの開発中における予防的なファジングにより、堅牢で回復力のあるアプリケーションを実現し、低リスクの環境でデプロイ・運用することが可能です。

アプリケーション開発に必要なセキュリティ

アプリケーション開発に組み込む必要があるセキュリティテストツールはファジングだけではありません。静的解析ツールは、ソースコードを読み取って問題を検出します。ソフトウェアコンポジション解析(SCA)ツールを使用することで、既知の脆弱性とライセンスの両方の観点からオープンソース・コンポーネントの使用を管理することができます。

インタラクティブアプリケーションセキュリティ・テスト(IAST)ツールは、実行中のWebアプリケーションおよびAPIを監視して脆弱性を検出します。アプリケーションによっては、その他のテストが適している場合もあります。

これはツールだけの話ではありません。脅威モデリングなどの設計時のアクティビティにより、コードを作成する前に重大な問題になる可能性のある欠陥を明らかにすることが可能になります。

リスクを最小限に抑え、効率を向上させるには、アプリケーションセキュリティに対する包括的かつ予防的なアプローチが必要です。セキュアソフトウェア開発ライフサイクル(SSDLC)では、設計から実装、テスト、デプロイ、保守までソフトウェア開発の全段階でセキュリティを組み込みます。

これらの脆弱性はフィンランドのオウルにあるSynopsys Cybersecurity Research Center(CyRC)のVille Heikkilä(ヴィッレ・ヘイッケラ)は、ファジングツールのDNSサーバ・テスト・スイートと新たに追加されたDNS over TLSのサポートにより、発見しました。ISCチームはこれに迅速に対応し、すぐに修正プログラムを実装しました。