2014-01-08 2 views
1

내가 들었습니다. safety questions over the BinaryFormatter.BinaryFormatter는 악의적 인 코드를 deserialise합니까?

클라이언트에서 서버로 사용자 생성 파일을 보냅니다. 이들은 서버에 의해 읽혀지는 직렬화 된 클래스입니다.

위의 링크를 이해하면 위험합니다. 하지만 일회용 클래스를 보내려고했지만 심지어 ISerilizable을 구현 한 클래스를 사용해 보았습니다. 그러나 서버가 소스 어셈블리를 모르기 때문에 둘 다 거부되었습니다.

[Serializable] 
public class Ship : ISerializable 
{ 
    public Ship() 
    { 

    } 

    public Ship(SerializationInfo info, StreamingContext context) 
    { 
     Console.WriteLine("test"); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 

    } 
} 

그러면 클라이언트가이 벡터를 통해 내 서버에 어떻게 코드를 성공적으로 가져올 수 있습니까? 네임 스페이스 이름과 공개 키를 위조하여 서버가 역 직렬화되도록 시도함으로써 위 코드를 실행합니다. 아니면 그것을 할 수있는 더 미묘한 방법이 있습니까?

이 기능은 불행하게도 내 게임의 근본 핵심이므로 조심하고 싶습니다.

+0

그들은 아마도 당신에게 Serializable으로 표시되는 임의의 클래스를 보낼 수 있습니다. 나는 그것이 위험하다고 생각한다. – usr

+0

'BinaryFormatter'를 사용하거나 데이터를 직렬화하기위한 요구 사항입니까? 또는 바이너리에서 데이터를 직렬화 하시겠습니까? –

+4

직렬화는 코드가 아닌 데이터에서 작동합니다. * 귀하의 * 코드가 악의적 인 입력에 취약 할 경우, 다른 방법으로 악의적 인 데이터를 주입하는 것과 마찬가지입니다. 게다가 원래 게시물에 대한 답변은 대부분 추측이었고 Java 직렬화에 대한 적용 할 수없는 의견 또는 실제로 고안된 예제였습니다. –

답변

3

직렬화는 코드가 아닌 데이터에서 작동합니다. 디시리얼라이저는 사용자가 제공 한 페이로드에서 데이터를 추출하고 새 객체 인스턴스를 구성한 다음 추출 된 데이터에서 객체 값을 설정합니다. 페이로드에서 코드를 추출하지 않습니다.

코드가 악의적 인 입력에 취약한 경우 그렇습니다. 예를 들어, 악의적 인 데이터를 주입하는 다른 방법과 마찬가지로 직렬 리서치를 공격 할 수 있습니다.

예를 들어, 문자열을 연결하여 SQL 문을 구성하면 문자열이 사용자 입력 또는 비 직렬화 데이터에서 왔는지 여부에 관계없이 SQL 삽입 공격에 취약합니다. 이 문제를 해결하는 방법은 매개 변수화 된 쿼리를 사용하는 것입니다. 역 직렬화를 피하거나 사용자의 입력을 위생적으로 처리하지는 마십시오.

어쨌든 원래 게시물에 대한 답변은 대부분 .NET과 관련이없는 자바 직렬화에 대한 논평 또는 실제로 고안된 예제였습니다.

1

BinaryFormatter필드이고 이 아닌을 직렬화합니다.

  1. 어셈블리를 받고 Assembly.Load를 사용하여로드 :

    전송하고 알 수없는 코드를로드 할 수있는 유일한 방법은 것입니다.

  2. 실행시 IL을 방출하려면 CodeDomProvider을 사용하십시오.
관련 문제