EN JP CN

SV.TAINTED.SECURITY_DECISION

SV.TAINTED.SECURITY_DECISION

セキュリティ決定での信頼できない入力に対する依存

入力がユーザーまたは外部環境から受け入れられるときは常に、入力のタイプ、長さ、書式、および範囲を検証してから使用する必要があります。適切に検証されるまでは、そのデータは 汚染 していると言われます。SV.TAINTED ファミリーチェッカーは、コードでの汚染データの使用箇所を探します。

認証および承認などのセキュリティ決定が誤ったデータの値に基づいて行わると、攻撃者は、ソフトウェアのセキュリティを回避することができます。十分な暗号化、整合性チェック、他の機構がなければ、部外者に由来する入力を信頼することはできません。

SV.TAINTED.SECURITY_DECISION チェッカは、セキュリティ決定で信頼できないデータが使用されている状況にフラグを付けます。このチェッカに関して、セキュリティ決定は、ハードコード化された文字列との比較として定義されます。

脆弱性とリスク

攻撃者は、いかに保護されていてもアクセスするセキュリティ決定をバイパスすることができます。この結果は、関連する機能に依存しますが、信頼できないユーザーに追加の権限を付与することから、重要なセキュリティチェックをバイパスすることに至る範囲に渡ります。最終的に、この弱点は、機密データの漏洩や変更、システムのクラッシュ、任意のコードの実行につながる可能性があります。

脆弱コード例

1  #include <sys/socket.h>
2  #include <netdb.h>
3  #include <stdbool.h>
4  #include <string.h>
5  #include <arpa/inet.h>
6 
7  void f(const char *ip_addr_string){
8     struct hostent *hp;struct in_addr myaddr;
9     char* tHost = "trustme.example.com";
10    myaddr.s_addr=inet_addr(ip_addr_string);
11    bool trusted = false;
12    hp = gethostbyaddr((char *) &myaddr, sizeof(struct in_addr), AF_INET);
13     if (hp && !strncmp(hp->h_name, tHost, sizeof(tHost))) { 
14         trusted = true;
15     } else {
16         trusted = false;
17     }
18 }

次のコードサンプルでは、インバウンドリクエストが信頼できるホストからのものであるか否かを決定するために、DNS ルックアップを使用しています。攻撃者が DNS キャッシュを害することができる場合に、信頼できる状態を得ることができます。

Klocwork は、13 行目でレポートを出し、未検証の文字列 hp->h_name が 12 行目の gethostbyaddr への呼び出しによって外部関数から渡され、13 行目の strncmp への呼び出しによって潜在的なセキュリティ決定で使用される可能性があることを示します。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。