CS.SV.TAINTED.PATH_TRAVERSAL
パス構築時の未検証の入力
プログラムが、パス名構築のために特殊文字の中立化を行わないで外部入力を使用する場合、パストラバーサル攻撃にさらされたままになる可能性があります。このチェッカーは、ファイルパスの一部として使用される外部文字列が適切にチェックされていない場合、欠陥をレポートします。
脆弱性とリスク
パストラバーサル攻撃は、重要なシステムやアプリケーションデータを含む、任意のファイルおよびディレクトリーへのアクセスを得ることを目的とします。パストラバーサル攻撃は、プログラムに悪意ある構成をもたらすためにも使用することができます。最も危険なプログラミングエラー上位 25 では 12 番目にランクされています。
軽減と防止
この指摘を避けるためには、生の入力をパス名として使用する前に、承認コードを追加することがベストです。承認コードには、次のようなケースのチェックが含まれている必要があります:
- ピリオド-ピリオド-スラッシュ ( ../ ): このシーケンスおよびそのバリエーションを使用して、攻撃者はファイルシステムに移動して、どのファイルにもアクセスを得ることを可能にします。 ( ../ ) は、さまざまなエンコーディングで表すことができることに注意してください。" ../../../etc/shadow " はその一例です。
- 絶対パス:また、相対パスが予測される状況で絶対パスを使用すると、お使いのシステムで任意のファイルにアクセスできるようにもなります。" /etc/shadow " はその一例です。
- ヌル記号:ヌル記号の使用は、アプリケーションが使用可能なファイル拡張子をチェックにより制限したり、または特定の拡張子、たとえば " application.cfg%00.pdf " の付加を制限する状況では、攻撃者が攻撃の範囲を広げるために生成されたファイル名を切り詰めることを可能にします。
脆弱コード例
コピー
namespace Program
{
class Program
{
static void Main(string[] args)
{
string fileName = args[1];
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
}
}
}
この例では、Klocwork は欠陥を報告します。これは、"fileName" 文字列が "args" 引数を通して受け取られ、検証されないままパス名として使用されるためです。
修正コード例
コピー
namespace Test
{
class Program
{
static void Main(string[] args)
{
string fileName = args[1];
neutralize(fileName);
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
}
private static void neutralize(string fname)
{
}
}
}
Klocwork はもはや欠陥を報告していません。これは、外部入力が "neutralize" 機能に送られて検証され、パスを安全にしているからです。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。