"不受信任的初始化"缺陷 - 创建SQL连接时

时间:2015-06-11 12:02:58

标签: c# sql-server veracode

我做了以下事情......

private static IDbConnectionProvider CreateSqlConnectionProvider(DbConfig dbConfig)
{
    return new QcDbConnectionProvider(() =>
        {
            SqlConnectionStringBuilder csBuilder = new SqlConnectionStringBuilder();

            if (!string.IsNullOrEmpty(dbConfig.DataSource)) 
                csBuilder.DataSource = dbConfig.DataSource;

            if (!string.IsNullOrEmpty(dbConfig.Database))
                csBuilder.InitialCatalog = dbConfig.Database;

            .
            .
            .
            .

            return new SqlConnection(csBuilder.ConnectionString);
        });
}

客户端使用VERACODE工具进行代码分析,VERACODE检测到一个缺陷" Untrusted initialization"在

return new SqlConnection(csBuilder.ConnectionString);

此外,dbConfig正在初始化,如下所示......

DbConfig configDbConfig = new DbConfig
{
    Database = codeFile.ConfigurationDb,
    DataSource = codeFile.DataSource,
    IntegratedSecurity = sqlCredentials.UseWindowsAuthentication ? 1 : 0,
    UserId = sqlCredentials.UseWindowsAuthentication ? null : sqlCredentials.SqlUserName,
    ClearTextPassword = sqlCredentials.UseWindowsAuthentication ? null : sqlCredentials.SqlUserPassword
};

为了解决这个缺陷,我还需要做些什么?另外,根据this link,我使用SqlConnectionStringBuilder创建连接字符串,这可以安全地创建连接字符串。

提前致谢...

2 个答案:

答案 0 :(得分:7)

不受信任的初始化问题的说明是:

  

应用程序应该不愿信任已在其信任边界之外初始化的变量。不受信任的初始化是指应用程序允许外部控制系统设置或变量的实例,这可能会中断服务或导致应用程序以意外方式运行。例如,如果应用程序使用来自环境的值,假设数据无法被篡改,则可能以危险的方式使用该数据。

在您的情况下,您正在从文件中读取dbConfig的数据:

 if (TryReadCodeFile(configurationProfileFile...)) {
     DbConfig configDbConfig = new DbConfig...
}

请注意,您收到的警告还应附带一个行号(以限制错误的代码)。您发布的代码中的几乎所有内容都会产生此问题(我不会看到sqlCredentials来自哪里,但如果它们是明文,则可能是安全问题的另一个来源 - 或者是解密的代码可以在您的申请中访问。)

来自引用的段落:" ...应用程序允许系统设置或变量外部控制可以中断服务 ..." 。这是此问题的核心:如果您的应用程序使用外部数据而没有直接控制它们,则可以更改其行为以修改该数据。这些外部数据是什么?列表完全不是详尽无遗的:

  • 环境变量(例如,用于解析到另一个文件或程序的路径),因为用户可能会更改它们。原始文件没有被触及但你还读了别的东西。
  • 路径(加载代码或数据),因为用户可能会重定向到其他内容(原始文件也没有被触及,但您还读到了其他内容)。
  • 支持文件,因为用户可以更改它们(例如,在您的情况下,指向另一台服务器和/或目录)。
  • 配置文件,因为用户可以更改它们(与上面相同)。
  • 数据库,因为它们也可以被其他用户访问,但它们可能会被更改(但它们可能会受到保护)。

恶意用户如何使用此功能?想象一下,每个用户都连接到不同的目录(根据他们的组织规则)。这不能更改,并且在安装过程中进行了配置。如果他们可以访问您的配置文件,他们可能会将目录更改为其他内容。他们还可能将数据库主机名更改为 tunnel ,在那里他们可以嗅探数据(如果他们可以访问其他人的机器)。

另请注意,他们也会说" ...假设数据无法被篡改,它可能会以危险的方式使用该数据" 。这意味着,例如,如果您的应用程序在Web服务器上运行并且物理访问受到保护,那么您可以认为该数据安全

请注意,您的应用程序将是安全的,因为整个系统中的安全性较低。请注意,要使应用程序安全(我知道,这个术语非常模糊)加密密码是不够的。

如果可以操作支持文件,那么您可以做的最好的事情就是使用公钥/私钥加密对它们进行加密。一个不太理想的解决方案是计算CRC或散列(例如)你在使用之前应用于配置文件(他们能够更改它们但你的应用程序会检测到这个问题)。

总结一下:您可以忽略此问题,但您必须证明您的客户您所依赖的数据无法被篡改。如果满足以下条件中的至少一个,您可以合理证明

1)除应用程序之外的任何人都无法访问支持文件所在的系统。您的应用程序安全性不能高于系统安全性。

2)您的支持文件对于每台计算机都是有效的(以避免在不同计算机之间进行复制),并且它们以任何人无法更改(有意或无意)的方式进行加密。 3)您的支持文件对于每台计算机都有效,并且他们以某种方式检测外部更改哈希

4)用户对配置文件的处理并不重要,因此应用程序本身无法改变其行为(例如,它是单个安装,其中只存在一个DB和一个目录)。 / p>

答案 1 :(得分:0)

连接字符串最重要的是它们的存储方式。如果它们以明文形式存储,则存在安全风险。因此,建议以加密格式存储它们,并在应用程序中解密并使用它。