내 코드에서 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를 수행하여 응용 프로그램 코드를 모두 보호하지만 라이브러리 및 프레임 워크 코드도 이러한 유형의 공격으로부터 보호 할 때마다 적용되도록 보안 컨트롤을 제공합니다.
당신은 할 수 없으며, 그 메시지는 심각하게 의미 할 수 없습니다. – EJP
그래, 내가 온라인으로 도움이되는 것을 찾지 못했다. 아마도 잘못 이해했거나 요새화 보고서가 문제를 정확하게 인식하지 못했을 것이다. 방금 게시물을 편집하고 요새화 보고서에서 문제를 첨부했습니다. 제발 저를 도와 주시겠습니까? 감사. –