SV.TAINTED.PATH_TRAVERSAL

パス構築時の未検証の入力

プログラムが、パス名構築のために特殊文字の中立化を行わないで外部入力を使用する場合、パストラバーサル攻撃にさらされたままになる可能性があります。このチェッカーは、ファイルパスの一部として使用される外部文字列が適切にチェックされていない場合、欠陥をレポートします。

脆弱性とリスク

パストラバーサル攻撃は、重要なシステムやアプリケーションデータを含む、任意のファイルおよびディレクトリーへのアクセスを得ることを目的とします。パストラバーサル攻撃は、プログラムに悪意ある構成をもたらすためにも使用することができます。最も危険なプログラミングエラー上位 25 では 13 番目にランクされています。

軽減と防止

この指摘を避けるためには、生の入力をパス名として使用する前に、承認コードを追加することがベストです。承認コードには、次のようなケースのチェックが含まれている必要があります:

  • ピリオド-ピリオド-スラッシュ ( ../ ): このシーケンスおよびそのバリエーションを使用して、攻撃者はファイルシステムに移動して、どのファイルにもアクセスを得ることを可能にします。
 ( ../ ) は、さまざまなエンコーディングで表すことができることに注意してください。" ../../../etc/shadow " はその一例です。
  • 絶対パス:また、相対パスが予測される状況で絶対パスを使用すると、お使いのシステムで任意のファイルにアクセスできるようにもなります。" /etc/shadow " はその一例です。
  • ヌル記号:ヌル記号の使用は、使用可能なファイル拡張子をアプリケーションがチェックによって制限したり、または特定の拡張子、たとえば " application.cfg%00.pdf " の付加を制限する状況で、攻撃者が攻撃の範囲を広げるために生成されたファイル名を切り詰めることを可能にします。

脆弱コード例

コピー
  main.c
  #include <stdio.h>
  int main(int argc, char **argv) {
    char *name = argv[1];
    FILE *user_config = fopen(name, "r");
    if (user_config == NULL) {
      return 1;
    }
    fclose(user_config);
    return 0;
  }

Klocwork は、この例の欠陥をレポートします。これは、「名前」文字列が「argv」引数を通して受け取られ、検証されないままパス名として使用されるからです。

修正コード例

コピー
  check.h
  char* neutralize(char *);
  main.c
  #include <stdio.h>
  #include "check.h"
  int main(int argc, char **argv) {
     char *name = argv[1];
     name = neutralize(name);
     FILE *user_config = fopen(name, "r");
    if (user_config == NULL) {
       return 1;
    }
    fclose(user_config);
    return 0;
    }

      check.kb
      neutralize - TSCheckPT 1 : $1 : 1

Klocwork は、この例で欠陥をレポートしません。これは、外部入力が「中立化」機能に送られ、検証されて、パスを安全にするからです。

拡張機能

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