>  기사  >  Java  >  Java 직렬화의 보안 취약점을 방지하는 방법은 무엇입니까?

Java 직렬화의 보안 취약점을 방지하는 방법은 무엇입니까?

王林
王林원래의
2024-04-16 12:36:021175검색

Java 직렬화 취약점을 방지하려면 다음을 포함한 다각적인 접근 방식이 필요합니다. 화이트리스트를 사용하여 직렬화 가능 클래스를 제한합니다. 필터를 사용하여 객체를 검사하고 서명을 확인하거나 객체를 암호화하세요. 역직렬화 프로세스를 비활성화합니다. 역직렬화 프로세스를 격리하고 통제된 환경에서 실행합니다. 입력 검증을 구현하고, 안전한 코딩 방법을 사용하고, 정기적으로 소프트웨어와 종속성을 업데이트하여 애플리케이션을 강화합니다.

Java 직렬화의 보안 취약점을 방지하는 방법은 무엇입니까?

Java 직렬화의 보안 취약점을 방지하는 방법

Java 직렬화는 저장 또는 전송을 위해 객체를 바이너리 형식으로 변환하는 프로세스입니다. 이 프로세스를 신중하게 설계하지 않으면 심각한 보안 취약점이 발생할 수 있습니다. 이 문서에서는 이러한 취약점의 유형과 이를 방지하는 방법을 살펴보겠습니다.

취약점 유형

Java 직렬화 취약점에는 두 가지 주요 유형이 있습니다.

  • 원격 코드 실행(RCE): 공격자는 직렬화 프로세스를 악용하여 피해자의 컴퓨터에서 임의의 코드를 실행할 수 있습니다.
  • 역직렬화 재생 공격: 공격자는 이전에 직렬화된 개체를 재생하여 무단 작업을 실행할 수 있습니다.

주의 사항

Java 직렬화 취약점을 방지하려면 다각적인 접근 방식이 필요합니다.

1. 화이트리스트를 사용하세요

화이트리스트를 사용하여 직렬화할 수 있는 클래스를 제한하고 신뢰할 수 있는 클래스만 직렬화하도록 허용하세요. 이는 RCE 취약점의 위험을 완화합니다.

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class SerializableFilter implements SerializableFilter {

    private Set<String> allowedClasses = new HashSet<>();

    public SerializableFilter() {
        allowedClasses.add("com.example.user.User");
        allowedClasses.add("com.example.product.Product");
    }

    @Override
    public boolean accept(Class<?> clazz) {
        return allowedClasses.contains(clazz.getName());
    }

}

2. 필터 사용

필터를 사용하여 직렬화 및 역직렬화 중에 객체를 검사합니다. 필터는 객체의 서명을 확인하거나, 객체를 암호화하거나, 의심스러운 속성이 있는지 확인할 수 있습니다.

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectOutputStream.PutField;
import java.lang.reflect.Field;

public class SerializationFilter implements ObjectOutputFilter {

    @Override
    public ObjectOutputStream filter(ObjectOutputStream out) {
        return new ObjectOutputStream(out) {

            @Override
            protected PutField putFields() throws IOException {
                return new PutField() {

                    @Override
                    public void put(String name, Object value) throws IOException {
                        if (value instanceof SensitiveData) {
                            throw new SecurityException("Cannot serialize sensitive data");
                        }
                        super.put(name, value);
                    }
                    
                };
            }
            
        };
    }

}

3. 역직렬화 비활성화

가능하면 역직렬화 프로세스를 비활성화하세요. 예를 들어 서블릿에서 역직렬화를 비활성화할 수 있습니다.

import javax.servlet.ServletContext;

public class ServletInitializer implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
        sce.getServletContext().setAttribute("org.apache.catalina.connector.RMI_SERVER", "disabled");
    }
    
}

4. 역직렬화 격리

역직렬화를 비활성화할 수 없는 경우 역직렬화 프로세스를 격리하고 통제된 환경에서 수행할 수 있습니다. 예를 들어 역직렬화는 별도의 가상 머신이나 컨테이너에서 수행될 수 있습니다.

5. 애플리케이션 강화

특정 직렬화 보안 조치 외에도 다음을 포함하여 애플리케이션을 강화하여 취약점을 예방할 수 있습니다.

  • 입력 유효성 검사 구현.
  • 보안 코딩 방식을 사용하세요.
  • 소프트웨어 및 종속성을 정기적으로 업데이트하세요.

현실적인 예

다음 예를 고려해보세요.

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class VulnerableClass {

    private String name;

    public VulnerableClass(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("malicious.ser");
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(new VulnerableClass("attacker-controlled-data"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

이 코드 예는 공격자가 제어하는 ​​데이터가 포함된 VulnerableClass 개체를 만듭니다. 개체는 악성.ser 파일로 직렬화됩니다. 공격자는 이 데이터를 이용하여 수정된 RCE 익스플로잇을 사용하여 피해자의 컴퓨터에서 임의의 코드를 실행할 수 있습니다. VulnerableClass 对象,其中包含攻击者控制的数据。该对象被序列化到文件恶意.ser。攻击者可以使用经过修改的 RCE 漏洞攻击利用此数据在受害者计算机上执行任意代码。

通过应用上述预防措施,我们可以抵御此类漏洞。例如,我们可以使用白名单仅允许 VulnerableClass

위에 언급된 예방 조치를 적용하면 이러한 취약점으로부터 보호할 수 있습니다. 예를 들어 화이트리스트를 사용하여 VulnerableClass의 신뢰할 수 있는 버전만 직렬화하도록 허용할 수 있습니다.

결론

Java 직렬화 취약점은 심각한 보안 위협입니다. 화이트리스트, 필터 사용, 역직렬화 비활성화, 역직렬화 격리, 애플리케이션 강화 등 다각적인 접근 방식을 취함으로써 이러한 취약점을 효과적으로 예방할 수 있습니다. 🎜

위 내용은 Java 직렬화의 보안 취약점을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.