SV.TAINTED.PATH_TRAVERSAL

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

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

脆弱性とリスク

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

軽減と防止

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

  • dot-dot-slash ( ../ ): このシーケンスおよびそのバリエーションを使用して、攻撃者はファイルシステムに移動して、どのファイルにもアクセスを得ることを可能にします。
 ( ../ ) は、さまざまなエンコーディングで表せることに注意してください。" ../../../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++ 解析のチューニング および C/C++ knowledge base (ナレッジベース) リファレンス を参照してください。