SV.USAGERULES.SPOOFING

スプーフィングのセキュリティ脆弱性

一部のシステム呼び出し、一般的には DNS ルックアップは、スプーフィングに対して脆弱です。SV.USAGERULES.SPOOFING チェッカーは、システム呼び出し、gethostbyaddr、gethostbyname、および sethostname の箇所にフラグを立てます。 これらは、ホストサーバーからのデータに依存するので、スプーフィングの標的になる可能性があります。

脆弱性とリスク

スプーフィングでは、悪意のあるユーザーが DNS キャッシュにポイズニングすることで、信頼されるステータスを取得することができます。この脆弱性の一例が、Microsoft Internet Explorer で見つかっています。攻撃者はこの脆弱性を悪用して、アドレスバーとステータスバーに偽の URL を表示させることができます。この場合、この脆弱性は、入力検証エラーが原因で生じます。

攻撃者が悪用に成功すると、アドレスバーとステータスバーに実際のページの場所とは異なる任意の完全修飾ドメイン名 (FQDN) を表示させることができます。この行為により、ユーザーを騙して機密情報を明かさせたり、マルウェアをシステムにダウンロードして実行させたりできます。 ユーザーがこうするのは、偽のドメインを信頼しているからです。

軽減と防止

この脆弱性を回避するには、次の操作を実行します。

  • システム入力がすべて適切に検証されていることを確認します。
  • DNS 名ではなく IP アドレスを使用します。IP アドレスもスプーフィングされる可能性はありますが、一般には DNS 名より信頼性が高いです。

脆弱コード例

コピー
   #include <winsock2.h>
   #include <ws2tcpip.h>

   void foo()
   {
      struct hostent *he;
      struct in_addr ipv4addr = { 0 };

      inet_pton(AF_INET, "127.0.0.1", &ipv4addr);
     he = gethostbyaddr((char *)&ipv4addr, sizeof ipv4addr, AF_INET);
  }

修正コード例

コピー
   #include <winsock2.h>
   #include <ws2tcpip.h>

   void foo()
   {
      struct sockaddr_in sa;
      char host[NI_MAXHOST] = "127.0.0.1";
      char service[NI_MAXSERV];

     getnameinfo((struct sockaddr *)&sa, sizeof sa, host, sizeof host, service, sizeof service, NI_NUMERICSERV);
  }

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。