CS.HCC
ハードコードされた資格情報の使用(パスワードおよびユーザー名)
ソフトウェアに認証用の資格情報がハードコードされている場合、悪意のあるユーザーに実行可能ファイルからこの資格情報を取り出す機会を与えてしまうため、こうしたソフトウェアは攻撃に対して極めて脆弱になります。
HCC チェッカーは、ハードコードされた資格情報(パスワードおよびユーザー名)が認証関数のパラメーターに使われている場合にそれを検出します。また HCC チェッカーは、ユーザーの資格情報がバックエンドアプリケーションの内部にハードコードされた値と比較されるケースも検出します。ハードコードされた資格情報は、関数の認証に使用される資格情報としてコード化されるばかりでなく、ハードコードされたチェックにも使用されます。脆弱性は、認証関数のユーザー名またはパスワードがハードコードされた文字列と比較される場合にも存在します。このチェッカーはデフォルトで、人気のあるソフトウェアライブラリからこの関数を検討しますが、カスタム認証関数を検出するよう設定することも可能です。
脆弱性とリスク
ハードコードされた資格情報を使用すると、攻撃者が実行可能ファイルから資格情報を取り出して、正当な認証を迂回することが可能になってしまいます。ハードコードされた資格情報は、検出や修正が困難と予想される著しいリスクを招きます。
軽減と防止
アウトバウンド認証の場合:パスワードやキーなどの認証資格情報は、ソースコード外部の強固に保護され、暗号化された構成ファイル内または同じシステム上のローカルユーザーも含め、すべての外部者によるアクセスから保護されたデータベースに保存されます。インバウンド認証の場合:初回ログイン時のデフォルトのユーザー名、パスワード、キー、その他の認証資格情報をハードコードするより、ユーザーが一意の強力なパスワードやキーを入力する必要がある「初回ログイン」モードを実装してください。
脆弱コード例 1
namespace HCC
{
class Program
{
int VerifyAdminUserPassword(String userPassword)
{
if (userPassword.Equals("username:pwd@123"))
{
Console.WriteLine("Entering Diagnostic Mode...");
return (1);
}
Console.WriteLine("Incorrect user or password");
return (0);
}
}
}
この例では、Klocwork は 7 行目で「関数 'System.String.Equals' の呼び出しによるハードコードされた資格情報の使用」という欠陥を報告します。
修正コード例 1
namespace Data
{
public class Database
{
public static int VerifyUserPwd(string userPassword)
{
//verify user and pwd at database
return 1;
}
}
}
namespace HCC
{
class Program
{
int VerifyAdminUser(String userPassword)
{
return Data.Database.VerifyUserPwd(userPassword);
}
}
}
修正されたこの例では、Klocwork はもはや欠陥を報告しません。
脆弱コード例 2
namespace HCC
{
class Program
{
public static bool mySqlConnection()
{
string cs = "server=localhost;user=root;database=sakila;port=3306;password=your_password";
using (MySqlConnection conn = new MySqlConnection(cs))
{
//Do operation
}
return true;
}
}
}
この例では、Klocwork は 8 行目で「関数 'MySql.Data.MySqlClient.MySqlConnection.#constructor' の呼び出しによるハードコードされた資格情報の使用」という欠陥を報告します。
修正コード例 2
namespace HCC
{
class Program
{
private static string getString()
{
//Implementation
throw new NotImplementedException();
}
public static bool mySqlConnection( )
{
string cs = getString();
using (MySqlConnection conn = new MySqlConnection(cs))
{
//perform operation
}
return true;
}
}
}
この訂正例では、Klocwork は欠陥を報告しません。
関連チェッカー
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。