다음을 통해 공유


CA2362: 자동 생성된 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음

속성
규칙 ID CA2362
제목 자동 생성된 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

SerializableAttribute로 표시된 클래스 또는 구조체에 DataSet 또는 DataTable 필드나 속성이 포함되어 있으며 DesignerCategoryAttribute가 있습니다.

CA2352DesignerCategoryAttribute가 없는 경우와 유사한 규칙입니다.

규칙 설명

BinaryFormatter를 사용하여 신뢰할 수 없는 입력을 역직렬화할 때 역직렬화된 개체 그래프에 DataSet 또는 DataTable이 포함되어 있으면 공격자가 악의적인 페이로드를 만들어 원격 코드 실행 공격을 수행할 수 있습니다.

이 규칙은 CA2352와 비슷하지만 GUI 애플리케이션 내에서 데이터의 메모리 내 표현을 위한 자동 생성 코드용입니다. 일반적으로 이러한 자동 생성 클래스는 신뢰할 수 없는 입력에서 역직렬화되지 않습니다. 애플리케이션은 다양한 방식으로 사용될 수 있습니다.

이 규칙은 역직렬화될 때 안전하지 않은 형식을 찾습니다. 코드가 검색된 형식을 역직렬화하지 않으면 deserialization 취약성이 없습니다.

자세한 내용은 DataSet 및 DataTable 보안 지침을 참조하세요.

위반 문제를 해결하는 방법

  • 가능하면 DataSetDataTable 대신 Entity Framework를 사용합니다.
  • 직렬화된 데이터를 변조 방지로 설정합니다. serialization 후에 직렬화된 데이터에 암호화된 방식으로 서명합니다. deserialization 전에 암호화 시그니처의 유효성을 검사합니다. 암호화 키가 공개되지 않도록 보호하고 키 순환을 설계합니다.

경고를 표시하지 않는 경우

다음 경우에는 이 규칙의 경고를 표시하지 않아도 됩니다.

  • 이 규칙에 의해 발견된 형식은 직접적으로나 간접적으로 역직렬화되지 않습니다.
  • 입력을 신뢰할 수 있습니다. 애플리케이션의 트러스트 경계 및 데이터 흐름이 시간이 지남에 따라 달라질 수 있다는 점을 고려합니다.
  • 위반 문제를 해결하는 방법의 예방 조치 중 하나를 수행했습니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA2362
// The code that's violating the rule is on this line.
#pragma warning restore CA2362

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2362.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

의사 코드 예제

위반

using System.Data;
using System.Xml.Serialization;

namespace ExampleNamespace
{
    [global::System.CodeDom.Compiler.GeneratedCode(""System.Data.Design.TypedDataSetGenerator"", ""2.0.0.0"")]
    [global::System.Serializable()]
    [global::System.ComponentModel.DesignerCategoryAttribute(""code"")]
    [global::System.ComponentModel.ToolboxItem(true)]
    [global::System.Xml.Serialization.XmlSchemaProviderAttribute(""GetTypedDataSetSchema"")]
    [global::System.Xml.Serialization.XmlRootAttribute(""Package"")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute(""vs.data.DataSet"")]
    public class ExampleClass : global::System.Data.DataSet {
        private DataTable table;
    }
}

CA2350: DataTable.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다.

CA2351: DataSet.ReadXml()의 입력을 신뢰할 수 있는지 확인합니다.

CA2352: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음

CA2353: 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable

CA2354: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있습니다.

CA2355: 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable

CA2356: 웹 역직렬화된 개체 그래프의 안전하지 않은 DataSet 또는 DataTable

CA2362: 자동 생성된 직렬화 가능 형식의 안전하지 않은 DataSet 또는 DataTable은 원격 코드 실행 공격에 취약할 수 있음