问题  ReadLine因不信任数据的反序列化而陷入安全扫描

已加入
2020年5月17日
留言内容
6
编程经验
5-10
我在我的项目中实现了以下代码。

C#:
public static String LoadTextFile(String path)
    {
        StringBuilder sb = new StringBuilder();
        using (StreamReader reader = new FileInfo(path).OpenText())
        {
            try
            {
                String text = null;
                do
                {
                    text = reader.ReadLine();
                    sb.Append(text);
                } while (text != null);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        return sb.ToString();
    }

调用方法:
C#:
private MessageConfig LoadConfig()
    {
        string xml = FileUtility.LoadTextFile(环境目录 + @"\test.config");
        XmlSerializer ser = new XmlSerializer((typeof(MessageConfig )));
        MemoryStream ms = new MemoryStream((new UTF8Encoding()).GetBytes(xml));
        return (MessageConfig )ser.Deserialize(ms);
    }

违规讯息:

在第13行的福彩12选5走势图Test \ FileUtility.cs中的LoadTextFile中处理的序列化对象ReadLine在福彩12选5走势图Test \ Simulator.cs中的Deserialize中反序列化

尽管XmlSerializer将内存流反序列化为预定义的类型,但ReadLine仍在代码扫描中陷入上述冲突。请提出任何解决方案。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
首先,据我所知,您可以放弃 LoadTextFile 方法,因为它无能为力 File.ReadAllText 方法尚未执行。
C#:
private MessageConfig LoadConfig()
{
    string xml = File.ReadAllText(Path.Combine(应用程序。启动路径, "test.config");
    XmlSerializer ser = new XmlSerializer((typeof(MessageConfig )));
    MemoryStream ms = new MemoryStream((new UTF8Encoding()).GetBytes(xml));
    return (MessageConfig )ser.Deserialize(ms);
}
其次,从福彩12选5走势图中读取文本并将其转换为 字节 数组,将其加载到 内存流 然后将其传递给 反序列化 当您可以创建一个方法时 福彩12选5走势图流 and pass that.
C#:
private MessageConfig LoadConfig()
{
    using (var fs = File.OpenRead(Path.Combine(应用程序。启动路径, "test.config")))
    {
        XmlSerializer ser = new XmlSerializer((typeof(MessageConfig)));
        
        return (MessageConfig) ser.Deserialize(fs);
    }
}
您至少应该进行这些更改,然后查看是否还有问题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
请注意,我曾经 应用程序。启动路径 在那个代码而不是 环境目录,在大多数情况下都是正确的。前者将始终是运行当前EXE的福彩12选5走势图夹路径,而后者将并非始终是启动时的福彩12选5走势图夹路径,并且可以在应用程序运行时更改。如果它是Windows GUI应用程序,并且您想要程序福彩12选5走势图夹的路径,请使用 应用程序。启动路径.
 
已加入
2020年5月17日
留言内容
6
编程经验
5-10
Note that I used 应用程序。启动路径 在那个代码而不是 环境目录,在大多数情况下都是正确的。前者将始终是运行当前EXE的福彩12选5走势图夹路径,而后者将并非始终是启动时的福彩12选5走势图夹路径,并且可以在应用程序运行时更改。如果它是Windows GUI应用程序,并且您想要程序福彩12选5走势图夹的路径,请使用 应用程序。启动路径.

嗨,谢谢您的答复和建议。我已经做出了您建议的更改,然后像现在这样重新运行扫描

在第368行的福彩12选5走势图Test \ Simulator.cs中的LoadConfig中处理的序列化对象fs通过在第368行的福彩12选5走势图Test \ Simulator.cs中的反序列化来反序列化。

Stll有什么问题..  :(

谢谢,
普拉文
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我不太明白那条信息。甚至听起来好像都不是错误消息。您可以为张贴课程定义吗 消息配置 以及您要反序列化的福彩12选5走势图的示例?是通过序列化 消息配置 对象放在首位?
 
已加入
2020年5月17日
留言内容
6
编程经验
5-10
我不太明白那条信息。甚至听起来好像都不是错误消息。您可以为张贴课程定义吗 消息配置 以及您要反序列化的福彩12选5走势图的示例?是通过序列化 消息配置 对象放在首位?

让我解释一下...有一个 消息配置 从通用对象继承的对象 DBCommonConfig 具有一些共同的属性。所以 消息配置 对象如下所示。

C#:
public class DBCommonConfig
    {
        protected string name;
        protected string className;
        protected string dllName;
        
        public DBCommonConfig()
        {
        }

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public string ClassName
        {
            get
            {
                return className;
            }
            set
            {
                className = value;
            }
        }

        public string DllName
        {
            get
            {
                return dllName;
            }
            set
            {
                dllName = value;
            }
        }
    }

public class MDBConfig: DBCommonConfig
    {
        private string queue;
        private string channelName;
        private string direction;

        public MDBConfig()
        {
        }
        public Region Region
        {
            get;
            set;
        }

        public string Queue
        {
            get
            {
                return queue;
            }
            set
            {
                queue = value;
            }
        }
        public string ChannelName
        {
            get
            {
                return channelName;
            }
            set
            {
                channelName = value;
            }
        }
}

我从目录加载的配置福彩12选5走势图如下所示。

XML:
<MessageConfig>
  <!-- ibm mq message driven beans -->
  <MDBsConfig>
    <MDBConfig>
      <Name>SYNCRLLSS</Name>
      <ClassName>MessageDriven.OrderDataRequest.OrderDataMDB</ClassName>
      <DllName>LLM.Business</DllName>
      <Queue>SYNCRO2FSL</Queue>
    </MDBConfig>
  </MDBsConfig>
<MessageConfig>

然后我只是用下面的代码调用LoadConfig方法
C#:
private MessageConfig LoadConfig()
{
    using (var fs = File.OpenRead(Path.Combine(应用程序。启动路径, "test.config")))
    {
        XmlSerializer ser = new XmlSerializer((typeof(MessageConfig)));
        
        return (MessageConfig) ser.Deserialize(fs);
    }
}

我正在使用CheckMarx扫描代码,扫描时显示如下消息捕获 fs 黄色。 CheckMarx表示这是对不可信数据的反序列化。我不确定我是否可以满足CheckMarx扫描的要求,因此不会显示这种高风险注射。

 图片2.PNG


我直接从福彩12选5走势图中将XML作为FileStream加载,然后反序列化为 消息配置 目的。将配置福彩12选5走势图作为FileStream加载到fs变量后,是否需要任何序列化?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,535
地点
弗吉尼亚州切萨皮克
编程经验
10+
我们的OP正在使用VeraCode或其他静态安全代码扫描器。扫描程序正确地识别出来自福彩12选5走势图的数据正在加载到XML反序列化器中,并且是潜在的漏洞。

我的建议是转到相关的OWASP页面,并实施一个或多个缓解控件。如果您的扫描软件提供了指向漏洞类别描述的链接,则优先选择那些链接中列出的缓解措施,因为扫描程序检测到您实施了缓解措施的可能性要高得多,即使扫描程序未检测到缓解措施,您也可以有一个非常坚定的立场可以向您的安全审查团队表明,建议您实施这些事情。

 
已加入
2020年5月17日
留言内容
6
编程经验
5-10
让我解释一下...有一个 消息配置 从通用对象继承的对象 DBCommonConfig 具有一些共同的属性。所以 消息配置 对象如下所示。

C#:
public class DBCommonConfig
    {
        protected string name;
        protected string className;
        protected string dllName;
      
        public DBCommonConfig()
        {
        }

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public string ClassName
        {
            get
            {
                return className;
            }
            set
            {
                className = value;
            }
        }

        public string DllName
        {
            get
            {
                return dllName;
            }
            set
            {
                dllName = value;
            }
        }
    }

public class MDBConfig: DBCommonConfig
    {
        private string queue;
        private string channelName;
        private string direction;

        public MDBConfig()
        {
        }
        public Region Region
        {
            get;
            set;
        }

        public string Queue
        {
            get
            {
                return queue;
            }
            set
            {
                queue = value;
            }
        }
        public string ChannelName
        {
            get
            {
                return channelName;
            }
            set
            {
                channelName = value;
            }
        }
}

我从目录加载的配置福彩12选5走势图如下所示。

XML:
<MessageConfig>
  <!-- ibm mq message driven beans -->
  <MDBsConfig>
    <MDBConfig>
      <Name>SYNCRLLSS</Name>
      <ClassName>MessageDriven.OrderDataRequest.OrderDataMDB</ClassName>
      <DllName>LLM.Business</DllName>
      <Queue>SYNCRO2FSL</Queue>
    </MDBConfig>
  </MDBsConfig>
<MessageConfig>

然后我只是用下面的代码调用LoadConfig方法
C#:
private MessageConfig LoadConfig()
{
    using (var fs = File.OpenRead(Path.Combine(应用程序。启动路径, "test.config")))
    {
        XmlSerializer ser = new XmlSerializer((typeof(MessageConfig)));
      
        return (MessageConfig) ser.Deserialize(fs);
    }
}

我正在使用CheckMarx扫描代码,扫描时显示如下消息捕获 fs 黄色。 CheckMarx表示这是对不可信数据的反序列化。我不确定我是否可以满足CheckMarx扫描的要求,因此不会显示这种高风险注射。

查看附件944

我直接从福彩12选5走势图中将XML作为FileStream加载,然后反序列化为 消息配置 目的。将配置福彩12选5走势图作为FileStream加载到fs变量后,是否需要任何序列化?

实际上没有错误。当我运行代码
我们的OP正在使用VeraCode或其他静态安全代码扫描器。扫描程序正确地识别出来自福彩12选5走势图的数据正在加载到XML反序列化器中,并且是潜在的漏洞。

我的建议是转到相关的OWASP页面,并实施一个或多个缓解控件。如果您的扫描软件提供了指向漏洞类别描述的链接,则优先选择那些链接中列出的缓解措施,因为扫描程序检测到您实施了缓解措施的可能性要高得多,即使扫描程序未检测到缓解措施,您也可以有一个非常坚定的立场可以向您的安全审查团队表明,建议您实施这些事情。


我看过这篇文章,并且在c#中没有示例,而且似乎我也遵循这篇文章中所讲的内容。但是,如果我可以使用上述c#代码获得任何解决方案,那就更好了。我真的找不到解决方案。  :(
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,535
地点
弗吉尼亚州切萨皮克
编程经验
10+
.NET Framework支持数字签名的XML。因此,如果XML的提供者可以对XML进行数字签名,则可以首先打开XML文档,验证签名,只有在签名有效的情况下,才将其传递给解串器。

如果提供者无法对福彩12选5走势图进行数字签名,那么您还有其他选择:

一种是向您的安全团队提供证据,表明"chain of custody"福彩12选5走势图是安全的。例如,该福彩12选5走势图由安装程序安装。对安装程序及其有效负载进行了数字签名,以防止在构建完成和到达用户计算机之间的时间之间篡改数据。并且在将福彩12选5走势图安装到用户计算机上之后,便对其进行了ACL操作,以便只有受信任的人才能修改该福彩12选5走势图。或者,如果福彩12选5走势图是动态下载的,则说明下载源是可靠,安全的,并且中间没有人可以篡改福彩12选5走势图内容,并且一旦福彩12选5走势图停在用户的计算机上,则只有您的应用可以读取或写给它。甚至更好的是,在下载福彩12选5走势图后,请对其进行数字签名,以防止将来被篡改。

您可以实现的其他缓解措施是自己解析XML并自己实例化该对象。是的,这意味着失去使用开箱即用的解串器的便利。好处是,在解析XML时,您可以根据白名单检查DLL和Classname。

提供者的其他缓解措施只是向您发送预定义的代码字或标志,这将告诉您要实例化哪种对象。

或者,您可以组合以上缓解措施。纵深防御是好的(直到它成为性能瓶颈)。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我正在使用CheckMarx扫描代码,扫描时显示如下消息捕获 fs in yellow.
我们应该是在第6个帖子中才第一次听说这一点。将来,请在第一篇文章中提供所有相关信息。并非总是可能知道相关的内容,但是很难看出这是怎么回事。
 
已加入
2020年5月17日
留言内容
6
编程经验
5-10
我们应该是在第6个帖子中才第一次听说这一点。将来,请在第一篇文章中提供所有相关信息。并非总是可能知道相关的内容,但是很难看出这是怎么回事。
实际上,我为所有信息提供了对对象命名的一些更改,否则我所提供的就是一切。 CheckMark可能无法以某种方式缓解此问题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我提供的是一切。
您应该已经告诉我们该消息的来源。如果您不这样做,人们会倾向于认为这是VS生成的错误消息。
 
最佳 底部