CS.SV.TAINTED.CALL.GLOBAL
割り当て演算での未検証整数値の使用
このチェッカーは、関数呼び出しを通じて、グローバルに表示されるデータフィールドを割り当てるために、汚染されたデータが使用されるたびに欠陥を報告します。
脆弱性とリスク
C# のパブリック静的クラスフィールドなどのグローバル変数は、プログラムスコープ全体で表示されます。プログラマーや解析ツールにとって、プログラム内でグローバル変数の割り当てや読み取りを完全に制御するのは困難な場合があります。プログラム制御フローに対するグローバル変数の影響を十分理解していないと、コードへの整数データの入力が適切に検証されずにグローバル変数の割り当てに使用された場合、セキュリティリスクが発生する可能性があります。
脆弱コード例
コピー
using System;
using System.IO;
namespace TaintedGlobal
{
class TestTaintedGlobal
{
const string fileName = "File.dat";
public static int gVar = 0;
public static void TaintedGlobalExample()
{
int t = getTaintedData();
bar(t); // CS.SV.TAINTED.CALL.GLOBAL
}
public static int getTaintedData()
{
try
{
using (BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open)))
{
return(br.ReadInt32());
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public static void bar(int value)
{
gVar = value;
}
}
}
上記の例では、攻撃者はグローバル変数「gVar」に任意の値を指定できます。その値は、その後、プログラマーが制御できないか、あるいは認識すらしていないコード内の別の場所で使用される可能性があります。結果として、その変数に関係したセキュリティ脆弱性のリスクをもたらす可能性があります。
Klocwork は 12 行目で SV.TAINTED.CALL.GLOBAL の欠陥を報告します。これは、12 行目で「getTaintedData」から受け取った未検証の整数値「t」が、13 行目で「bar()」の呼び出しを通じて、グローバル変数を割り当てるために使用されることを示しています。修正コード例
コピー
using System;
using System.IO;
namespace TaintedGlobal
{
class TestTaintedGlobal
{
const string fileName = "File.dat";
const int maxBuf = 10;
public static int gVar = 0;
public static void TaintedGlobalExample()
{
int t = getTaintedData();
if(t < maxBuf)
{
bar(t);
}
}
public static int getTaintedData()
{
try
{
using (BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open)))
{
return(br.ReadInt32());
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public static void bar(int value)
{
gVar = value;
}
}
}
整数値「t」は検証されるため、Klocwork は欠陥を報告しなくなります。