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 が提供しているアプリケーションセキュリティトレーニング教材。