2016-09-30 2 views
3

내 코드에서 JMS 대기열에서받은 ObjectMessage 객체에서 getObject() 메소드를 호출하려고합니다. Fortify 보고서에서이 getObject() 메소드에 대해 Dynamic Code Evaluation: Unsafe Deserialization과 같은 오류 이름과 함께 불평합니다. 기본적으로 객체 스트림의 내용의 유효성을 검사하지 않고 신뢰할 수없는 데이터를 deserialize해서는 안됩니다. 아래는 코드입니다. 이 Fortify 보고서 오류를 없애기 위해 어떻게 그리고 어떤 방법을 사용해야합니까?역 직렬화하기 전에 객체 유효성을 검사하는 방법

if (message instanceof ObjectMessage) { 
    ObjectMessage objMessage = (ObjectMessage) message; 
    Object objReportMessage = objMessage.getObject(); 
.... 

다음은 권장 사항과 관련된 요새화 된 문제입니다. 그런 다음이 오류를 위의 코드 objMessage.getObject();에서 가리 킵니다.

동적 코드 평가 : 불안전 직렬화 (1 월호)

추상적 병렬 변환 사용자가 제어하는 ​​목적은 공격자가 서버 남용 애플리케이션 로직에 임의의 코드를 실행 또는 거부 될 수 있도록 할 수 런타임 스트림 서비스.

설명 자바 직렬화 바이트 스트림으로부터 그 자신을 재구성하고 필요한 메타 데이터 객체들을 포함하는 바이트 스트림으로 객체 그래프를 온. 개발자는 을 지원하는 사용자 지정 코드를 만들어 Java 개체를 deserialize하는 과정을 진행할 수 있습니다.이 작업을 수행하면 서로 역 직렬화 된 개체를 다른 개체 또는 프록시로 바꿀 수 있습니다. 사용자 지정 deserialization 프로세스는 개체가 응용 프로그램에 반환되고 예상되는 형식으로 캐스팅되기 전에 개체 재구성 중에 발생합니다. 개발자가 예상되는 형식을 적용하려고하면 코드가 이미 실행되었을 수 있습니다. 사용자 지정 deserialization 루틴은 런타임 클래스 경로 에 있어야하며 공격자가 삽입 할 수없는 직렬화 가능 클래스에 정의되어 있으므로 이러한 공격의 악용 가능성은 응용 프로그램 환경에서 사용 가능한 클래스 인 에 따라 달라집니다. 불행하게도 일반적인 제 3 자 클래스 또는 심지어 JDK 클래스는 JVM 리소스를 고갈 시키거나, 악성 파일을 배포하거나, 임의 코드를 실행하기 위해 남용 될 수 있습니다. 특정 프로토콜은 전송 계층에서 자바 직렬화를 사용합니다. RMI 및 JMX는 이러한 프로토콜의 예제 인 입니다.

실시 예 1 : 여기 하나 이상의 파라미터를 포함하는 방법을 공개 노출 될 수 RMI 인터페이스의 일례이다. 원격으로 이러한 메서드를 호출하면 인수가 서버에 deserialize되어 공격자가 악성 개체 그래프를 삽입 할 수 있습니다.

public interface MyService extends java.rmi.Remote { 
public Object doSomething (Object arg0) throws RemoteException; 
public Object doSomethingElse (Object arg0, Object arg1) throws 
RemoteException; 
... 
} 

예 2 : JMX MBean는, 또한 호출 인수를 전달하는 자바 직렬화를 사용합니다. 아래 예제에서 MyManagedBean 클래스 메서드는 클라이언트에 노출됩니다.

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
ObjectName name = new ObjectName("com.example:type=MyManagedBean"); 
MyManagedBean mbean = new MyManagedBean(); 
mbs.registerMBean(mbean, name); 

추천 가능하면, 객체 스트림의 내용을 검증하지 않고 신뢰할 수없는 데이터를 역 직렬화하지 않습니다. 클래스를 deserialize하는 클래스의 유효성을 검사하려면 look-ahead deserialization 패턴을 사용해야합니다. 개체 스트림에는 먼저 클래스 설명 메타 데이터가 포함 된 다음 구성원 필드의 serialize 된 바이트가 포함됩니다. Java 직렬화 프로세스에 의해, 개발자는 클래스의 설명을 읽어 들여, 객체의 직렬화를 개시할지 어떨지를 결정할 수 있습니다 ( ). 이렇게하려면 하위 클래스 java.io.ObjectInputStream을 사용하고 클래스 유효성 검사 및 확인을 수행해야하는 resolveClass (ObjectStreamClass desc) 메서드의 사용자 지정 구현을 제공해야합니다. 2030 년 9 월 29 일, 05:09 Copyright 2015 Hewlett Packard 엔터프라이즈 개발 LP 13 이 진행됩니다. Apache Commons IO (org.apache.commons.io.serialization.ValidatingObjectInputStream)와 같이 쉽게 사용할 수있는 미리보기 패턴의 기존 구현이 있습니다. 항상 예상 유형을 역 직렬화하기 위해 엄격한 화이트리스트 접근 방식을 사용하십시오. 블랙리스트 접근법은 공격자가 블랙리스트를 우회하기 위해 많은 가제트를 사용할 수 있으므로 을 권장하지 않습니다. 또한 에는 코드 실행을 달성하는 일부 클래스가 공개적으로 알려져 있지만 알 수 없거나 공개되지 않은 클래스가있을 수 있으므로 항상 화이트리스트 접근 방식이 선호됩니다. 화이트리스트에 허용 된 모든 클래스 은 deserialize하는 것이 안전한지 감사해야합니다. 서비스 거부 공격을 방지하려면 임계 값을 초과 할 때 deserialize되는 객체 수를 계산하고 deserialize를 중단하려면 resolveObject (Object obj) 메소드를 대체하는 것이 좋습니다. 라이브러리 또는 프레임 워크에서 직렬화가 발생하는 경우 (예 : JMX, RMI, JMS, HTTP 호출자를 사용하는 경우) 위 권장 사항은 개발자가 제어 할 수 없으므로 유용하지 않습니다. 이 경우 이 프로토콜이 다음 요구 사항을 충족하는지 확인해야합니다. - 공개적으로 노출되지 않습니다. - 인증을 사용하십시오. - 무결성 검사를 사용합니다. - 암호화를 사용하십시오. 또한 HPE Security Fortify 런타임은 응용 프로그램이 ObjectInputStream에서 deserialize를 수행하여 응용 프로그램 코드를 모두 보호하지만 라이브러리 및 프레임 워크 코드도 이러한 유형의 공격으로부터 보호 할 때마다 적용되도록 보안 컨트롤을 제공합니다.

+0

당신은 할 수 없으며, 그 메시지는 심각하게 의미 할 수 없습니다. – EJP

+0

그래, 내가 온라인으로 도움이되는 것을 찾지 못했다. 아마도 잘못 이해했거나 요새화 보고서가 문제를 정확하게 인식하지 못했을 것이다. 방금 게시물을 편집하고 요새화 보고서에서 문제를 첨부했습니다. 제발 저를 도와 주시겠습니까? 감사. –

답변

3

ValidatingObjectInputStream을 살펴보십시오. 기본적으로 deserialize 할 수있는 클래스를 허용 목록에 추가합니다 (가져 오는 정보를 기반으로 이러한 클래스를 알아야합니다). 그런 다음 유효성 검사기는 메타 데이터를 직렬화 된 데이터로 확인하고 허용 목록에 포함되지 않은 클래스는 거부합니다.

3

권장 사항의 팁 부분을 보면 미리보기 ObjectInputStream이 구현되어 있어도 문제가보고 될 것이라고 나와 있습니다. 따라서 문제를 해결할 수 있었다하더라도 을 발견하면을 제거하지 않을 것입니다.

그러나 코드가 JMS를 사용하고 JMS와 같이 보이면 비 직렬화를 제어 할 수 없습니다. 이 작업은 복사 및 붙여 넣기 권고 인식 :

직렬화는 라이브러리에있는 장소, 또는 프레임 워크를 취하면 (예를 들어, JMX, RMI, JMS, HTTP 호출자 사용하는 경우)는 이상이기 때문에 위의 권고 사항이 유용하지 않습니다를 개발자의 통제. 이러한 경우 이러한 프로토콜이 다음 요구 사항을 충족하는지 확인하십시오.

  • 공개적으로 노출되지 않습니다.
  • 인증을 사용하십시오.
  • 무결성 검사를 사용하십시오.
  • 암호화를 사용하십시오.

따라서 실제 수정은 네 개의 글 머리 기호를 따르는 것입니다. 연결에 대한 연구를해야하며 요구 사항과 제한 사항에 따라 가능하지 않을 수도 있습니다.

관련 문제